DIOS.Dev.Generator.Salmon.cpp 282 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111
  1. // CCOS.Dev.GEN.DEMO.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include <assert.h>
  5. #include <functional>
  6. using namespace std::placeholders;
  7. //#include "ResDataObject.h"
  8. #include "CCOS.Dev.Generator.Salmon.h"
  9. #include "logger.temp.h"
  10. #include "Helper.JSON.hpp"
  11. //#include <SimpleLog.hpp>
  12. //extern SimpleLog* g_SLogger;
  13. using namespace CCOS::Dev::Detail::Generator;
  14. namespace nsGEN = CCOS::Dev::Detail::Generator;
  15. #pragma warning (disable:4244) // warning C4244: “初始化”: 从“double”转换到“float”,可能丢失数据
  16. #pragma warning (disable:4305) // warning C4305: “参数”: 从“double”到“float”截断
  17. #pragma warning (disable:4267) // warning C4267 : “初始化”: 从“size_t”转换到“int”,可能丢失数据
  18. static const int msTimeOut_Lock = 500;
  19. const char* EXPOSUREEVENT = "Global\\ExpoureEvent";
  20. #ifdef WIN_64BIT
  21. #ifdef _DEBUG
  22. #pragma comment (lib,"lib_64\\libaxnclientif.lib")
  23. #else
  24. #pragma comment (lib,"lib_64\\libaxnclientif.lib")
  25. #endif
  26. #else
  27. #ifdef _DEBUG
  28. #pragma comment (lib,"lib_32\\libaxnclientif.lib")
  29. #else
  30. #pragma comment (lib,"lib_32\\libaxnclientif.lib")
  31. #endif
  32. #endif
  33. //-----------------------------------------------------------------------------
  34. // SMZDevice
  35. //-----------------------------------------------------------------------------
  36. nsGEN::SMZDevice::SMZDevice (std::shared_ptr <IOEventCenter> center,string ConfigPath)
  37. : super (center)
  38. , m_bExited(false)
  39. , m_bReGetTurnOn(false)
  40. , m_nLastErrorCount(0)
  41. , m_nGenSTMode(-1)
  42. , m_bGenService(false)
  43. , m_bExposureStatus(false)
  44. , m_nDAPUnit(0)
  45. , m_bSelectORG(false)
  46. , m_nSelectOGPWaitingTime(50)
  47. , m_nAPRCommandSynFlag(0)
  48. , m_nTUICOMMANDSENDWAITTIME(200)
  49. , m_bInExam(false)
  50. , m_nFDCLostConnectNumber(0)
  51. , m_nLostConnectNumber(0)
  52. , m_nSettingWS(0)
  53. , m_bCalibMode(false)
  54. , m_bSetAPR(false)
  55. , m_bGetIGENANZ(false)
  56. , m_bSetEnable(false)
  57. , m_nExposureIndex(0)
  58. , m_nBackup_Restre_Identifier(17)
  59. , m_tmDetectorStart(0)
  60. , m_nXwindowTime(100)
  61. , m_hEventExposure(NULL)
  62. , m_bAlreadyExposure(false)
  63. , m_nIdfrstatus(0)
  64. {
  65. assert (EventCenter);
  66. //CreateLogger("Salmon");
  67. m_strConfigPath = ConfigPath;
  68. m_DoseUnit.m_KV.reset(new KVMould(0.0, 40.0, 150.0, 1.0));
  69. m_DoseUnit.m_MA.reset(new MAMould(0.0, 8.0, 1000.0, 0.1));
  70. m_DoseUnit.m_MS.reset(new MSMould(0.0, 1.0, 10000.0, 0.01));
  71. m_DoseUnit.m_MAS.reset(new MASMould(0.0, 0.0, 1000.0, 0.01));
  72. m_DoseUnit.m_Techmode.reset(new TECHMODEMould(1, 0, 2, 1));
  73. m_DoseUnit.m_WS.reset(new WORKSTATIONMould(1, 0, 5, 1));
  74. m_DoseUnit.m_Focus.reset(new FOCUSMould(1, 0, 1, 1));
  75. m_DoseUnit.m_AECField.reset(new AECFIELDMould(0, 0, 111, 1));
  76. m_DoseUnit.m_AECFilm.reset(new AECFILMMould(0, 0, 2, 1));
  77. m_DoseUnit.m_AECDensity.reset(new AECDENSITYMould(0, -4, 4, 1));
  78. m_DoseUnit.m_HE.reset(new TUBEHEATMould(0, 0, 100, 1));
  79. m_DoseUnit.m_PostKV.reset(new POSTKVMould(0.0, 0.0, 150.0, 1.0));
  80. m_DoseUnit.m_PostMA.reset(new POSTMAMould(0.0, 0.0, 1000.0, 0.1));
  81. m_DoseUnit.m_PostMS.reset(new POSTMSMould(0.0, 0.0, 10000.0, 0.01));
  82. m_DoseUnit.m_PostMAS.reset(new POSTMASMould(0.0, 0.0, 1000.0, 0.01));
  83. m_DoseUnit.m_GenSynState.reset(new GENSYNSTATEMould(0, AttrKey::GENERATOR_SYNC_ERR, AttrKey::GENERATOR_RAD_XRAYOFF, 1));
  84. m_DoseUnit.m_GenState.reset(new GENSTATEMould(0, AttrKey::GENERATOR_STATUS_SHUTDOWN, AttrKey::GENERATOR_STATUS_MAX, 1));
  85. m_DoseUnit.m_GenTotalExpNumber.reset(new TOTALEXPNUMMould(0, 0, 9999, 1));
  86. m_DoseUnit.m_GenTotalAcqTimes.reset(new TOTALACQTIMESMould(0, 0, 9999, 1));
  87. m_DoseUnit.m_GenTubeCoolWaitTimes.reset(new TUBECOOLTIMEMould(0, 0, 9999, 1));
  88. m_DoseUnit.m_GenTubeOverLoadNumber.reset(new TUBEOVERLOADNUMMould(0, 0, 9999, 1));
  89. m_DoseUnit.m_GenCurrentExpNumber.reset(new CUREXPNUMMould(0, 0, 99999999, 1));
  90. m_DoseUnit.m_BatteryChargeState.reset(new BATTERYCHARGSTATEMould(-1,0,5,1));
  91. m_DoseUnit.m_ReferenceAirKerma.reset(new REFERENCEAIRKERMAMould(0.0,0.0,999999.0,0.01));
  92. m_DoseUnit.m_KVList.reset(new KVLISTMould(""));
  93. m_DoseUnit.m_mAsList.reset(new MASLISTMould(""));
  94. m_UIClientUnit.m_ERA.reset(new DevUIClient::ERAMould(-1,0,9999999,1));
  95. m_UIClientUnit.m_RSI.reset(new DevUIClient::RSIMould(-1, 0, 30000, 1));
  96. m_UIClientUnit.m_RMV.reset(new DevUIClient::RMVMould(-1, 0, 10, 1));
  97. m_UIClientUnit.m_CFM.reset(new DevUIClient::CFMMould(-1, 0, 10, 1));
  98. m_UIClientUnit.m_BRM.reset(new DevUIClient::BRMMould(-1, 0, 10, 1));
  99. m_UIClientUnit.m_PLS.reset(new DevUIClient::PLSMould(-1, 0, 2, 1));
  100. m_UIClientUnit.m_UDO.reset(new DevUIClient::UDOMould(-1, 0, 2, 1));
  101. m_UIClientUnit.m_SHS.reset(new DevUIClient::SHSMould(-1, 0, 2, 1));
  102. m_UIClientUnit.m_STM.reset(new DevUIClient::STMMould(-1, 0, 2, 1));
  103. m_UIClientUnit.m_SDF.reset(new DevUIClient::SDFMould(-1, 0, 10, 1));
  104. m_UIClientUnit.m_SOP.reset(new DevUIClient::SOPMould(""));
  105. m_UIClientUnit.m_SCREENLOCK.reset(new DevUIClient::SCREENLOCKMould(-1, 0, 5, 1));
  106. m_UIClientUnit.m_SDN.reset(new DevUIClient::SDNMould(""));
  107. m_UIClientUnit.m_AutoConfig.reset(new DevUIClient::AUTOCONFIGMould(-1, 0, 5, 1));
  108. m_UIClientUnit.m_WS2FD.reset(new DevUIClient::WS2FDMould(-1, 0, 10, 1));
  109. m_UIClientUnit.m_AuditMessage.reset(new DevUIClient::AUDITMSGMould(""));
  110. m_CollimatorUnit.m_XSize.reset(new DevCollimator::XSIZEMould(0, 0, 4300, 1));
  111. m_CollimatorUnit.m_YSize.reset(new DevCollimator::YSIZEMould(0, 0, 4300, 1));
  112. m_CollimatorUnit.m_Filter.reset(new DevCollimator::FILTERMould(0, 0, 10, 1));
  113. m_CollimatorUnit.m_SID.reset(new DevCollimator::SIDMould(0, 0, 18000, 1));
  114. m_CollimatorUnit.m_Angle.reset(new DevCollimator::ANGLEMould(0, 0, 360.0, 0.1));
  115. m_CollimatorUnit.m_Mode.reset(new DevCollimator::MODEMould(0, 0, 6, 1));
  116. m_CollimatorUnit.m_Light.reset(new DevCollimator::LIGHTMould(0, 0, 1, 1));
  117. m_MSGUnit.reset(new nsDetail::MSGUnit(center, GeneratorUnitType));
  118. m_DAP.reset(new DevDAP::DOSEMould(0, 0, 999999.0, 0.01));
  119. m_FPDGUnit.reset(new DevFPDClient::CFPDCommunicateWithOtherDevice());
  120. m_FPDGUnit->SetEventCenter(center);
  121. m_pAxnClient = NULL;
  122. m_pFDCAxnClient = NULL;
  123. m_hXCUDataEvent = NULL;
  124. m_hFDCDataEvent = NULL;
  125. m_hGenPostEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  126. m_hGenPostDAPEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  127. m_hFDCDataEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  128. m_hXCUDataEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  129. m_hGenSelectOGPEvent = CreateEvent(NULL, false, false, NULL);
  130. m_hDUMMYEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  131. m_hWaitForDapEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  132. m_hEventExposure = CreateEvent(NULL, FALSE, FALSE, EXPOSUREEVENT);
  133. m_hXCUDataThread = NULL;
  134. m_hXCUDataRevThread = NULL;
  135. m_hFDCDataDealThread = NULL;
  136. m_hFDCDataRevThread = NULL;
  137. m_hOGPWorkThread = NULL;
  138. m_hWaitForDummyThread = NULL;
  139. m_pBuffer = new axn_byte[MAX_LEN_ACS_OBJ];
  140. m_pFDCBuffer = new axn_byte[MAX_LEN_ACS_OBJ];
  141. InitializeCriticalSection(&m_csXCUData);
  142. InitializeCriticalSection(&m_csFDCData);
  143. InitializeCriticalSection(&m_csStatus);
  144. 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-->
  145. 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,
  146. 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-->
  147. 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,
  148. 500000, 560000, 630000, 710000, 800000, 900000, 1000000, 1100000, 1250000, 1400000, 1600000, 1800000, 2000000, 2200000, 2500000, 2800000, 3200000, 3600000, 4000000, 4500000, 5000000 };//<!--ms * 1000-->
  149. g_AECDensity_List = { -20, -15, -10, -5, 0, 5, 10, 15, 20 };// <!--density * 10-->
  150. g_AECDOSE_List = { 89, 125, 179, 250, 357, 500, 714 }; //<!--AECDose * 100-->
  151. g_AECFILM_List = { 200, 400, 800 }; //<!--AECFILM-->
  152. g_FILTER_List = { 0, 1, 2, 3 }; //FILTER * 10
  153. AprParamBackup.nWS = WS_TABLE;
  154. AprParamBackup.nFocus = FOCUS_LARGE;
  155. AprParamBackup.nTechmode = TECHMODE_NOAEC_3P;
  156. AprParamBackup.nAECField = FIELD_CENTER;
  157. AprParamBackup.nAECFilm = GEN_AECFILM_U;
  158. AprParamBackup.nAECDensity = 0;
  159. AprParamBackup.fKV = 70.0f;
  160. AprParamBackup.fMA = 10.0f;
  161. AprParamBackup.fMS = 100.0f;
  162. AprParamBackup.fMAS = 1.0f;
  163. m_bAutoHandSwitch = false;
  164. m_wHeaderLength = 2 * sizeof(ACS_WORD) + 4 * sizeof(ACS_BYTE);
  165. Register ();
  166. ResDataObject temp;
  167. temp.loadFile(m_strConfigPath.c_str());
  168. m_GenConfig = temp["CONFIGURATION"];
  169. TransJsonText(m_GenConfig);
  170. }
  171. nsGEN::SMZDevice::~SMZDevice ()
  172. {
  173. m_bExited = true;
  174. if (m_hGenSelectOGPEvent != NULL)
  175. {
  176. CloseHandle(m_hGenSelectOGPEvent);
  177. m_hGenSelectOGPEvent = NULL;
  178. }
  179. if (m_hXCUDataEvent != NULL)
  180. {
  181. CloseHandle(m_hXCUDataEvent);
  182. m_hXCUDataEvent = NULL;
  183. }
  184. if (m_hFDCDataEvent != NULL)
  185. {
  186. CloseHandle(m_hFDCDataEvent);
  187. m_hFDCDataEvent = NULL;
  188. }
  189. if (m_hDUMMYEvent != NULL)
  190. {
  191. CloseHandle(m_hDUMMYEvent);
  192. m_hDUMMYEvent = NULL;
  193. }
  194. if (m_pFDCBuffer != NULL)
  195. {
  196. delete[] m_pFDCBuffer;
  197. m_pFDCBuffer = NULL;
  198. }
  199. if (m_pBuffer != NULL)
  200. {
  201. delete[] m_pBuffer;
  202. m_pBuffer = NULL;
  203. }
  204. m_hXCUDataThread = NULL;
  205. m_hFDCDataDealThread = NULL;
  206. m_hFDCDataRevThread = NULL;
  207. m_hOGPWorkThread = NULL;
  208. m_hWaitForDummyThread = NULL;
  209. m_hWaitForDapThread = NULL;
  210. //ReleaseLogger();
  211. CloseHandle(m_hGenPostEvent);
  212. CloseHandle(m_hGenPostDAPEvent);
  213. CloseHandle(m_hWaitForDapEvent);
  214. }
  215. std::string nsGEN::SMZDevice::GetGUID() const
  216. {
  217. printf("\n===============GetGUID : %s ===================\n", GeneratorUnitType);
  218. return GeneratorUnitType;
  219. }
  220. void nsGEN::SMZDevice::Register()
  221. {
  222. auto Disp = &Dispatch;
  223. superGen::Register (Disp);
  224. superGen::RegisterRAD (Disp);
  225. superGen::RegisterAEC (Disp);
  226. superGen::RegisterExpEnable (Disp);
  227. superGen::RegisterGeneratortoSyncStatus(Disp);
  228. superUIClient::Register(Disp);
  229. superCollimatorClient::Register(Disp);
  230. Disp->Get.Push(m_MSGUnit->GetKey().c_str(), [this](std::string& out) { out = m_MSGUnit->JSGet(); return RET_STATUS::RET_SUCCEED; });
  231. auto fun_Clear_DAP = [this](auto a, auto&)
  232. {
  233. return Clear_DAP();
  234. };
  235. Disp->Action.Push ("Clear_DAP", fun_Clear_DAP);
  236. auto fun_GetValue_DAP = [this](auto a, auto& b)
  237. {
  238. float value = 0;
  239. RET_STATUS ret = GetValue_DAP(value);
  240. b = ToJSON(value);
  241. return ret;
  242. };
  243. Disp->Action.Push("GetValue_DAP", fun_GetValue_DAP);
  244. Disp->Get.Push("DAP", [this](std::string& out) { out = m_DAP->JSGet(); return RET_STATUS::RET_SUCCEED; });
  245. Disp->Get.Push("GetAPRms", m_FPDGUnit.get(), &DevFPDClient::CFPDCommunicateWithOtherDevice::JSGetAPRms);
  246. Disp->Get.Push("XrayStatus", m_FPDGUnit.get(), &DevFPDClient::CFPDCommunicateWithOtherDevice::JSXrayStatus);
  247. Disp->Action.Push("SetLTEthreshold", m_FPDGUnit.get(), &DevFPDClient::CFPDCommunicateWithOtherDevice::JSSetLTEthreshold);
  248. Disp->Action.Push("SetFPDCalibrationStatus", this, &nsGEN::SMZDevice::JSSetFPDCalibrationStatus);
  249. Disp->Action.Push("SetPanelSN", this, &nsGEN::SMZDevice::JSSetPanelSN);
  250. Disp->Action.Push("SendFPDError", this, &nsGEN::SMZDevice::JSSendFPDError);
  251. Disp->Action.Push("ClearFPDError", this, &nsGEN::SMZDevice::JSClearFPDError);
  252. Disp->Action.Push("SendFPDWarn", this, &nsGEN::SMZDevice::JSSendFPDWarn);
  253. Disp->Action.Push("FPDSTATUS", this, &nsGEN::SMZDevice::JSSendFPDStatus);
  254. Disp->Action.Push("FPDXWINDOWOPEN", this, &nsGEN::SMZDevice::JSFPDXWindowOpen);
  255. }
  256. bool nsGEN::SMZDevice::Prepare()
  257. {
  258. SerialPortOpen();
  259. m_hEventExitExposureThread = CreateEvent(NULL, FALSE, FALSE, NULL);
  260. m_hExposureEventArray[0] = m_hEventExitExposureThread;
  261. m_hExposureEventArray[1] = m_hEventExposure;
  262. m_hExposureThread = CreateThread(0, 0, ExposureThread, this, 0, &m_ExposureThreadID);
  263. if (m_hExposureThread == NULL)
  264. {
  265. PRINTA_DEBUG("Start Exposure Thread Failed!\n");
  266. }
  267. else
  268. {
  269. PRINTA_DEBUG("Start Exposure Thread End\n");
  270. }
  271. return true;
  272. }
  273. DWORD WINAPI SMZDevice::ExposureThread(LPVOID pParam)
  274. {
  275. SMZDevice* pCurMoniOpr = (SMZDevice*)pParam;
  276. BOOL bExit = false;
  277. DWORD dwResult;
  278. PRINTA_DEBUG("ExposureThread Start!!!!\n");
  279. DWORD curThreadPri = GetThreadPriority(GetCurrentThread());
  280. if (curThreadPri != THREAD_PRIORITY_TIME_CRITICAL)
  281. {
  282. if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL))
  283. {
  284. PRINTA_DEBUG("Failed to enter timecritical priority.lasterror (%d)\n", GetLastError());
  285. }
  286. PRINTA_DEBUG("Set timecritical priority.ok\n");
  287. }
  288. while (!bExit)
  289. {
  290. dwResult = WaitForMultipleObjects(2, pCurMoniOpr->m_hExposureEventArray, FALSE, INFINITE);
  291. switch (dwResult)
  292. {
  293. case WAIT_OBJECT_0: // m_hEventExitExposureThread
  294. bExit = true;
  295. PRINTA_DEBUG("Start to Exit Exposure Thread");
  296. break;
  297. case WAIT_OBJECT_0 + 1: // m_hEventExposure
  298. PRINTA_DEBUG("Get Exposure Event");
  299. {
  300. pCurMoniOpr->DoExposure();
  301. ResetEvent(pCurMoniOpr->m_hEventExposure);
  302. }
  303. break;
  304. default:
  305. DWORD nErrorCode;
  306. nErrorCode = GetLastError();
  307. PRINTA_DEBUG("Exposure Thread unknown Exit Mercu event! error code: %d \n", nErrorCode);
  308. bExit = true;
  309. break;
  310. }
  311. }
  312. PRINTA_DEBUG("ExposureThread Exit!!!!");
  313. return 0;
  314. }
  315. /*********************************************************************************
  316. 函数名称:SerialPortOpen
  317. 功能描述:建立通讯
  318. 修改记录:
  319. 2015-04-20 创建
  320. *******************************************************************************/
  321. bool nsGEN::SMZDevice::SerialPortOpen()
  322. {
  323. //与AXIM节点建立通讯 及接收线程启动
  324. m_sCallbackData.clear();
  325. DWORD dwThreadId;
  326. if (NULL == m_hXCUDataThread)
  327. m_hXCUDataThread = CreateThread(NULL, 0, XCUDataThread, this, 0, &dwThreadId);
  328. if (m_hXCUDataThread == NULL)
  329. {
  330. PRINTA_DEBUG("Open XCUDataThread Failed\n");
  331. return false;
  332. }//ENDIF
  333. if (ConnectXCS())
  334. {
  335. PRINTA_DEBUG("Init Siemens XCS(F3) generator: connected\n");
  336. printf("Init XCU(F3): connect success\n");
  337. //接收线程
  338. if (NULL == m_hXCUDataRevThread)
  339. m_hXCUDataRevThread = CreateThread(NULL, 0, ReveiveXCUData, this, 0, &dwThreadId);
  340. if (m_hXCUDataRevThread == NULL)
  341. {
  342. PRINTA_DEBUG("Open XCUDataThread Failed");
  343. return false;
  344. }//ENDIF
  345. if (NULL == m_hWaitForDummyThread)
  346. m_hWaitForDummyThread = CreateThread(NULL, 0, WaitForDummyThread, this, 0, &dwThreadId);
  347. if (m_hWaitForDummyThread == NULL)
  348. {
  349. PRINTA_DEBUG("Open WaitForDummyThread Failed\n");
  350. return false;
  351. }//ENDIF
  352. }
  353. else
  354. {
  355. printf("Init XCU(F3): connect failed");
  356. return false;
  357. }
  358. // end
  359. //与FDC节点建立通讯 及接收线程启动
  360. m_sFDCCallbackData.clear();
  361. if (NULL == m_hFDCDataDealThread)
  362. m_hFDCDataDealThread = CreateThread(NULL, 0, FDCDataThread, this, 0, &dwThreadId);
  363. if (m_hFDCDataDealThread == NULL)
  364. {
  365. PRINTA_DEBUG("Open XCUDataThread Failed");
  366. return false;
  367. }//ENDIF
  368. if (FDCConnectXCS())
  369. {
  370. PRINTA_DEBUG( "Init FDC(F4): connected");
  371. printf("Init FDC(F4): connect success\n");
  372. if (NULL == m_hFDCDataRevThread)
  373. m_hFDCDataRevThread = CreateThread(NULL, 0, ReveiveFDCData, this, 0, &dwThreadId);
  374. if (m_hFDCDataRevThread == NULL)
  375. {
  376. PRINTA_DEBUG("Open XCUDataThread Failed\n");
  377. return false;
  378. }//ENDIF
  379. }
  380. else
  381. {
  382. printf("Init FDC(F4): connect failed\n");
  383. return false;
  384. }
  385. // 完成与AXIM FDC F4节点建立通讯连接
  386. Sleep(1000);
  387. printf("connect success\n");
  388. //Sleep(20000);
  389. return true;
  390. }
  391. /*********************************************************************************
  392. 函数名称:SerialPortClose
  393. 功能描述:关闭通讯
  394. 修改记录:
  395. 2015-04-20 创建
  396. *******************************************************************************/
  397. bool nsGEN::SMZDevice::SerialPortClose() //在哪调用?
  398. {
  399. m_bExited = true;
  400. //关闭FDC通讯
  401. TurnOffFDCRequest();
  402. DisconnectFDCAxn();
  403. Sleep(1000);
  404. ////关闭XCU通讯
  405. TurnOffRequest();
  406. DisconnectAxn();
  407. Sleep(100);
  408. if (m_pFDCAxnClient != NULL)
  409. {
  410. m_pFDCAxnClient = NULL;
  411. }
  412. if (m_pAxnClient != NULL)
  413. {
  414. m_pAxnClient = NULL;
  415. }
  416. PRINTA_DEBUG( "SerialPortClose End\n");
  417. return true;
  418. }
  419. /*********************************************************************************
  420. 函数名称:ConnectXCS
  421. 功能描述:连接XCS服务器
  422. 修改记录:
  423. 2015-04-20 创建
  424. *******************************************************************************/
  425. bool nsGEN::SMZDevice::ConnectXCS(void)
  426. {
  427. axn_word wtimeout = 10; //默认值 该值会影响recvobject()函数的返回时间,现场使用的时间为该值*200(程序放大值)*3(经验值);针对turn off时间由5秒延迟到10s,与SSME周超保持一致
  428. axn_status status;
  429. if (m_pAxnClient)
  430. {
  431. CAxnClientIFCreator::deleteAxnClientIF(m_pAxnClient);
  432. m_pAxnClient = NULL;
  433. PRINTA_INFO("ConnectXCS,deleteAxnClientIF\n");
  434. }
  435. m_pAxnClient = CAxnClientIFCreator::newAxnClientIF();
  436. if (m_pAxnClient == NULL)
  437. {
  438. PRINTA_INFO("newAxnClientIF fail\n");
  439. return false;
  440. }//ENDIF
  441. Sleep(100);
  442. int nConnectTime = 0; //初始化0
  443. PRINTA_INFO( "== SEND == : connectToServer AxnClient\n");
  444. while ((status = m_pAxnClient->connectToServer(Clientsender, wtimeout)) != ACS_AXN_OK)
  445. {
  446. PRINTA_WARN("Connect Time: %d\n", nConnectTime);
  447. printf("F3 Connect Time: %d\n", nConnectTime);
  448. if (nConnectTime >= 20)
  449. {
  450. break;
  451. }
  452. else
  453. {
  454. nConnectTime++;
  455. Sleep(1000);
  456. }
  457. }
  458. if (nConnectTime >= 20)
  459. {
  460. PRINTA_ERROR("Tried %d times, still failed to connect XCS, return\n", nConnectTime);
  461. string code = "ConnectError";
  462. string info = "Can't connect to Axim, Please reboot the system.";
  463. int level = CONNECTIONERROR;
  464. m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(),0xF3);
  465. return false;
  466. }
  467. else
  468. {
  469. string code = "ConnectError";
  470. string info = "";
  471. int level = CONNECTIONERROR;
  472. m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
  473. return true;
  474. }
  475. }
  476. void nsGEN::SMZDevice::DisconnectAxn()
  477. {
  478. if (m_pAxnClient)
  479. {
  480. CAxnClientIFCreator::deleteAxnClientIF(m_pAxnClient);
  481. m_pAxnClient = NULL;
  482. EnterCriticalSection(&m_csStatus);
  483. m_bIdentStatus = false;
  484. m_bReGetTurnOn = true;
  485. PRINTA_INFO("callback: DisconnectAxn, m_bIdentStatus = false,m_bReGetTurnOn = true\n");
  486. LeaveCriticalSection(&m_csStatus);
  487. PRINTA_INFO( "deleteAxnClientIF\n");
  488. }
  489. }
  490. DWORD nsGEN::SMZDevice::ReveiveXCUData(LPVOID pParam)
  491. {
  492. nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
  493. while (1)
  494. {
  495. if (pCurOpr->m_pAxnClient == NULL)
  496. {
  497. return 1;
  498. }
  499. try {
  500. axn_status status;
  501. ::ZeroMemory(pCurOpr->m_pBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
  502. status = pCurOpr->m_pAxnClient->recvObject((ACS_BYTE*)pCurOpr->m_pBuffer);
  503. if (status == ACS_AXN_NOK)
  504. {
  505. PRINTA_ERROR("XCU Some Error when AxnClient recvObject\n");
  506. Sleep(2 * AXN_DUMMYTIME_BASE_RATE_IN_MS * 1);
  507. if (pCurOpr->m_nLostConnectNumber >= 5)
  508. {
  509. string code = "ReceiveError";
  510. string info = "Can't receive the command from generator,Please reboot the system.";
  511. int level = CONNECTIONERROR;
  512. pCurOpr->m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(), 0xF3);
  513. }
  514. else
  515. {
  516. pCurOpr->m_nLostConnectNumber++;
  517. }
  518. PRINTA_ERROR("XCU communication fail\n");
  519. printf("XCU communication fail!!!!!!!! \n");
  520. pCurOpr->DisconnectAxn();
  521. Sleep(2000);
  522. pCurOpr->ConnectXCS();
  523. }
  524. else if (status == ACS_AXN_TIMEOUT)
  525. {
  526. PRINTA_ERROR("XCU receive communication Timeout\n");
  527. }
  528. else
  529. {
  530. if (pCurOpr->m_nLostConnectNumber > 0)
  531. {
  532. pCurOpr->m_nLostConnectNumber = 0;
  533. }
  534. if (pCurOpr->m_pBuffer != NULL)
  535. {
  536. acs_obj_header_t* tel_hdr_p;
  537. tel_hdr_p = (acs_obj_header_t*)pCurOpr->m_pBuffer;
  538. try {
  539. if (tel_hdr_p->length <= MAX_LEN_ACS_OBJ)
  540. {
  541. SetEvent(pCurOpr->m_hDUMMYEvent);
  542. //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
  543. if (tel_hdr_p->id != DUMMY_MSG)
  544. {
  545. PRINTA_DEBUG("ReveiveXCUData: recvObject id: %x", tel_hdr_p->id);
  546. axn_byte* pBuffer;
  547. pBuffer = new axn_byte[MAX_LEN_ACS_OBJ];
  548. ::ZeroMemory(pBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
  549. ::memcpy(pBuffer, pCurOpr->m_pBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
  550. EnterCriticalSection(&pCurOpr->m_csXCUData);
  551. pCurOpr->m_sCallbackData.push_back(pBuffer);
  552. LeaveCriticalSection(&pCurOpr->m_csXCUData);
  553. SetEvent(pCurOpr->m_hXCUDataEvent);
  554. }
  555. else
  556. {
  557. //ACS_DUMMY Dummy1 = (*(ACS_DUMMY*)(pCurOpr->m_pBuffer + sizeof(acs_obj_header_t)));
  558. //ACS_DUMMY Dummy2 = (*(ACS_DUMMY*)(pCurOpr->m_pBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_DUMMY)));
  559. //ACS_DUMMY Dummy3 = (*(ACS_DUMMY*)(pCurOpr->m_pBuffer + sizeof(acs_obj_header_t) + 2 * sizeof(ACS_DUMMY)));
  560. //ACS_DUMMY Dummy4 = (*(ACS_DUMMY*)(pCurOpr->m_pBuffer + sizeof(acs_obj_header_t) + 3 * sizeof(ACS_DUMMY)));
  561. //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",
  562. //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
  563. }
  564. if (pCurOpr->m_nTimeoutCount != 0)
  565. {
  566. pCurOpr->m_nTimeoutCount = 0;
  567. PRINTA_INFO("ReceiveCommand get command, then set TimeoutCount to 0\n");
  568. }
  569. }
  570. else
  571. {
  572. PRINTA_ERROR("Get a error command: > max_len_acs_obj\n");
  573. }
  574. }
  575. catch (...)
  576. {
  577. PRINTA_ERROR("Crash log 1, other error\n");
  578. }
  579. }
  580. else
  581. {
  582. PRINTA_ERROR("m_pBuffer = NULL\n");
  583. }
  584. }
  585. }
  586. catch (...)
  587. {
  588. PRINTA_ERROR("Crash log 2, other error\n");
  589. }
  590. if (pCurOpr->m_bExited)
  591. {
  592. break;
  593. }
  594. }
  595. return 0;
  596. }
  597. DWORD nsGEN::SMZDevice::XCUDataThread(LPVOID pParam)
  598. {
  599. nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
  600. while (true)
  601. {
  602. axn_byte* dd;
  603. bool bGetData = false;
  604. EnterCriticalSection(&pCurOpr->m_csXCUData);
  605. if (!pCurOpr->m_sCallbackData.empty())
  606. {
  607. bGetData = true;
  608. dd = pCurOpr->m_sCallbackData.front();
  609. pCurOpr->m_sCallbackData.pop_front();
  610. LeaveCriticalSection(&pCurOpr->m_csXCUData);
  611. //PRINTA_DEBUG("Callback XCUData push the data\n");
  612. }
  613. else
  614. {
  615. LeaveCriticalSection(&pCurOpr->m_csXCUData);
  616. WaitForSingleObject(pCurOpr->m_hXCUDataEvent, 50);
  617. }
  618. if (bGetData)
  619. {
  620. pCurOpr->CallbackXCU((acs_obj_header_t*)dd);
  621. if (dd != NULL)
  622. {
  623. delete[] dd;
  624. dd = NULL;
  625. }
  626. }//ENDIF
  627. if (pCurOpr->m_bExited)
  628. {
  629. break;
  630. }
  631. }
  632. return 0;
  633. }
  634. bool nsGEN::SMZDevice::CallbackXCU(const acs_obj_header_t* pCommand)
  635. {
  636. if (pCommand == NULL)
  637. {
  638. PRINTA_ERROR("Callback: Get command is Null\n");
  639. return false;
  640. }//ENDIF
  641. printf("== IN == XCU Telegram ID: %x \n", pCommand->id);
  642. try
  643. {
  644. switch (pCommand->id)
  645. {
  646. case UINT16(INIT_MSG):
  647. PRINTA_DEBUG("== IN == : INIT_MSG\n");
  648. SendList();
  649. SendTelegramLog("INIT_MSG");
  650. break;
  651. case UINT16(TURN_ON):
  652. PRINTA_DEBUG("== IN == : TURN_ON\n");
  653. CallbackTurnOn((ACS_BYTE*)pCommand);
  654. break;
  655. case UINT16(TURN_OFF):
  656. PRINTA_DEBUG("== IN == : TURN_OFF\n");
  657. CallBackTurnOff((ACS_BYTE*)pCommand);
  658. break;
  659. case UINT16(INETZAUFNAHME):
  660. PRINTA_DEBUG("== IN == : INETZAUFNAHME\n");
  661. SendTelegramLog("INETZAUFNAHME");
  662. m_bIdentStatus = true;
  663. SendDate();
  664. Sleep(50);
  665. SendIfeStatus(WARTEND);
  666. break;
  667. case UINT16(SAPPLIKATION):
  668. PRINTA_DEBUG("== IN == : SAPPLIKATION\n");
  669. SendTelegramLog("SAPPLIKATION");
  670. SendIfeStatus(BETRIEBSBEREIT);
  671. SendErrorLog();
  672. break;
  673. case UINT16(AISTWERTE): //xcu wait
  674. PRINTA_DEBUG("== IN == : AISTWERTE\n");
  675. SendiISTWERTE();
  676. SendTelegramLog("AISTWERTE");
  677. break;
  678. case UINT16(SINIT):
  679. PRINTA_DEBUG("== IN == : SINIT\n");
  680. SendTelegramLog("SINIT");
  681. sinit_t1_tag* sinit_p;
  682. sinit_p = (sinit_t1_tag*)pCommand;
  683. if (sinit_p->initkennung == 0)
  684. {
  685. SendIfeStatus(BETRIEBSBEREIT);
  686. }
  687. break;
  688. case UINT16(AKENNDATEN):
  689. PRINTA_DEBUG("== IN == : AKENNDATEN\n");
  690. SendTelegramLog("AKENNDATEN");
  691. Sleep(50);
  692. QueryExposureNumber(); //20200604 增加曝光查询次数
  693. break;
  694. case UINT16(IPASSWORT):
  695. break;
  696. case UINT16(IORGANANZ2): //get organanz for paramlist, orgdate
  697. PRINTA_DEBUG("== IN == : IORGANANZ2\n");
  698. break;
  699. case UINT16(SAUSLBED):
  700. PRINTA_DEBUG("== IN == : SAUSLBED\n");//TODO
  701. //CallbackSauslBed((ACS_BYTE*)pCommand);
  702. break;
  703. case UINT16(IGENANZ):
  704. PRINTA_DEBUG("== IN == : IGENANZ\n");
  705. CallbackGenParam((ACS_BYTE*)pCommand);
  706. break;
  707. //case UINT16(ISTRMANANZ):
  708. // PRINTA_DEBUG("== IN == : ISTRMANANZ\n");
  709. // //CallbackstrmananzParam((istrmananz_t1_tag*)pCommand); 不需要实现
  710. // break;
  711. case UINT16(IFILTERANZ):
  712. PRINTA_DEBUG("== IN == : IFILTERANZ\n");
  713. CallbackIFILTERANZParam((ACS_BYTE*)pCommand);
  714. break;
  715. case UINT16(IFILTER):
  716. PRINTA_DEBUG("== IN == : IFILTER\n");
  717. //CallbackIFILTERParam((ACS_BYTE*)pCommand); 不需要实现
  718. break;
  719. case UINT16(IDFPANZ2):
  720. PRINTA_DEBUG("== IN == : IDFPANZ2\n");
  721. //CallbackDAPParam((ACS_BYTE *)pCommand); //本报文原用于获取DAP,但目前已经不起作用,可以不予解析;2018/9/26
  722. break;
  723. case UINT16(IERRORLOG2): //Error message set to log file
  724. PRINTA_DEBUG("== IN == : IERRORLOG2\n");
  725. CallbackErrorParam((ACS_BYTE*)pCommand);
  726. break;
  727. case UINT16(ERROR_MSG):
  728. PRINTA_DEBUG("== IN == : ERROR_MSG\n");
  729. SendTelegramLog("ERROR_MSG");
  730. break;
  731. case UINT16(IFEHLER): //error type;
  732. PRINTA_DEBUG("== IN == : IFEHLER\n");
  733. SendTelegramLog("IFEHLER");
  734. break;
  735. case UINT16(ISYSTEMANZ):
  736. PRINTA_DEBUG("== IN == : ISYSTEMANZ\n");
  737. CallbackWorkstationFromXCU((ACS_BYTE*)pCommand);
  738. break;
  739. case UINT16(SAUFNAUSL):
  740. PRINTA_DEBUG("== IN == : SAUFNAUSL\n");
  741. CallbackAufnAusl((ACS_BYTE*)pCommand);
  742. break;
  743. //case UINT16(SBILD):
  744. // PRINTA_DEBUG("== IN == : SBILD\n");
  745. // CallbackSBILD((ACS_BYTE*)pCommand);
  746. // break;
  747. case UINT16(SORGANSELECT): //set finish the view value
  748. PRINTA_DEBUG("== IN == : SORGANSELECT\n");
  749. CallbackSORGANSELECT((ACS_BYTE*)pCommand);
  750. break;
  751. case UINT16(SH_LIST):
  752. PRINTA_DEBUG("== IN == : SH_LIST\n");
  753. CallBackShowList((ACS_BYTE*)pCommand);
  754. break;
  755. case UINT16(DUMMY_MSG):
  756. break;
  757. case UINT16(IIONANZ):
  758. PRINTA_DEBUG("== IN == : IIONANZ\n");
  759. CallbackGetField((ACS_BYTE*)pCommand);
  760. break;
  761. case UINT16(INACHANZ): //post exposure parameters
  762. PRINTA_DEBUG("== IN == : INACHANZ\n");
  763. CallbackPostGenParam((ACS_BYTE*)pCommand);
  764. break;
  765. case UINT16(IAUFNDATEN):
  766. PRINTA_DEBUG("== IN == : IAUFNDATEN\n");
  767. SendTelegramLog("IAUFNDATEN");
  768. break;
  769. case UINT16(IDAPVALUE): //dap not in using
  770. PRINTA_DEBUG("== IN == : IDAPVALUE\n");
  771. SendTelegramLog("IDAPVALUE");
  772. break;
  773. case UINT16(IDFRALLGANZ2):
  774. PRINTA_DEBUG("== IN == : IDFRALLGANZ2\n");
  775. CallBackIdrallganz2((ACS_BYTE*)pCommand);
  776. break;
  777. case UINT16(IFEHLERANZ2): //dispaly the message to UI
  778. PRINTA_DEBUG("== IN == : IFEHLERANZ2\n");
  779. CallBackIfehleranz2((ACS_BYTE*)pCommand);
  780. break;
  781. //case UINT16(IINFOCOMP):
  782. // PRINTA_DEBUG("== IN == : IINFOCOMP\n");
  783. // CallBackIINFOCOMP((ACS_BYTE*)pCommand);
  784. // break;
  785. case UINT16(SDETEKTORSTART):
  786. PRINTA_DEBUG("== IN == : SDETEKTORSTART\n"); //二级手闸信号;
  787. m_bAlreadyExposure = false;
  788. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_READY);
  789. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  790. PRINTA_INFO("<GEN EXP>the generator ready \n");
  791. SendTelegramLog("SDETEKTORSTART","", pCommand->sender);
  792. break;
  793. case UINT16(STESTCMD):
  794. PRINTA_DEBUG("== IN == : STESTCMD\n");
  795. SendTelegramLog("STESTCMD");
  796. break;
  797. case UINT16(ST_MODE):
  798. PRINTA_DEBUG("== IN == : ST_MODE\n");
  799. CallBackST_MODE((ACS_BYTE*)pCommand);
  800. break;
  801. case UINT16(SDFRNAHBED2):
  802. PRINTA_DEBUG("== IN == : SDFRNAHBED2\n");
  803. CallBackSDFRNAHBED2((ACS_BYTE*)pCommand);
  804. break;
  805. case UINT16(ST_ORGAN_PROG):
  806. PRINTA_DEBUG("== IN == : ST_ORGAN_PROG\n");
  807. CallBackST_ORGAN_PROG((ACS_BYTE*)pCommand);
  808. break;
  809. case UINT16(SRESETFEHLER):
  810. PRINTA_DEBUG("== IN == : SRESETFEHLER\n");
  811. CallBackSRESETFEHLER((ACS_BYTE*)pCommand);
  812. SendTelegramLog("SRESETFEHLER");
  813. break;
  814. case UINT16(IFFA): //get SID
  815. PRINTA_DEBUG("== IN == : IFFA(SID)\n");
  816. CallBackSID((ACS_BYTE*)pCommand);
  817. break;
  818. //case UINT16(SBEDSYS): // Get Workstation //from TUI select
  819. // PRINTA_DEBUG("== IN == : SBEDSYS(WorkStation)\n");
  820. // CallBackWorkStationFromTUI((ACS_BYTE*)pCommand);
  821. // break;
  822. case UINT16(IBLENDEANZ): //(Collimator)
  823. PRINTA_DEBUG("== IN == : IBLENDEANZ(Collimator)\n");
  824. CallBackCollimator((ACS_BYTE*)pCommand);
  825. break;
  826. case UINT16(IRASTERANZ): //(Grid)
  827. PRINTA_DEBUG("== IN == : IRASTERANZ(Grid)\n");
  828. CallBackGrid((ACS_BYTE*)pCommand);
  829. break;
  830. case UINT16(RQ_FDR_DATA): //(Request FPD Data)
  831. PRINTA_DEBUG("== IN == : RQ_FDR_DATA\n");
  832. CallBackRQ_FDR_DATA((ACS_BYTE*)pCommand);
  833. break;
  834. case UINT16(ST_ADJUST):
  835. PRINTA_DEBUG("== IN == : ST_ADJUST\n");
  836. CallBackAdjust((ACS_BYTE*)pCommand);
  837. break;
  838. case UINT16(IGGANZ2):
  839. PRINTA_DEBUG("== IN == : IGGANZ2\n");
  840. //GeneratorDriver::SetGeneratorStatus(GENERATOR_STATUS_STANDBY); //202110 待完善
  841. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_STANDBY);
  842. CallBackIGGANZ2((ACS_BYTE*)pCommand);
  843. break;
  844. case UINT16(IROEANZ):
  845. PRINTA_DEBUG("== IN == : IROEANZ\n");
  846. CallBackTubeHeat((ACS_BYTE*)pCommand);
  847. break;
  848. case UINT16(ST_DIAG):
  849. PRINTA_DEBUG( "== IN == : PMS ST_DIAG, request system status information\n");
  850. CallBackSTDIAG((ACS_BYTE*)pCommand);
  851. break;
  852. case UINT16(RQ_OBJECT):
  853. PRINTA_DEBUG("== IN == : PMS RQ_OBJECT, request system Version information\n");
  854. CallBackRQOBJECT((ACS_BYTE*)pCommand);
  855. break;
  856. case UINT16(IALLGANZ):
  857. PRINTA_DEBUG("== IN == : IALLGANZ\n");
  858. CallBackDoorStatus((ACS_BYTE*)pCommand);
  859. break;
  860. case UINT16(ST_CONFIG):
  861. PRINTA_DEBUG("== IN == : PMS ST_CONFIG\n");
  862. CallBackSTCONFIG((ACS_BYTE*)pCommand);
  863. break;
  864. case UINT16(ST_DATA_TRANS):
  865. PRINTA_DEBUG("== IN == : PMS ST_DATA_TRANS\n");
  866. CallBackST_DATA_TRANS((ACS_BYTE*)pCommand);
  867. break;
  868. case UINT16(ST_SYSTEM_STATE):
  869. PRINTA_DEBUG("== IN == : PMS ST_SYSTEM_STATE\n");
  870. CallBackPMSSystemStatus((ACS_BYTE*)pCommand);
  871. break;
  872. case UINT16(SFANZLOESCHEN):
  873. PRINTA_DEBUG("== IN == : PMS SFANZLOESCHEN\n");
  874. CallBackSFANZLOESCHEN((ACS_BYTE*)pCommand);
  875. break;
  876. case UINT16(ISERVBETRIEB):
  877. PRINTA_DEBUG("== IN == : ISERVBETRIEB\n");
  878. CallbackExposureNumber((ACS_BYTE*)pCommand);
  879. break;
  880. case UINT16(IWATERVALACQ):
  881. PRINTA_DEBUG("== IN == : IWATERVALACQ\n");
  882. CallbackIWATERVALACQ((ACS_BYTE*)pCommand);
  883. break;
  884. case UINT16(ISOD):
  885. PRINTA_DEBUG("== IN == : ISOD\n");
  886. CallBackSOD((ACS_BYTE*)pCommand);
  887. break;
  888. case UINT16(IACSS):
  889. PRINTA_DEBUG("== IN == : IACSS\n");
  890. CallbackIACSS((ACS_BYTE*)pCommand);
  891. break;
  892. case UINT16(IXRAY):
  893. PRINTA_DEBUG("== IN == : IXRAY\n");
  894. CallbackIXRAY((ACS_BYTE*)pCommand);
  895. break;
  896. case UINT16(IPRINTAUFN):
  897. PRINTA_DEBUG("== IN == : IPRINTAUFN\n");
  898. break;
  899. case UINT16(IERWALLGANZ):
  900. PRINTA_DEBUG("== IN == : IERWALLGANZ\n");
  901. CallbackIERWALLGANZ((ACS_BYTE*)pCommand);
  902. break;
  903. case UINT16(SORTHO):
  904. PRINTA_DEBUG("== IN == : SORTHO\n");
  905. CallbackSORTHO((ACS_BYTE*)pCommand);
  906. break;
  907. case UINT16(SORTHOACTSIZE):
  908. PRINTA_DEBUG("== IN == : SORTHOACTSIZE\n");
  909. //CallbackSORTHOACTSIZE((ACS_BYTE*)pCommand); //2021-04:不需要实现
  910. break;
  911. case UINT16(SH_STPAR_RFP):
  912. PRINTA_DEBUG("== IN == : SH_STPAR_RFP\n");
  913. CallbackSH_STPAR_RFP((ACS_BYTE*)pCommand);
  914. break;
  915. case UINT16(ST_PWR_OFF):
  916. PRINTA_DEBUG("== IN == : ST_PWR_OFF\n");
  917. CallbackST_PWR_OFF((ACS_BYTE*)pCommand);
  918. break;
  919. case UINT16(IANLBEREIT):
  920. PRINTA_INFO("== IN == : IANLBEREIT\n");
  921. CallBackIANLBEREIT((ACS_BYTE*)pCommand);
  922. break;
  923. default:
  924. break;
  925. }
  926. }
  927. catch (...)
  928. {
  929. PRINTA_ERROR("Callback Deal XCU data Crash: id:%x\n", pCommand->id);
  930. printf("Callback Deal XCU data Crash: id:%x\n", pCommand->id);
  931. }
  932. return true;
  933. }
  934. /*********************************************************************************
  935. 函数名称:SendList
  936. 功能描述:设置DROC端需要从SCU端接收的报文清单
  937. 修改记录:
  938. 2015-04-20 创建
  939. 2017-03-04 增加DAP报文
  940. *******************************************************************************/
  941. bool nsGEN::SMZDevice::SendList(void)
  942. {
  943. ACS_WORD szID[XCS_MESSAGE_NUM] = { INETZAUFNAHME,
  944. SAPPLIKATION,
  945. SINIT,
  946. AKENNDATEN,
  947. IPASSWORT,
  948. TURN_OFF,
  949. DUMMY_MSG,
  950. IGENANZ,
  951. TURN_ON,
  952. IORGANANZ2,
  953. //ISTRMANANZ,
  954. IFILTERANZ,
  955. IDFPANZ2,
  956. IERRORLOG2,
  957. ERROR_MSG,
  958. IFEHLER,
  959. IFEHLER2,
  960. ISYSTEMANZ,
  961. SAUFNAUSL,
  962. //SBILD,
  963. SORGANSELECT,
  964. IIONANZ,
  965. AISTWERTE,
  966. IFEHLERANZ2,
  967. IDFRALLGANZ2,
  968. SH_LIST,
  969. INACHANZ,
  970. IDAPVALUE,
  971. //IINFOCOMP,
  972. SDETEKTORSTART,
  973. SAUSLBED,
  974. STESTCMD,
  975. ST_MODE,
  976. SDFRNAHBED2,
  977. ST_ORGAN_PROG,
  978. SRESETFEHLER,
  979. IFILTER,
  980. IANLBEREIT,
  981. IFFA,
  982. IBLENDEANZ,
  983. IRASTERANZ,
  984. RQ_FDR_DATA,
  985. ST_ADJUST,
  986. IGGANZ2,
  987. IROEANZ,
  988. ST_DIAG,
  989. SH_VERSION,
  990. RQ_OBJECT,
  991. SH_CONFIG,
  992. ST_DATA_TRANS,
  993. IALLGANZ,
  994. ST_SYSTEM_STATE,
  995. SFANZLOESCHEN,
  996. ISERVBETRIEB,
  997. IWATERVALACQ,
  998. ISOD,
  999. IACSS,
  1000. IXRAY,
  1001. IPRINTAUFN,
  1002. IERWALLGANZ,
  1003. IBETRIEBSART,
  1004. ST_PWR_OFF,
  1005. IANLBEREIT
  1006. };
  1007. inlist_enh_t1_tag szSendGen = {};
  1008. m_stGenCommand.id = INLIST_ENH;
  1009. m_stGenCommand.sender = Clientsender;
  1010. m_stGenCommand.mode = 0;
  1011. m_stGenCommand.target = 0;
  1012. m_stGenCommand.group_index = Clientgroup_index;
  1013. m_stGenCommand.length = m_wHeaderLength + (XCS_MESSAGE_NUM + 1) * sizeof(ACS_WORD);
  1014. szSendGen.no_objects = XCS_MESSAGE_NUM;
  1015. szSendGen.header = m_stGenCommand;
  1016. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  1017. ::memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  1018. ::memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_wHeaderLength + sizeof(ACS_WORD));
  1019. ::memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_WORD)),
  1020. (ACS_BYTE*)(&szID), XCS_MESSAGE_NUM * sizeof(ACS_WORD));
  1021. if (m_pAxnClient != NULL)
  1022. {
  1023. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  1024. SendTelegramLog("INLIST_ENH", "", m_stGenCommand.sender,0);
  1025. }//ENDIF
  1026. delete[]p_ID;
  1027. p_ID = NULL;
  1028. PRINTA_DEBUG("== SEND == : INLIST_ENH( LIST)\n");
  1029. return true;
  1030. }
  1031. /*********************************************************************************
  1032. 函数名称:SendiISTWERTE
  1033. 功能描述:设置组件状态
  1034. 修改记录:
  1035. 2021-04-20 创建
  1036. *******************************************************************************/
  1037. bool nsGEN::SMZDevice::SendiISTWERTE(void)
  1038. {
  1039. iistwertequit_t1 szSendGen = {};
  1040. m_stGenCommand.id = IISTWERTEQUIT;
  1041. m_stGenCommand.length = m_wHeaderLength;
  1042. szSendGen.header = m_stGenCommand;
  1043. if (m_pAxnClient != NULL)
  1044. {
  1045. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1046. PRINTA_DEBUG("== SEND == : IISTWERTEQUIT\n");
  1047. SendTelegramLog("IISTWERTEQUIT", "", m_stGenCommand.sender);
  1048. }//ENDIF
  1049. return true;
  1050. }
  1051. /*********************************************************************************
  1052. 函数名称:SendIdent
  1053. 功能描述:设置与XCU交互的第一条报文
  1054. 修改记录:
  1055. 2015-04-20 创建
  1056. *******************************************************************************/
  1057. bool nsGEN::SMZDevice::SendIdent(void)
  1058. {
  1059. iident_t1 szSendGen = {};
  1060. m_stGenCommand.id = IIDENT;
  1061. m_stGenCommand.length = m_wHeaderLength + 3 * sizeof(ACS_BYTE) + 10 * sizeof(ACS_STRING_8) + 3 * sizeof(ACS_DUMMY);
  1062. m_stGenCommand.mode = Clientmode;
  1063. m_stGenCommand.sender = Clientsender;
  1064. m_stGenCommand.group_index = Clientgroup_index;
  1065. m_stGenCommand.target = Clienttarget;
  1066. szSendGen.fetyp = BILDVERARBEITUNG;
  1067. szSendGen.knotenid = Clientsender;
  1068. szSendGen.apid = Clientsender;
  1069. ACS_STRING_8 temp[10] = "FLSP_COMP";
  1070. ::memcpy(szSendGen.kompname, temp, 10);
  1071. szSendGen.header = m_stGenCommand;
  1072. if (m_pAxnClient != NULL)
  1073. {
  1074. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1075. PRINTA_DEBUG("== SEND == : IIDENT\n");
  1076. SendTelegramLog("IIDENT", "", m_stGenCommand.sender);
  1077. }//ENDIF
  1078. else
  1079. {
  1080. PRINTA_DEBUG("== SEND == : IIDENT is not successful\n");
  1081. }
  1082. return true;
  1083. }
  1084. /*********************************************************************************
  1085. 函数名称:SendErrorLog
  1086. 功能描述:设置当前DROC保存的错误个数到XCU端
  1087. 修改记录:
  1088. 2015-04-20 创建
  1089. *******************************************************************************/
  1090. bool nsGEN::SMZDevice::SendErrorLog(void)
  1091. {
  1092. ierrorlogsync_t1_tag szSendGen = {};
  1093. m_stGenCommand.id = IERRORLOGSYNC;
  1094. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_WORD) + 2 * sizeof(ACS_DUMMY);
  1095. szSendGen.errcnt = m_nLastErrorCount; //需要读取配置
  1096. szSendGen.header = m_stGenCommand;
  1097. if (m_pAxnClient != NULL)
  1098. {
  1099. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1100. PRINTA_DEBUG("IS: errcnt: %lu", szSendGen.errcnt);
  1101. SendTelegramLog("IERRORLOGSYNC", "", m_stGenCommand.sender);
  1102. }//ENDIF
  1103. PRINTA_DEBUG("== SEND == : IERRORLOGSYNC\n");
  1104. return true;
  1105. }
  1106. /*********************************************************************************
  1107. 函数名称:SendDate
  1108. 功能描述:设置当前时间到XCU端,保持时间同步
  1109. 修改记录:
  1110. 2015-04-20 创建
  1111. *******************************************************************************/
  1112. bool nsGEN::SMZDevice::SendDate(void)
  1113. {
  1114. sdate_t1_tag szSendGen = {};
  1115. SYSTEMTIME SysCurrentTime;
  1116. GetLocalTime(&SysCurrentTime);
  1117. m_stGenCommand.id = SDATE;
  1118. m_stGenCommand.length = m_wHeaderLength + 6 * sizeof(ACS_BYTE) + 2 * sizeof(ACS_DUMMY);
  1119. szSendGen.day = SysCurrentTime.wDay; //day   
  1120. szSendGen.year = SysCurrentTime.wYear - 2000; //year   Siemens要求
  1121. szSendGen.month = SysCurrentTime.wMonth; //month
  1122. szSendGen.hour = SysCurrentTime.wHour; //hour
  1123. szSendGen.minute = SysCurrentTime.wMinute; //minute
  1124. szSendGen.second = SysCurrentTime.wSecond; //second
  1125. szSendGen.header = m_stGenCommand;
  1126. if (m_pAxnClient != NULL)
  1127. {
  1128. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1129. SendTelegramLog("SDATE", "", m_stGenCommand.sender);
  1130. }//ENDIF
  1131. PRINTA_DEBUG("== SEND == : SDATE\n");
  1132. //SendErrorLog(); //Siemens要求,在此时间点设置该指令 20210512 符合AXIM流程
  1133. return true;
  1134. }
  1135. ///*********************************************************************************
  1136. //函数名称:QueryExposureNumber
  1137. //功能描述: 查询当前曝光的次数(ASERVBETRIEB )
  1138. //修改记录:
  1139. //2021-04-20 创建
  1140. //*******************************************************************************/
  1141. bool nsGEN::SMZDevice::QueryExposureNumber() //2021-04 待完善功能:需要客户端根据需要进行调用
  1142. {
  1143. aservbetrieb_t1 QueryExposureNumber = {};
  1144. m_stGenCommand.id = ASERVBETRIEB;
  1145. m_stGenCommand.length = m_wHeaderLength;
  1146. QueryExposureNumber.header = m_stGenCommand;
  1147. if (m_pAxnClient != NULL)
  1148. {
  1149. m_pAxnClient->sendObject((ACS_BYTE*)&QueryExposureNumber);
  1150. SendTelegramLog("ASERVBETRIEB", "", m_stGenCommand.sender);
  1151. }//ENDIF
  1152. PRINTA_INFO("QueryExposureNumber\n");
  1153. return true;
  1154. }
  1155. /*********************************************************************************
  1156. 函数名称:SendIfeStatus
  1157. 功能描述:设置组件状态
  1158. 修改记录:
  1159. 2021-04-20 创建
  1160. *******************************************************************************/
  1161. bool nsGEN::SMZDevice::SendIfeStatus(int IfeStatusValue)
  1162. {
  1163. ifestatus_t1_tag szSendGen = {};
  1164. m_stGenCommand.id = IFESTATUS;
  1165. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_BYTE) + sizeof(ACS_DUMMY) * 3;
  1166. szSendGen.festatus = IfeStatusValue;
  1167. szSendGen.header = m_stGenCommand;
  1168. if (m_pAxnClient != NULL)
  1169. {
  1170. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1171. PRINTA_DEBUG("IS: festatus: %d, Send to 0x%x\n", szSendGen.festatus, szSendGen.header.target);
  1172. SendTelegramLog("IFESTATUS", "", m_stGenCommand.sender);
  1173. }//ENDIF
  1174. szSendGen.header.target = SFServer;
  1175. if (m_pAxnClient != NULL)
  1176. {
  1177. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1178. PRINTA_DEBUG("IS: festatus: %d, Send to 0x%x\n", szSendGen.festatus, szSendGen.header.target);
  1179. SendTelegramLog("IFESTATUS", "Send to SFServer", m_stGenCommand.sender);
  1180. }//ENDIF
  1181. PRINTA_INFO("== SEND == : IFESTATUS: %d\n", IfeStatusValue);
  1182. return true;
  1183. }
  1184. ///*********************************************************************************
  1185. //函数名称:SetSH_Mode
  1186. //功能描述: 返回SH_mode报文,对应ST_mode
  1187. //修改记录:
  1188. //2021-04-23 创建
  1189. //*******************************************************************************/
  1190. bool nsGEN::SMZDevice::SetSH_Mode(int nMode)
  1191. {
  1192. sh_mode_t1_tag SendSH_Mode = {};
  1193. m_stGenCommand.id = SH_MODE;
  1194. m_stGenCommand.target = ClientPMS;
  1195. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY);
  1196. SendSH_Mode.header = m_stGenCommand;
  1197. SendSH_Mode.system_mode = (int)nMode;
  1198. if (m_pAxnClient != NULL)
  1199. {
  1200. m_pAxnClient->sendObject((ACS_BYTE*)&SendSH_Mode);
  1201. std::ostringstream buffer;
  1202. buffer << "IS: system_mode:" << (int)SendSH_Mode.system_mode;
  1203. string str = buffer.str();
  1204. SendTelegramLog("IFESTATUS", str.c_str(), m_stGenCommand.sender, 0);
  1205. }//ENDIF
  1206. m_stGenCommand.target = Clienttarget;
  1207. PRINTA_INFO("== SEND == : SetSH_Mode: SendSH_Mode.system_mode: %d\n", SendSH_Mode.system_mode);
  1208. return true;
  1209. }
  1210. /*********************************************************************************
  1211. 函数名称:SendIdfrnahbed
  1212. 功能描述:对iDfrBed报文的确认
  1213. 修改记录:
  1214. 2021-04-20 创建
  1215. *******************************************************************************/
  1216. bool nsGEN::SMZDevice::SendIdfrnahbed(int nCode, int nData) //2021-04 待完善功能:需要客户端设置 设置TOD参数
  1217. {
  1218. idfrnahbed_t1_tag szSendGen = {};
  1219. m_stGenCommand.id = IDFRNAHBED;
  1220. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_COUNT) + 2 * sizeof(ACS_INT) + 3 * sizeof(ACS_DUMMY);
  1221. szSendGen.header = m_stGenCommand;
  1222. szSendGen.aktanzahl = 1;
  1223. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  1224. memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  1225. memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_wHeaderLength + sizeof(ACS_COUNT) + 3 * sizeof(ACS_DUMMY));
  1226. idfrnahbed_t2_tag szSendGen2 = {};
  1227. szSendGen2.aktcode = nCode; //MARK_R_POSITION;
  1228. szSendGen2.aktdata = nData; //0; //Siemens 要求
  1229. memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_COUNT) + 3 * sizeof(ACS_DUMMY)), (ACS_BYTE*)(&szSendGen2),
  1230. 2 * sizeof(ACS_INT));
  1231. if (m_pAxnClient != NULL)
  1232. {
  1233. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  1234. std::ostringstream buffer;
  1235. buffer << "IS: F3 aktcode:" << (int)szSendGen2.aktcode << ",aktdata: " << (int)szSendGen2.aktdata;
  1236. string str = buffer.str();
  1237. SendTelegramLog("IDFRNAHBED", str.c_str(), m_stGenCommand.sender,0);
  1238. }//ENDIF
  1239. delete[] p_ID;
  1240. p_ID = NULL;
  1241. PRINTA_INFO("== SEND == : IDFRNAHBED\n");
  1242. return true;
  1243. }
  1244. /*********************************************************************************
  1245. 函数名称:SendAdjust
  1246. 功能描述:发送AP的读写结果到PMS
  1247. 修改记录:
  1248. 2021-04-23 创建
  1249. 2021-06-01 已经不使用了
  1250. *******************************************************************************/
  1251. bool nsGEN::SMZDevice::SendAdjust(int nResult)
  1252. {
  1253. return true;
  1254. sh_adjust_t1_tag shAdjustData = {};
  1255. m_stGenCommand.id = SH_ADJUST;
  1256. m_stGenCommand.target = ClientPMS;
  1257. int nAdjustLength = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + 3 * sizeof(ACS_INT) + sizeof(ACS_DCOUNT);
  1258. int nAdjust2Length = 0;
  1259. string strPath = "";
  1260. if (ACS_ADJ_FILETRANS_OK == nResult) //6
  1261. {
  1262. nAdjust2Length = strlen(strPath.c_str()) * sizeof(ACS_BYTE);
  1263. shAdjustData.adj_status = ACS_ADJ_FILETRANS_OK; //6
  1264. }
  1265. else if (ACS_ADJ_FILETRANS_NOK == nResult) //7
  1266. {
  1267. shAdjustData.adj_status = ACS_ADJ_FILETRANS_NOK;//7
  1268. }
  1269. else if (ACS_ADJ_RUNNING == nResult) //1
  1270. {
  1271. shAdjustData.adj_status = ACS_ADJ_RUNNING;// 1
  1272. }
  1273. else if (ACS_ADJ_FILETRANS_NODATA == nResult)
  1274. {
  1275. shAdjustData.adj_status = ACS_ADJ_FILETRANS_NODATA;// 9
  1276. }//ENDIF
  1277. shAdjustData.identifier = ACS_ADJUST_ID_FD_WLAN; //22
  1278. m_stGenCommand.length = nAdjustLength + nAdjust2Length;
  1279. shAdjustData.header = m_stGenCommand;
  1280. shAdjustData.no_adj_data = nAdjust2Length;
  1281. ACS_BYTE* pCommand = new ACS_BYTE[m_stGenCommand.length * 2];
  1282. memset(pCommand, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  1283. memcpy((ACS_BYTE*)pCommand, (ACS_BYTE*)(&shAdjustData), nAdjustLength);
  1284. if (ACS_ADJ_FILETRANS_OK == nResult)
  1285. {
  1286. PRINTA_INFO("Copy ScalanceWlanAccesspoint.xml\n");
  1287. sh_adjust_t2_tag shAdjustData2 = {};
  1288. for (int i = 0; i < sizeof(strPath); i++)
  1289. {
  1290. shAdjustData2.adj_data = (ACS_BYTE)(strPath[i]);
  1291. memcpy((ACS_BYTE*)(pCommand + nAdjustLength + i * sizeof(ACS_BYTE)), (ACS_BYTE*)(&shAdjustData2), sizeof(ACS_BYTE));
  1292. }
  1293. }//ENDIF
  1294. if (m_pAxnClient != NULL)
  1295. {
  1296. m_pAxnClient->sendObject(pCommand);//pCommand
  1297. SendTelegramLog("SH_ADJUST", "", m_stGenCommand.sender, 0);
  1298. }//ENDIF;
  1299. PRINTA_INFO("== SEND == : SH_ADJUST Path:%s\n", strPath);
  1300. delete[]pCommand;
  1301. pCommand = NULL;
  1302. m_stGenCommand.target = Clienttarget;
  1303. return true;
  1304. }
  1305. /*********************************************************************************
  1306. 函数名称:SetSystemStatusInformation
  1307. 功能描述:设置当前软件系统的状态信息
  1308. 参数描述:
  1309. nStatusIndex:
  1310. VERSIONINFOR_SOFTWARE (3)
  1311. HOSTID (4)
  1312. SOFTWAREDONGLEID (5)
  1313. FREESPACEOFHARDDISK (6)
  1314. FREESPACEOFMEMORY (7)
  1315. CONFIGFILEISSUE (8)
  1316. 修改记录:
  1317. 2021-04-23 创建
  1318. *******************************************************************************/
  1319. bool nsGEN::SMZDevice::SetSystemStatusInformation(int nStatusIndex, const char* strInfor, ACS_ENUM nDealStatus) //需要客户端设置 各版本信息 202110 SSI
  1320. {
  1321. sh_diag_t1_tag SendSystemStatusInformation = {};
  1322. m_stGenCommand.id = SH_DIAG;
  1323. m_stGenCommand.target = ClientPMS;
  1324. m_stGenCommand.length = m_wHeaderLength + 5 * sizeof(ACS_INT)
  1325. + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT) + DIAG_STRING_LENGTH * sizeof(ACS_STRING) * strlen(strInfor);
  1326. SendSystemStatusInformation.header = m_stGenCommand;
  1327. int nSH_DIAGLength = m_wHeaderLength + 5 * sizeof(ACS_INT) + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT);
  1328. SendSystemStatusInformation.par_2 = 108;
  1329. SendSystemStatusInformation.obj_count = ACS_ONLY_ONE_OBJECT;
  1330. SendSystemStatusInformation.diag_status = nDealStatus;
  1331. SendSystemStatusInformation.identifier = (ACS_INT)nStatusIndex;
  1332. SendSystemStatusInformation.diag_duration = 0;
  1333. SendSystemStatusInformation.lostr_diag = (int)strlen(strInfor);
  1334. ACS_BYTE* pCommand = new ACS_BYTE[m_stGenCommand.length];
  1335. memset(pCommand, 0, m_stGenCommand.length * sizeof(ACS_BYTE));
  1336. memcpy((ACS_BYTE*)pCommand, (ACS_BYTE*)(&SendSystemStatusInformation), nSH_DIAGLength);
  1337. //int unicodeLen = MultiByteToWideChar(CP_ACP, 0, strInfor, -1, NULL, 0);
  1338. //wchar_t* pUnicode;
  1339. //pUnicode = new wchar_t[(unicodeLen + 1) * 2];
  1340. //memset(pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t) * 2);
  1341. //size_t nUnicodeLenSize = unicodeLen + 1;
  1342. //mbstowcs_s(&nUnicodeLenSize, pUnicode, 200, strInfor, _TRUNCATE);
  1343. sh_diag_t2_tag strDiagInfor = {};
  1344. for (int i = 0; i < (int)strlen(strInfor); i++)
  1345. {
  1346. memset(strDiagInfor.diag_string, 0, DIAG_STRING_LENGTH * sizeof(ACS_STRING));
  1347. strDiagInfor.diag_string[0] = strInfor[i];
  1348. memcpy((ACS_BYTE*)(pCommand + (nSH_DIAGLength + i * sizeof(sh_diag_t2_tag))),
  1349. (ACS_BYTE*)(&strDiagInfor), sizeof(sh_diag_t2_tag));
  1350. }
  1351. if (m_pAxnClient != NULL)
  1352. {
  1353. m_pAxnClient->sendObject((ACS_BYTE*)pCommand);
  1354. }//ENDIF
  1355. delete[]pCommand;
  1356. pCommand = NULL;
  1357. //delete[] pUnicode;
  1358. //pUnicode = NULL;
  1359. m_stGenCommand.target = Clienttarget;
  1360. PRINTA_INFO("== SEND == : SH_DIAG: fOrgStatus: %d, strInfor:%s,Length: %d,diag_status:%d\n",
  1361. nStatusIndex, strInfor, m_stGenCommand.length, SendSystemStatusInformation.diag_status);
  1362. std::ostringstream buffer;
  1363. buffer << "nStatusIndex:" << nStatusIndex << "strInfor:" << strInfor <<"diag_status:"<< SendSystemStatusInformation.diag_status;
  1364. string str = buffer.str();
  1365. SendTelegramLog("SH_DIAG", str.c_str(), m_stGenCommand.sender);
  1366. return true;
  1367. }
  1368. /*********************************************************************************
  1369. 函数名称:SendIdfrStatus
  1370. 功能描述:设置当前系统曝光状态到XCU端
  1371. 修改记录:
  1372. 2021-04-20 创建
  1373. *******************************************************************************/
  1374. bool nsGEN::SMZDevice::SendIdfrStatus(int nDRStatus, int nRFStatus, int bSaveParm) //2021-04 待完善功能:需要客户端设置 客户端或子系统会根据不同的界面及系统状态进行设置 //202110 STA
  1375. {
  1376. if (bSaveParm == 1)
  1377. {
  1378. m_nIdfrstatus = nDRStatus;
  1379. }
  1380. if (m_nScreenSaver >= 1)
  1381. {
  1382. PRINTA_DEBUG("SCreenSave: return IDFRSTATUS(dfraufnbereit: %d, dfrdlbereit:%d)\n", nDRStatus, nRFStatus);
  1383. return true;
  1384. }
  1385. idfrstatus_t1_tag szSendGen = {};
  1386. m_stGenCommand.id = IDFRSTATUS;
  1387. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_BYTE);
  1388. szSendGen.dfraufnbereit = nDRStatus;
  1389. szSendGen.dfrdlbereit = nRFStatus;
  1390. if (nDRStatus == 27) //DROC_IQAP_RECEIVED
  1391. {
  1392. m_stGenCommand.target = ClientPMS;
  1393. }
  1394. else
  1395. {
  1396. //m_stGenCommand.mode = ACS_MODE_DIRECT; //normal
  1397. }
  1398. szSendGen.header = m_stGenCommand;
  1399. if (m_pAxnClient != NULL)
  1400. {
  1401. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1402. }//ENDIF
  1403. PRINTA_DEBUG("== SEND == : IDFRSTATUS(dfraufnbereit: %d, dfrdlbereit:%d),mode: %d,target:%x \n", nDRStatus, nRFStatus, m_stGenCommand.mode, m_stGenCommand.target);
  1404. m_stGenCommand.target = Clienttarget;
  1405. std::ostringstream buffer;
  1406. buffer << "dfraufnbereit:" << nDRStatus << "dfrdlbereit:" << nRFStatus;
  1407. string str = buffer.str();
  1408. SendTelegramLog("IDFRSTATUS", str.c_str(), m_stGenCommand.sender);
  1409. return true;
  1410. }
  1411. /*********************************************************************************
  1412. 函数名称:SelectORG
  1413. 功能描述:设置当前UI端选中的view到UI端
  1414. 修改记录:
  1415. 2021-04-22 创建
  1416. *******************************************************************************/
  1417. bool nsGEN::SMZDevice::SelectORG(int nCode, int nParam, int nNeedOGP) //2021-4-22 待完善功能:需要客户端设置
  1418. {
  1419. m_stGenCommand.id = SBEDORG;
  1420. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
  1421. sbedorg_t1_tag szSendGen = {};
  1422. szSendGen.bedeinh = DFR_BEDIENUNG;
  1423. szSendGen.fktscodeorg = (ACS_INT)nCode;
  1424. szSendGen.bedienobj = SELEKTIONSTASTEN;
  1425. szSendGen.param = (ACS_INT)nParam;
  1426. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  1427. memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  1428. memcpy(p_ID, &m_stGenCommand, 8);
  1429. memcpy(p_ID + 8, &szSendGen.bedeinh, 1);
  1430. memcpy(p_ID + 9, &szSendGen.bedienobj, 1);
  1431. memcpy(p_ID + 10, &szSendGen.fktscodeorg, 2);
  1432. memcpy(p_ID + 12, &szSendGen.param, 2);
  1433. if (m_pAxnClient != NULL)
  1434. {
  1435. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  1436. std::ostringstream buffer;
  1437. buffer << "IS: fktscodeorg(code):" << (int)szSendGen.fktscodeorg << ",param:" << (int)szSendGen.param;
  1438. string str = buffer.str();
  1439. SendTelegramLog("SBEDORG", str.c_str(), m_stGenCommand.sender, 0);
  1440. }//ENDIF
  1441. delete[] p_ID;
  1442. p_ID = NULL;
  1443. PRINTA_INFO("== SEND == : SBEDORG | SelectORG(code:%d,param:%d) \n", nCode, nParam /*m_nAPRCommandSynFlag*/);
  1444. m_nSetViewNumber = nParam;
  1445. if (nCode == 451) //Siemens要求 设置OGP选择
  1446. {
  1447. if (nNeedOGP == 0)
  1448. {
  1449. PRINTA_INFO("== SelectORG == : Send ORT, don't need back OGP\n");
  1450. return true;
  1451. }
  1452. else if (nNeedOGP == 2)
  1453. {
  1454. /*m_data.m_gen.m_nmSelectOGP = nParam;*/ //待完善功能:需要设置到UI端
  1455. PRINTA_INFO("== SelectORG == : Send ORG,need back OGP,but don't need SelectOGP\n");
  1456. return true;
  1457. }
  1458. if (m_bCalibMode)
  1459. {
  1460. PRINTA_INFO("AutoCalibration mode, No Send No OGP Selected\n");
  1461. }
  1462. else
  1463. {
  1464. SendIdfrStatus(NO_OGP_SELECTED, NO_OGP_SELECTED);
  1465. PRINTA_INFO("No AutoCalibration mode,Send No OGP Selected\n");
  1466. }
  1467. DWORD dwThreadId;
  1468. if (NULL == m_hXCUDataThread)
  1469. m_hOGPWorkThread = CreateThread(NULL, 0, OGPWorkThread, this, 0, &dwThreadId);
  1470. if (m_hOGPWorkThread == NULL)
  1471. {
  1472. PRINTA_DEBUG("Open XCUDataThread Failed\n");
  1473. return false;
  1474. }//ENDIF
  1475. }
  1476. if ((m_nAPRCommandSynFlag == 0) || (m_nAPRCommandSynFlag == 2)) //Siemens 要求
  1477. {
  1478. EnterCriticalSection(&m_csStatus);
  1479. m_nAPRCommandSynFlag = 1; //清除当前的变量标识,重新统计
  1480. LeaveCriticalSection(&m_csStatus);
  1481. PRINTA_INFO("SelectORG:: m_nAPRCommandSynFlag++,m_nAPRCommandSynFlag = %d\n", m_nAPRCommandSynFlag);
  1482. }//ENDIF
  1483. return true;
  1484. }
  1485. /*********************************************************************************
  1486. 函数名称:OGPWorkThread
  1487. 功能描述: 等待OGP(VIEW)确认返回线程
  1488. 修改记录:
  1489. 2021-04-20 创建
  1490. *******************************************************************************/
  1491. DWORD nsGEN::SMZDevice::OGPWorkThread(LPVOID pParam)
  1492. {
  1493. nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
  1494. pCurOpr->m_bSelectORG = true;
  1495. if (WaitForSingleObject(pCurOpr->m_hGenSelectOGPEvent, pCurOpr->m_nSelectOGPWaitingTime) == WAIT_OBJECT_0)
  1496. {
  1497. //pCurOpr->m_pGenSiemensSalmon_Mech->Mech::UpdateViewID(pCurOpr->m_nTargetViewNumber); //202110
  1498. PRINTA_INFO("Get OGP view back, TargetView: %d\n", pCurOpr->m_nTargetViewNumber);
  1499. }
  1500. else
  1501. {
  1502. //pCurOpr->m_pGenSiemensSalmon_Mech->Mech::UpdateViewID(pCurOpr->m_nSetViewNumber + 1); //202110
  1503. PRINTA_INFO("can't Get OGP view back,direct send view number\n");
  1504. }
  1505. pCurOpr->m_bSelectORG = false;
  1506. return true;
  1507. }
  1508. /*********************************************************************************
  1509. 函数名称:WaitForDummyThread
  1510. 功能描述: 等待Dummy message
  1511. 修改记录:
  1512. 2021-04-20 创建
  1513. *******************************************************************************/
  1514. DWORD nsGEN::SMZDevice::WaitForDummyThread(LPVOID pParam)
  1515. {
  1516. nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
  1517. while (1)
  1518. {
  1519. if (WaitForSingleObject(pCurOpr->m_hDUMMYEvent, 2500/*pCurOpr->m_nSelectOGPWaitingTime*/) == WAIT_OBJECT_0) //20220328 dission with SSME, use the 2500ms for dummy message timeout
  1520. {
  1521. //According to the SSME's message,the dummy message will be send from Axim every 600ms Normally;
  1522. //if (!pCurOpr->m_bIdentStatus)
  1523. {
  1524. //EnterCriticalSection(&pCurOpr->m_csStatus);
  1525. //pCurOpr->m_bIdentStatus = true;
  1526. //pCurOpr->m_bReGetTurnOn = false;
  1527. //LeaveCriticalSection(&pCurOpr->m_csStatus);
  1528. //string code = "0";
  1529. //string info = "";
  1530. //int level = CONNECTIONERROR;
  1531. //pCurOpr->m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
  1532. }
  1533. }
  1534. else
  1535. {
  1536. PRINTA_ERROR("Get Dummy message timeout\n");
  1537. //if (pCurOpr->m_bIdentStatus)
  1538. {
  1539. //EnterCriticalSection(&pCurOpr->m_csStatus);
  1540. //pCurOpr->m_bIdentStatus = false;
  1541. //pCurOpr->m_bReGetTurnOn = true;
  1542. //LeaveCriticalSection(&pCurOpr->m_csStatus);
  1543. //PRINTA_INFO("WaitForDummyThread: m_bIdentStatus = false,m_bReGetTurnOn = true\n");
  1544. //string code = "LostDummyMessage";
  1545. //string info = "Lost communication to generator,Please reboot the system.";
  1546. //int level = CONNECTIONERROR;
  1547. //pCurOpr->m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str());
  1548. }//ENDIF
  1549. }
  1550. if (pCurOpr->m_bExited)
  1551. {
  1552. break;
  1553. }
  1554. }
  1555. return true;
  1556. }
  1557. /*********************************************************************************
  1558. 函数名称:WaitForDapThread
  1559. 功能描述: 等待Dap message
  1560. 修改记录:
  1561. 2022-10-11 创建
  1562. *******************************************************************************/
  1563. DWORD nsGEN::SMZDevice::WaitForDapThread(LPVOID pParam)
  1564. {
  1565. nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
  1566. int nWaitForDap = 5000;
  1567. try
  1568. {
  1569. nWaitForDap = (int)(pCurOpr->m_GenConfig["DAPTimeOut"]);
  1570. }
  1571. catch (...)
  1572. {
  1573. PRINTA_ERROR("Can't get the DAPTimeOut value,default = 5000ms\n");
  1574. }
  1575. if (WaitForSingleObject(pCurOpr->m_hWaitForDapEvent, nWaitForDap) == WAIT_OBJECT_0)
  1576. {
  1577. PRINTA_INFO("WaitForDapThread: Get DAP value");
  1578. }
  1579. else
  1580. {
  1581. PRINTA_ERROR("WaitForDapThread: Get Dap value timeout\n");
  1582. string code = "DapTimeOut";
  1583. string info = "DAP display impaired. Turn off / on system. If error still persists, contact service.";
  1584. int level = MESSAGEBOX_CLEARERROR;
  1585. pCurOpr->m_MSGUnit->AddWarnMessage(code.c_str(), level, info.c_str(), 0xF0);
  1586. }
  1587. return true;
  1588. }
  1589. RET_STATUS nsGEN::SMZDevice::EnterExam() //202110 对外接口
  1590. {
  1591. if (!SelectORG(450, 20)) //must send it to Generator, otherwise, can't enable exposure
  1592. {
  1593. PRINTA_ERROR("Select OGP (450,20) fail\n");
  1594. return RET_STATUS::RET_FAILED;
  1595. }//ENDIF
  1596. if (!m_bInExam)
  1597. {
  1598. SendTUIButtonStatus(BTN_RESTORE_OGP, NORMAL);
  1599. }
  1600. m_bInExam = true;
  1601. return RET_STATUS::RET_SUCCEED;
  1602. }
  1603. RET_STATUS nsGEN::SMZDevice::ExitExam() //202110 对外接口
  1604. {
  1605. if (m_bInExam)
  1606. {
  1607. SendTUIButtonStatus(BTN_RESTORE_OGP, DIMMED);
  1608. Sleep(200);
  1609. SetPatientStatus(ACS_PAT_CLOSED);
  1610. }
  1611. m_bInExam = false;
  1612. return RET_STATUS::RET_SUCCEED;
  1613. }
  1614. /*********************************************************************************
  1615. 函数名称:SendTUIButton
  1616. 功能描述:设置TUI上Button按钮状态
  1617. 修改记录:
  1618. 2021-04-25 创建 (设置病人体型、设置TuiUndo信息)
  1619. *******************************************************************************/
  1620. bool nsGEN::SMZDevice::SendTUIButtonStatus(int nButtonType, int nStatus) ////2021-04 待完善功能:需要客户端设置 设置TUI Undo功能
  1621. {
  1622. stuibuttons_2_t1_tag PatientSize = {};
  1623. m_stGenCommand.id = STUIBUTTONS_2;
  1624. m_stGenCommand.target = TUI_IFtarget;
  1625. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
  1626. PatientSize.header = m_stGenCommand;
  1627. PatientSize.dummy1 = 0;
  1628. PatientSize.dummy2 = 0;
  1629. PatientSize.no_func = 1;
  1630. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  1631. memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  1632. memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&PatientSize), m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY));
  1633. stuibuttons_2_t2_tag TUIButton2 = {};
  1634. TUIButton2.tui_item = nButtonType;
  1635. TUIButton2.item_state = nStatus;
  1636. memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY)),
  1637. (ACS_BYTE*)(&TUIButton2), sizeof(ACS_INT) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE));
  1638. if (m_pAxnClient != NULL)
  1639. {
  1640. Sleep(m_nTUICOMMANDSENDWAITTIME);
  1641. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  1642. SendTelegramLog("STUIBUTTONS_2", "", m_stGenCommand.sender);
  1643. }//ENDIF
  1644. m_stGenCommand.target = Clienttarget;
  1645. delete[] p_ID;
  1646. p_ID = NULL;
  1647. PRINTA_INFO("== SEND == : SendTUIButtonStatus: ECOM ButtonType: %d,status: %d\n", nButtonType, nStatus);
  1648. return true;
  1649. }
  1650. /*********************************************************************************
  1651. 函数名称:SetPatientStatus
  1652. 功能描述:进入检查时通知XCU进入检查;退出时,通知XCU退出检查;
  1653. 修改记录:
  1654. 2021-04-25 创建
  1655. *******************************************************************************/
  1656. bool nsGEN::SMZDevice::SetPatientStatus(int nPatientStatus) //2021-04 待完善功能:需要客户端设置
  1657. {
  1658. sdfrpatwechsel_t1_tag szSendGen = {};
  1659. m_stGenCommand.id = SDFRPATWECHSEL;
  1660. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY);
  1661. m_stGenCommand.mode = Clientmode;
  1662. m_stGenCommand.sender = Clientsender;
  1663. m_stGenCommand.group_index = Clientgroup_index;
  1664. m_stGenCommand.target = Clienttarget;
  1665. szSendGen.header = m_stGenCommand;
  1666. szSendGen.pat_action = nPatientStatus;
  1667. if (m_pAxnClient != NULL)
  1668. {
  1669. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1670. std::ostringstream buffer;
  1671. buffer << "IS: pat_action: " << (int)szSendGen.pat_action;
  1672. string str = buffer.str();
  1673. SendTelegramLog("SDFRPATWECHSEL", str.c_str(), m_stGenCommand.sender, 0);
  1674. }
  1675. PRINTA_INFO("== SEND == : SetPatientStatus: PatientStatus:%d\n", nPatientStatus);
  1676. return true;
  1677. }
  1678. /*********************************************************************************
  1679. 函数名称:SetVersionInfor
  1680. 功能描述:设置版本信息
  1681. 参数描述:
  1682. nModuleIndex:
  1683. VERSIONINFOR_VISUALIZOR (1)
  1684. VERSIONINFOR_PIXRAD (2)
  1685. VERSIONINFOR_SOFTWARE (3)
  1686. 修改记录:
  1687. 2021-04-25 创建
  1688. 需要获得报文后继续完善
  1689. *******************************************************************************/
  1690. bool nsGEN::SMZDevice::SetVersionInfor(const char* strModuleName, const char* strVersionInfor) // 设置版本信息 //202110 SMV
  1691. {
  1692. sh_version_check_t1_tag SendVersionInfor = {};
  1693. m_stGenCommand.id = SH_VERSION_CHECK;
  1694. m_stGenCommand.target = ClientPMS;
  1695. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_BYTE) + sizeof(ACS_DCOUNT)
  1696. + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + UNIT_ID_LONG_LENGTH * sizeof(ACS_STRING) + VERSION_LONG_LENGTH * sizeof(ACS_STRING);
  1697. SendVersionInfor.header = m_stGenCommand;
  1698. SendVersionInfor.obj_count = -1; //Simenes 要求
  1699. SendVersionInfor.no_versions_long = 1;
  1700. ACS_BYTE* pCommand = new ACS_BYTE[m_stGenCommand.length * 2];
  1701. memset(pCommand, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  1702. memcpy((ACS_BYTE*)pCommand, (ACS_BYTE*)(&SendVersionInfor),
  1703. (m_wHeaderLength + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_BYTE) + sizeof(ACS_DCOUNT)));
  1704. //打包状态信息
  1705. sh_version_check_t2_tag strDiagInfor = {};
  1706. string strTemp = strModuleName;
  1707. int nstrNameLength = (int)strlen(strModuleName);
  1708. //Function code
  1709. if (strTemp.find("_FW") != string::npos) //更改命名规则 20191024
  1710. {
  1711. strDiagInfor.vers_type = ACS_FIRMWARE;
  1712. nstrNameLength = nstrNameLength - 3;
  1713. }
  1714. else
  1715. {
  1716. strDiagInfor.vers_type = ACS_SOFTWARE;
  1717. }
  1718. if (nstrNameLength >= UNIT_ID_LONG_LENGTH)
  1719. {
  1720. nstrNameLength = UNIT_ID_LONG_LENGTH;
  1721. }
  1722. memset(strDiagInfor.unit_id_long, 0, UNIT_ID_LONG_LENGTH * sizeof(ACS_STRING));
  1723. for (int j = 0; j < nstrNameLength; j++)
  1724. {
  1725. strDiagInfor.unit_id_long[j] = strModuleName[j];
  1726. }
  1727. memset(strDiagInfor.version_long, 0, VERSION_LONG_LENGTH * sizeof(ACS_STRING));
  1728. int nstrVersionInforLength = (int)strlen(strVersionInfor);
  1729. if (nstrVersionInforLength >= VERSION_LONG_LENGTH)
  1730. {
  1731. nstrVersionInforLength = VERSION_LONG_LENGTH;
  1732. }
  1733. for (int j = 0; j < nstrVersionInforLength; j++)
  1734. {
  1735. strDiagInfor.version_long[j] = strVersionInfor[j];
  1736. }
  1737. memcpy((ACS_BYTE*)(pCommand + (m_wHeaderLength + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_BYTE) + sizeof(ACS_DCOUNT))),
  1738. (ACS_BYTE*)(&strDiagInfor), sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + UNIT_ID_LONG_LENGTH * sizeof(ACS_STRING) + VERSION_LONG_LENGTH * sizeof(ACS_STRING));
  1739. if (m_pAxnClient != NULL)
  1740. {
  1741. m_pAxnClient->sendObject((ACS_BYTE*)pCommand);
  1742. std::ostringstream buffer;
  1743. buffer << "IS: SetVersionInfor: ModuleName: " << strModuleName << ", strDiagInfor.vers_type:" << strDiagInfor.vers_type << ", strDiagInfor.version_long:" << strVersionInfor;
  1744. string str = buffer.str();
  1745. SendTelegramLog("SH_VERSION_CHECK", str.c_str(), m_stGenCommand.sender, 0);
  1746. }//ENDIF
  1747. delete[]pCommand;
  1748. pCommand = NULL;
  1749. m_stGenCommand.target = Clienttarget;
  1750. PRINTA_INFO("== SEND == : SetVersionInfor: ModuleName: %s, NameLength:%d,Vers_type:%d,strVersionInfor:%s,VersionInforLength:%d\n", strModuleName, nstrNameLength, strDiagInfor.vers_type, strVersionInfor, nstrVersionInforLength);
  1751. return true;
  1752. }
  1753. ///*********************************************************************************
  1754. //函数名称:SetSH_DATA_TRANS
  1755. //功能描述:设置配置文件Backup/Resort状态
  1756. //修改记录:Backup
  1757. //2021-04-25 创建
  1758. //*******************************************************************************/
  1759. bool nsGEN::SMZDevice::SetSH_DATA_TRANS(float fResult, int nIdent) //2021-04 待完善功能:需要客户端设置 //202110 BRM
  1760. {
  1761. sh_data_trans_t1_tag SendSH_DATA_TRANS = {};
  1762. m_stGenCommand.id = SH_DATA_TRANS;
  1763. m_stGenCommand.target = ClientPMS;
  1764. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT) + sizeof(ACS_BYTE);
  1765. SendSH_DATA_TRANS.header = m_stGenCommand;
  1766. SendSH_DATA_TRANS.data_ack = (int)fResult;
  1767. SendSH_DATA_TRANS.data_ident = nIdent;
  1768. if (m_pAxnClient != NULL)
  1769. {
  1770. m_pAxnClient->sendObject((ACS_BYTE*)&SendSH_DATA_TRANS);
  1771. std::ostringstream buffer;
  1772. buffer << "IS: SendSH_DATA_TRANS.data_ack: " << SendSH_DATA_TRANS.data_ack << ", SendSH_DATA_TRANS.data_ident:" << SendSH_DATA_TRANS.data_ident;
  1773. string str = buffer.str();
  1774. SendTelegramLog("SH_DATA_TRANS", str.c_str(), m_stGenCommand.sender, 0);
  1775. }//ENDIF
  1776. m_stGenCommand.target = Clienttarget;
  1777. PRINTA_INFO("== SEND == : SetSH_DATA_TRANS: SendSH_DATA_TRANS.data_ack: %d, SendSH_DATA_TRANS.data_ident: %d\n",
  1778. SendSH_DATA_TRANS.data_ack, SendSH_DATA_TRANS.data_ident);
  1779. return true;
  1780. }
  1781. /*********************************************************************************
  1782. 函数名称:SetSatetySwitch
  1783. 功能描述:设置当前工作模式(主要设置到自动校正)
  1784. 修改记录:
  1785. 2021-04-22 改进代码风格
  1786. *******************************************************************************/
  1787. bool nsGEN::SMZDevice::SetSatetySwitch()//TODO: AutoCalibration //202110 校正接口 FPD
  1788. {
  1789. st_ss_t1_tag szSendGen = {};
  1790. m_stGenCommandFDC.id = ST_SS;
  1791. m_stGenCommandFDC.length = m_wHeaderLength + 3 * sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
  1792. m_stGenCommandFDC.mode = Clientmode;
  1793. m_stGenCommandFDC.sender = FDC_Controlsender;
  1794. m_stGenCommandFDC.group_index = Clientgroup_index;
  1795. m_stGenCommandFDC.target = Gentarget;
  1796. szSendGen.header = m_stGenCommandFDC;
  1797. szSendGen.sttype = ACS_CHANGE_IMMEDIATELY;
  1798. szSendGen.idx = NULL;
  1799. szSendGen.sw_switch = ACS_ON;
  1800. szSendGen.xray_man_enable = ACS_ENABLE_XRAY;
  1801. ACS_BYTE* sCommmand = new ACS_BYTE[m_stGenCommandFDC.length * 2];
  1802. memset(sCommmand, 0, m_stGenCommandFDC.length * sizeof(ACS_BYTE) * 2);
  1803. memcpy(sCommmand, &m_stGenCommandFDC, 8);
  1804. memcpy(sCommmand + 8, &szSendGen.sttype, sizeof(ACS_ENUM));
  1805. memcpy(sCommmand + 9, &szSendGen.idx, sizeof(ACS_BYTE));
  1806. memcpy(sCommmand + 10, &szSendGen.sw_switch, sizeof(ACS_ENUM));
  1807. memcpy(sCommmand + 11, &szSendGen.xray_man_enable, sizeof(ACS_ENUM));
  1808. if (m_pFDCAxnClient != NULL)
  1809. {
  1810. m_pFDCAxnClient->sendObject(sCommmand);
  1811. std::ostringstream buffer;
  1812. buffer << "IS: szSendGen.sttype: " << szSendGen.sttype << ", szSendGen.sw_switch:" << szSendGen.sw_switch;
  1813. string str = buffer.str();
  1814. SendTelegramLog("ST_SS", str.c_str(), m_stGenCommand.sender, 0);
  1815. }//ENDIF
  1816. delete[] sCommmand;
  1817. sCommmand = NULL;
  1818. PRINTA_INFO("== SEND == : ST_SS,SetSatetySwitch\n");
  1819. return true;
  1820. }
  1821. /*********************************************************************************
  1822. 函数名称:SendIDFRABSCHALTUNG
  1823. 功能描述:通知SCU当前view结束
  1824. 修改记录:
  1825. 2021-04-22 创建
  1826. *******************************************************************************/
  1827. bool nsGEN::SMZDevice::SendIDFRABSCHALTUNG()//TODO: 一张view结束; //202110 for校正接口 FPD
  1828. {
  1829. idfrabschaltung_t1_tag szSendGen = {};
  1830. m_stGenCommand.id = IDFRABSCHALTUNG;
  1831. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY);
  1832. szSendGen.header = m_stGenCommand;
  1833. szSendGen.abschgrund = 1; //Siemens要求
  1834. if (m_pAxnClient != NULL)
  1835. {
  1836. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1837. SendTelegramLog("IDFRABSCHALTUNG", "", m_stGenCommand.sender, 0);
  1838. }//ENDIF
  1839. PRINTA_INFO("== SEND == : IDFRABSCHALTUNG\n");
  1840. return true;
  1841. }
  1842. /*********************************************************************************
  1843. 函数名称:GetSwitchState
  1844. 功能描述:获取当前工作模式
  1845. 修改记录:
  1846. 2021-04-22 创建
  1847. *******************************************************************************/
  1848. bool nsGEN::SMZDevice::GetSwitchState()//TODO: AutoCalibration 202110 for CAM FPD
  1849. {
  1850. rq_object_t1_tag szSendGen = {};
  1851. m_stGenCommandFDC.id = RQ_OBJECT;
  1852. m_stGenCommandFDC.length = m_wHeaderLength + sizeof(ACS_WORD) + sizeof(ACS_DUMMY) + 2 * sizeof(ACS_ENUM) + 3 * sizeof(ACS_BYTE);
  1853. m_stGenCommandFDC.mode = Clientmode;//??
  1854. m_stGenCommandFDC.sender = FDC_Controlsender;
  1855. m_stGenCommandFDC.group_index = Clientgroup_index;//??
  1856. m_stGenCommandFDC.target = Gentarget;
  1857. szSendGen.header = m_stGenCommandFDC;
  1858. szSendGen.object_id = SH_SS;
  1859. szSendGen.send_rj = ACS_NO;
  1860. szSendGen.address_mode = 0; //Siemens提供默认值
  1861. szSendGen.ap_id = 0xFF;
  1862. szSendGen.version_rqobject = ACS_V_RQOBJECT;
  1863. szSendGen.procedure_id = 0; //Siemens提供默认值
  1864. szSendGen.dummy1 = 0; //Siemens提供默认值
  1865. ACS_BYTE* sCommmand = new ACS_BYTE[(m_stGenCommandFDC.length + 1) * 2];
  1866. memset(sCommmand, 0, (m_stGenCommandFDC.length + 1) * sizeof(ACS_BYTE) * 2);
  1867. memcpy(sCommmand, &m_stGenCommandFDC, 8);
  1868. memcpy(sCommmand + 8, &szSendGen.object_id, sizeof(ACS_WORD));
  1869. memcpy(sCommmand + 10, &szSendGen.send_rj, sizeof(ACS_ENUM));
  1870. memcpy(sCommmand + 11, &szSendGen.address_mode, sizeof(ACS_ENUM));
  1871. memcpy(sCommmand + 12, &szSendGen.ap_id, sizeof(ACS_BYTE));
  1872. memcpy(sCommmand + 13, &szSendGen.version_rqobject, sizeof(ACS_BYTE));
  1873. memcpy(sCommmand + 14, &szSendGen.procedure_id, sizeof(ACS_BYTE));
  1874. memcpy(sCommmand + 15, &szSendGen.dummy1, sizeof(ACS_DUMMY));
  1875. if (m_pFDCAxnClient != NULL)
  1876. {
  1877. m_pFDCAxnClient->sendObject(sCommmand);
  1878. std::ostringstream buffer;
  1879. buffer << "IS: szSendGen.object_id: " << szSendGen.object_id << ", szSendGen.send_rj:" << szSendGen.send_rj << ", szSendGen.address_mode:" << szSendGen.address_mode;
  1880. string str = buffer.str();
  1881. SendTelegramLog("RQ_OBJECT", str.c_str(), m_stGenCommand.sender, 0);
  1882. }//ENDIF
  1883. delete[] sCommmand;
  1884. sCommmand = NULL;
  1885. PRINTA_INFO("== SEND == : RQ_OBJECT,GetSwitchState Over\n");
  1886. return true;
  1887. }
  1888. /*********************************************************************************
  1889. 函数名称:SetFDErrorCode
  1890. 功能描述:设置SetFDErrorCode
  1891. 修改记录:
  1892. 2021-04-25 创建
  1893. *******************************************************************************/
  1894. bool nsGEN::SMZDevice::SetFDErrorCode(int nErrorCode, int nErrorType, string& strSN) //202110 for FPD接口
  1895. {
  1896. PRINTA_INFO("SetFDErrorCode\n");
  1897. ifehler2_t1_tag szSendGen = {};
  1898. m_stGenCommand.id = IFEHLER2;
  1899. 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);
  1900. m_stGenCommand.mode = Clientmode;
  1901. m_stGenCommand.sender = Clientsender;
  1902. m_stGenCommand.group_index = Clientgroup_index;
  1903. m_stGenCommand.target = Clienttarget;
  1904. szSendGen.header = m_stGenCommand;
  1905. szSendGen.fehlernummer = nErrorCode;
  1906. szSendGen.category = nErrorType; //Siemens 要求 WARNUNG 0x01 warning, BEHEB_FEHLER 0x02 error
  1907. szSendGen.no_args = 0; //siemens 要求 20191120
  1908. string strTempSN = strSN.substr(0, min(sizeof(strSN), STRARG_LENGTH));
  1909. for (int j = 0; j < sizeof(strTempSN); j++)
  1910. {
  1911. szSendGen.strarg[j] = strTempSN[j];
  1912. }
  1913. PRINTA_INFO("== SEND == : IFEHLER2 ErrorCode: %d ErrorCategory: %d,SN:%s\n", szSendGen.fehlernummer, szSendGen.category, strTempSN);
  1914. if (m_pAxnClient != NULL)
  1915. {
  1916. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  1917. std::ostringstream buffer;
  1918. buffer << "IS:fehlernummer:" << (int)szSendGen.fehlernummer << ",category:" << (int)szSendGen.category
  1919. << ", strarg: " << szSendGen.strarg;
  1920. string str = buffer.str();
  1921. SendTelegramLog("IFEHLER2", str.c_str(), m_stGenCommand.sender, 0);
  1922. return true;
  1923. }
  1924. else
  1925. {
  1926. return false;
  1927. }
  1928. }
  1929. /*********************************************************************************
  1930. 函数名称:SendPatientSize
  1931. 功能描述: 设置病人体型到XCU
  1932. 修改记录:
  1933. 2021-04-25 创建
  1934. *******************************************************************************/
  1935. bool nsGEN::SMZDevice::SendPatientSize(int nPatientSize) //2021-04 待完善功能:需要客户端设置 设置给TUI端 202110 SetStudyInfo
  1936. {
  1937. stuibuttons_2_t1_tag PatientSize = {};
  1938. m_stGenCommand.id = STUIBUTTONS_2;
  1939. m_stGenCommand.target = TUI_IFtarget;
  1940. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
  1941. PatientSize.header = m_stGenCommand;
  1942. PatientSize.dummy1 = 0;
  1943. PatientSize.dummy2 = 0;
  1944. PatientSize.no_func = 1; //默认设置1组病人信息
  1945. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  1946. memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  1947. memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&PatientSize), m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY));
  1948. stuibuttons_2_t2_tag PatientSize2 = {};
  1949. PatientSize2.tui_item = BTN_PATIENT_SIZE; //PAT_SIZE_SELECTION;
  1950. PatientSize2.item_state = NORMAL; // This TUI Button should be normally visible.
  1951. switch (nPatientSize) //备用 用于转换参数
  1952. {
  1953. case PATIENT_BODYSIZE_CUSTOM:
  1954. PatientSize2.param_8 = PATIENT_FLC_SIZE_CUSTOM;
  1955. break;
  1956. case PATIENT_BODYSIZE_LARGE:
  1957. PatientSize2.param_8 = PATIENT_FLC_SIZE_BIG;
  1958. break;
  1959. case PATIENT_BODYSIZE_MEDIUM:
  1960. PatientSize2.param_8 = PATIENT_FLC_SIZE_MEDIUM;
  1961. break;
  1962. case PATIENT_BODYSIZE_SMALL:
  1963. PatientSize2.param_8 = PATIENT_FLC_SIZE_SMALL;
  1964. break;
  1965. default:
  1966. PatientSize2.param_8 = PATIENT_FLC_SIZE_MEDIUM;
  1967. break;
  1968. }
  1969. memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY)),
  1970. (ACS_BYTE*)(&PatientSize2), sizeof(ACS_INT) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE));
  1971. if (m_pAxnClient != NULL)
  1972. {
  1973. Sleep(m_nTUICOMMANDSENDWAITTIME);
  1974. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  1975. std::ostringstream buffer;
  1976. buffer << "IS: PatientSize.no_func: " << PatientSize.no_func << ", PatientSize2.param_8:" << PatientSize2.param_8;
  1977. string str = buffer.str();
  1978. SendTelegramLog("STUIBUTTONS_2", str.c_str(), m_stGenCommand.sender, 0);
  1979. }//ENDIF
  1980. m_stGenCommand.target = Clienttarget;
  1981. delete[] p_ID;
  1982. p_ID = NULL;
  1983. PRINTA_INFO("== SEND == : SendPatientSize: ECOM patientsize: %d,PatientType: %d(150), Patient Size:%d\n", nPatientSize, PatientSize2.tui_item, PatientSize2.param_8);
  1984. return true;
  1985. }
  1986. /*********************************************************************************
  1987. 函数名称:SendPatientInfor
  1988. 功能描述: 设置病人名及病人ID
  1989. 修改记录:
  1990. 2021-04-25 创建
  1991. *******************************************************************************/
  1992. bool nsGEN::SMZDevice::SendPatientInfor(wstring& wstrPatientName, wstring& wstrPatientID) //set Patient Information to XCU //2021-04 待完善功能:需要客户端设置 设置病人名及ID号 202110 SetStudyInfo
  1993. {
  1994. int PatientInfoPart1Length = m_wHeaderLength + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_DCOUNT) + sizeof(ACS_BYTE);
  1995. int PatientInfoPart2Length = sizeof(ACS_ENUM) + sizeof(ACS_DUMMY) + sizeof(ACS_WORD) + DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING);
  1996. PRINTA_INFO("PatientInfoPart1: %d,PatientInfoPart2:%d\n", PatientInfoPart1Length, PatientInfoPart2Length);
  1997. sh_disp_long_t1 PatientInfoDisplayPart1 = {};
  1998. m_stGenCommand.id = SH_DISP_LONG;
  1999. m_stGenCommand.target = TUItarget;
  2000. m_stGenCommand.mode = 0;
  2001. m_stGenCommand.length = PatientInfoPart1Length + PatientInfoPart2Length * 2;
  2002. PatientInfoDisplayPart1.header = m_stGenCommand;
  2003. PatientInfoDisplayPart1.no_disp_long = 2;//default
  2004. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  2005. memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  2006. memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&PatientInfoDisplayPart1),
  2007. PatientInfoPart1Length);
  2008. PRINTA_INFO("Start PatientNameDisplayPart2\n");
  2009. sh_disp_long_t2 PatientInfoDisplayPart2_Name = {};
  2010. PatientInfoDisplayPart2_Name.disp_func = AXCS_DISP_PATIENT_DATA1; //Name
  2011. memset(PatientInfoDisplayPart2_Name.disp_value_long, 0, DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING));
  2012. int nPatientNameLength = (int)(wstrPatientName.size());
  2013. if (nPatientNameLength > DISP_VALUE_LONG_LENGTH)
  2014. {
  2015. nPatientNameLength = DISP_VALUE_LONG_LENGTH;
  2016. }
  2017. for (int j = 0; j < nPatientNameLength; j++)
  2018. {
  2019. PatientInfoDisplayPart2_Name.disp_value_long[j] = wstrPatientName[j];
  2020. }
  2021. memcpy((ACS_BYTE*)(p_ID + PatientInfoPart1Length),
  2022. (ACS_BYTE*)(&PatientInfoDisplayPart2_Name), PatientInfoPart2Length);
  2023. PRINTA_INFO("end PatientInfoDisplayPart2_Name\n");
  2024. sh_disp_long_t2 PatientInfoDisplayPart2_ID = {};
  2025. PatientInfoDisplayPart2_ID.disp_func = AXCS_DISP_PATIENT_DATA2; //ID
  2026. memset(PatientInfoDisplayPart2_ID.disp_value_long, 0, DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING));
  2027. int nPatientIDLength = (int)(wstrPatientID.size());
  2028. if (nPatientIDLength > DISP_VALUE_LONG_LENGTH)
  2029. {
  2030. nPatientIDLength = DISP_VALUE_LONG_LENGTH;
  2031. }
  2032. for (int j = 0; j < nPatientIDLength; j++)
  2033. {
  2034. PatientInfoDisplayPart2_ID.disp_value_long[j] = wstrPatientID[j];
  2035. }
  2036. memcpy((ACS_BYTE*)(p_ID + PatientInfoPart1Length + PatientInfoPart2Length),
  2037. (ACS_BYTE*)(&PatientInfoDisplayPart2_ID), PatientInfoPart2Length);
  2038. PRINTA_INFO("end PatientInfoDisplayPart2_ID\n");
  2039. if (m_pAxnClient != NULL)
  2040. {
  2041. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  2042. }//ENDIF
  2043. m_stGenCommand.target = Clienttarget;
  2044. m_stGenCommand.mode = Clientmode;
  2045. delete[] p_ID;
  2046. p_ID = NULL;
  2047. return true;
  2048. }
  2049. /*********************************************************************************
  2050. 函数名称:SendPositionImageName
  2051. 功能描述: 设置当前选中的View的缩略图名称到TUI
  2052. 修改记录:
  2053. 2021-04-25 创建
  2054. *******************************************************************************/
  2055. bool nsGEN::SMZDevice::SendPositionImageName(string& strPatientPositionImageName) //2021-04 待完善功能:需要客户端设置
  2056. {
  2057. int PatientInfoPart1Length = m_wHeaderLength + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_DCOUNT) + sizeof(ACS_BYTE);
  2058. int PatientInfoPart2Length = sizeof(ACS_ENUM) + sizeof(ACS_DUMMY) + sizeof(ACS_WORD) + DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING);
  2059. PRINTA_INFO("PatientInfoPart1: %d,PatientInfoPart2:%d\n", PatientInfoPart1Length, PatientInfoPart2Length);
  2060. sh_disp_long_t1 PatientInfoDisplayPart1 = {};
  2061. m_stGenCommand.id = SH_DISP_LONG;
  2062. m_stGenCommand.target = TUItarget;
  2063. m_stGenCommand.mode = 0;
  2064. m_stGenCommand.length = PatientInfoPart1Length + PatientInfoPart2Length * 2;
  2065. PatientInfoDisplayPart1.header = m_stGenCommand;
  2066. PatientInfoDisplayPart1.no_disp_long = 1;//default
  2067. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  2068. memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  2069. memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&PatientInfoDisplayPart1),
  2070. PatientInfoPart1Length);
  2071. //Patient Name
  2072. sh_disp_long_t2 PatientInfoDisplayPart2_Name = {};
  2073. //Function code
  2074. PatientInfoDisplayPart2_Name.disp_func = AXCS_DISP_PATIENT_POS1; //Name
  2075. memset(PatientInfoDisplayPart2_Name.disp_value_long, 0, DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING));
  2076. int nstrPatientInfoLength = (int)sizeof(strPatientPositionImageName);
  2077. for (int j = 0; j < nstrPatientInfoLength; j++)
  2078. {
  2079. PatientInfoDisplayPart2_Name.disp_value_long[j] = strPatientPositionImageName[j];
  2080. }
  2081. memcpy((ACS_BYTE*)(p_ID + PatientInfoPart1Length),
  2082. (ACS_BYTE*)(&PatientInfoDisplayPart2_Name), PatientInfoPart2Length);
  2083. if (m_pAxnClient != NULL)
  2084. {
  2085. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  2086. SendTelegramLog("SH_DISP_LONG", "", m_stGenCommand.sender, 0);
  2087. }//ENDIF
  2088. m_stGenCommand.target = Clienttarget;
  2089. m_stGenCommand.mode = Clientmode;
  2090. delete[] p_ID;
  2091. p_ID = NULL;
  2092. PRINTA_INFO("== SEND == : SendPatient Position: name: %s\n", strPatientPositionImageName);
  2093. return true;
  2094. }
  2095. /*********************************************************************************
  2096. 函数名称:SendFPDSerialNumber
  2097. 功能描述: 设置探测器序列号到PMS端
  2098. 修改记录:
  2099. 2015-04-20 创建
  2100. *******************************************************************************/
  2101. bool nsGEN::SMZDevice::SendFPDSerialNumber(int nFPDType, const char* strFPDNumber)
  2102. {
  2103. int nSiemensWS = -1;
  2104. switch (nFPDType)
  2105. {
  2106. case WS_PARAM_TABLE_ECOM:
  2107. nSiemensWS = ACS_FD_TABLE;
  2108. break;
  2109. case WS_PARAM_WALL_ECOM:
  2110. nSiemensWS = ACS_FD_WALL;
  2111. break;
  2112. case WS_PARAM_FREE_ECOM:
  2113. nSiemensWS = ACS_FD_PORTABLE;
  2114. break;
  2115. case WS_PARAM_FREE1_LARGE_ECOM:
  2116. nSiemensWS = ACS_FD_PORTABLE;
  2117. break;
  2118. case WS_PARAM_FREE2_SMALL_ECOM:
  2119. nSiemensWS = ACS_FD_SMALL_PORTABLE;
  2120. break;
  2121. default:
  2122. nSiemensWS = nFPDType;
  2123. break;
  2124. }
  2125. sh_fdr_data_t1_tag FPDSerialNumber = {};
  2126. m_stGenCommand.id = SH_FDR_DATA;
  2127. m_stGenCommand.target = ClientPMS;
  2128. 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);
  2129. FPDSerialNumber.header = m_stGenCommand;
  2130. FPDSerialNumber.obj_count = -1; //siemens要求
  2131. if (strFPDNumber == "")
  2132. {
  2133. FPDSerialNumber.fdr_ack = ACS_NOK;
  2134. }
  2135. else
  2136. {
  2137. FPDSerialNumber.fdr_ack = ACS_OK;
  2138. }
  2139. FPDSerialNumber.fdr_rq_index = 1; //siemens要求
  2140. FPDSerialNumber.detector_plane = nSiemensWS; //VE61X
  2141. FPDSerialNumber.no_fdr_data = 1; //siemens要求
  2142. ACS_BYTE* pCommand = new ACS_BYTE[m_stGenCommand.length * 2];
  2143. memset(pCommand, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  2144. 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));
  2145. if (strFPDNumber != "")
  2146. {
  2147. sh_fdr_data_t2_tag FPDSerialNumber2 = {};
  2148. FPDSerialNumber2.fdr_param_tag = ACS_FDR_SERNUM; // Serial Number VE61X Siemens 确认过
  2149. FPDSerialNumber2.dummy2 = 0; //Serial Number
  2150. memset(FPDSerialNumber2.fdr_param, 0, FDR_PARAM_LENGTH * sizeof(ACS_STRING_8));
  2151. int nstrFPDSerialNumberLength = (int)strlen(strFPDNumber);
  2152. for (int j = 0; j < nstrFPDSerialNumberLength; j++)
  2153. {
  2154. FPDSerialNumber2.fdr_param[j] = strFPDNumber[j];
  2155. }
  2156. memcpy((ACS_BYTE*)(pCommand + m_wHeaderLength + sizeof(ACS_DCOUNT) + sizeof(ACS_DUMMY) + sizeof(ACS_INT) + 2 * sizeof(ACS_ENUM) + sizeof(ACS_BYTE)),
  2157. (ACS_BYTE*)(&FPDSerialNumber2), FDR_PARAM_LENGTH * sizeof(ACS_STRING_8) + sizeof(ACS_ENUM) + sizeof(ACS_DUMMY));
  2158. }
  2159. if (m_pAxnClient != NULL)
  2160. {
  2161. m_pAxnClient->sendObject((ACS_BYTE*)pCommand);
  2162. std::ostringstream buffer;
  2163. buffer << "IS:detector_plane:" << (int)nFPDType << ", FPDSerialNumber:" << strFPDNumber;
  2164. string str = buffer.str();
  2165. SendTelegramLog("SH_FDR_DATA", str.c_str(), m_stGenCommand.sender, 0);
  2166. }//ENDIF
  2167. m_stGenCommand.target = Clienttarget;
  2168. delete[] pCommand;
  2169. pCommand = NULL;
  2170. PRINTA_INFO("== SEND == : SendFPDSerialNumber: Detect Type: %d,SiemensWS: %d,FPDSerialNumber: %s\n", nFPDType, nSiemensWS, strFPDNumber);
  2171. return true;
  2172. }
  2173. /*********************************************************************************
  2174. 函数名称:TubeHeatTest
  2175. 功能描述: 模拟测试球管热容量
  2176. 对应需求:IS_display_heatunits_test(VERSION_RAD3-VA10)
  2177. 修改记录:
  2178. 2021-04-25 创建
  2179. *******************************************************************************/
  2180. bool nsGEN::SMZDevice::TubeHeatTest(void)
  2181. {
  2182. sservtestcmd_t1 szSendGen = {};
  2183. m_stGenCommand.id = SSERVTESTCMD;
  2184. m_stGenCommand.length = m_wHeaderLength + 4 * sizeof(ACS_BYTE) + sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT);
  2185. m_stGenCommand.mode = Clientmode;
  2186. m_stGenCommand.sender = Clientsender;
  2187. m_stGenCommand.group_index = Clientgroup_index;
  2188. m_stGenCommand.target = Clienttarget;
  2189. szSendGen.header = m_stGenCommand;
  2190. szSendGen.apid = Clienttarget;
  2191. szSendGen.cmdkennung = 5; //Siemens要求
  2192. szSendGen.anzahldaten = 1; //Siemens要求
  2193. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  2194. memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  2195. memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen),
  2196. m_stGenCommand.length - sizeof(ACS_BYTE));
  2197. sservtestcmd_t2 szSendGen2 = {};
  2198. szSendGen2.daten = 0; //默认要求
  2199. memcpy((ACS_BYTE*)p_ID + (m_stGenCommand.length - sizeof(ACS_BYTE)), (ACS_BYTE*)(&szSendGen2),
  2200. sizeof(ACS_BYTE));
  2201. if (m_pAxnClient != NULL)
  2202. {
  2203. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  2204. SendTelegramLog("SSERVTESTCMD", "", m_stGenCommand.sender, 0);
  2205. }
  2206. delete[] p_ID;
  2207. p_ID = NULL;
  2208. PRINTA_INFO("== SEND == : TubeHeatTest\n");
  2209. return true;
  2210. }
  2211. ///*********************************************************************************
  2212. //函数名称:SetSHCONFIG
  2213. //功能描述: 配置文件结果处理,对应ST_CONFIG
  2214. //修改记录:
  2215. //2021-04-25 创建
  2216. //*******************************************************************************/
  2217. bool nsGEN::SMZDevice::SetSHCONFIG(float fResult) //2021-04 待完善功能:需要客户端设置
  2218. {
  2219. sh_config_t1_tag SendSHConfig = {};
  2220. m_stGenCommand.id = SH_CONFIG;
  2221. m_stGenCommand.target = ClientPMS;
  2222. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 5 * sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT);
  2223. SendSHConfig.header = m_stGenCommand;
  2224. /* Parameter: cfg_ack (Defines) --------------------------------------------------------------------------------------*/
  2225. /* ACS_OK 1 the operation is accepted */
  2226. /* ACS_NOK 2 the operation is not accepted */
  2227. /* ACS_NODATA 3 no data available */
  2228. /* */
  2229. /*####################################################################################################################*/
  2230. SendSHConfig.cfg_ack = (int)fResult;
  2231. if (m_pAxnClient != NULL)
  2232. {
  2233. m_pAxnClient->sendObject((ACS_BYTE*)&SendSHConfig);
  2234. std::ostringstream buffer;
  2235. buffer << "IS: SendSHConfig.cfg_ack:" << (int)SendSHConfig.cfg_ack;
  2236. string str = buffer.str();
  2237. SendTelegramLog("SH_CONFIG", str.c_str(), m_stGenCommand.sender, 0);
  2238. }//ENDIF
  2239. m_stGenCommand.target = Clienttarget;
  2240. PRINTA_INFO("== SEND == : SetSHCONFIG: fResult: %f, SendSHConfig.cfg_ack: %d\n", fResult, SendSHConfig.cfg_ack);
  2241. return true;
  2242. }
  2243. /*********************************************************************************
  2244. 函数名称:SetPanelRotate
  2245. 功能描述:设置探测器旋转方向
  2246. 修改记录:
  2247. 2021-04-25 创建
  2248. *******************************************************************************/
  2249. bool nsGEN::SMZDevice::SetPanelRotate(int nPanelRotate) //2021-04 待完善功能:需要客户端设置
  2250. {
  2251. PRINTA_INFO("Set PanelRotate: %d\n", nPanelRotate);
  2252. ibewegung2_t1_tag szSendGen = {};
  2253. m_stGenCommand.id = IBEWEGUNG2;
  2254. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_DUMMY) * 3 + sizeof(ACS_COUNT) + sizeof(ACS_INT) + sizeof(ACS_BYTE) + sizeof(ACS_ENUM);
  2255. m_stGenCommand.mode = Clientmode;
  2256. m_stGenCommand.sender = Clientsender;
  2257. m_stGenCommand.group_index = Clientgroup_index;
  2258. m_stGenCommand.target = Clienttarget;
  2259. szSendGen.header = m_stGenCommand;
  2260. szSendGen.aktanzahl = 1;
  2261. ibewegung2_t2_tag szSendGen2 = {};
  2262. szSendGen2.antrieb = ACS_DETECTOR_ORIENTATION;
  2263. szSendGen2.antriebstatus = STOP_MIT_ZIELPOSITION;
  2264. szSendGen2.physposition = nPanelRotate;
  2265. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  2266. memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  2267. memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_wHeaderLength + sizeof(ACS_DUMMY) * 3 + sizeof(ACS_COUNT)); //指令默认长度
  2268. 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)); //默认指令长度
  2269. if (m_pAxnClient != NULL)
  2270. {
  2271. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  2272. std::ostringstream buffer;
  2273. buffer << "IS:aktanzahl: " << (int)szSendGen.aktanzahl << ",physposition: " << (int)szSendGen2.physposition;
  2274. string str = buffer.str();
  2275. SendTelegramLog("IBEWEGUNG2", str.c_str(), m_stGenCommand.sender, 0);
  2276. }
  2277. else
  2278. {
  2279. PRINTA_INFO("IBEWEGUNG2 : m_pAxnClient = null\n");
  2280. }
  2281. delete[] p_ID;
  2282. p_ID = NULL;
  2283. PRINTA_INFO("== SEND == : IBEWEGUNG2\n");
  2284. return TRUE;
  2285. }
  2286. /*********************************************************************************
  2287. 函数名称:SetScreenSaver
  2288. 功能描述:控制锁屏功能(1:锁屏启动;0:锁屏关闭)
  2289. 对应需求:
  2290. 修改记录:
  2291. 2021-4-25 创建
  2292. *******************************************************************************/
  2293. bool nsGEN::SMZDevice::SetScreenSaver(int nScreenSaver) //2021-04 待完善功能:需要客户端设置
  2294. {
  2295. if (nScreenSaver >= 1)
  2296. {
  2297. SendIdfrStatus(0, 0, 0);
  2298. }
  2299. m_stGenCommand.id = SBEDALLG;
  2300. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
  2301. m_stGenCommand.mode = Clientmode;
  2302. m_stGenCommand.sender = Clientsender;
  2303. m_stGenCommand.group_index = Clientgroup_index;
  2304. m_stGenCommand.target = Clienttarget;
  2305. sbedallg_t1_tag szSendGen = {};
  2306. szSendGen.bedeinh = GERAETENAHBEDIENUNG;
  2307. szSendGen.bedienobj = EIN_AUS_TASTE;
  2308. szSendGen.fktscodeallg = SCREENSAVER_ON_OFF;
  2309. if (nScreenSaver >= 1)
  2310. {
  2311. szSendGen.param = DRUCKORIENTIERTE_TASTE;
  2312. }
  2313. else
  2314. {
  2315. szSendGen.param = ACS_NO_INFORMATION;
  2316. }
  2317. szSendGen.dummy1 = 0;
  2318. szSendGen.dummy2 = 0;
  2319. szSendGen.header = m_stGenCommand;
  2320. if (m_pAxnClient != NULL)
  2321. {
  2322. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  2323. std::ostringstream buffer;
  2324. buffer << "IS:ScreenSaver param: " << (int)szSendGen.param;
  2325. string str = buffer.str();
  2326. SendTelegramLog("SBEDALLG", str.c_str(), m_stGenCommand.sender, 0);
  2327. }//ENDIF
  2328. PRINTA_INFO("== SEND == : SBEDALLG nScreenSaver: %d,szSendGen.param: %d\n", nScreenSaver,(int)szSendGen.param);
  2329. m_nScreenSaver = nScreenSaver;
  2330. if (nScreenSaver == 0)
  2331. {
  2332. SendIdfrStatus(m_nIdfrstatus, m_nIdfrstatus);
  2333. }
  2334. return true;
  2335. }
  2336. ///*********************************************************************************
  2337. //函数名称:GetLastErrorAmount
  2338. //功能描述:获取当前的错误数量
  2339. //对应需求:
  2340. //修改记录:
  2341. //2021-4-25 创建
  2342. //*******************************************************************************/
  2343. bool nsGEN::SMZDevice::GetLastErrorAmount()
  2344. {
  2345. m_GenConfig["LastErrorCount"] = m_nErrorCount;
  2346. m_UIClientUnit.m_ERA->Update(m_nErrorCount);
  2347. FireNotify(m_UIClientUnit.m_ERA->GetKey(), m_UIClientUnit.m_ERA->JSGet());
  2348. ResDataObject config, writecontent;
  2349. writecontent.add("CONFIGURATION", m_GenConfig);
  2350. writecontent.SaveFile(m_strConfigPath.c_str());
  2351. PRINTA_INFO("GetLastErrorAmount: Write the error number: %d,bResult:%d\n", m_nErrorCount);
  2352. return true;
  2353. }
  2354. ///*********************************************************************************
  2355. //函数名称:SetST_SYSTEM_STATE
  2356. //功能描述:设置ST_SYSTEM_STATE报文
  2357. //修改记录:
  2358. //2021-07-21 创建
  2359. //*******************************************************************************/
  2360. bool nsGEN::SMZDevice::SetST_SYSTEM_STATE(int nStatus) //202110 for 校正时调用 设置系统状态
  2361. {
  2362. st_system_state_t1_tag szSendGen = {};
  2363. m_stGenCommand.id = ST_SYSTEM_STATE;
  2364. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_SET) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
  2365. szSendGen.header = m_stGenCommand;
  2366. szSendGen.system_state = nStatus; //Siemens要求
  2367. if (m_pAxnClient != NULL)
  2368. {
  2369. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  2370. std::ostringstream buffer;
  2371. buffer << "IS: szSendGen.system_state:" << (int)szSendGen.system_state;
  2372. string str = buffer.str();
  2373. SendTelegramLog("ST_SYSTEM_STATE", str.c_str(), m_stGenCommand.sender, 0);
  2374. }//ENDIF
  2375. PRINTA_INFO("== SEND == : ST_SYSTEM_STATE: %d\n", nStatus);
  2376. return true;
  2377. }
  2378. /*********************************************************************************
  2379. 函数名称:SendOrthoLocalParam
  2380. 功能描述:设置拼接协议,包括曝光参数及位置信息
  2381. 修改记录:
  2382. 2021-4-21 创建
  2383. *******************************************************************************/
  2384. bool nsGEN::SMZDevice::SendOrthoLocalParam(int nWS, float fKV, float fMA, float fMS, float fMAS, int nFO, int nET, int nAECFieldSel, int nAECFilmSel,
  2385. float fAECDensity, ACS_BYTE nTarget, float fCollimatorWidth, float fCollimatorHeight, float fAECDose, int nFilter,
  2386. int nTubeLoad, int nGridType, int nOrthoType, float fRelativePosition, float fSID, float fBeamAngle, int nOrthoDir, int nPartialCP,
  2387. int nPatientSize, int nOperationMode, int nAlignmentMode, int nTracking, int nSidTracking)
  2388. {
  2389. PRINTA_INFO("SendOrthoLocalParam IS:nWS:%d, nFO:%d, nET:%d, fKV:%f, fMA:%f, fMS:%f, fMAS:%f\n",
  2390. nWS, nFO, nET, fKV, fMA, fMS, fMAS);
  2391. st_cp_data_t1_tag szSendGen;
  2392. m_stGenCommand.id = ST_CP_DATA;
  2393. m_stGenCommand.target = nTarget;
  2394. m_stGenCommand.length = m_wHeaderLength + 9 * sizeof(ACS_INT)
  2395. + 12 * sizeof(ACS_ENUM) + 10 * sizeof(ACS_BYTE) + 2 * sizeof(ACS_LINT) + 2 * sizeof(ACS_WORD) + 2 * sizeof(ACS_DUMMY);
  2396. szSendGen.header = m_stGenCommand;
  2397. //WorkStation
  2398. int nGenWS = 0;
  2399. OrthoWSUI2Gen(nWS, nGenWS); //for ortho, table:0; wall:1
  2400. szSendGen.exp_target = nGenWS;
  2401. szSendGen.strahler = 1; //siemens
  2402. szSendGen.relative_cp_pos_usage = ACS_USE_REL_POS; //Siemens 要求
  2403. szSendGen.partial_cp = nPartialCP;
  2404. //Tech Mode
  2405. nET = TECHMODE_NOAEC_2P; //临时代码 待完善
  2406. switch (nET)
  2407. {
  2408. case TECHMODE_AEC_1P:
  2409. m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_1P);
  2410. szSendGen.technik = _1_PUNKT_TECHNIK;
  2411. break;
  2412. case TECHMODE_AEC_3P:
  2413. m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_3P);
  2414. szSendGen.technik = _1_PUNKT_TECHNIK;
  2415. break;
  2416. case TECHMODE_AEC_1P_REDUCEMA:
  2417. m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_1P_REDUCEMA);
  2418. szSendGen.technik = _1_PUNKT_TECHNIK_RED_STROM;
  2419. break;
  2420. case TECHMODE_NOAEC_2P:
  2421. m_DoseUnit.m_Techmode->Update(TECHMODE_NOAEC_2P);
  2422. szSendGen.technik = _2_PUNKT_TECHNIK;
  2423. break;
  2424. case TECHMODE_NOAEC_3P:
  2425. m_DoseUnit.m_Techmode->Update(TECHMODE_NOAEC_3P);
  2426. szSendGen.technik = _3_PUNKT_TECHNIK;
  2427. break;
  2428. default:
  2429. break;
  2430. }
  2431. FireNotify(AttrKey::TECHMODE, m_DoseUnit.m_Techmode->JSGet());
  2432. int nOperationModeBK = nOperationMode;
  2433. //if ((int)m_SiemensSalmon_Element[CMD_ELEMENT_OPERATIONMODE].fSetValue == OPM_NORMAL)
  2434. {
  2435. if (nWS == WS_CONVENTIONAL)
  2436. {
  2437. nOperationMode = OPM_CASSETTE;
  2438. }
  2439. else
  2440. {
  2441. nOperationMode = OPM_NORMAL;
  2442. }
  2443. }
  2444. //else if ((int)m_SiemensSalmon_Element[CMD_ELEMENT_OPERATIONMODE].fSetValue == OPM_ORTHO)
  2445. //{
  2446. // nOperationMode = OPM_ORTHO;
  2447. //}
  2448. //else
  2449. //{
  2450. // nOperationMode = OPM_NORMAL;
  2451. //}
  2452. szSendGen.operation_mode = nOperationMode;
  2453. PRINTA_INFO("SendOrthoLocalParam: WS: %d, Operation mode : %d,Original Operation mode: %d\n", nWS, nOperationMode, nOperationModeBK);
  2454. //return true;
  2455. //kv
  2456. //int nKV = (int)(fKV * 10);
  2457. //int nKvPos = GetFacKvValue(nKV);
  2458. //szSendGen.kv = g_KV_List[nKvPos];
  2459. szSendGen.kv = (int)(fKV * 10);
  2460. //mas
  2461. //int nMAS = (int)(fMAS * 1000);
  2462. //int nMasPos = GetFacmAsValue(nMAS);
  2463. //szSendGen.mas = (int)(g_MAS_List[nMasPos] / 10); //取整
  2464. szSendGen.mas = (int)(fMAS * 100);
  2465. //MS
  2466. if (nET == TECHMODE_NOAEC_3P)
  2467. {
  2468. int nms = (int)(fMS * 1000);
  2469. int nPos = GetFacmSValue(nms);
  2470. PRINTA_INFO("nPos: %d\n", nPos);
  2471. if (nPos < (int)(sizeof(g_MS_List) / sizeof(int)))
  2472. {
  2473. nms = g_MS_List[nPos] / 100;
  2474. }
  2475. else
  2476. {
  2477. nPos = (int)(sizeof(g_MS_List) / sizeof(int)) - 1;
  2478. nms = g_MS_List[nPos] / 100;
  2479. }
  2480. PRINTA_INFO("Set ARP ms: %d\n", nms);
  2481. szSendGen.ms = nms;
  2482. }
  2483. else
  2484. {
  2485. szSendGen.ms = (ACS_LINT)(m_DoseUnit.m_MS->Get() * 10);
  2486. }
  2487. //dose
  2488. int nAECDose = (int)(fAECDose * 100);
  2489. int nAECDosePos = 0;
  2490. nAECDosePos = GetFacAECDoseValue(nAECDose); //for salmon
  2491. if (nWS == WS_CONVENTIONAL)
  2492. {
  2493. switch (nAECFilmSel)
  2494. {
  2495. case GEN_AECFILM_H:
  2496. szSendGen.dosis = GEN_AECFILM_H; //siemens 要求
  2497. break;
  2498. case GEN_AECFILM_U:
  2499. szSendGen.dosis = GEN_AECFILM_U; //siemens 要求
  2500. break;
  2501. case GEN_AECFILM_D:
  2502. szSendGen.dosis = GEN_AECFILM_D; //siemens 要求
  2503. break;
  2504. default:
  2505. szSendGen.dosis = GEN_AECFILM_U; //siemens 要求
  2506. break;
  2507. }
  2508. }
  2509. else
  2510. {
  2511. szSendGen.dosis = g_AECDOSE_List[nAECDosePos] * 10;
  2512. }
  2513. //kv dr
  2514. szSendGen.kvdr = 0; //siemens 要求
  2515. //blackening correction
  2516. szSendGen.schwaerzkorr = (ACS_INT)(fAECDensity * 4); //density
  2517. //size
  2518. szSendGen.szeit = 1; //siemens 要求
  2519. //曝光曲线
  2520. szSendGen.kennl = 1; //siemens 要求
  2521. //焦点
  2522. if (nFO == FOCUS_SMALL)
  2523. {
  2524. nFO = KLEINER_FOKUS;
  2525. }
  2526. else if (nFO == FOCUS_LARGE)
  2527. {
  2528. nFO = GROSSER_FOKUS;
  2529. }
  2530. else
  2531. {
  2532. nFO = _3_FOKUS;
  2533. }
  2534. szSendGen.fokus = nFO;
  2535. //szSendGen.proz = 80; // tube Load
  2536. szSendGen.proz = nTubeLoad; // tube Load
  2537. //regstop
  2538. szSendGen.regstop = 0; //siemens 要求
  2539. //filteraufn
  2540. switch (nFilter)
  2541. {
  2542. case GEN_FILTER_CU_0:
  2543. szSendGen.filteraufn = Cu_00mm;
  2544. break;
  2545. case GEN_FILTER_CU_1:
  2546. szSendGen.filteraufn = Cu_01mm;
  2547. break;
  2548. case GEN_FILTER_CU_2:
  2549. szSendGen.filteraufn = Cu_02mm;
  2550. break;
  2551. case GEN_FILTER_CU_3:
  2552. szSendGen.filteraufn = Cu_03mm;
  2553. break;
  2554. default:
  2555. szSendGen.filteraufn = Cu_00mm;
  2556. break;
  2557. }
  2558. //Grid number
  2559. szSendGen.grid_requested = SwitchGridFocusECOM2SIEMENSORTHO(nWS, nGridType); //Ortho下 Grid 类型需要进一步提供
  2560. szSendGen.ortho_range_def_method = nOrthoType; //20200410
  2561. if (m_bCalibMode)
  2562. {
  2563. szSendGen.cp_category = CP_FD_CALIB;
  2564. }
  2565. else
  2566. {
  2567. szSendGen.cp_category = CP_NORMAL;
  2568. }
  2569. //height of collimation
  2570. szSendGen.coll_height = (ACS_INT)(fCollimatorHeight * 100); // 0.1mm
  2571. //width of collimation
  2572. szSendGen.coll_width = (ACS_INT)(fCollimatorWidth * 100); //0.1mm
  2573. szSendGen.auto_zoom = ACS_NO_INFORMATION; //siemens
  2574. //add 映射
  2575. switch (nPatientSize)
  2576. {
  2577. case PATIENT_BODYSIZE_LARGE:
  2578. szSendGen.pat_bmi = PAT_THN_L;
  2579. break;
  2580. case PATIENT_BODYSIZE_MEDIUM:
  2581. szSendGen.pat_bmi = PAT_THN_M;
  2582. break;
  2583. case PATIENT_BODYSIZE_SMALL:
  2584. szSendGen.pat_bmi = PAT_THN_S;
  2585. break;
  2586. case PATIENT_BODYSIZE_CUSTOM:
  2587. default:
  2588. szSendGen.pat_bmi = PAT_THN_M;
  2589. break;
  2590. }
  2591. szSendGen.position_cp = fRelativePosition;
  2592. szSendGen.sid = (int)fSID;
  2593. szSendGen.oblique_beam_angle = fBeamAngle * 100;
  2594. szSendGen.alignment_mode = nAlignmentMode; //siemens
  2595. szSendGen.tracking = nTracking; //siemens
  2596. szSendGen.sid_tracking = nSidTracking; //siemens
  2597. szSendGen.ortho_dir = nOrthoDir;
  2598. int nAECField2Gen = 0;
  2599. switch (nAECFieldSel)
  2600. {
  2601. case FIELD_RIGHT:
  2602. nAECField2Gen = RECHTS;
  2603. break;
  2604. case FIELD_CENTER:
  2605. nAECField2Gen = MITTE;
  2606. break;
  2607. case FIELD_RIGHT_CENTER:
  2608. nAECField2Gen = MITTE_RECHTS;
  2609. break;
  2610. case FIELD_LEFT:
  2611. nAECField2Gen = LINKS;
  2612. break;
  2613. case FIELD_LEFT_RIGHT:
  2614. nAECField2Gen = LINKS_RECHTS;
  2615. break;
  2616. case FIELD_CENTER_LEFT:
  2617. nAECField2Gen = LINKS_MITTE;
  2618. break;
  2619. case FIELD_LEFT_CENTER_RIGHT:
  2620. nAECField2Gen = LINKS_MITTE_RECHTS;
  2621. break;
  2622. default:
  2623. break;
  2624. }
  2625. szSendGen.frate = 0; //siemens要求 VE61X
  2626. szSendGen.gewmessf = nAECField2Gen;
  2627. szSendGen.xrpt_flrad = 500;
  2628. if ((nET == TECHMODE_NOAEC_3P) && (szSendGen.ms > 500))
  2629. {
  2630. szSendGen.xrpt_flrad = 3200;
  2631. }
  2632. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  2633. ::memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  2634. ::memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_stGenCommand.length); //指令默认长度
  2635. if (m_pAxnClient != NULL)
  2636. {
  2637. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  2638. }
  2639. else
  2640. {
  2641. PRINTA_INFO("== SEND == : m_pAxnClient = NULL");
  2642. }
  2643. delete[] p_ID;
  2644. p_ID = NULL;
  2645. PRINTA_INFO("== SEND == : ST_CP_DATA IS:exp_target: %d,fokus:%d,technik:%d,kv:%d, mas: %d,ms:%d,\
  2646. position_cp: %d,alignment_mode: %d, szSendGen.operation_mode: %d,szSendGen.cp_category: %d\n",
  2647. szSendGen.exp_target, szSendGen.fokus, szSendGen.technik, szSendGen.kv, szSendGen.mas, szSendGen.ms,
  2648. szSendGen.position_cp,szSendGen.alignment_mode, szSendGen.operation_mode,szSendGen.cp_category);
  2649. if (nTarget == ClientPMS)
  2650. {
  2651. m_stGenCommand.target = Clienttarget;
  2652. }
  2653. std::ostringstream buffer;
  2654. buffer << "IS:exp_target:" << (int)szSendGen.exp_target << ", fokus:" << (int)szSendGen.fokus
  2655. << ", technik :" << (int)szSendGen.technik << ", gewmessf(AECFieldSel) : " << (int)szSendGen.gewmessf
  2656. << ", schwaerzkorr(AECDensity):" << (int)szSendGen.schwaerzkorr << ",kv:" << (int)szSendGen.kv
  2657. << ",mas:" << (int)szSendGen.mas << ", ms : " << (int)szSendGen.ms << ",filteraufn(Filter):"
  2658. << (int)szSendGen.filteraufn << ",dosis:" << (int)szSendGen.dosis << ",proz(TubeLoad):" << (int)szSendGen.proz
  2659. << ", coll_height :" << (int)szSendGen.coll_height << ",coll_width :" << (int)szSendGen.coll_width
  2660. << ", grid_requested(GridType) :" << (int)szSendGen.grid_requested << ",ortho_range_def_method:" << (int)szSendGen.ortho_range_def_method << ", position_cp: " << szSendGen.position_cp
  2661. << ", SID :" << (int)szSendGen.sid << ", oblique_beam_angle :" << (int)szSendGen.oblique_beam_angle
  2662. << ", ortho_dir :" << (int)szSendGen.ortho_dir << ",alignment_mode :" << (int)szSendGen.alignment_mode
  2663. << ", szSendGen.operation_mode : " << (int)szSendGen.operation_mode << ",pat_bmi:" << (int)szSendGen.pat_bmi
  2664. << ", tracking:" << (int)szSendGen.tracking << ", sid_tracking:" << (int)szSendGen.sid_tracking
  2665. << ", sid :" << (int)szSendGen.sid << ", szSendGen.xrpt_flrad :" << (int)szSendGen.xrpt_flrad;
  2666. string str = buffer.str();
  2667. SendTelegramLog("ST_CP_DATA", str.c_str(), m_stGenCommand.sender);
  2668. return true;
  2669. }
  2670. /*********************************************************************************
  2671. 函数名称:SendGenData
  2672. 功能描述:调节参数指令(增加或减少)
  2673. 对应需求:IS_buttons_kv_mAs_ms(VERSION_RAD3-VA10)
  2674. 修改记录:
  2675. 2021-04-20 创建
  2676. *******************************************************************************/
  2677. bool nsGEN::SMZDevice::SendGenData(int interfaceType, int AdjustMode, int nFunctionID, int nGenData, int nUnitChange) //adjust parameter
  2678. {
  2679. sbedgen_t1 szSendGen;
  2680. m_stGenCommand.id = SBEDGEN;
  2681. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
  2682. szSendGen.bedeinh = interfaceType;
  2683. szSendGen.bedienobj = AdjustMode;
  2684. szSendGen.fktscodegen = nFunctionID;
  2685. //szSendGen.param = (ACS_INT)nGenData;
  2686. if (nUnitChange == 1)
  2687. {
  2688. szSendGen.param = (ACS_INT)nGenData / 10;
  2689. }
  2690. else
  2691. {
  2692. szSendGen.param = (ACS_INT)nGenData;
  2693. }
  2694. szSendGen.header = m_stGenCommand;
  2695. ACS_BYTE* sCommmand = new ACS_BYTE[(m_stGenCommand.length + 1) * 2];
  2696. ::memset(sCommmand, 0, (m_stGenCommand.length + 1) * sizeof(ACS_BYTE) * 2);
  2697. ::memcpy(sCommmand, &m_stGenCommand, 8);
  2698. ::memcpy(sCommmand + 8, &szSendGen.bedeinh, 1);
  2699. ::memcpy(sCommmand + 9, &szSendGen.bedienobj, 1);
  2700. ::memcpy(sCommmand + 10, &szSendGen.fktscodegen, 2);
  2701. ::memcpy(sCommmand + 12, &szSendGen.param, 2);
  2702. szSendGen.header = m_stGenCommand;
  2703. if (m_pAxnClient != NULL)
  2704. {
  2705. m_pAxnClient->sendObject(sCommmand);
  2706. //std::ostringstream buffer;
  2707. //buffer << "IS: szSendGen.bedeinh:" << (int)szSendGen.bedeinh << ", szSendGen.bedienobj:" << szSendGen.bedienobj << ", szSendGen.fktscodegen" << szSendGen.fktscodegen << ", szSendGen.param:" << szSendGen.param;
  2708. //string str = buffer.str();
  2709. //SendTelegramLog("SBEDGEN", str.c_str(), m_stGenCommand.sender, 0);
  2710. }//ENDIF
  2711. PRINTA_INFO("=== Send GenData == fktscodegen:%d,param:%d\n", nFunctionID, nGenData);
  2712. delete[] sCommmand;
  2713. sCommmand = NULL;
  2714. //==============================================================SBEDGEN2=============================================
  2715. //send SBEDGEN2报文
  2716. sbedgen2_t1 szSendGen2;
  2717. m_stGenCommand.id = SBEDGEN2;
  2718. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + sizeof(ACS_INT) + sizeof(ACS_LINT);
  2719. szSendGen2.bedeinh = interfaceType;
  2720. szSendGen2.bedienobj = AdjustMode;
  2721. szSendGen2.fktscodegen = nFunctionID;
  2722. szSendGen2.param_32 = (ACS_LINT)nGenData;
  2723. szSendGen2.header = m_stGenCommand;
  2724. ACS_BYTE* sCommmand2 = new ACS_BYTE[m_stGenCommand.length];
  2725. ::memset(sCommmand2, 0, m_stGenCommand.length * sizeof(ACS_BYTE));
  2726. ::memcpy(sCommmand2, &m_stGenCommand, 8);
  2727. ::memcpy(sCommmand2 + 8, &szSendGen2.bedeinh, 1);
  2728. ::memcpy(sCommmand2 + 9, &szSendGen2.bedienobj, 1);
  2729. ::memcpy(sCommmand2 + 10, &szSendGen2.fktscodegen, 2);
  2730. szSendGen2.param_32 = (ACS_LINT)nGenData;
  2731. ::memcpy(sCommmand2 + 12, &szSendGen2.param_32, sizeof(ACS_LINT));
  2732. szSendGen2.header = m_stGenCommand;
  2733. if (m_pAxnClient != NULL)
  2734. {
  2735. m_pAxnClient->sendObject(sCommmand2);
  2736. std::ostringstream buffer;
  2737. buffer << "IS: szSendGen.bedeinh:" << (int)szSendGen2.bedeinh << ", szSendGen.bedienobj:" << szSendGen2.bedienobj << ", szSendGen.fktscodegen" << szSendGen2.fktscodegen << ", szSendGen.param_32:" << szSendGen2.param_32;
  2738. string str = buffer.str();
  2739. SendTelegramLog("SBEDGEN2", str.c_str(), m_stGenCommand.sender, 0);
  2740. }//ENDIF
  2741. PRINTA_INFO("=== Send GenData2 == fktscodegen:%d,param:%d\n", nFunctionID, nGenData);
  2742. delete[] sCommmand2;
  2743. sCommmand2 = NULL;
  2744. return true;
  2745. }
  2746. /*********************************************************************************
  2747. 函数名称:SendsBEDSP
  2748. 功能描述:调节参数指令(对应Dose)
  2749. 对应需求:IS_buttons_DOSE(VERSION_RAD3-VA10)
  2750. 修改记录:
  2751. 2021-04-20 创建
  2752. *******************************************************************************/
  2753. bool nsGEN::SMZDevice::SendsBEDSP(int interfaceType, int AdjustMode, int nFunctionID, int nGenData) //adjust parameter
  2754. {
  2755. sbedsp_t1 szSendGen;
  2756. m_stGenCommand.id = SBEDSP;
  2757. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
  2758. szSendGen.bedeinh = interfaceType;
  2759. szSendGen.bedienobj = AdjustMode;
  2760. szSendGen.fktscodesp = nFunctionID;
  2761. szSendGen.param = (ACS_INT)nGenData;
  2762. szSendGen.header = m_stGenCommand;
  2763. ACS_BYTE* sCommmand = new ACS_BYTE[(m_stGenCommand.length + 1) * 2];
  2764. ::memset(sCommmand, 0, (m_stGenCommand.length + 1) * sizeof(ACS_BYTE) * 2);
  2765. ::memcpy(sCommmand, &m_stGenCommand, 8);
  2766. ::memcpy(sCommmand + 8, &szSendGen.bedeinh, 1);
  2767. ::memcpy(sCommmand + 9, &szSendGen.bedienobj, 1);
  2768. ::memcpy(sCommmand + 10, &szSendGen.fktscodesp, 2);
  2769. ::memcpy(sCommmand + 12, &szSendGen.param, 2);
  2770. szSendGen.header = m_stGenCommand;
  2771. if (m_pAxnClient != NULL)
  2772. {
  2773. m_pAxnClient->sendObject(sCommmand);
  2774. std::ostringstream buffer;
  2775. buffer << "IS: szSendGen.bedeinh:" << (int)szSendGen.bedeinh << ", szSendGen.bedienobj:" << szSendGen.bedienobj << ", szSendGen.fktscodesp" << szSendGen.fktscodesp << ", szSendGen.param:" << szSendGen.param;
  2776. string str = buffer.str();
  2777. SendTelegramLog("SBEDSP", str.c_str(), m_stGenCommand.sender, 0);
  2778. }//ENDIF
  2779. PRINTA_INFO("=== Send GenData == fktscodegen:%d,param:%d\n", nFunctionID, nGenData);
  2780. delete[] sCommmand;
  2781. sCommmand = NULL;
  2782. return true;
  2783. }
  2784. /*********************************************************************************
  2785. 函数名称:SetFilter
  2786. 功能描述:设置Filter参数
  2787. 修改记录:
  2788. 2021-04-20 创建
  2789. *******************************************************************************/
  2790. bool nsGEN::SMZDevice::SetFilter(int nFilterType)
  2791. {
  2792. GetFacFilterValue(nFilterType);
  2793. m_stGenCommand.id = SBEDSTRM;
  2794. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
  2795. m_stGenCommand.mode = Clientmode;
  2796. m_stGenCommand.sender = Clientsender;
  2797. m_stGenCommand.group_index = Clientgroup_index;
  2798. m_stGenCommand.target = Clienttarget;
  2799. sbedstrm_t1_tag szSendGen = {};
  2800. szSendGen.bedeinh = DFR_BEDIENUNG;
  2801. szSendGen.bedienobj = SELEKTIONSTASTEN;
  2802. szSendGen.fktscodestrm = FILTER_EINFAHREN;
  2803. switch (nFilterType)
  2804. {
  2805. case GEN_FILTER_CU_0:
  2806. szSendGen.param = 0; // Cu_00mm;
  2807. break;
  2808. case GEN_FILTER_CU_1:
  2809. szSendGen.param = 1;// Cu_01mm;
  2810. break;
  2811. case GEN_FILTER_CU_2:
  2812. szSendGen.param = 2;// Cu_02mm;
  2813. break;
  2814. case GEN_FILTER_CU_3:
  2815. szSendGen.param = 3;// Cu_03mm;
  2816. break;
  2817. default:
  2818. szSendGen.param = 0;// Cu_00mm;
  2819. break;
  2820. }
  2821. szSendGen.dummy1 = 0;
  2822. szSendGen.dummy2 = 0;
  2823. szSendGen.header = m_stGenCommand;
  2824. //CString strLog = "";
  2825. if (m_pAxnClient != NULL)
  2826. {
  2827. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  2828. PRINTA_INFO("IS: Filter param: %d\n", szSendGen.param);
  2829. std::ostringstream buffer;
  2830. buffer << "IS: Filter param:" << (int)szSendGen.param;
  2831. string str = buffer.str();
  2832. SendTelegramLog("SBEDSTRM", str.c_str(), m_stGenCommand.sender);
  2833. }//ENDIF
  2834. return true;
  2835. }
  2836. /*********************************************************************************
  2837. 函数名称:SetTubeLoad
  2838. 功能描述:设置TubeLoad参数
  2839. 对应需求:IS_rad_button_tube_load
  2840. 修改记录:
  2841. 2021-04-20 创建
  2842. *******************************************************************************/
  2843. bool nsGEN::SMZDevice::SetTubeLoad(int nTubeLoad)
  2844. {
  2845. return SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, ROEHRENAUSLASTUNG, nTubeLoad);
  2846. }
  2847. /*********************************************************************************
  2848. 函数名称:GetFacKvValue
  2849. 功能描述:将设置的KV值映射到当前KV参数列表的位置
  2850. 修改记录:
  2851. 2021-04-21 创建
  2852. *******************************************************************************/
  2853. int nsGEN::SMZDevice::GetFacKvValue(int& nkv)
  2854. {
  2855. if (nkv <= 0)
  2856. {
  2857. nkv = g_KV_List[0];
  2858. return 0;
  2859. }//ENDIF
  2860. int nlength = static_cast <int>(g_KV_List.size());
  2861. int nPos = 0;
  2862. int nValue = 0;
  2863. if (nkv <= g_KV_List[0])
  2864. {
  2865. nPos = 0;
  2866. }
  2867. else if (nkv >= g_KV_List[nlength - 1])
  2868. {
  2869. nPos = nlength - 1;
  2870. }//endif
  2871. else
  2872. {
  2873. for (int i = 0; i < nlength; i++)
  2874. {
  2875. if (i == nlength - 1)
  2876. {
  2877. nPos = i;
  2878. break;
  2879. }
  2880. else
  2881. {
  2882. if ((nkv >= g_KV_List[i]) && (nkv < g_KV_List[i + 1]))
  2883. {
  2884. nPos = i;
  2885. break;
  2886. }//ENDIF
  2887. }
  2888. }
  2889. }
  2890. nkv = g_KV_List[nPos];
  2891. return nPos;
  2892. }
  2893. /*********************************************************************************
  2894. 函数名称:GetFacmSValue
  2895. 功能描述:将设置的MS值映射到当前MS参数列表的位置
  2896. 修改记录:
  2897. 2021-04-20 创建
  2898. *******************************************************************************/
  2899. int nsGEN::SMZDevice::GetFacmSValue(int& nms)
  2900. {
  2901. if (nms <= 0)
  2902. {
  2903. nms = g_MS_List[0];
  2904. return 0;
  2905. }//ENDIF
  2906. int nlength = static_cast<int> (g_MS_List.size());
  2907. int nPos = 0;
  2908. int nValue = 0;
  2909. if (nms <= g_MS_List[0])
  2910. {
  2911. nPos = 0;
  2912. }
  2913. else if (nms >= g_MS_List[nlength - 1])
  2914. {
  2915. nPos = nlength - 1;
  2916. }
  2917. else
  2918. {
  2919. for (int i = 0; i < nlength; i++)
  2920. {
  2921. if (i == nlength - 1)
  2922. {
  2923. nPos = i;
  2924. break;
  2925. }
  2926. else
  2927. {
  2928. if ((nms >= g_MS_List[i]) && (nms < g_MS_List[i + 1]))
  2929. {
  2930. nPos = i;
  2931. break;
  2932. }//ENDIF
  2933. }//ENDIF
  2934. }
  2935. }
  2936. nms = g_MS_List[nPos];
  2937. return nPos;
  2938. }
  2939. /*********************************************************************************
  2940. 函数名称:GetFacmASValue
  2941. 功能描述:将设置的MAS值映射到当前MAS参数列表的位置
  2942. 修改记录:
  2943. 2021-04-20 创建
  2944. *******************************************************************************/
  2945. int nsGEN::SMZDevice::GetFacmAsValue(int& nmAs)
  2946. {
  2947. if (nmAs <= 0)
  2948. {
  2949. nmAs = g_MAS_List[0];
  2950. return 0;
  2951. }//ENDIF
  2952. int nlength = static_cast<int> (g_MAS_List.size());
  2953. int nPos = 0;
  2954. int nValue = 0;
  2955. if (nmAs <= g_MAS_List[0])
  2956. {
  2957. nPos = 0;
  2958. }
  2959. else if (nmAs >= g_MAS_List[nlength - 1])
  2960. {
  2961. nPos = nlength - 1;
  2962. }
  2963. else
  2964. {
  2965. for (int i = 0; i < nlength; i++)
  2966. {
  2967. if (i == nlength - 1)
  2968. {
  2969. nPos = i;
  2970. break;
  2971. }
  2972. else
  2973. {
  2974. if ((nmAs >= g_MAS_List[i]) && (nmAs < g_MAS_List[i + 1]))
  2975. {
  2976. int nmAsMed = (g_MAS_List[i] + g_MAS_List[i + 1]) / 2;
  2977. if (nmAs >= nmAsMed)
  2978. {
  2979. nPos = i + 1;
  2980. }
  2981. else
  2982. {
  2983. nPos = i;
  2984. }
  2985. break;
  2986. }//ENDIF
  2987. }//ENDIF
  2988. }
  2989. }
  2990. nmAs = g_MAS_List[nPos];
  2991. PRINTA_INFO("Set GetFacmAsValue: nlength: %d, nPos:%d,nmas: %d\n", nlength, nPos, nmAs);
  2992. return nPos;
  2993. }
  2994. /*********************************************************************************
  2995. 函数名称:GetFacDensityValue
  2996. 功能描述:将设置的AECDensity值映射到当前AECDensity参数列表的位置
  2997. 修改记录:
  2998. 2021-04-20 创建
  2999. *******************************************************************************/
  3000. int nsGEN::SMZDevice::GetFacDensityValue(int& nDensity)
  3001. {
  3002. int nlength = static_cast<int> (g_AECDensity_List.size());
  3003. int nPos = 0;
  3004. int nValue = 0;
  3005. if (nDensity <= g_AECDensity_List[0])
  3006. {
  3007. nPos = 0;
  3008. }
  3009. else if (nDensity >= g_AECDensity_List[nlength - 1])
  3010. {
  3011. nPos = nlength - 1;
  3012. }
  3013. else
  3014. {
  3015. for (int i = 0; i < nlength; i++)
  3016. {
  3017. if (i == nlength - 1)
  3018. {
  3019. nPos = i;
  3020. break;
  3021. }
  3022. else
  3023. {
  3024. if ((nDensity >= g_AECDensity_List[i]) && (nDensity < g_AECDensity_List[i + 1]))
  3025. {
  3026. nPos = i;
  3027. break;
  3028. }//ENDIF
  3029. }//ENDIF
  3030. }
  3031. }
  3032. nDensity = g_AECDensity_List[nPos];
  3033. return nPos;
  3034. }
  3035. /*********************************************************************************
  3036. 函数名称:GetFacAECDoseValue
  3037. 功能描述:将设置的AECDOSE值映射到当前AECDOSE参数列表的位置
  3038. 参数内容:实际值*100
  3039. 修改记录:
  3040. 2021-04-20 创建
  3041. *******************************************************************************/
  3042. int nsGEN::SMZDevice::GetFacAECDoseValue(int& nAECDose)
  3043. {
  3044. int nlength = static_cast<int> (g_AECDOSE_List.size());
  3045. int nPos = 0;
  3046. int nValue = 0;
  3047. if (nAECDose <= g_AECDOSE_List[0])
  3048. {
  3049. nPos = 0;
  3050. }
  3051. else if (nAECDose >= g_AECDOSE_List[nlength - 1])
  3052. {
  3053. nPos = nlength - 1;
  3054. }
  3055. else
  3056. {
  3057. for (int i = 0; i < nlength; i++)
  3058. {
  3059. if (i == nlength - 1)
  3060. {
  3061. nPos = i;
  3062. break;
  3063. }
  3064. else
  3065. {
  3066. if ((nAECDose >= g_AECDOSE_List[i]) && (nAECDose < g_AECDOSE_List[i + 1]))
  3067. {
  3068. nPos = i;
  3069. break;
  3070. }
  3071. }//ENDIF
  3072. }
  3073. }
  3074. nAECDose = g_AECDOSE_List[nPos];
  3075. return nPos;
  3076. }
  3077. /*********************************************************************************
  3078. 函数名称:GetFacFilterValue
  3079. 功能描述:将设置的Filter值映射到当前Filter参数列表的位置
  3080. 参数内容:实际值*10
  3081. 修改记录:
  3082. 2021-04-20 创建
  3083. *******************************************************************************/
  3084. int nsGEN::SMZDevice::GetFacFilterValue(int& nFilter)
  3085. {
  3086. int nlength = static_cast<int> (g_FILTER_List.size());
  3087. int nPos = 0;
  3088. int nValue = 0;
  3089. if (nFilter <= g_FILTER_List[0])
  3090. {
  3091. nPos = 0;
  3092. }
  3093. else if (nFilter >= g_FILTER_List[nlength - 1])
  3094. {
  3095. nPos = nlength - 1;
  3096. }
  3097. else
  3098. {
  3099. for (int i = 0; i < nlength; i++)
  3100. {
  3101. if (i == nlength - 1)
  3102. {
  3103. nPos = i;
  3104. break;
  3105. }
  3106. else
  3107. {
  3108. if ((nFilter <= g_FILTER_List[i]) && (nFilter < g_FILTER_List[i + 1]))
  3109. {
  3110. nPos = i;
  3111. break;
  3112. }//endif
  3113. }
  3114. }//ENDIF
  3115. }
  3116. nFilter = g_FILTER_List[nPos];
  3117. return nPos;
  3118. }
  3119. /*********************************************************************************
  3120. 函数名称:OrthoWSUI2Gen
  3121. 功能描述:切换workstations从UI到XCU,用于映射对应的workstation值
  3122. 修改记录:
  3123. 2021-04-21 创建
  3124. *******************************************************************************/
  3125. void nsGEN::SMZDevice::OrthoWSUI2Gen(int nUIWS, int& nGenWS)
  3126. {
  3127. try
  3128. {
  3129. if (nUIWS == WS_TABLE) //lying: cross mode
  3130. {
  3131. nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoTable"]);
  3132. }
  3133. else if (nUIWS == WS_WALL) //standing mode
  3134. {
  3135. nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoWall"]);
  3136. }
  3137. else if (nUIWS == WS_FREE) //mobile mode
  3138. {
  3139. nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoFree"]);
  3140. }
  3141. else if (nUIWS == WS_TOMO) //tomo mode
  3142. {
  3143. nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoFree"]);
  3144. }
  3145. else if (nUIWS == WS_CONVENTIONAL) //Conventional table
  3146. {
  3147. nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoConventional"]);
  3148. }
  3149. else
  3150. {
  3151. nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoFree"]);
  3152. }
  3153. }
  3154. catch (ResDataObjectExption& exp)
  3155. {
  3156. PRINTA_ERROR("Get configuration failed, %s\n", exp.what());
  3157. }
  3158. PRINTA_INFO("Ortho Set WS: %d,Generator workstaion: %d\n", nUIWS, nGenWS);
  3159. }
  3160. /*********************************************************************************
  3161. 函数名称:SwitchGridFocusECOM2SIEMENSORTHO
  3162. 功能描述:切换workstations从UI到XCU,用于映射对应的workstation值
  3163. 修改记录:
  3164. 2021-04-21 创建
  3165. *******************************************************************************/
  3166. int nsGEN::SMZDevice::SwitchGridFocusECOM2SIEMENSORTHO(int nWS, int nECOMGridType)
  3167. {
  3168. int nSiemensGridType = GRID_FOCUS_NOGRID;
  3169. switch (nECOMGridType)
  3170. {
  3171. case GRID_FOCUS_UNIVERSAL:
  3172. {
  3173. if (nWS == WS_TABLE)
  3174. {
  3175. nSiemensGridType = ORTHO_GRID_FOCUS_UNIVERSAL_TABLE_SIEMSN;
  3176. }
  3177. else if (nWS == WS_WALL)
  3178. {
  3179. nSiemensGridType = ORTHO_GRID_FOCUS_UNIVERSAL_WALL_SIEMENS;
  3180. }
  3181. break;
  3182. }
  3183. case GRID_FOCUS_1800:
  3184. if (nWS == WS_TABLE)
  3185. {
  3186. nSiemensGridType = ORTHO_GRID_FOCUS_1800;
  3187. }
  3188. else if (nWS == WS_WALL)
  3189. {
  3190. nSiemensGridType = ORTHO_GRID_FOCUS_1800_WALL_SIEMENS;
  3191. }
  3192. break;
  3193. default:
  3194. nSiemensGridType = nECOMGridType;
  3195. break;
  3196. }
  3197. if ((nWS != WS_TABLE) && (nWS != WS_WALL))
  3198. {
  3199. nSiemensGridType = GRID_FOCUS_NOGRID; //Siemens要求:在free和casste模式下,不设置Gridtype;
  3200. }
  3201. return nSiemensGridType;
  3202. }
  3203. /*********************************************************************************
  3204. 函数名称:TurnOffFDCRequest
  3205. 功能描述: 确认探测器Turnoff请求
  3206. 修改记录:
  3207. 2021-04-25 创建
  3208. *******************************************************************************/
  3209. void nsGEN::SMZDevice::TurnOffFDCRequest()
  3210. {
  3211. if (m_pFDCAxnClient)
  3212. {
  3213. inlist_red_t1 inlistRedObj = {};
  3214. int no_objects_p = 0;
  3215. inlist_red_t2* pinlist_red_t2_p = NULL;
  3216. unsigned int iObjectSize = sizeof(*pinlist_red_t2_p) * no_objects_p;
  3217. inlistRedObj.header.length = (int)(sizeof(inlistRedObj)) + iObjectSize;
  3218. inlistRedObj.header.mode = ACS_MODE_FUNCTIONAL;
  3219. inlistRedObj.header.target = ACS_NO_TARGET;
  3220. inlistRedObj.header.group_index = 0x01;
  3221. inlistRedObj.header.sender = FDC_Controlsender;
  3222. inlistRedObj.header.id = INLIST_RED;
  3223. inlistRedObj.no_objects = (ACS_DCOUNT)no_objects_p;
  3224. // Allocate memory for the data to be sent.
  3225. ACS_BYTE* pDataForSending = new ACS_BYTE[inlistRedObj.header.length * 2];
  3226. if (pDataForSending == NULL)
  3227. {
  3228. //DO NOTHING
  3229. }//ENDIF
  3230. // Copy all objects together in a continous section of memory.
  3231. ACS_BYTE* pCh = pDataForSending;
  3232. memcpy(pCh, &inlistRedObj, sizeof(inlistRedObj));
  3233. pCh += sizeof(inlistRedObj);
  3234. memcpy(pCh, pinlist_red_t2_p, iObjectSize);
  3235. // Send the resulting memory section.
  3236. ACS_ENUM axnResult = CAxnClientIF::sendObjectToServer(pDataForSending);
  3237. // Release memory.
  3238. delete[] pDataForSending;
  3239. pDataForSending = NULL;
  3240. pCh = NULL;
  3241. if (axnResult != ACS_AXN_OK)
  3242. {
  3243. // Error while sending.
  3244. }//ENDIF
  3245. PRINTA_INFO("Turnoff FDC request\n");
  3246. }//ENDIF
  3247. }
  3248. /*********************************************************************************
  3249. 函数名称:SendIasuStatus
  3250. 功能描述:设置当前系统状态到XCU端
  3251. 修改记录:
  3252. 2021-04-20 创建
  3253. *******************************************************************************/
  3254. bool nsGEN::SMZDevice::SendIasuStatus(int nDRStatus, int nRFStatus)
  3255. {
  3256. iasustatus_t1_tag szSendGen = {};
  3257. m_stGenCommand.id = IASUSTATUS;
  3258. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_BYTE) + 2 * sizeof(ACS_DUMMY);
  3259. szSendGen.dfraufnbereit = nDRStatus;
  3260. szSendGen.dfrdlbereit = nDRStatus;
  3261. szSendGen.header = m_stGenCommand;
  3262. if (m_pAxnClient != NULL)
  3263. {
  3264. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  3265. std::ostringstream buffer;
  3266. buffer << "IS: dfraufnbereit: " << (int)szSendGen.dfraufnbereit << ",dfrdlbereit: " << (int)szSendGen.dfrdlbereit;
  3267. string str = buffer.str();
  3268. SendTelegramLog("IASUSTATUS", str.c_str(), m_stGenCommand.sender,0);
  3269. }//ENDIF
  3270. PRINTA_INFO("== SEND == : IASUSTATUS dfraufnbereit: %d, dfrdlbereit:%d\n", nDRStatus, nRFStatus);
  3271. return true;
  3272. }
  3273. RET_STATUS nsGEN::SMZDevice::SetExpEnable() //202110 对外接口
  3274. {
  3275. PRINTA_INFO("SetExpEnable\n");
  3276. if (m_bCalibMode)
  3277. {
  3278. if (m_bGetIGENANZ)
  3279. {
  3280. EnableExposure(1);
  3281. m_bGetIGENANZ = false;
  3282. PRINTA_INFO("SetExpEnable: Set EnableExposure");
  3283. }
  3284. else
  3285. {
  3286. m_bSetEnable = true;
  3287. }
  3288. }
  3289. else
  3290. {
  3291. EnableExposure(1);
  3292. }
  3293. PRINTA_INFO("SetExpEnable: m_bCalibMode: %d, m_bSetEnable: %d, m_bGetIGENANZ: %d\n",(int)m_bCalibMode,(int)m_bSetEnable,(int)m_bGetIGENANZ);
  3294. return RET_STATUS::RET_SUCCEED;
  3295. }
  3296. RET_STATUS nsGEN::SMZDevice::SetExpDisable() //202110 对外接口
  3297. {
  3298. PRINTA_INFO("SetExpDisable\n");
  3299. m_bSetEnable = false;
  3300. if (((int)m_DoseUnit.m_GenState->Get() != (int)AttrKey::GENERATOR_STATUS_ERROR))
  3301. {
  3302. EnableExposure(0);
  3303. }
  3304. else
  3305. {
  3306. PRINTA_INFO("SetExpDisable,the same disable status from Axim,don't send disable status to Axim\n");
  3307. }
  3308. return RET_STATUS::RET_SUCCEED;
  3309. }
  3310. /*********************************************************************************
  3311. 函数名称:SendSAUSLBED
  3312. 功能描述:设置当前工作模式(主要设置到自动校正),手闸按下
  3313. 对应需求:IS_Service_xrayrelease
  3314. 修改记录:
  3315. 2015-04-20 创建
  3316. 2017-01-04 改进代码风格
  3317. *******************************************************************************/
  3318. bool nsGEN::SMZDevice::SendSAUSLBED(bool bEnable) //202110 对外接口
  3319. {
  3320. if (bEnable)
  3321. {
  3322. PRINTA_INFO("SAUSLBED 0,1,1\n");
  3323. }
  3324. else
  3325. {
  3326. PRINTA_INFO("SAUSLBED 0,0,0\n");
  3327. }
  3328. sauslbed_t1_tag szSendGen = {};
  3329. m_stGenCommandFDC.id = SAUSLBED;
  3330. m_stGenCommandFDC.length = m_wHeaderLength + 3 * sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
  3331. m_stGenCommandFDC.mode = Clientmode;
  3332. m_stGenCommandFDC.sender = FDC_Controlsender;
  3333. m_stGenCommandFDC.group_index = Clientgroup_index;
  3334. m_stGenCommandFDC.target = Clienttarget;
  3335. szSendGen.header = m_stGenCommandFDC;
  3336. szSendGen.bedeinh = SERVICEPC;
  3337. if (bEnable)
  3338. {
  3339. szSendGen.dl = AUS;
  3340. szSendGen.vorbereitung = EIN;//一档
  3341. szSendGen.hk = EIN;//二档
  3342. }
  3343. else
  3344. {
  3345. szSendGen.dl = AUS;
  3346. szSendGen.vorbereitung = AUS;//一档
  3347. szSendGen.hk = AUS;//二档
  3348. }
  3349. ACS_BYTE* sCommmand = new ACS_BYTE[m_stGenCommandFDC.length * 2];
  3350. memset(sCommmand, 0, m_stGenCommandFDC.length * sizeof(ACS_BYTE) * 2);
  3351. memcpy(sCommmand, &m_stGenCommandFDC, 8);
  3352. memcpy(sCommmand + 8, &szSendGen.bedeinh, sizeof(ACS_ENUM));
  3353. memcpy(sCommmand + 9, &szSendGen.dl, sizeof(ACS_BYTE));
  3354. memcpy(sCommmand + 10, &szSendGen.vorbereitung, sizeof(ACS_BYTE));
  3355. memcpy(sCommmand + 11, &szSendGen.hk, sizeof(ACS_BYTE));
  3356. if (m_pFDCAxnClient != NULL)
  3357. {
  3358. m_pFDCAxnClient->sendObject(sCommmand);
  3359. std::ostringstream buffer;
  3360. buffer << "IS:sender: " << (int)m_stGenCommandFDC.sender << ",dl: " << (int)szSendGen.dl
  3361. << ", vorbereitung: " << (int)szSendGen.vorbereitung << ", hk: " << (int)szSendGen.hk;
  3362. string str = buffer.str();
  3363. SendTelegramLog("SAUSLBED", str.c_str(), m_stGenCommand.sender,0);
  3364. }//ENDIF
  3365. delete[] sCommmand;
  3366. sCommmand = NULL;
  3367. PRINTA_INFO("== SEND == : SAUSLBED in SendSAUSLBED()\n");
  3368. return true;
  3369. }
  3370. /*********************************************************************************
  3371. 函数名称:SendIDETEKTORSTATUS
  3372. 功能描述: 设置探测器Ready状态到XCU
  3373. 修改记录:
  3374. 2021-04-20 创建
  3375. *******************************************************************************/
  3376. bool nsGEN::SMZDevice::SendIDETEKTORSTATUS(int nDetectorStatus) //202110 对外接口 开窗
  3377. {
  3378. idetektorstatus_t1 szSendGen = {};
  3379. m_stGenCommand.id = IDETEKTORSTATUS;
  3380. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_BYTE) + 3 * sizeof(ACS_DUMMY);
  3381. m_stGenCommand.mode = Clientmode;
  3382. m_stGenCommand.sender = Clientsender;
  3383. m_stGenCommand.group_index = Clientgroup_index;
  3384. m_stGenCommand.target = Clienttarget;
  3385. szSendGen.detstatus = DET_AUFNAHMEBEREIT;
  3386. szSendGen.header = m_stGenCommand;
  3387. m_FPDGUnit->OnXrayStatus(false);
  3388. if (m_pAxnClient != NULL)
  3389. {
  3390. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  3391. SendTelegramLog("IDETEKTORSTATUS","", m_stGenCommand.sender);
  3392. }//ENDIF
  3393. PRINTA_INFO("== SEND == : IDETEKTORSTATUS\n");
  3394. return true;
  3395. }
  3396. /*********************************************************************************
  3397. 函数名称:SetProgramList
  3398. 功能描述:设置view到XCU端
  3399. 修改记录:
  3400. 2021-04-20 创建
  3401. *******************************************************************************/
  3402. bool nsGEN::SMZDevice::SetProgramList(int nCount, int nOrganIndex, string& OrginName, int nDefaultWS) //202110 对外接口
  3403. {
  3404. sprogramlist_t1_tag szSendGen = {};
  3405. m_stGenCommand.id = SPROGRAMLIST;
  3406. 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
  3407. szSendGen.header = m_stGenCommand;
  3408. szSendGen.obj_count = nOrganIndex; //2015.5.6
  3409. szSendGen.exam_index = EXAM_SET_NRF;
  3410. szSendGen.prog_name_usage = EXAM_SET;
  3411. szSendGen.update_last_selection = ACS_NO_INFORMATION;
  3412. szSendGen.no_prog_name = 1/*nCount*/;//view name
  3413. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
  3414. memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
  3415. memcpy((ACS_BYTE*)p_ID,
  3416. (ACS_BYTE*)(&szSendGen),
  3417. m_wHeaderLength + sizeof(ACS_INT) + 2 * sizeof(ACS_ENUM) + sizeof(ACS_WORD) + sizeof(ACS_DCOUNT));
  3418. int nDefaultWS2TUI = nDefaultWS;
  3419. WSUI2TUI(nDefaultWS, nDefaultWS2TUI);
  3420. sprogramlist_t2_tag szSendGen2 = {};
  3421. szSendGen2.prog_info = nDefaultWS2TUI;
  3422. szSendGen2.prog_executed = ACS_NO;
  3423. szSendGen2.organ_index = abs(nOrganIndex);
  3424. memset(szSendGen2.program_name, 0, PROGRAM_NAME_LENGTH * sizeof(ACS_STRING));
  3425. int nOrginNameLength = (int)sizeof(OrginName);
  3426. wstring wstrOrginName = mb2wc(OrginName.c_str());
  3427. if (nOrginNameLength > PROGRAM_NAME_LENGTH)
  3428. {
  3429. nOrginNameLength = PROGRAM_NAME_LENGTH;
  3430. }
  3431. for (int j = 0; j < nOrginNameLength; j++)
  3432. {
  3433. szSendGen2.program_name[j] = wstrOrginName[j];
  3434. }
  3435. memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_INT) + 2 * sizeof(ACS_ENUM) + sizeof(ACS_WORD) + sizeof(ACS_DCOUNT)),
  3436. (ACS_BYTE*)(&szSendGen2),
  3437. (2 * sizeof(ACS_ENUM) + sizeof(ACS_WORD) + PROGRAM_NAME_LENGTH * sizeof(ACS_STRING)));
  3438. if (m_pAxnClient != NULL)
  3439. {
  3440. m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
  3441. std::ostringstream buffer;
  3442. buffer << "IS:obj_count: " << (int)szSendGen.obj_count << ",prog_info: " << szSendGen2.prog_info
  3443. << ", organ_index: " << (int)szSendGen2.organ_index << ", OrginName: " << OrginName;
  3444. string str = buffer.str();
  3445. SendTelegramLog("SPROGRAMLIST", str.c_str(), m_stGenCommand.sender,0);
  3446. }//ENDIF
  3447. delete[] p_ID;
  3448. p_ID = NULL;
  3449. PRINTA_INFO("== SEND == : SPROGRAMLIST(count:%d,organ_index:%d,prog_info: %d)\n", nCount, nOrganIndex, nDefaultWS2TUI);
  3450. return true;
  3451. }
  3452. /*********************************************************************************
  3453. 函数名称:SetOrgNameStatus
  3454. 功能描述:设置OrgName状态
  3455. 对应需求:IS_acim_x_ray_ready_all(VERSION_RAD3-VA10)
  3456. 修改记录:
  3457. 2021-04-22 创建
  3458. *******************************************************************************/
  3459. bool nsGEN::SMZDevice::SetOrgNameStatus(float fOrgStatus) //202110 对外接口 SHO
  3460. {
  3461. sh_organ_prog_t1_tag SendOrgNameStatus = {};
  3462. m_stGenCommand.id = SH_ORGAN_PROG;
  3463. m_stGenCommand.target = ClientPMS;
  3464. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY);
  3465. SendOrgNameStatus.header = m_stGenCommand;
  3466. switch ((int)fOrgStatus)
  3467. {
  3468. case STATUS_NOREADY:
  3469. SendOrgNameStatus.acknowledge = ACS_NOK;
  3470. break;
  3471. case STATUS_READY:
  3472. SendOrgNameStatus.acknowledge = ACS_OK;
  3473. break;
  3474. default:
  3475. break;
  3476. }
  3477. if (m_pAxnClient != NULL)
  3478. {
  3479. m_pAxnClient->sendObject((ACS_BYTE*)&SendOrgNameStatus);
  3480. std::ostringstream buffer;
  3481. buffer << "IS: SendOrgNameStatus.acknowledge:" << (int)SendOrgNameStatus.acknowledge;
  3482. string str = buffer.str();
  3483. SendTelegramLog("SH_ORGAN_PROG", str.c_str(), m_stGenCommand.sender, 0);
  3484. }//ENDIF
  3485. m_stGenCommand.target = Clienttarget;
  3486. PRINTA_INFO("== SEND == : SetOrgNameStatus: fOrgStatus: %d, acknowledge:%d\n", (int)fOrgStatus, SendOrgNameStatus.acknowledge);
  3487. return true;
  3488. }
  3489. /*********************************************************************************
  3490. 函数名称:EnableExposure
  3491. 功能描述:接收到DROC允许曝光消息,通知XCU
  3492. 对应需求:IS_Examination_StopConditions
  3493. 修改记录:
  3494. 2021-04-23 创建
  3495. *******************************************************************************/
  3496. bool nsGEN::SMZDevice::EnableExposure(int nEnable)
  3497. {
  3498. PRINTA_INFO("EnableExposureNotice XCU:%d\n", nEnable);
  3499. SendIasuStatus(nEnable, nEnable);
  3500. Sleep(50);
  3501. SendIdfrStatus(nEnable, nEnable);
  3502. //if (nEnable == STATUS_READY)
  3503. //{
  3504. // SendIasuStatus(JA, JA);
  3505. // Sleep(50);
  3506. // SendIdfrStatus(JA, JA);
  3507. //}//ENDIF
  3508. //else
  3509. //{
  3510. // SendIasuStatus(NEIN, NEIN);
  3511. // Sleep(50);
  3512. // SendIdfrStatus(NEIN, NEIN);
  3513. //}
  3514. return true;
  3515. }
  3516. /*********************************************************************************
  3517. 函数名称:CallbackTurnOn
  3518. 功能描述:对TurnOn消息进行反馈处理
  3519. 修改记录:
  3520. 2021-4-21 创建
  3521. *******************************************************************************/
  3522. bool nsGEN::SMZDevice::CallbackTurnOn(ACS_BYTE* pCommand)
  3523. {
  3524. if (pCommand == NULL)
  3525. {
  3526. PRINTA_ERROR("Get command is Null\n");
  3527. return false;
  3528. }//ENDIF
  3529. ACS_BYTE* stmpBuffer = pCommand;
  3530. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  3531. PRINTA_DEBUG("callback Turn on : object_id: %x\n", object_id);
  3532. std::ostringstream buffer;
  3533. buffer << "object_id:" << (int)object_id;
  3534. string str = buffer.str();
  3535. SendTelegramLog("TURN_ON", str.c_str(), object_id);
  3536. //if ((object_id == Clientsender) || (object_id == Clienttarget) || (object_id == FDC_Controlsender))
  3537. //{
  3538. //}
  3539. if (object_id == Clienttarget)
  3540. {
  3541. SendIdent();
  3542. string code = "TurnOff";
  3543. string info = "";
  3544. int level = CONNECTIONERROR;
  3545. m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
  3546. }//ENDIF
  3547. return true;
  3548. }
  3549. /*********************************************************************************
  3550. 函数名称:CallBackTurnOff
  3551. 功能描述: 解析当前关闭状态信息(turn off message)
  3552. 修改记录:
  3553. 2021-04-20 创建
  3554. *******************************************************************************/
  3555. bool nsGEN::SMZDevice::CallBackTurnOff(ACS_BYTE* pCommand)
  3556. {
  3557. if (pCommand == NULL)
  3558. {
  3559. PRINTA_ERROR("Get command is Null\n");
  3560. return false;
  3561. }//ENDIF
  3562. ACS_BYTE* stmpBuffer = pCommand;
  3563. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  3564. PRINTA_DEBUG("callback Trun Off : object_id: %x\n", object_id);
  3565. std::ostringstream buffer;
  3566. buffer << "object_id:" << std::hex << (int)object_id << "h";
  3567. string str = buffer.str();
  3568. SendTelegramLog("TURN_OFF", str.c_str(), object_id);
  3569. string code = "";
  3570. string info = "";
  3571. int level = 0;
  3572. if (object_id == Clienttarget)//XCU
  3573. {
  3574. if (m_bIdentStatus)
  3575. {
  3576. TimeOutWaring();
  3577. EnterCriticalSection(&m_csStatus);
  3578. m_bIdentStatus = false;
  3579. m_bReGetTurnOn = true;
  3580. LeaveCriticalSection(&m_csStatus);
  3581. PRINTA_INFO("callback: Get Client sender, m_bIdentStatus = false,m_bReGetTurnOn = true\n");
  3582. code = "TurnOff";
  3583. info = "Lost communication to generator, Please reboot the system.";
  3584. level = CONNECTIONERROR;
  3585. m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(), 0xF3);
  3586. }//ENDIF
  3587. }//ENDIF
  3588. return true;
  3589. }
  3590. /*********************************************************************************
  3591. 函数名称:CallbackGenParam
  3592. 功能描述: 解析当前系统的曝光参数
  3593. 修改记录:
  3594. 2021-04-20 创建
  3595. *******************************************************************************/
  3596. int nsGEN::SMZDevice::CallbackGenParam(ACS_BYTE* pCommand)
  3597. {
  3598. if (pCommand == NULL)
  3599. {
  3600. PRINTA_ERROR("Get command is Null\n");
  3601. return 0;
  3602. }//ENDIF
  3603. ACS_BYTE* stmpBuffer = pCommand;
  3604. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  3605. ACS_BYTE nET = (ACS_BYTE)(*(stmpBuffer + 8));
  3606. ACS_BYTE nNumberexposurecurve = (ACS_BYTE)(*(stmpBuffer + 9));
  3607. unsigned short* temp;
  3608. temp = (unsigned short*)(stmpBuffer + 10);
  3609. unsigned short wKV = *temp;
  3610. ACS_LINT wMAS = *((ACS_LINT*)(stmpBuffer + 12));
  3611. ACS_LINT wMS = *((ACS_LINT*)(stmpBuffer + 16));
  3612. ACS_BYTE wFO = (ACS_BYTE)(*(stmpBuffer + 20));
  3613. ACS_BYTE wTubeLoad = (ACS_BYTE)(*(stmpBuffer + 21));
  3614. PRINTA_INFO("Received APR Param:kv:%d, MAS:%d,MS:%d,FO:%d,ET:%d,TubeLoad:%d,Numberexposurecurve:%d\n",
  3615. (int)wKV, (int)wMAS, (int)wMS, (int)wFO, (int)nET, (int)wTubeLoad, (int)nNumberexposurecurve);
  3616. std::ostringstream buffer;
  3617. buffer << "Received APR Param:kv:" << (int)wKV << ",MAS :" << (int)wMAS << ",MS:" << (int)wMS << ",FO:" << (int)wFO << ",ET:" << (int)nET << ",TubeLoad:" << (int)wTubeLoad
  3618. << ",Numberexposurecurve:" << (int)nNumberexposurecurve;
  3619. string str = buffer.str();
  3620. SendTelegramLog("IGENANZ", str.c_str(), object_id);
  3621. //KV
  3622. m_DoseUnit.m_KV->Update((float)((wKV) / 10.0));
  3623. //FOCUS
  3624. switch (wFO)
  3625. {
  3626. case KLEINER_FOKUS:
  3627. m_DoseUnit.m_Focus->Update(FOCUS_SMALL);
  3628. break;
  3629. case GROSSER_FOKUS:
  3630. m_DoseUnit.m_Focus->Update(FOCUS_LARGE);
  3631. break;
  3632. case _3_FOKUS:
  3633. m_DoseUnit.m_Focus->Update(FOCUS_SMALL);
  3634. break;
  3635. case AUTOFOCUS:
  3636. m_DoseUnit.m_Focus->Update(FOCUS_SMALL);
  3637. break;
  3638. default:
  3639. break;
  3640. }
  3641. //Tech Mode
  3642. switch (nET)
  3643. {
  3644. case _0_PUNKT_TECHNIK:
  3645. break;
  3646. case _1_PUNKT_TECHNIK:
  3647. m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_1P);
  3648. break;
  3649. case _1_PUNKT_TECHNIK_RED_STROM:
  3650. m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_1P_REDUCEMA);
  3651. break;
  3652. case _2_PUNKT_TECHNIK:
  3653. m_DoseUnit.m_Techmode->Update(TECHMODE_NOAEC_2P);
  3654. break;
  3655. case _3_PUNKT_TECHNIK:
  3656. m_DoseUnit.m_Techmode->Update(TECHMODE_NOAEC_3P);
  3657. break;
  3658. case _3_PUNKT_T_MIT_IONT:
  3659. break;
  3660. default:
  3661. break;
  3662. }
  3663. m_DoseUnit.m_MAS->Update((float)((wMAS) / 100.0f));
  3664. m_DoseUnit.m_MS->Update((float)((wMS) / 10.0f));
  3665. if (m_DoseUnit.m_MS->Get() > 0)
  3666. {
  3667. int nMA = (int)((m_DoseUnit.m_MAS->Get() * 1000) / m_DoseUnit.m_MS->Get());
  3668. m_DoseUnit.m_MA->Update((float)nMA);
  3669. }
  3670. else
  3671. {
  3672. m_DoseUnit.m_MA->Update(0);
  3673. m_DoseUnit.m_MS->Update(0);
  3674. PRINTA_INFO("CallbackGenParam: Get MS is not illegality\n");
  3675. }
  3676. FireNotify(m_DoseUnit.m_KV->GetKey(), m_DoseUnit.m_KV->JSGet());
  3677. FireNotify(m_DoseUnit.m_Focus->GetKey(), m_DoseUnit.m_Focus->JSGet());
  3678. FireNotify(m_DoseUnit.m_Techmode->GetKey(), m_DoseUnit.m_Techmode->JSGet());
  3679. FireNotify(m_DoseUnit.m_MAS->GetKey(), m_DoseUnit.m_MAS->JSGet());
  3680. FireNotify(m_DoseUnit.m_MS->GetKey(), m_DoseUnit.m_MS->JSGet());
  3681. m_FPDGUnit->OnAPRms(m_DoseUnit.m_MS->Get());
  3682. if (m_bSetAPR)
  3683. {
  3684. m_bSetAPR = false;
  3685. if (m_bCalibMode)
  3686. {
  3687. if (m_bSetEnable)
  3688. {
  3689. EnableExposure(1);
  3690. m_bSetEnable = false;
  3691. PRINTA_INFO("CallbackIGENANZ: Set EnableExposure");
  3692. }
  3693. else
  3694. {
  3695. m_bGetIGENANZ = true;
  3696. }
  3697. }
  3698. }
  3699. PRINTA_INFO("IGENANZ: m_bSetAPR:%d,m_bCalibMode: %d, m_bSetEnable: %d, m_bGetIGENANZ: %d\n",
  3700. (int)m_bSetAPR, (int)m_bCalibMode, (int)m_bSetEnable, (int)m_bGetIGENANZ);
  3701. PRINTA_INFO("Processed APR Param m_fKV:%f,m_fMAS: %f, m_fMS: %f, m_nFo: %d,m_nET:%d,wTubeLoad:%d\n",
  3702. 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());
  3703. return 1;
  3704. }
  3705. /*********************************************************************************
  3706. 函数名称:CallbackIFILTERANZParam
  3707. 功能描述: 解析现场的Filter信息
  3708. 修改记录:
  3709. 2021-04-21 创建
  3710. *******************************************************************************/
  3711. bool nsGEN::SMZDevice::CallbackIFILTERANZParam(ACS_BYTE* pCommand)
  3712. {
  3713. if (pCommand == NULL)
  3714. {
  3715. PRINTA_ERROR("Get command is Null\n");
  3716. return false;
  3717. }//ENDIF
  3718. ACS_BYTE* stmpBuffer = pCommand;
  3719. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  3720. ACS_BYTE nFilter = (ACS_BYTE)(*(stmpBuffer + 9));
  3721. ACS_BYTE nFilterStatus = (ACS_BYTE)(*(stmpBuffer + 10));
  3722. std::ostringstream buffer;
  3723. buffer << "nFilter:" << (int)nFilter << ",nFilterStatus:" << (int)nFilterStatus;
  3724. string str = buffer.str();
  3725. SendTelegramLog("IFILTERANZ", str.c_str(), object_id);
  3726. return true;
  3727. }
  3728. /*********************************************************************************
  3729. 函数名称:CallbackErrorParam
  3730. 功能描述: 解析错误信息,目前仅用作记录
  3731. 修改记录:
  3732. 2021-04-23 创建
  3733. *******************************************************************************/
  3734. bool nsGEN::SMZDevice::CallbackErrorParam(ACS_BYTE* pCommand)
  3735. {
  3736. if (pCommand == NULL)
  3737. {
  3738. PRINTA_ERROR("Get command is Null\n");
  3739. return false;
  3740. }//ENDIF
  3741. ACS_BYTE* stmpBuffer = pCommand;
  3742. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  3743. ACS_BYTE nYear = (*(ACS_BYTE*)(stmpBuffer + 8));
  3744. ACS_BYTE nMonth = (*(ACS_BYTE*)(stmpBuffer + 9));
  3745. ACS_BYTE nDay = (*(ACS_BYTE*)(stmpBuffer + 10));
  3746. ACS_BYTE nHour = (*(ACS_BYTE*)(stmpBuffer + 11));
  3747. ACS_BYTE nMinute = (*(ACS_BYTE*)(stmpBuffer + 12));
  3748. ACS_BYTE nSecond = (*(ACS_BYTE*)(stmpBuffer + 13));
  3749. ACS_BYTE nCentisecond = (*(ACS_BYTE*)(stmpBuffer + 14));
  3750. ACS_DWORD nErrorCode = (*(ACS_DWORD*)(stmpBuffer + 16));
  3751. ACS_BYTE nPID = (*(ACS_BYTE*)(stmpBuffer + 20));
  3752. ACS_ENUM nErrorType = (*(ACS_ENUM*)(stmpBuffer + 21));
  3753. ACS_BYTE nSender = (*(ACS_BYTE*)(stmpBuffer + sizeof(ACS_WORD) + 3 * sizeof(ACS_BYTE)));
  3754. //Error count
  3755. ACS_WORD errcnt = (*(ACS_WORD*)(stmpBuffer + 22 + (FEHLERTEXT2_LENGTH + ADDTEXT2_LENGTH) * sizeof(ACS_STRING)));
  3756. if ((m_nLastErrorCount > errcnt) && (nSender == Clienttarget))
  3757. {
  3758. PRINTA_WARN("Current XCS Error is small than software Error number: LastErrorCount: %d,errcnt:%d\n", m_nLastErrorCount, errcnt);
  3759. if (errcnt == 0)
  3760. {
  3761. m_nLastErrorCount = 0;
  3762. }
  3763. return true;
  3764. }//ENDIF
  3765. if (nSender == Clienttarget)
  3766. {
  3767. m_nErrorCount = errcnt;
  3768. }
  3769. //fehlertext2
  3770. ACS_STRING* tempfehlertext2 = (ACS_STRING*)(pCommand + 22);
  3771. ACS_STRING* strfehlertext2 = new ACS_STRING[(FEHLERTEXT2_LENGTH + 1) * 2];
  3772. memset(strfehlertext2, 0, (FEHLERTEXT2_LENGTH + 1) * sizeof(ACS_STRING) * 2);
  3773. ACS_STRING* tempStrfehlertext2 = strfehlertext2;
  3774. for (int i = 0; i < FEHLERTEXT2_LENGTH; i++, tempStrfehlertext2++, tempfehlertext2++)
  3775. {
  3776. *tempStrfehlertext2 = *(ACS_STRING*)(tempfehlertext2);
  3777. }
  3778. strfehlertext2[FEHLERTEXT2_LENGTH] = '\0';
  3779. string strfehlertext2FromT = wc2mb((const wchar_t*)strfehlertext2);
  3780. //addtext2
  3781. ACS_STRING* tempaddtext2 = (ACS_STRING*)(pCommand + 22 + FEHLERTEXT2_LENGTH * sizeof(ACS_STRING));
  3782. ACS_STRING* straddtext2 = new ACS_STRING[(ADDTEXT2_LENGTH + 1) * 2];
  3783. memset(straddtext2, 0, (ADDTEXT2_LENGTH + 1) * sizeof(ACS_STRING) * 2);
  3784. ACS_STRING* tempStraddtext2 = straddtext2;
  3785. for (int i = 0; i < (ADDTEXT2_LENGTH); i++, tempStraddtext2++, tempaddtext2++)
  3786. {
  3787. *tempStraddtext2 = *(ACS_STRING*)(tempaddtext2);
  3788. }
  3789. straddtext2[ADDTEXT2_LENGTH] = '\0';
  3790. string straddtext2FromT = wc2mb((const wchar_t*)straddtext2);
  3791. PRINTA_WARN("fehlertext2:%s,addtext2:%s\n", strfehlertext2FromT.c_str(), straddtext2FromT.c_str());
  3792. delete[] strfehlertext2;
  3793. strfehlertext2 = NULL;
  3794. tempStrfehlertext2 = NULL;
  3795. delete[] straddtext2;
  3796. straddtext2 = NULL;
  3797. tempStraddtext2 = NULL;
  3798. //string strLogType;
  3799. //strLogType = SwitchCategory2Str(nErrorType);
  3800. //int nLogType;
  3801. //nLogType = SwitchCategory2ECOM(nErrorType);
  3802. int nPosition = string::npos;
  3803. nPosition = strfehlertext2FromT.find("[AUDIT]", 0);
  3804. if ((ClientPMS == nSender)&&(nErrorType == BEDIENEVENT) && (nPosition == 0))
  3805. {
  3806. char strTime[20] = "";
  3807. 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);
  3808. AuditMessage(strTime, strfehlertext2FromT.c_str());
  3809. }
  3810. std::ostringstream buffer;
  3811. buffer << "fehlernummer_long:"<< (unsigned long)nErrorCode<<", apid:"<< std::hex << (int)nPID <<"h, category:"<< (int)nErrorType <<"h, fehlertext2:" << strfehlertext2FromT.c_str() << ", addtext2:" << straddtext2FromT.c_str()<<";";
  3812. string str = buffer.str();
  3813. char strErrorCode[20] = "";
  3814. sprintf_s(strErrorCode, "%lu", nErrorCode);
  3815. SendTelegramLog("IERRORLOG2", str.c_str(), nPID,1, SwitchCategory2ECOM(nErrorType), strErrorCode);
  3816. return true;
  3817. }
  3818. /*********************************************************************************
  3819. 函数名称:CallbackAufnAusl
  3820. 功能描述: 解析当前的手闸状态信息
  3821. 修改记录:
  3822. 2021-04-20 创建
  3823. *******************************************************************************/
  3824. bool nsGEN::SMZDevice::CallbackAufnAusl(ACS_BYTE* pCommand)
  3825. {
  3826. if (pCommand == NULL)
  3827. {
  3828. PRINTA_ERROR("Get command is Null");
  3829. return false;
  3830. }//ENDIF
  3831. ACS_BYTE* stmpBuffer = pCommand;
  3832. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  3833. ACS_BYTE vorbereitung = (ACS_BYTE)(*(stmpBuffer + 8));
  3834. ACS_BYTE hauptkontakt = (ACS_BYTE)(*(stmpBuffer + 9));
  3835. ACS_BYTE strahlgbereit = (ACS_BYTE)(*(stmpBuffer + 10));
  3836. ACS_DWORD acq_index = (*(ACS_DWORD*)(pCommand + 12));
  3837. PRINTA_INFO("pre-contact:%d,main-contact:%d,readyExposure:%d, index: %lu\n", vorbereitung, hauptkontakt, strahlgbereit, acq_index);
  3838. std::ostringstream buffer;
  3839. buffer << "pre-contact:" << (int)vorbereitung << ", main-contact:" << (int)hauptkontakt << ", readyExposure:"
  3840. << (int)strahlgbereit << ",index:" << (int)acq_index;
  3841. string str = buffer.str();
  3842. SendTelegramLog("SAUFNAUSL", str.c_str(), object_id);
  3843. if (vorbereitung == EIN) //one switch
  3844. {
  3845. if (strahlgbereit == AUS)
  3846. {
  3847. if (m_bExposureStatus)
  3848. {
  3849. PRINTA_INFO("Current status is exposure, omit this command\n");
  3850. }
  3851. else
  3852. {
  3853. //if (m_DoseUnit.m_WS->Get() != WS_CONVENTIONAL)
  3854. {
  3855. m_bExposureStatus = true;
  3856. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_PREPARE);
  3857. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  3858. PRINTA_INFO("<GEN EXP>pre-contact ,prep ok, set GENERATOR_RAD_PREPARE\n"); //one switch
  3859. }
  3860. }
  3861. }
  3862. else if (strahlgbereit == EIN)
  3863. {
  3864. if (hauptkontakt == AUS)
  3865. {
  3866. PRINTA_INFO("<GEN EXP> No main-contact ,prep ok,the generator ready \n");
  3867. }
  3868. else if (hauptkontakt == EIN)
  3869. {
  3870. //if (m_DoseUnit.m_WS->Get() == WS_CONVENTIONAL)
  3871. //{
  3872. // m_bExposureStatus = true;
  3873. // m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_PREPARE);
  3874. // FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  3875. // PRINTA_INFO("<GEN EXP>main-contact ,casset mode ,set GENERATOR_RAD_PREPARE\n"); //one switch
  3876. //}
  3877. PRINTA_INFO("<GEN EXP> main-contact,prep ok,the generator ready \n");
  3878. }
  3879. }
  3880. return true;
  3881. }//ENDIF
  3882. if ((hauptkontakt == AUS) && (vorbereitung == AUS) && (strahlgbereit == AUS)) // two switch release
  3883. {
  3884. m_bExposureStatus = false;
  3885. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  3886. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  3887. PRINTA_INFO("<GEN EXP>the generator handswitch release\n");
  3888. }//ENDIF
  3889. return true;
  3890. }
  3891. /*********************************************************************************
  3892. 函数名称:CallbackSBILD
  3893. 功能描述: image display on imaging system, sent from XCU to DFR or camera
  3894. 修改记录:
  3895. 2021-04-23 创建
  3896. *******************************************************************************/
  3897. bool nsGEN::SMZDevice::CallbackSBILD(ACS_BYTE* pCommand) //remove this telegram at VE62P
  3898. {
  3899. //if (pCommand == NULL)
  3900. //{
  3901. // PRINTA_INFO("Get command is Null\n");
  3902. // return false;
  3903. //}//ENDIF
  3904. //ACS_BYTE* stmpBuffer = pCommand;
  3905. //ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  3906. //ACS_ENUM avr_request = (ACS_ENUM)(*(stmpBuffer + 10));
  3907. //if (avr_request == FESTVERSTAERKUNG_1)
  3908. //{
  3909. // PRINTA_INFO("CallbackSBILD:set patient success\n");
  3910. //}//ENDIF
  3911. //ACS_ENUM nZoom = (ACS_ENUM)(*(stmpBuffer + 11));
  3912. //PRINTA_INFO("CallbackSBILD:Format:%d\n", nZoom);
  3913. //std::ostringstream buffer;
  3914. //buffer << "CallbackSBILD:Format:" << (int)nZoom;
  3915. //string str = buffer.str();
  3916. //SendTelegramLog("SBILD", str.c_str(), object_id);
  3917. return true;
  3918. }
  3919. /*********************************************************************************
  3920. 函数名称:CallbackSORGANSELECT
  3921. 功能描述: 解析当前SORGANSELECT报文,当前选中view
  3922. 修改记录:
  3923. 2021-04-20 创建
  3924. *******************************************************************************/
  3925. bool nsGEN::SMZDevice::CallbackSORGANSELECT(ACS_BYTE* pCommand) //20220326 don't get the telegram
  3926. {
  3927. sorganselect_t1_tag* SelectCurrentOrg;
  3928. SelectCurrentOrg = (sorganselect_t1_tag*)pCommand;
  3929. m_nCurrentViewNumber = SelectCurrentOrg->alt_index;
  3930. m_nTargetViewNumber = SelectCurrentOrg->organ_index;
  3931. PRINTA_DEBUG("CurrentView:%d,TargetView:%d\n", m_nCurrentViewNumber, m_nTargetViewNumber);
  3932. SendTelegramLog("SORGANSELECT");
  3933. if (m_nTargetViewNumber == 0) //0 means No information
  3934. {
  3935. PRINTA_WARN("Get organ_index = 0, mean No information, return\n");
  3936. return true;
  3937. }
  3938. if (m_bSelectORG)
  3939. {
  3940. Sleep(10); //等待OGPWorkThread线程起来
  3941. SetEvent(m_hGenSelectOGPEvent); //select OGP success; 20160721
  3942. PRINTA_INFO("SORGANSELECT:: m_nAPRCommandSynFlag = %d\n", m_nAPRCommandSynFlag);
  3943. if (m_nAPRCommandSynFlag == 2)
  3944. {
  3945. //202110
  3946. SendOrthoLocalParam(AprParamBackup.nWS,
  3947. AprParamBackup.fKV,
  3948. AprParamBackup.fMA,
  3949. AprParamBackup.fMS,
  3950. AprParamBackup.fMAS,
  3951. AprParamBackup.nFocus,
  3952. AprParamBackup.nTechmode,
  3953. AprParamBackup.nAECField,
  3954. AprParamBackup.nAECFilm,
  3955. AprParamBackup.nAECDensity);
  3956. if (m_bGenService)
  3957. {
  3958. Sleep(50);
  3959. //202110
  3960. SendOrthoLocalParam(AprParamBackup.nWS,
  3961. AprParamBackup.fKV,
  3962. AprParamBackup.fMA,
  3963. AprParamBackup.fMS,
  3964. AprParamBackup.fMAS,
  3965. AprParamBackup.nFocus,
  3966. AprParamBackup.nTechmode,
  3967. AprParamBackup.nAECField,
  3968. AprParamBackup.nAECFilm,
  3969. AprParamBackup.nAECDensity,ClientPMS);
  3970. }//ENDIF
  3971. EnterCriticalSection(&m_csStatus);
  3972. m_nAPRCommandSynFlag = 0;//reset
  3973. LeaveCriticalSection(&m_csStatus);
  3974. PRINTA_INFO("Callback SORGANSELECT,SetAPR,m_nAPRCommandSynFlag = %d\n", m_nAPRCommandSynFlag);
  3975. }
  3976. else if (m_nAPRCommandSynFlag == 1)
  3977. {
  3978. EnterCriticalSection(&m_csStatus);
  3979. m_nAPRCommandSynFlag++;//reset
  3980. LeaveCriticalSection(&m_csStatus);
  3981. PRINTA_INFO("IN SORGANSELECT:: m_nAPRCommandSynFlag++, m_nAPRCommandSynFlag = %d\n", m_nAPRCommandSynFlag);
  3982. }
  3983. }
  3984. else
  3985. {
  3986. PRINTA_INFO("Get select per view command from TUI\n");
  3987. }
  3988. return true;
  3989. }
  3990. //typedef struct sh_list_t1_tag
  3991. //{
  3992. //acs_obj_header_t header; /* Object-Header */
  3993. //ACS_INT obj_count; /* number of objects, 1..(n-1), -n (minus = last one) */
  3994. //ACS_WORD ref_object_id; /* ID of the object to that this list refers (e.g. SH_UI_BSR or SH_UI_XCU) */
  3995. //ACS_WORD sel_func; /* function to be selected; all values are defined in an additional include file */
  3996. //ACS_WORD min_list_index; /* Index (0,...) in the list of the minimum selectable value */
  3997. //ACS_WORD max_list_index; /* Index (0,...) in the list of the maximum selectable value */
  3998. /*********************************************************************************
  3999. 函数名称:CallBackShowList
  4000. 功能描述: 解析当前的参数范围信息
  4001. 修改记录:
  4002. 2021-04-20 创建
  4003. *******************************************************************************/
  4004. bool nsGEN::SMZDevice::CallBackShowList(const ACS_BYTE* pCommand)
  4005. {
  4006. if (pCommand == NULL)
  4007. {
  4008. PRINTA_ERROR("Get command is Null\n");
  4009. return false;
  4010. }//ENDIF
  4011. ACS_INT obj_count = 0;
  4012. ACS_WORD temp = 0;
  4013. int nFuncID = 0;
  4014. int ref_object_id = 0xFFFF;
  4015. int nMinPos = 0;
  4016. int nMaxPos = 0;
  4017. int nstrListNumber = 0;
  4018. ACS_BYTE object_id = (*(ACS_BYTE*)(pCommand + 5)); //sender
  4019. obj_count = *(ACS_INT*)(pCommand + 8);
  4020. temp = *(ACS_WORD*)(pCommand + 10);
  4021. ref_object_id = temp;
  4022. temp = *(ACS_WORD*)(pCommand + 12);
  4023. nFuncID = temp;
  4024. temp = *(ACS_WORD*)(pCommand + 14);
  4025. nMinPos = temp;
  4026. temp = *(ACS_WORD*)(pCommand + 16);
  4027. nMaxPos = temp;
  4028. nstrListNumber = *(ACS_DCOUNT*)(pCommand + 16 + sizeof(ACS_WORD) + sizeof(ACS_DUMMY) * 8);
  4029. try {
  4030. PRINTA_INFO("obj_count:%d, ref_object_id:%x, FuncID:%d, MinPos:%d, MaxPos:%d\n", obj_count, ref_object_id, nFuncID, nMinPos, nMaxPos);
  4031. std::ostringstream buffer;
  4032. buffer << "obj_count:" << obj_count << ", ref_object_id :" << ref_object_id << ", FuncID :" << nFuncID << ", MinPos :" << nMinPos << ", MaxPos :" << nMaxPos;
  4033. string str = buffer.str();
  4034. SendTelegramLog("SH_LIST", str.c_str(), object_id);
  4035. //以下单位转换来源于实际报文定义
  4036. switch (nFuncID)
  4037. {
  4038. case AXCS_ACQ_KV:
  4039. {
  4040. if (ref_object_id == 0xFFFF)
  4041. {
  4042. if (g_KV_List.size() < nMinPos)
  4043. {
  4044. m_fKVmin = ((float)(g_KV_List[g_KV_List.size() - 1])) / 10.0f;
  4045. }
  4046. else
  4047. {
  4048. m_fKVmin = ((float)(g_KV_List[nMinPos - 1])) / 10.0f;
  4049. }
  4050. if (g_KV_List.size() < nMaxPos)
  4051. {
  4052. m_fKVmax = ((float)(g_KV_List[g_KV_List.size() - 1])) / 10.0f;
  4053. }
  4054. else
  4055. {
  4056. m_fKVmax = ((float)(g_KV_List[nMaxPos - 1])) / 10.0f;
  4057. }
  4058. float* fKV_List = new float[g_KV_List.size() + 1];
  4059. int nLength = 0;
  4060. for (int i = 0; i <= nMaxPos - nMinPos; i++)
  4061. {
  4062. fKV_List[i] = (float)g_KV_List[i + nMinPos-1] / 10.0f;
  4063. nLength++;
  4064. }
  4065. RefreshParameterList("KVList", fKV_List, nLength, m_fKVmax, m_fKVmin);
  4066. delete[] fKV_List;
  4067. 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());
  4068. }
  4069. else
  4070. {
  4071. if (abs(obj_count) == 1)
  4072. {
  4073. g_KV_List.clear();
  4074. }
  4075. char* strInfo = new char[(STRING_FIX_LENGTH + 1)];
  4076. for (int i = 0; i < nstrListNumber; i++)
  4077. {
  4078. memset(strInfo, 0, (STRING_FIX_LENGTH + 1) * sizeof(char));
  4079. ACS_STRING* strtemp = (ACS_STRING*)(pCommand + sizeof(sh_list_t1_tag) + i * sizeof(sh_list_t2_tag) + sizeof(ACS_WORD));
  4080. for (int j = 0; j < (STRING_FIX_LENGTH); j++)
  4081. {
  4082. strInfo[j] = strtemp[j];
  4083. }
  4084. float fTemp = atof(strInfo);
  4085. g_KV_List.push_back(fTemp * 10);
  4086. }
  4087. delete[] strInfo;
  4088. strInfo = NULL;
  4089. if (obj_count <= 0)
  4090. {
  4091. m_fKVmax = (float)g_KV_List[nMaxPos - 1] / 10.0f;
  4092. m_fKVmin = (float)g_KV_List[nMinPos - 1] / 10.0f;
  4093. //for (int i = 0; i < nMaxPos; i++)
  4094. // PRINTA_DEBUG("g_KV_List:%d,sizeof:%d,i: %d\n", g_KV_List[i], g_KV_List.size(), i);
  4095. float* fKV_List = new float[g_KV_List.size() + 1];
  4096. int nLength = 0;
  4097. for (int i = 0; i <= nMaxPos - nMinPos; i++)
  4098. {
  4099. fKV_List[i] = (float)g_KV_List[i] / 10.0f;
  4100. nLength++;
  4101. }
  4102. RefreshParameterList("KVList", fKV_List, nLength, m_fKVmax, m_fKVmin);
  4103. /*for (int i = 0; i < nLength; i++)
  4104. {
  4105. PRINTA_DEBUG("fKV_List:%f,i:%d\n", fKV_List[i], nLength);
  4106. }*/
  4107. delete[] fKV_List;
  4108. }
  4109. }
  4110. break;
  4111. }
  4112. case AXCS_ACQ_MAS:
  4113. {
  4114. if (ref_object_id == 0xFFFF)
  4115. {
  4116. if (g_MAS_List.size() < nMinPos)
  4117. {
  4118. m_fMASmin = ((float)(g_MAS_List[g_MAS_List.size() - 1])) / 1000.0f;
  4119. }
  4120. else
  4121. {
  4122. m_fMASmin = ((float)(g_MAS_List[nMinPos - 1])) / 1000.0f;
  4123. }
  4124. if (g_MAS_List.size() < nMaxPos)
  4125. {
  4126. m_fMASmax = ((float)(g_MAS_List[g_MAS_List.size() - 1])) / 1000.0f;
  4127. }
  4128. else
  4129. {
  4130. m_fMASmax = ((float)(g_MAS_List[nMaxPos - 1])) / 1000.0f;
  4131. }
  4132. float* fMAS_List = new float[g_MAS_List.size() + 1];
  4133. int nLength = 0;
  4134. for (int i = 0; i <= nMaxPos - nMinPos; i++)
  4135. {
  4136. fMAS_List[i] = (float)g_MAS_List[i+ nMinPos-1] / 1000.0f;
  4137. nLength++;
  4138. }
  4139. RefreshParameterList("MASList", fMAS_List, nLength, m_fMASmax, m_fMASmin);
  4140. delete[] fMAS_List;
  4141. 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());
  4142. }
  4143. else
  4144. {
  4145. if (abs(obj_count) == 1)
  4146. {
  4147. g_MAS_List.clear();
  4148. }
  4149. char* strInfo = new char[(STRING_FIX_LENGTH + 1)];
  4150. for (int i = 0; i < nstrListNumber; i++)
  4151. {
  4152. memset(strInfo, 0, (STRING_FIX_LENGTH + 1) * sizeof(char));
  4153. ACS_STRING* strtemp = (ACS_STRING*)(pCommand + sizeof(sh_list_t1_tag) + i * sizeof(sh_list_t2_tag) + sizeof(ACS_WORD));
  4154. for (int j = 0; j < (STRING_FIX_LENGTH); j++)
  4155. {
  4156. strInfo[j] = strtemp[j];
  4157. }
  4158. float fTemp = atof(strInfo);
  4159. g_MAS_List.push_back(fTemp * 1000);
  4160. }
  4161. delete[] strInfo;
  4162. strInfo = NULL;
  4163. if (obj_count <= 0)
  4164. {
  4165. m_fMASmax = (float)g_MAS_List[nMaxPos - 1] / 1000.0f;
  4166. m_fMASmin = (float)g_MAS_List[nMinPos - 1] / 1000.0f;
  4167. //for (int i = 0; i < nMaxPos; i++)
  4168. // PRINTA_DEBUG("g_MAS_List:%d,sizeof:%d,i:%d\n", g_MAS_List[i], g_MAS_List.size(), i);
  4169. float* fMAS_List = new float[g_MAS_List.size() + 1];
  4170. int nLength = 0;
  4171. for (int i = 0; i <= nMaxPos - nMinPos; i++)
  4172. {
  4173. fMAS_List[i] = (float)g_MAS_List[i] / 1000.0f;
  4174. nLength++;
  4175. }
  4176. RefreshParameterList("MASList", fMAS_List, nLength, m_fMASmax, m_fMASmin);
  4177. /*for (int i = 0; i < nLength; i++)
  4178. {
  4179. PRINTA_DEBUG("fMAS_List:%f,i:%d\n", fMAS_List[i], nLength);
  4180. }*/
  4181. delete[] fMAS_List;
  4182. }
  4183. }
  4184. break;
  4185. }
  4186. case AXCS_ACQ_MS:
  4187. {
  4188. if (ref_object_id == 0xFFFF)
  4189. {
  4190. if (g_MS_List.size() < nMinPos)
  4191. {
  4192. m_fMSmin = ((float)(g_MS_List[g_MS_List.size() - 1])) / 1000.0f;
  4193. }
  4194. else
  4195. {
  4196. m_fMSmin = ((float)(g_MS_List[nMinPos - 1])) / 1000.0f;
  4197. }
  4198. if (g_MS_List.size() < nMaxPos)
  4199. {
  4200. m_fMSmax = ((float)(g_MS_List[g_MS_List.size() - 1])) / 1000.0f;
  4201. }
  4202. else
  4203. {
  4204. m_fMSmax = ((float)(g_MS_List[nMaxPos - 1])) / 1000.0f;
  4205. }
  4206. 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());
  4207. }
  4208. else
  4209. {
  4210. if (abs(obj_count) == 1)
  4211. {
  4212. g_MS_List.clear();
  4213. }
  4214. char* strInfo = new char[(STRING_FIX_LENGTH + 1)];
  4215. for (int i = 0; i < nstrListNumber; i++)
  4216. {
  4217. memset(strInfo, 0, (STRING_FIX_LENGTH + 1) * sizeof(char));
  4218. ACS_STRING* strtemp = (ACS_STRING*)(pCommand + sizeof(sh_list_t1_tag) + i * sizeof(sh_list_t2_tag) + sizeof(ACS_WORD));
  4219. for (int j = 0; j < (STRING_FIX_LENGTH); j++)
  4220. {
  4221. strInfo[j] = strtemp[j];
  4222. }
  4223. float fTemp = atof(strInfo);
  4224. g_MS_List.push_back(fTemp * 1000);
  4225. }
  4226. delete[] strInfo;
  4227. strInfo = NULL;
  4228. /*if (obj_count <= 0)
  4229. {
  4230. for (int i = 0; i < nMaxPos; i++)
  4231. PRINTA_DEBUG("g_MS_List:%d,sizeof:%d,i:%d\n", g_MS_List[i], g_MS_List.size(), i);
  4232. }*/
  4233. }
  4234. break;
  4235. }
  4236. default:
  4237. PRINTA_INFO("obj_count: %d,nFuncID :%d,nMinPos:%d,nMaxPos:%d\n",
  4238. obj_count, nFuncID, nMinPos, nMaxPos);
  4239. break;
  4240. }
  4241. }
  4242. catch (...)
  4243. {
  4244. PRINTA_ERROR("Crash CallBackShowList log\n");
  4245. }
  4246. return true;
  4247. }
  4248. //Description: this function presents how to get the AEC field and film from telegrams.
  4249. /*********************************************************************************
  4250. 函数名称:CallbackGetField
  4251. 功能描述: 解析AEC Field信息
  4252. 修改记录:
  4253. 2021-04-20 创建
  4254. *******************************************************************************/
  4255. bool nsGEN::SMZDevice::CallbackGetField(const ACS_BYTE* pCommand)
  4256. {
  4257. return true;
  4258. }
  4259. //Description: this function presents how to get the post exposure parameters from telegrams.
  4260. //ACS_INT kvist; /* Actual voltage of fluoroscopy or exposure, told by generator */
  4261. //ACS_LINT masist; /* mAs value of last exposure */
  4262. //ACS_LINT msist; /* duration of last exposure */
  4263. /*********************************************************************************
  4264. 函数名称:CallbackPostGenParam
  4265. 功能描述: 解析曝光Post参数
  4266. 修改记录:
  4267. 2021-04-20 创建
  4268. *******************************************************************************/
  4269. int nsGEN::SMZDevice::CallbackPostGenParam(ACS_BYTE* pCommand)
  4270. {
  4271. if (pCommand == NULL)
  4272. {
  4273. PRINTA_ERROR("Get command is Null");
  4274. return 0;
  4275. }//ENDIF
  4276. ACS_BYTE* stmpBuffer = pCommand;
  4277. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4278. int nTempMAS = (*(long*)(stmpBuffer + 8));
  4279. int nTempMS = (*(long*)(stmpBuffer + 12));
  4280. int nTempKV = (*(short*)(stmpBuffer + 16));
  4281. ACS_DWORD acq_index = (*(ACS_DWORD*)(pCommand + 8 + sizeof(ACS_LINT) * 2 + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + 3 * sizeof(ACS_BYTE)));
  4282. PRINTA_INFO("== IN ==: CallbackPostGenParam begin kv:%d,wMAS: %d, wMS: %d\n", nTempKV, nTempMAS, nTempMS);
  4283. //KV
  4284. m_DoseUnit.m_PostKV->Update((float)((nTempKV) / 10.0));
  4285. FireNotify(m_DoseUnit.m_PostKV->GetKey(), m_DoseUnit.m_PostKV->JSGet());
  4286. //MAS
  4287. m_DoseUnit.m_PostMAS->Update((float)((nTempMAS) / 100.0));
  4288. FireNotify(m_DoseUnit.m_PostMAS->GetKey(), m_DoseUnit.m_PostMAS->JSGet());
  4289. //MS
  4290. m_DoseUnit.m_PostMS->Update((float)((nTempMS) / 10.0));
  4291. FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
  4292. //MA
  4293. if (m_DoseUnit.m_PostMS->Get() > 0)
  4294. {
  4295. m_DoseUnit.m_PostMA->Update(m_DoseUnit.m_PostMAS->Get() * 1000.0/m_DoseUnit.m_PostMS->Get());
  4296. FireNotify(m_DoseUnit.m_PostMA->GetKey(), m_DoseUnit.m_PostMA->JSGet());
  4297. }
  4298. else
  4299. {
  4300. m_DoseUnit.m_PostMA->Update(0);
  4301. FireNotify(m_DoseUnit.m_PostMA->GetKey(), m_DoseUnit.m_PostMA->JSGet());
  4302. m_DoseUnit.m_PostMS->Update(0);
  4303. FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
  4304. PRINTA_INFO("Get PostMS is less than 0\n");
  4305. }
  4306. 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());
  4307. std::ostringstream buffer;
  4308. buffer << "kv:" << nTempKV << ",MAS:" << nTempMAS << ",MS:"
  4309. << nTempMS << ",index:" << (int)acq_index;
  4310. string str = buffer.str();
  4311. SendTelegramLog("INACHANZ", str.c_str(), object_id);
  4312. return 1;
  4313. }
  4314. //Description: this function presents how to get the information message from telegrams.
  4315. /*********************************************************************************
  4316. 函数名称:CallBackIdrallganz2
  4317. 功能描述: 解析错误信息,并发给UI进行显示 无CodeID,只有内容
  4318. 修改记录:
  4319. 2021-04-23 创建
  4320. *******************************************************************************/
  4321. bool nsGEN::SMZDevice::CallBackIdrallganz2(const ACS_BYTE* pCommand)
  4322. {
  4323. if (pCommand == NULL)
  4324. {
  4325. PRINTA_ERROR("Get command is Null");
  4326. return false;
  4327. }//ENDIF
  4328. ACS_BYTE object_id = (*(ACS_BYTE*)(pCommand + 5)); //sender
  4329. ACS_ENUM nFunction = (ACS_ENUM)(*(pCommand + 8));
  4330. ACS_BYTE nCommand = *((ACS_BYTE*)(pCommand + 9));
  4331. ACS_BYTE ndisp_style = *((ACS_BYTE*)(pCommand + 12));
  4332. ACS_STRING* temp = (ACS_STRING*)(pCommand + 16);
  4333. ACS_STRING* strInfo = new ACS_STRING[(TEXT_LENGTH + 1) * 2]; //记录日志信息
  4334. if (strInfo != NULL)
  4335. {
  4336. memset(strInfo, 0, (TEXT_LENGTH + 1) * sizeof(ACS_STRING) * 2);
  4337. }
  4338. else
  4339. {
  4340. return false;
  4341. }
  4342. ACS_STRING* tempStr = strInfo;
  4343. for (int i = 0; i < TEXT_LENGTH; i++, tempStr++, temp++)
  4344. {
  4345. *tempStr = *(ACS_STRING*)(temp);
  4346. }
  4347. strInfo[TEXT_LENGTH] = '\0';
  4348. string strInfoDisplayFromT = wc2mb((const wchar_t*)strInfo);
  4349. PRINTA_INFO("CallBackIDFRALLGANZ2: %s\n", strInfoDisplayFromT.c_str());
  4350. string code = "Info";
  4351. int level = AUTOCLEARERROR;
  4352. if (nCommand == ACS_SET_DISPLAY)
  4353. {
  4354. m_MSGUnit->AddWarnMessage(code.c_str(), level, strInfoDisplayFromT.c_str(), object_id); //将消息显示到界面
  4355. }
  4356. else if (nCommand == ACS_CLEAR_DISPLAY)
  4357. {
  4358. m_MSGUnit->DelWarnMessage(code.c_str(), level, strInfoDisplayFromT.c_str()); //清除界面消息
  4359. }
  4360. delete[] strInfo;
  4361. strInfo = NULL;
  4362. std::ostringstream buffer;
  4363. buffer << "FunctionID:" << (int)nFunction << ", nCommand:" << (int)nCommand << ", ndisp_style:"
  4364. << (int)ndisp_style << ", Content:" << strInfoDisplayFromT.c_str();
  4365. string str = buffer.str();
  4366. SendTelegramLog("IDFRALLGANZ2", str.c_str(), object_id);
  4367. return true;
  4368. }
  4369. //Description: this function presents how to get the error message from telegrams.
  4370. /*********************************************************************************
  4371. 函数名称:CallBackIfehleranz2
  4372. 功能描述: 获取当前的错误信息,并发给UI进行显示
  4373. 修改记录:
  4374. 2021-04-23 创建
  4375. *******************************************************************************/
  4376. bool nsGEN::SMZDevice::CallBackIfehleranz2(const ACS_BYTE* pCommand)
  4377. {
  4378. if (pCommand == NULL)
  4379. {
  4380. PRINTA_ERROR("Get command is Null");
  4381. return false;
  4382. }//ENDIF
  4383. ACS_BYTE object_id = (*(ACS_BYTE*)(pCommand + 5)); //sender
  4384. ACS_DWORD nFunction = (*(ACS_DWORD*)(pCommand + 8));
  4385. ACS_BYTE apid = *((ACS_BYTE*)(pCommand + 12));
  4386. ACS_ENUM category = *((ACS_ENUM*)(pCommand + 13)); //属性
  4387. //string strAPid = ""; //2021-04 待完善功能:需要设置到UI端
  4388. char strAPid[50] = "";
  4389. sprintf_s(strAPid, "%d", apid);
  4390. char strSiemensCode[50] = "";
  4391. sprintf_s(strSiemensCode, "%lu", nFunction);
  4392. ACS_STRING* temp = (ACS_STRING*)(pCommand + 14);
  4393. ACS_STRING* strInfo = new ACS_STRING[(FEHLERTEXT2_LENGTH + 1) * 2];
  4394. memset(strInfo, 0, (FEHLERTEXT2_LENGTH + 1) * sizeof(ACS_STRING) * 2);
  4395. ACS_STRING* tempStr = strInfo;
  4396. for (int i = 0; i < FEHLERTEXT2_LENGTH; i++, tempStr++, temp++)
  4397. {
  4398. *tempStr = *(ACS_STRING*)(temp);
  4399. }
  4400. strInfo[FEHLERTEXT2_LENGTH] = '\0';
  4401. const string strDisplayError = wc2mb((const wchar_t*)strInfo);
  4402. //PRINTA_INFO(strDisplayError.c_str());
  4403. //按照SSME要求,增加code和ID码 仅对应0x02\0x03\0x04
  4404. char strTemp[50] = "";
  4405. sprintf_s(strTemp, "%lu/%d: ", nFunction, apid); //Error 为英文 Siemens要求 //2021-04 待完善功能:需要设置到UI端
  4406. string strDisplayErrorTemp = strTemp + strDisplayError;
  4407. //end
  4408. /*string strLogType = "";
  4409. strLogType = SwitchCategory2Str(category);*/
  4410. std::ostringstream buffer;
  4411. buffer << "FunctionID:" << (unsigned long)nFunction << ", apid:" << std::hex << (int)apid << "h, category:"
  4412. << (int)category << "h, Content:" << strDisplayError.c_str();
  4413. string str = buffer.str();
  4414. /*SendTelegramLog("IFEHLERANZ2", str.c_str(), 1, strLogType.c_str());*/
  4415. SendTelegramLog("IFEHLERANZ2", str.c_str(), object_id,1, SwitchCategory2ECOM(category));
  4416. PRINTA_INFO("CallBackIfehleranz2: %s,category:%x, objectID: %x\n", strDisplayErrorTemp.c_str(), category,object_id);
  4417. if (nFunction == 0)
  4418. {
  4419. if (strDisplayError.empty())
  4420. {
  4421. PRINTA_INFO("CallBackIfehleranz2: Get SiemensCode:%s, and FEHLERTEXT2 is empty, direct return;\n", strSiemensCode);
  4422. delete[] strInfo;
  4423. return true;
  4424. }
  4425. else
  4426. {
  4427. sprintf_s(strSiemensCode, "%s", "FFFFFFFF"); //将code = 0转化为不可能提供的ID,设置到客户端,规避客户端对code为0 时全清错误消息的情况;
  4428. PRINTA_INFO("CallBackIfehleranz2: Get fehlernummer_long: %lu,switch 0 to SiemensCode:%s, and FEHLERTEXT2 is not empty;\n", nFunction,strSiemensCode);
  4429. }
  4430. }
  4431. //string code = "0";
  4432. string info = "";
  4433. int level = 0;
  4434. //#define CONNECTIONERROR 1
  4435. //#define UNCLEARERROR 2
  4436. //#define CLEARERROR 3
  4437. //#define AUTOCLEARERROR 4
  4438. switch (category)
  4439. {
  4440. case MSGBOX_NO_OK_NO_TUI:
  4441. case ORTHOMESSAGE: //Notify
  4442. //level = CLEARERROR;
  4443. //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), object_id);
  4444. break;
  4445. case USERMESSAGE: //WarnMessage
  4446. level = CLEARERROR;
  4447. m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), apid);
  4448. break;
  4449. case RESET_USERMSG_LEGACY:
  4450. case TELEGRAM:
  4451. case ACS_FLAG_RESET: //InfoMessage
  4452. //level = CLEARERROR;
  4453. //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), object_id);
  4454. break;
  4455. case WARNUNG: //WarnMessage
  4456. //level = CLEARERROR;
  4457. //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), object_id);
  4458. break;
  4459. case BEHEB_FEHLER:
  4460. level = MESSAGEBOX_CLEARERROR;
  4461. m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), apid);
  4462. break;
  4463. case NICHT_BEHEB_FEHLER:
  4464. level = NOCLEARERROR;
  4465. m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), apid);
  4466. break;
  4467. case FATALER_FEHLER: //ERROR
  4468. //level = CLEARERROR;
  4469. //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), object_id);
  4470. break;
  4471. case RESET_WARNING:
  4472. {
  4473. //PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_WARNING\n");
  4474. //level = CLEARERROR;
  4475. //m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
  4476. break;
  4477. }
  4478. case RESET_ERROR: //RESET ERROR
  4479. {
  4480. PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_ERROR\n");
  4481. level = MESSAGEBOX_CLEARERROR;
  4482. m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
  4483. break;
  4484. }
  4485. case RESET_SEVERE:
  4486. {
  4487. PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_SEVERE\n");
  4488. level = NOCLEARERROR;
  4489. m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
  4490. break;
  4491. }
  4492. case RESET_FATAL: //RESET FATAL
  4493. {
  4494. //PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_FATAL\n");
  4495. //level = CLEARERROR;
  4496. //m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
  4497. break;
  4498. }
  4499. case RESET_USERMESSAGE://RESET USEMESSAGE
  4500. {
  4501. PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_USERMESSAGE\n");
  4502. level = CLEARERROR;
  4503. m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
  4504. break;
  4505. }
  4506. case RESET_TELEGRAM:
  4507. break;
  4508. case RESET_MSGBOX:
  4509. break;
  4510. case RESET_ORTHOMSG:
  4511. break;
  4512. case ACS_FLAG_YESNO:
  4513. break;
  4514. default:
  4515. break;
  4516. }
  4517. delete[] strInfo;
  4518. strInfo = NULL;
  4519. tempStr = NULL;
  4520. return true;
  4521. }
  4522. /*********************************************************************************
  4523. 函数名称:CallBackIINFOCOMP
  4524. 功能描述: 收集当前组件的版本信息(collected SW/FW-versions of all components)
  4525. 修改记录:
  4526. 2021-04-23 创建
  4527. *******************************************************************************/
  4528. bool nsGEN::SMZDevice::CallBackIINFOCOMP(ACS_BYTE* pCommand)
  4529. {
  4530. if (pCommand == NULL)
  4531. {
  4532. PRINTA_ERROR("Get command is Null");
  4533. return false;
  4534. }//ENDIF
  4535. ACS_BYTE* stmpBuffer = pCommand;
  4536. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4537. ACS_BYTE backup_set = (*(ACS_BYTE*)(stmpBuffer + 8));
  4538. ACS_COUNT apanzahl = (*(ACS_COUNT*)(stmpBuffer + 9));
  4539. for (int i = 0; i <= apanzahl; i++)
  4540. {
  4541. ACS_BYTE APID = (*(ACS_BYTE*)(pCommand + i * 5 + 10));
  4542. ACS_BYTE anzahlkenndaten = (*(ACS_BYTE*)(pCommand + i * 5 + 11));
  4543. ACS_BYTE kenndatum_id = (*(ACS_BYTE*)(pCommand + i * 5 + 12));
  4544. ACS_BYTE anzahlkenneintr = (*(ACS_BYTE*)(pCommand + i * 5 + 13));
  4545. ACS_STRING_8 kenneintrag = (*(ACS_STRING_8*)(pCommand + i * 5 + 14));
  4546. PRINTA_INFO("APID = %d,anzahlkenndaten = %d,kenndatum_id = %d,anzahlkenneintr = %d,kenneintrag = %s\n",
  4547. APID, anzahlkenndaten, kenndatum_id, anzahlkenneintr, kenneintrag);
  4548. }
  4549. SendTelegramLog("IINFOCOMP");
  4550. return true;
  4551. }
  4552. /*********************************************************************************
  4553. 函数名称:CallBackST_MODE
  4554. 功能描述: 解析当前的工作模式(当前仅用service)
  4555. 修改记录:
  4556. 2015-04-20 创建
  4557. *******************************************************************************/
  4558. bool nsGEN::SMZDevice::CallBackST_MODE(ACS_BYTE* pCommand)
  4559. {
  4560. if (pCommand == NULL)
  4561. {
  4562. PRINTA_INFO("Get command is Null");
  4563. return false;
  4564. }//ENDIF
  4565. ACS_BYTE* stmpBuffer = pCommand;
  4566. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4567. ACS_BYTE System_Mode = (*(ACS_ENUM*)(stmpBuffer + 8)); //System_mode(1-7)
  4568. ACS_DUMMY dummy1 = (*(ACS_DUMMY*)(stmpBuffer + 9)); //System_mode(1-7)
  4569. int nCode = 1;
  4570. if (System_Mode == ACS_SERVICE)
  4571. {
  4572. nCode = 2;
  4573. }//ENDIF
  4574. m_UIClientUnit.m_STM->Update(nCode);
  4575. FireNotify(m_UIClientUnit.m_STM->GetKey(), m_UIClientUnit.m_STM->JSGet());
  4576. SetSH_Mode(System_Mode);
  4577. PRINTA_INFO("callback ST_MODE: %d,dummy1:%d\n", System_Mode, dummy1);
  4578. std::ostringstream buffer;
  4579. buffer << "ST_MODE:" << (int)System_Mode << ",dummy1:" << dummy1;
  4580. string str = buffer.str();
  4581. SendTelegramLog("ST_MODE", str.c_str(), object_id);
  4582. return true;
  4583. }
  4584. /*********************************************************************************
  4585. 函数名称:CallBackSDFRNAHBED2
  4586. 功能描述: 解析SDFRNAHBED2;(1、当前的病人信息(体型);2、当前DROC界面)
  4587. 修改记录:
  4588. 2021-04-20 创建
  4589. *******************************************************************************/
  4590. bool nsGEN::SMZDevice::CallBackSDFRNAHBED2(ACS_BYTE* pCommand)
  4591. {
  4592. if (pCommand == NULL)
  4593. {
  4594. PRINTA_INFO("Get command is Null");
  4595. return false;
  4596. }//ENDIF
  4597. ACS_BYTE* stmpBuffer = pCommand;
  4598. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4599. ACS_ENUM reply_req = (*(ACS_ENUM*)(stmpBuffer + 8));
  4600. ACS_INT aktcode = (*(ACS_INT*)(stmpBuffer + 12));
  4601. ACS_INT aktdata = (*(ACS_INT*)(stmpBuffer + 14)); //0=No Action / 1=Pat / 2=Exam / 3=Postproc / 4=Doc
  4602. int nTabCard = 0;
  4603. int nStatus = 0;
  4604. if (aktcode == TABCARD_TOGGLE)
  4605. {
  4606. nTabCard = (int)aktdata;
  4607. m_UIClientUnit.m_SDF->Update(nTabCard);
  4608. FireNotify(m_UIClientUnit.m_SDF->GetKey(), m_UIClientUnit.m_SDF->JSGet());
  4609. }
  4610. else if (aktcode == BTN_PATIENT_SIZE) //callback Patient size
  4611. {
  4612. //1: large; 2: Medium; 3:Small; 4;Custom define APR
  4613. //不处理
  4614. PRINTA_INFO("CallBackSDFRNAHBED2 Patient size: aktcode: %d,aktdata:%d\n", aktcode, aktdata);
  4615. }
  4616. else if (aktcode == REFRESH_ORGAN_PROGRAM/*REDO_ORGAN_PROGRAM*/) //根据siemens要求,更改对应的报文内容
  4617. {
  4618. if ((int)aktdata == 1)
  4619. {
  4620. nStatus = 1;
  4621. //PRINTA_INFO("Undo"); //需要设置消息到界面
  4622. }
  4623. else
  4624. {
  4625. nStatus = 0;
  4626. //PRINTA_INFO("No Undo");
  4627. }
  4628. m_UIClientUnit.m_UDO->Update(nStatus);
  4629. FireNotify(m_UIClientUnit.m_UDO->GetKey(), m_UIClientUnit.m_UDO->JSGet());
  4630. }
  4631. else if (aktcode == TOD)
  4632. {
  4633. SendIdfrnahbed(TOD, (int)aktdata);
  4634. }
  4635. if (m_nGenSTMode == ACS_SERVICE)
  4636. {
  4637. if (nTabCard == 2) //Siemens 要求 表示进入服务模式
  4638. {
  4639. m_bGenService = true;
  4640. }
  4641. else if (nTabCard == 1)//Siemens 要求 表示退出服务模式
  4642. {
  4643. m_bGenService = false;
  4644. }
  4645. }//ENDIF
  4646. PRINTA_INFO("CallBackSDFRNAHBED2: reply_req:%d,aktcode: %d,aktdata:%d,TableCard: %d\n", reply_req, aktcode, aktdata, nTabCard);
  4647. std::ostringstream buffer;
  4648. buffer << "aktcode:" << aktcode << ", aktdata:" << aktdata;
  4649. string str = buffer.str();
  4650. SendTelegramLog("SDFRNAHBED2", str.c_str(), object_id);
  4651. return true;
  4652. }
  4653. //ST_ORGAN_PROG: tell DROC to which OGP will be used in the next acquisition.
  4654. /*********************************************************************************
  4655. 函数名称:CallBackST_ORGAN_PROG
  4656. 功能描述: 返回当前使用的view名称
  4657. 修改记录:
  4658. 2021-04-23 创建
  4659. *******************************************************************************/
  4660. bool nsGEN::SMZDevice::CallBackST_ORGAN_PROG(ACS_BYTE* pCommand)
  4661. {
  4662. if (pCommand == NULL)
  4663. {
  4664. PRINTA_INFO("Get command is Null");
  4665. return false;
  4666. }//ENDIF
  4667. ACS_BYTE* stmpBuffer = pCommand;
  4668. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4669. ACS_STRING* temp = (ACS_STRING*)(pCommand + 8);
  4670. ACS_STRING* str = new ACS_STRING[(PROG_NAME_LENGTH + 1) * 2];
  4671. memset(str, 0, (PROG_NAME_LENGTH + 1) * sizeof(ACS_STRING) * 2);
  4672. ACS_STRING* tempStr = str;
  4673. for (int i = 0; i < PROG_NAME_LENGTH; i++, tempStr++, temp++)
  4674. {
  4675. *tempStr = *(ACS_STRING*)(temp);
  4676. }
  4677. str[PROG_NAME_LENGTH] = '\0';
  4678. string strDisplayOrganProg = wc2mb((const wchar_t*)str);
  4679. //m_pGenSiemensSalmon_UI->UIClientUnitLogic::GetSOP(strDisplayOrganProg.c_str()); //待完善
  4680. //ResDataObject resdata;
  4681. //resdata.update("SOP", strDisplayOrganProg.c_str());
  4682. m_UIClientUnit.m_SOP->Update(strDisplayOrganProg.c_str());
  4683. FireNotify(m_UIClientUnit.m_SOP->GetKey(), m_UIClientUnit.m_SOP->JSGet());
  4684. delete[] str;
  4685. str = NULL;
  4686. tempStr = NULL;
  4687. PRINTA_INFO("CallBackST_ORGAN_PROG: prog_name : %s\n", strDisplayOrganProg.c_str());//Warn
  4688. std::ostringstream buffer;
  4689. buffer << "prog_name:" << strDisplayOrganProg;
  4690. string strlog = buffer.str();
  4691. SendTelegramLog("ST_ORGAN_PROG", strlog.c_str(), object_id);
  4692. return true;
  4693. }
  4694. /*********************************************************************************
  4695. 函数名称:CallBackSRESETFEHLER
  4696. 功能描述: reset当前DROC错误状态
  4697. 修改记录:
  4698. 2021-04-23 创建
  4699. *******************************************************************************/
  4700. bool nsGEN::SMZDevice::CallBackSRESETFEHLER(ACS_BYTE* pCommand)
  4701. {
  4702. //add code, send the reset message to UI, then close the error box;
  4703. if (pCommand == NULL)
  4704. {
  4705. PRINTA_ERROR("Get command is Null");
  4706. return false;
  4707. }//ENDIF
  4708. return true;
  4709. }
  4710. /*********************************************************************************
  4711. 函数名称:CallBackSID
  4712. 功能描述: 解析SID信息
  4713. 对应需求:IS_rad_SID(VERSION_RAD3-VA10)
  4714. 修改记录:
  4715. 2021-04-23 创建
  4716. *******************************************************************************/
  4717. bool nsGEN::SMZDevice::CallBackSID(ACS_BYTE* pCommand) //receive SID "IFFA", unit: mm
  4718. {
  4719. if (pCommand == NULL)
  4720. {
  4721. PRINTA_ERROR("CallBackSID: Get pCommand is NULL");
  4722. return false;
  4723. }//ENDIF
  4724. ACS_BYTE* stmpBuffer = pCommand;
  4725. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4726. ACS_INT nSID = (*(ACS_INT*)(stmpBuffer + 8));
  4727. //m_SiemensSalmon_Element[CMD_ELEMENT_SID].fGetValue = nSID; //202110 待完善
  4728. //m_pCollimatorCommunication->CollimatorLogic::SetCollimatorSID(m_SiemensSalmon_Element[CMD_ELEMENT_SID].fGetValue);
  4729. PRINTA_INFO("CallBackSID: IFFA: %d mm\n", nSID);
  4730. std::ostringstream buffer;
  4731. buffer << "IFFA:" << (int)nSID;
  4732. string str = buffer.str();
  4733. SendTelegramLog("IFFA", str.c_str(), object_id);
  4734. return true;
  4735. }
  4736. /*********************************************************************************
  4737. 函数名称:CallBackWorkStation
  4738. 功能描述:获取当前探测器对应的Workstation信息
  4739. 修改记录:
  4740. 2015-04-20 创建
  4741. *******************************************************************************/
  4742. bool nsGEN::SMZDevice::CallBackWorkStationFromTUI(ACS_BYTE* pCommand) //receive System workstation SBEDSYS
  4743. {
  4744. if (pCommand == NULL)
  4745. {
  4746. PRINTA_ERROR("CallBackWorkStation: Get pCommand is NULL");
  4747. return false;
  4748. }//ENDIF
  4749. ACS_BYTE* stmpBuffer = pCommand;
  4750. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4751. ACS_INT nFunctionParam = (*(ACS_INT*)(stmpBuffer + 10));
  4752. ACS_INT nWorkStation = (*(ACS_INT*)(stmpBuffer + 12));
  4753. int nWorkStationEcom;
  4754. switch (nWorkStation)
  4755. {
  4756. case AXCS_MODE_SPOTFILM:
  4757. nWorkStationEcom = WS_TABLE;
  4758. break;
  4759. case AXCS_MODE_BWS:
  4760. nWorkStationEcom = WS_WALL;
  4761. break;
  4762. case AXCS_MODE_BED:
  4763. nWorkStationEcom = WS_FREE;
  4764. break;
  4765. case AXCS_MODE_TOMO:
  4766. nWorkStationEcom = WS_CONVENTIONAL;
  4767. break;
  4768. case AXCS_MODE_NONE:
  4769. //break;
  4770. default:
  4771. nWorkStationEcom = WS_CONVENTIONAL;
  4772. break;
  4773. }
  4774. PRINTA_INFO("CallBackWorkStation (SBEDSYS) from TUI: %d,ECOM: %d, FunctionNumber:%d\n", nWorkStation, nWorkStationEcom, nFunctionParam);
  4775. std::ostringstream buffer;
  4776. buffer << "From TUI fktscodesys: " << nWorkStation;
  4777. string str = buffer.str();
  4778. SendTelegramLog("SBEDSYS", str.c_str(), object_id);
  4779. return true;
  4780. }
  4781. /*********************************************************************************
  4782. 函数名称:CallBackCollimator
  4783. 功能描述: 获取遮光器尺寸信息
  4784. 修改记录:
  4785. 2015-04-20 创建
  4786. *******************************************************************************/
  4787. bool nsGEN::SMZDevice::CallBackCollimator(ACS_BYTE* pCommand) //receive collimator "IBLENDEANZ"
  4788. {
  4789. return true;
  4790. if (pCommand == NULL)
  4791. {
  4792. PRINTA_ERROR("CallBackCollimator: Get pCommand is NULL");
  4793. return false;
  4794. }//ENDIF
  4795. ACS_BYTE* stmpBuffer = pCommand;
  4796. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4797. ACS_ENUM nCollimatorMode = (*(ACS_ENUM*)(stmpBuffer + 10));
  4798. //m_pCollimatorCommunication->CollimatorLogic::SetCollimatorMode(nCollimatorMode); //202110 待完善
  4799. ACS_COUNT nCollimatorNumber = (*(ACS_COUNT*)(stmpBuffer + 11));
  4800. ACS_BYTE blendenauswahl = 0; //Collimator Cross or Length;
  4801. ACS_WORD blendenposition = 0; //Current Position size
  4802. ACS_BYTE blendenstatus = 0; //Collimator Status: moving or arrive status
  4803. int niblendeanz_t2_tag_Length = sizeof(ACS_BYTE) * 2 + sizeof(ACS_DUMMY) * 2 + sizeof(ACS_WORD) + sizeof(ACS_INT);
  4804. for (int i = 0; i < nCollimatorNumber; i++)
  4805. {
  4806. blendenauswahl = (*(ACS_BYTE*)(stmpBuffer + 12 + i * niblendeanz_t2_tag_Length));
  4807. blendenposition = (*(ACS_WORD*)(stmpBuffer + 14 + i * niblendeanz_t2_tag_Length));
  4808. blendenstatus = (*(ACS_BYTE*)(stmpBuffer + 18 + i * niblendeanz_t2_tag_Length));
  4809. if (blendenauswahl == HOEHENBLENDE)
  4810. {
  4811. //m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORHEIGHT].fGetValue = (float)blendenposition / 100.0f; //cm //202110 待完善
  4812. }
  4813. else if (blendenauswahl == BREITENBLENDE)
  4814. {
  4815. //m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORWIDTH].fGetValue = (float)blendenposition / 100.0f; //cm //202110 待完善
  4816. }
  4817. else
  4818. {
  4819. PRINTA_INFO("Get Other Collimator value");
  4820. }
  4821. 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",
  4822. nCollimatorNumber, i + 1, blendenauswahl, blendenposition, blendenstatus, niblendeanz_t2_tag_Length, nCollimatorMode);
  4823. std::ostringstream buffer;
  4824. buffer << "blendenauswahl:" << (int)blendenauswahl << ", blendenposition:" << (int)blendenposition
  4825. << ", blendenstatus:" << (int)blendenstatus << ", CollimatorMode:" << (int)nCollimatorMode;
  4826. string str = buffer.str();
  4827. SendTelegramLog("IBLENDEANZ", str.c_str(), object_id);
  4828. }
  4829. //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnCollimatorWidth((float)m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORWIDTH].fGetValue); //202110 待完善
  4830. //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnCollimatorLen((float)m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORHEIGHT].fGetValue); //202110 待完善
  4831. //m_pCollimatorCommunication->CollimatorLogic::SetCollimatorSize((float)m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORWIDTH].fGetValue, (float)m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORHEIGHT].fGetValue); //202110 待完善
  4832. return true;
  4833. }
  4834. /*********************************************************************************
  4835. 函数名称:CallBackGrid
  4836. 功能描述: 获取滤线栅信息
  4837. 修改记录:
  4838. 2021-04-23 创建
  4839. *******************************************************************************/
  4840. bool nsGEN::SMZDevice::CallBackGrid(ACS_BYTE* pCommand)
  4841. {
  4842. return true;
  4843. }
  4844. /*********************************************************************************
  4845. 函数名称:CallBackRQ_FDR_DATA
  4846. 功能描述: 获取对应探测器的workstation信息
  4847. 修改记录:
  4848. 2015-04-20 创建
  4849. *******************************************************************************/
  4850. bool nsGEN::SMZDevice::CallBackRQ_FDR_DATA(ACS_BYTE* pCommand)
  4851. {
  4852. if (pCommand == NULL)
  4853. {
  4854. PRINTA_ERROR("Get command is Null");
  4855. return false;
  4856. }//ENDIF
  4857. ACS_BYTE* stmpBuffer = pCommand;
  4858. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4859. ACS_ENUM nFPDType = (*(ACS_ENUM*)(stmpBuffer + 9));
  4860. ACS_ENUM nFPDTag = (*(ACS_ENUM*)(stmpBuffer + 12));
  4861. switch (nFPDTag)
  4862. {
  4863. case ACS_FDR_SERNUM: //VE61X
  4864. switch (nFPDType)
  4865. {
  4866. case ACS_FD_TABLE:
  4867. //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnWorkStation(WS_PARAM_TABLE_ECOM); //202110 待完善
  4868. break;
  4869. case ACS_FD_WALL:
  4870. //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnWorkStation(WS_PARAM_WALL_ECOM); //202110 待完善
  4871. break;
  4872. case ACS_FD_PORTABLE:
  4873. m_UIClientUnit.m_WS2FD->Update(WS_PARAM_FREE1_LARGE_ECOM);
  4874. FireDataNotify(m_UIClientUnit.m_WS2FD->GetKey(), m_UIClientUnit.m_WS2FD->JSGet());
  4875. break;
  4876. case ACS_FD_SMALL_PORTABLE:
  4877. m_UIClientUnit.m_WS2FD->Update(WS_PARAM_FREE2_SMALL_ECOM);
  4878. FireDataNotify(m_UIClientUnit.m_WS2FD->GetKey(), m_UIClientUnit.m_WS2FD->JSGet());
  4879. break;
  4880. case ACS_FD_STAND:
  4881. case ACS_FD_C_ARM:
  4882. case ACS_FD_FLEXIBLE:
  4883. default:
  4884. break;
  4885. }
  4886. break;
  4887. default:
  4888. break;
  4889. }
  4890. PRINTA_INFO("CallbackRQ_FDR_DATA: FPDType:%d,FPDTag: %d\n", (int)nFPDType, (int)nFPDTag);
  4891. std::ostringstream buffer;
  4892. buffer << "nFPDType:" << (int)nFPDType << ",nFPDTag:" << (int)nFPDTag;
  4893. string str = buffer.str();
  4894. SendTelegramLog("RQ_FDR_DATA", str.c_str(), object_id);
  4895. return true;
  4896. }
  4897. /*********************************************************************************
  4898. 函数名称:CallBackAdjust
  4899. 功能描述: PMS请求AP的读取或写入信息
  4900. 修改记录:
  4901. 2021-04-23 创建
  4902. *******************************************************************************/
  4903. bool nsGEN::SMZDevice::CallBackAdjust(ACS_BYTE* pCommand)
  4904. {
  4905. if (pCommand == NULL)
  4906. {
  4907. PRINTA_ERROR("Get command is Null");
  4908. return false;
  4909. }//ENDIF
  4910. ACS_BYTE* stmpBuffer = pCommand;
  4911. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4912. ACS_ENUM nAdjustAction = (*(ACS_ENUM*)(stmpBuffer + 8));
  4913. ACS_INT nAdjustIdent = (*(ACS_INT*)(stmpBuffer + 10));
  4914. PRINTA_INFO("Adjsut Action : %d, Identifier : %d, No Action\n", nAdjustAction, nAdjustIdent);
  4915. return true;
  4916. if ((nAdjustAction == ACS_ADJ_SUPPLY_DATA) && (nAdjustIdent == ACS_ADJUST_ID_FD_WLAN))
  4917. {
  4918. }
  4919. else if ((nAdjustAction == ACS_ADJ_STORE_DATA) && (nAdjustIdent == ACS_ADJUST_ID_FD_WLAN))
  4920. {
  4921. //write AP
  4922. SendAdjust(ACS_ADJ_FILETRANS_RUNNING);
  4923. }//ENDIF
  4924. std::ostringstream buffer;
  4925. buffer << "Adjsut Action:" << (int)nAdjustAction << ", Identifier:" << (int)nAdjustIdent;
  4926. string str = buffer.str();
  4927. SendTelegramLog("ST_ADJUST", str.c_str(), object_id);
  4928. return true;
  4929. }
  4930. /*********************************************************************************
  4931. 函数名称:CallBackIGGANZ2
  4932. 功能描述: 获取遮光器平移和探测器旋转状态
  4933. 对应需求:IS_rad_stand_collimation_sym_asym_parameter、IS_Rotaion_portableDet_default_rotation(VERSION_RAD3-VA10)
  4934. 修改记录:
  4935. 2021-04-23 创建
  4936. *******************************************************************************/
  4937. bool nsGEN::SMZDevice::CallBackIGGANZ2(ACS_BYTE* pCommand)
  4938. {
  4939. if (pCommand == NULL)
  4940. {
  4941. PRINTA_ERROR("Get command is Null");
  4942. return false;
  4943. }//ENDIF
  4944. ACS_BYTE* stmpBuffer = pCommand;
  4945. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  4946. ACS_COUNT nNumber = (*(ACS_COUNT*)(stmpBuffer + 11));
  4947. for (int n = 0; n < nNumber; n++)
  4948. {
  4949. ACS_INT anzcode = (*(ACS_INT*)(stmpBuffer + 12 + n * 4));
  4950. ACS_INT param = (*(ACS_INT*)(stmpBuffer + 14 + n * 4));
  4951. switch (anzcode)
  4952. {
  4953. case A_POSSYS:
  4954. //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnCollimatorAlign(param); //202110 待完善
  4955. break;
  4956. case A_DETECTOR_ORIENTATION:
  4957. //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnPANEL_ROTATE(param); //202110 待完善
  4958. break;
  4959. case A_TIEFENBLENDE_GEDREHT: //遮光器旋转 //与102、17同为ACSS的条件,可以省略;目前先按照现有逻辑设置
  4960. //m_pCollimatorCommunication->CollimatorLogic::SetCollimatorAngle((float)param);
  4961. break;
  4962. case A_TUBE_ROT_HOR: //球管旋转角度
  4963. //m_data.m_gen.m_nmTubeRotHor = param; //球管旋转角度:单位未知 //2021-04-21 待完善功能:需要设置到UI端
  4964. break;
  4965. case A_ORTHO_STEP: //Ortho step
  4966. //m_data.m_gen.m_nmCP_Position_Match = param; //2021-04-21 待完善功能:需要设置到UI端
  4967. if (param >= 9)
  4968. {
  4969. //清除界面消息
  4970. //m_data.m_gen.m_strsNotifyMessage = ""; //2021-04-21 待完善功能:需要设置到UI端
  4971. }
  4972. break;
  4973. default:
  4974. break;
  4975. }
  4976. 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",
  4977. nNumber, n, anzcode, param);
  4978. std::ostringstream buffer;
  4979. buffer << "Number:" << (int)nNumber << ", n:" << n
  4980. << ", anzcode:" << anzcode << ", Param:" << param;
  4981. string str = buffer.str();
  4982. SendTelegramLog("IGGANZ2", str.c_str(), object_id);
  4983. }
  4984. return true;
  4985. }
  4986. /*********************************************************************************
  4987. 函数名称:CallBackTubeHeat
  4988. 功能描述: 获取当前设备热容量
  4989. 修改记录:
  4990. 2021-04-22 创建
  4991. *******************************************************************************/
  4992. bool nsGEN::SMZDevice::CallBackTubeHeat(ACS_BYTE* pCommand)
  4993. {
  4994. if (pCommand == NULL)
  4995. {
  4996. PRINTA_ERROR("Get command is Null");
  4997. return false;
  4998. }//ENDIF
  4999. ACS_BYTE* stmpBuffer = pCommand;
  5000. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5001. ACS_BYTE nTubeHeat = (*(ACS_BYTE*)(stmpBuffer + 8));
  5002. ACS_WORD nWaitTime = (*(ACS_WORD*)(stmpBuffer + 10));
  5003. m_DoseUnit.m_HE->Update(nTubeHeat);
  5004. FireNotify(m_DoseUnit.m_HE->GetKey(), m_DoseUnit.m_HE->JSGet());
  5005. PRINTA_INFO("CallBackTubeHeat(IROEANZ): TubeHeat: %d, nWaitTime:%d\n", nTubeHeat, nWaitTime);
  5006. std::ostringstream buffer;
  5007. buffer << "TubeHeat:" << (int)nTubeHeat << ", nWaitTime:" << nWaitTime;
  5008. string str = buffer.str();
  5009. SendTelegramLog("IROEANZ", str.c_str(), object_id);
  5010. return true;
  5011. }
  5012. /*********************************************************************************
  5013. 函数名称:CallBackSTDIAG
  5014. 功能描述: 接受当前系统需要查询版本的内容
  5015. 修改记录:
  5016. 2021-04-23 创建
  5017. *******************************************************************************/
  5018. bool nsGEN::SMZDevice::CallBackSTDIAG(ACS_BYTE* pCommand)
  5019. {
  5020. if (pCommand == NULL)
  5021. {
  5022. PRINTA_ERROR("Get command is Null");
  5023. return false;
  5024. }//ENDIF
  5025. ACS_BYTE* stmpBuffer = pCommand;
  5026. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5027. int nidentifier = (*(ACS_INT*)(stmpBuffer + 10));
  5028. //设置当前的状态信息到软件端
  5029. m_UIClientUnit.m_RSI->Update(nidentifier);
  5030. FireNotify(m_UIClientUnit.m_RSI->GetKey(), m_UIClientUnit.m_RSI->JSGet());
  5031. SetSystemStatusInformation(nidentifier, "", ACS_DIAG_RUNNING);
  5032. PRINTA_INFO("CallBackSTDIAG: nidentifier: %d\n", nidentifier);
  5033. std::ostringstream buffer;
  5034. buffer << "nidentifier:" << (int)nidentifier;
  5035. string str = buffer.str();
  5036. SendTelegramLog("ST_DIAG", str.c_str(), object_id);
  5037. return true;
  5038. }
  5039. /*********************************************************************************
  5040. 函数名称:CallBackRQOBJECT
  5041. 功能描述: 接受当前系统需要查询的内容
  5042. 修改记录:
  5043. 2021-04-23 创建
  5044. *******************************************************************************/
  5045. bool nsGEN::SMZDevice::CallBackRQOBJECT(ACS_BYTE* pCommand)
  5046. {
  5047. if (pCommand == NULL)
  5048. {
  5049. PRINTA_ERROR("Get command is Null");
  5050. return false;
  5051. }//ENDIF
  5052. //设置当前需要查询的模块版本信息到软件端
  5053. ACS_BYTE* stmpBuffer = pCommand;
  5054. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5055. ACS_WORD wObject_id = (*(ACS_WORD*)(stmpBuffer + 8));
  5056. if (wObject_id == SH_VERSION_CHECK)
  5057. {
  5058. int nCode = 0;
  5059. m_UIClientUnit.m_RMV->Update(nCode);
  5060. FireNotify(m_UIClientUnit.m_RMV->GetKey(), m_UIClientUnit.m_RMV->JSGet());
  5061. }
  5062. std::ostringstream buffer;
  5063. buffer << "Object_id:" << wObject_id;
  5064. string str = buffer.str();
  5065. SendTelegramLog("RQ_OBJECT", str.c_str(), object_id);
  5066. return true;
  5067. }
  5068. ///*********************************************************************************
  5069. //函数名称:CallBackDoorStatus
  5070. //功能描述: 解析门的开关状态
  5071. //修改记录:
  5072. //2021-04-23 创建
  5073. //*******************************************************************************/
  5074. bool nsGEN::SMZDevice::CallBackDoorStatus(ACS_BYTE* pCommand)
  5075. {
  5076. if (pCommand == NULL)
  5077. {
  5078. PRINTA_ERROR("Get command is Null");
  5079. return false;
  5080. }//endif
  5081. ACS_BYTE* stmpBuffer = pCommand;
  5082. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5083. ACS_BYTE nDoorStatus = (*(ACS_BYTE*)(stmpBuffer + 9));
  5084. if (1 == nDoorStatus)
  5085. {
  5086. PRINTA_INFO("Door Close");
  5087. }
  5088. else if (2 == nDoorStatus)
  5089. {
  5090. PRINTA_INFO("Door Open ");
  5091. }
  5092. else
  5093. {
  5094. PRINTA_INFO("Door Status is unknown");
  5095. }
  5096. std::ostringstream buffer;
  5097. buffer << "DoorStatus:" << (int)nDoorStatus;
  5098. string str = buffer.str();
  5099. SendTelegramLog("IALLGANZ", str.c_str(), object_id);
  5100. return true;
  5101. }
  5102. /*********************************************************************************
  5103. 函数名称:CallBackSTCONFIG
  5104. 功能描述: 获取并解析ST_CONFIG报文
  5105. 参数记录:
  5106. /* Parameter: cfg_action (Defines)
  5107. /* ACS_CFG_SUPPLY_DATA 1 copy to the host
  5108. /* ACS_CFG_STORE_DATA 2 copy from the host
  5109. /* ACS_CFG_ABORT_DATA 3 abort
  5110. /* ACS_CFG_COMPARE 4 compare config data
  5111. /*修改记录:
  5112. 2021-04-23 创建
  5113. *******************************************************************************/
  5114. bool nsGEN::SMZDevice::CallBackSTCONFIG(ACS_BYTE* pCommand)
  5115. {
  5116. if (pCommand == NULL)
  5117. {
  5118. PRINTA_ERROR("Get command is Null");
  5119. return false;
  5120. }//ENDIF
  5121. ACS_BYTE* stmpBuffer = pCommand;
  5122. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5123. int nconfigResult = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t))); //执行行为
  5124. int nDummy1 = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_DUMMY))); //执行行为
  5125. PRINTA_INFO("CallBackSTCONFIG: nconfigResult: %d,Dummy1: %d\n", nconfigResult, nDummy1);
  5126. if (nDummy1 != 0)
  5127. {
  5128. if (nDummy1 == 1)
  5129. {
  5130. if (nconfigResult == ACS_CFG_STORE_DATA)
  5131. {
  5132. m_UIClientUnit.m_CFM->Update(nDummy1); //1:AutoConfig; 2:Restore
  5133. FireNotify(m_UIClientUnit.m_CFM->GetKey(), m_UIClientUnit.m_CFM->JSGet());//20220406 无法区分configration与backupstore流程
  5134. }
  5135. }
  5136. else
  5137. {
  5138. m_UIClientUnit.m_CFM->Update(nDummy1); //1:AutoConfig; 2:Restore
  5139. FireNotify(m_UIClientUnit.m_CFM->GetKey(), m_UIClientUnit.m_CFM->JSGet());//20220406 无法区分configration与backupstore流程
  5140. }
  5141. }
  5142. std::ostringstream buffer;
  5143. buffer << "cfg_action:" << nconfigResult << "Dummy1:" << nDummy1;
  5144. string str = buffer.str();
  5145. SendTelegramLog("ST_CONFIG", str.c_str(), object_id);
  5146. if ((nconfigResult != ACS_CFG_STORE_DATA)||(nDummy1 != 1))
  5147. //if (nDummy1 != 1)
  5148. {
  5149. SetSHCONFIG(ACS_OK); //20220402 由上层服务端给出配置文件处理结果
  5150. }
  5151. return true;
  5152. }
  5153. /*********************************************************************************
  5154. 函数名称:CallbackST_PWR_OFF
  5155. 功能描述:接收到关机报文
  5156. 参数:Full_image_size、image_size、overlap、Image number
  5157. 修改记录:
  5158. 2021-4-21 创建
  5159. *******************************************************************************/
  5160. bool nsGEN::SMZDevice::CallbackST_PWR_OFF(ACS_BYTE* pCommand)
  5161. {
  5162. if (pCommand == NULL)
  5163. {
  5164. PRINTA_ERROR("Get command is Null");
  5165. return false;
  5166. }//ENDIF
  5167. int nECOMShutDown = 0;
  5168. ACS_BYTE* stmpBuffer = pCommand;
  5169. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5170. int nShutDown = (*(ACS_ENUM*)(stmpBuffer + 8));
  5171. int nDelay = (*(ACS_INT*)(stmpBuffer + 8 + sizeof(ACS_ENUM) + sizeof(ACS_DUMMY)));
  5172. switch (nShutDown)
  5173. {
  5174. case ACS_REQ_PWR_OFF:
  5175. nECOMShutDown = 1;
  5176. break;
  5177. case ACS_SHUTDOWN_APP:
  5178. nECOMShutDown = 2;
  5179. break;
  5180. case ACS_PWR_OFF_CANCEL:
  5181. nECOMShutDown = 0;
  5182. break;
  5183. default:
  5184. break;
  5185. }
  5186. ResDataObject resdata;
  5187. resdata.add("State", nECOMShutDown);
  5188. resdata.add("DelayTime", nDelay);
  5189. //EventCenter->OnNotify(8, "SDN", resdata.encode());
  5190. m_UIClientUnit.m_SDN->Update(resdata.encode());
  5191. FireDataNotify(m_UIClientUnit.m_SDN->GetKey(), m_UIClientUnit.m_SDN->JSGet());
  5192. PRINTA_INFO("CallbackST_PWR_OFF shutdown: ECOM:%d,From AXIM:Shutdown: %d,Delay:%d\n",
  5193. nECOMShutDown, nShutDown, nDelay);
  5194. std::ostringstream buffer;
  5195. buffer << "CallbackST_PWR_OFF shutdown:" << nShutDown << ",Delay Value:" << nDelay;
  5196. string str = buffer.str();
  5197. SendTelegramLog("ST_PWR_OFF", str.c_str(), object_id);
  5198. return true;
  5199. }
  5200. /*********************************************************************************
  5201. 函数名称:CallBackPMSSystemStatus
  5202. 功能描述: 获取当前PMS状态
  5203. 修改记录:
  5204. 2021-04-20 创建
  5205. *******************************************************************************/
  5206. bool nsGEN::SMZDevice::CallBackPMSSystemStatus(ACS_BYTE* pCommand)
  5207. {
  5208. if (pCommand == NULL)
  5209. {
  5210. PRINTA_INFO("Get command is Null");
  5211. return false;
  5212. }//ENDIF
  5213. ACS_BYTE* stmpBuffer = pCommand;
  5214. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5215. ACS_SET LoginStatus = (*(ACS_SET*)(stmpBuffer + 8));
  5216. int nStatus = 0;
  5217. if ((LoginStatus & ACS_STATE_SERVICE_SESSION) > 0)
  5218. {
  5219. nStatus = 1;
  5220. m_nGenSTMode = ACS_SERVICE;
  5221. }
  5222. else
  5223. {
  5224. nStatus = 0;
  5225. m_nGenSTMode = -1;
  5226. }
  5227. m_UIClientUnit.m_PLS->Update(nStatus);
  5228. FireNotify(m_UIClientUnit.m_PLS->GetKey(), m_UIClientUnit.m_PLS->JSGet());
  5229. PRINTA_INFO("CallBackSystemLoginStatus:LoginStatus: %x\n", LoginStatus);
  5230. int nAutoConfig = -1;
  5231. if (LoginStatus == ACS_STATE_SERVICE_SESSION)
  5232. {
  5233. nAutoConfig = 1;
  5234. }
  5235. else if (LoginStatus == (ACS_STATE_CONF_INCONSISTENT & ACS_STATE_SERVICE_SESSION))
  5236. {
  5237. nAutoConfig = 0;
  5238. }
  5239. m_UIClientUnit.m_AutoConfig->Update(nAutoConfig);
  5240. FireNotify(m_UIClientUnit.m_AutoConfig->GetKey(), m_UIClientUnit.m_AutoConfig->JSGet());
  5241. std::ostringstream buffer;
  5242. buffer << "LoginStatus:" << LoginStatus;
  5243. string str = buffer.str();
  5244. SendTelegramLog("ST_SYSTEM_STATE", str.c_str(), object_id);
  5245. return true;
  5246. }
  5247. /*********************************************************************************
  5248. 函数名称:CallbackIXRAY
  5249. 功能描述:对IXRAY消息进行反馈处理
  5250. 修改记录:
  5251. 2021-4-22 创建
  5252. *******************************************************************************/
  5253. bool nsGEN::SMZDevice::CallbackIXRAY(ACS_BYTE* pCommand)
  5254. {
  5255. if (pCommand == NULL)
  5256. {
  5257. PRINTA_ERROR("CallbackIXRAY: Get command is Null");
  5258. return false;
  5259. }//ENDIF
  5260. ACS_BYTE* stmpBuffer = pCommand;
  5261. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5262. ACS_BYTE xray = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t)));
  5263. ACS_DWORD acq_index = (*(ACS_DWORD*)(pCommand + sizeof(acs_obj_header_t) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_BYTE)));
  5264. if (xray > 0)
  5265. {
  5266. if ((m_bExposureStatus)||(m_bCalibMode)) //仅在收到手闸信号时,设置XRAYON状态;XRAYOFF不受影响,可以设置
  5267. {
  5268. //if (acq_index != m_nExposureIndex)
  5269. //{
  5270. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYON);
  5271. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  5272. PRINTA_INFO("CallbackIXRAY: Get Exposure XRAYON,Send the status GENERATOR_RAD_XRAYON\n");
  5273. Clear_DAP();
  5274. ResetEvent(m_hGenPostEvent);
  5275. ResetEvent(m_hGenPostDAPEvent);
  5276. ResetEvent(m_hWaitForDapEvent);
  5277. m_nExposureIndex = acq_index;
  5278. m_FPDGUnit->OnXrayStatus(true);
  5279. DWORD dwThreadId;
  5280. if (NULL == m_hWaitForDapThread)
  5281. {
  5282. }
  5283. else
  5284. {
  5285. m_hWaitForDapThread = NULL;
  5286. }
  5287. m_hWaitForDapThread = CreateThread(NULL, 0, WaitForDapThread, this, 0, &dwThreadId);
  5288. if (m_hWaitForDapThread == NULL)
  5289. {
  5290. PRINTA_DEBUG("Open WaitForDapThread Failed");
  5291. }
  5292. //}
  5293. //else
  5294. //{
  5295. // PRINTA_ERROR("CallbackIXRAY: get same index for IXRAYON, don't send the XRAYON message to HW \n");
  5296. //}
  5297. }
  5298. else
  5299. {
  5300. 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);
  5301. }
  5302. }
  5303. else
  5304. {
  5305. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYOFF);
  5306. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  5307. m_bExposureStatus = false;
  5308. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  5309. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  5310. PRINTA_INFO("CallbackIXRAY: Get Exposure XRAYOFF,Send the status GENERATOR_RAD_XRAYOFF\n");
  5311. }
  5312. PRINTA_INFO("xray: %d, index:%lu\n", xray, acq_index);
  5313. std::ostringstream buffer;
  5314. buffer << "xray:" << (int)xray << ",index:" << (int)acq_index;
  5315. string str = buffer.str();
  5316. SendTelegramLog("IXRAY", str.c_str(), object_id);
  5317. return true;
  5318. }
  5319. /*********************************************************************************
  5320. 函数名称:CallbackIWATERVALACQ
  5321. 功能描述: 获取当前DAP值
  5322. 修改记录:
  5323. 2021-04-22 创建
  5324. *******************************************************************************/
  5325. bool nsGEN::SMZDevice::CallbackIWATERVALACQ(ACS_BYTE* pCommand)
  5326. {
  5327. if (pCommand == NULL)
  5328. {
  5329. PRINTA_ERROR("Get command is Null");
  5330. return false;
  5331. }//ENDIF
  5332. ACS_BYTE* stmpBuffer = pCommand;
  5333. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5334. int nTempKV = (*(ACS_INT*)(stmpBuffer + 8 + sizeof(ACS_DWORD) + 2 * sizeof(ACS_WORD) + sizeof(ACS_INT)));
  5335. int nTempMA = (*(ACS_INT*)(stmpBuffer + 8 + sizeof(ACS_DWORD) + 2 * sizeof(ACS_WORD) + 2 * sizeof(ACS_INT))); //20220221:按照Siemens要求,虽然解析,但是不使用
  5336. int nTempMAS = (*(ACS_LINT*)(stmpBuffer + 8 + sizeof(ACS_DWORD) + 3 * sizeof(ACS_WORD) + 3 * sizeof(ACS_INT)));
  5337. int nTempMS = (*(ACS_LINT*)(stmpBuffer + 8 + sizeof(ACS_DWORD) + 3 * sizeof(ACS_WORD) + 3 * sizeof(ACS_INT) + sizeof(ACS_LINT)));
  5338. PRINTA_INFO("== IN ==: IWATERVALACQ CallbackPostGenParam begin kv:%d,wMAS: %d, wMS: %d,ma:%d\n", nTempKV, nTempMAS, nTempMS, nTempMA);
  5339. //KV
  5340. m_DoseUnit.m_PostKV->Update((float)((nTempKV) / 10.0f));
  5341. FireNotify(m_DoseUnit.m_PostKV->GetKey(), m_DoseUnit.m_PostKV->JSGet());
  5342. //MAS
  5343. m_DoseUnit.m_PostMAS->Update((float)((nTempMAS) / 100.0f));
  5344. FireNotify(m_DoseUnit.m_PostMAS->GetKey(), m_DoseUnit.m_PostMAS->JSGet());
  5345. //MS
  5346. m_DoseUnit.m_PostMS->Update((float)((nTempMS) / 10.0f));
  5347. FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
  5348. //MA
  5349. if (nTempMS > 0)
  5350. {
  5351. m_DoseUnit.m_PostMA->Update(m_DoseUnit.m_PostMAS->Get() * 1000.0 / m_DoseUnit.m_PostMS->Get());
  5352. }
  5353. else
  5354. {
  5355. m_DoseUnit.m_PostMA->Update(0);
  5356. }
  5357. FireNotify(m_DoseUnit.m_PostMA->GetKey(), m_DoseUnit.m_PostMA->JSGet());
  5358. PRINTA_INFO("== IN ==: IWATERVALACQ CallbackPostGenParam PostKV:%f,PostMAS: %f, PostMS: %f, nTempMA: %f,PostMA:%f\n",
  5359. (float)((nTempKV) / 10.0f),
  5360. (float)((nTempMAS) / 100.0f),
  5361. (float)((nTempMS) / 10.0f),
  5362. (float)nTempMA,
  5363. (float)m_DoseUnit.m_PostMA->Get());
  5364. 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)));
  5365. 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)));
  5366. m_DoseUnit.m_ReferenceAirKerma->Update((float)(nskdose * 0.01f));
  5367. FireNotify(m_DoseUnit.m_ReferenceAirKerma->GetKey(), m_DoseUnit.m_ReferenceAirKerma->JSGet());
  5368. 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)));
  5369. m_CollimatorUnit.m_Filter->Update(filter_acq);
  5370. FireNotify(m_CollimatorUnit.m_Filter->GetKey(), m_CollimatorUnit.m_Filter->JSGet());
  5371. ACS_DWORD acq_index = (*(ACS_DWORD*)(stmpBuffer + sizeof(acs_obj_header_t)));
  5372. m_DoseUnit.m_GenCurrentExpNumber->Update(acq_index);
  5373. FireNotify(m_DoseUnit.m_GenCurrentExpNumber->GetKey(), m_DoseUnit.m_GenCurrentExpNumber->JSGet());
  5374. 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)));
  5375. m_DoseUnit.m_GenTotalAcqTimes->Update(acq_index);
  5376. FireNotify(m_DoseUnit.m_GenTotalAcqTimes->GetKey(), m_DoseUnit.m_GenTotalAcqTimes->JSGet());
  5377. 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));
  5378. if (ndfp > 0)
  5379. {
  5380. m_DAP->Update((float)ndfp / 1000.0f);
  5381. FireNotify(m_DAP->GetKey(), m_DAP->JSGet());
  5382. SetEvent(m_hGenPostDAPEvent);
  5383. PRINTA_INFO("CallbackIWATERVALACQ Get DFP: %f,SetDAPEvent", (float)ndfp);
  5384. }
  5385. SetEvent(m_hGenPostEvent);
  5386. if (((nTempKV == 0)&&(nTempMAS == 0)&&(ndfp == 0))
  5387. ||((nTempKV != 0) && (nTempMAS != 0) && (ndfp != 0)))
  5388. {
  5389. SetEvent(m_hWaitForDapEvent);
  5390. }
  5391. else
  5392. {
  5393. PRINTA_ERROR("CallbackIWATERVALACQ:Get Post Parameter = 0");
  5394. }
  5395. 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",
  5396. acq_index, (float)nStime, (float)ndfp / 1000.0f, m_nDAPUnit, (float)(nskdose * 0.01f), (int)nFocus,(int)filter_acq);
  5397. std::ostringstream buffer;
  5398. buffer << "CallbackIWATERVALACQ ACQIndex : " << acq_index << ", Stime : "
  5399. << (float)nStime << ", dfp :" << (float)ndfp / 1000.0f << "(dGycm ^ 2), ReferenceAirKerma :" << (float)(nskdose * 0.01f) << "(mGy)"
  5400. << ",PostKV:"<< (float)m_DoseUnit.m_PostKV->Get()<<", PostMAS:"<< m_DoseUnit.m_PostMAS->Get()
  5401. << ",PostMS:" << (float)m_DoseUnit.m_PostMS->Get() << ", PostMA:" << m_DoseUnit.m_PostMA->Get() << ",FOKUS:" << (int)nFocus << ",filter_acq:" << (int)filter_acq;
  5402. string str = buffer.str();
  5403. SendTelegramLog("IWATERVALACQ", str.c_str(), object_id);
  5404. return true;
  5405. }
  5406. //发生器READY,表示可以按手闸曝光了
  5407. /*********************************************************************************
  5408. 函数名称:CallBackIANLBEREIT
  5409. 功能描述: 解析发生器状态是否ready
  5410. 修改记录:
  5411. 2021-04-23 创建
  5412. *******************************************************************************/
  5413. bool nsGEN::SMZDevice::CallBackIANLBEREIT(ACS_BYTE* pCommand)
  5414. {
  5415. if (pCommand == NULL)
  5416. {
  5417. PRINTA_ERROR("Get command is Null");
  5418. return false;
  5419. }//ENDIF
  5420. ACS_BYTE* stmpBuffer = pCommand;
  5421. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5422. ACS_BYTE nANLAUFNBEREIT = (*(ACS_BYTE*)(stmpBuffer + 8));
  5423. if (1 == nANLAUFNBEREIT)
  5424. {
  5425. string code = "0";
  5426. //string code = "Not_Ready";
  5427. string info = "";
  5428. int level = AUTOCLEARERROR;
  5429. m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
  5430. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_STANDBY);
  5431. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  5432. if (m_bAutoHandSwitch)
  5433. {
  5434. SendSAUSLBED(1); //自动曝光 按下手闸
  5435. m_bAutoHandSwitch = false;
  5436. }
  5437. PRINTA_INFO("CallBack IANLBEREIT:1 ,Generator Ready\n");
  5438. }
  5439. else
  5440. {
  5441. if (nANLAUFNBEREIT == m_nIdfrstatus)
  5442. {
  5443. PRINTA_WARN("CallBack IANLBEREIT: Generator not Ready from IS, %d\n", nANLAUFNBEREIT);
  5444. }
  5445. else
  5446. {
  5447. PRINTA_WARN("CallBack IANLBEREIT: Generator not Ready from Other, %d\n", nANLAUFNBEREIT);
  5448. if ((int)m_DoseUnit.m_GenState->Get() != (int)AttrKey::GENERATOR_STATUS_ERROR)
  5449. {
  5450. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_ERROR);
  5451. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  5452. PRINTA_DEBUG("CallBack IANLBEREIT: Different status as before,send to subSystem\n");
  5453. }
  5454. else
  5455. {
  5456. PRINTA_DEBUG("CallBack IANLBEREIT: Due to the same status,don't send the status to subsystem.\n");
  5457. }
  5458. }
  5459. }
  5460. PRINTA_INFO("CallBack IANLBEREIT: %d\n", nANLAUFNBEREIT);
  5461. std::ostringstream buffer;
  5462. buffer << "CallBack IANLBEREIT:" << (int)nANLAUFNBEREIT;
  5463. string str = buffer.str();
  5464. SendTelegramLog("0xF3 IANLBEREIT", str.c_str(), object_id);
  5465. return true;
  5466. }
  5467. ///*********************************************************************************
  5468. //函数名称:CallBackST_DATA_TRANS
  5469. //功能描述: 获取并解析ST_DATA_TRANS报文
  5470. //修改记录:
  5471. //2021-04-23 创建
  5472. //*******************************************************************************/
  5473. bool nsGEN::SMZDevice::CallBackST_DATA_TRANS(ACS_BYTE* pCommand)
  5474. {
  5475. if (pCommand == NULL)
  5476. {
  5477. PRINTA_ERROR("Get command is Null");
  5478. return false;
  5479. }//ENDIF
  5480. ACS_BYTE* stmpBuffer = pCommand;
  5481. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5482. int ndata_action = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t))); //执行行为
  5483. int nIdent = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t) + 2)); //执行行为
  5484. if (ndata_action == 5) //需要进行backup操作
  5485. {
  5486. m_UIClientUnit.m_BRM->Update(ndata_action);
  5487. FireDataNotify(m_UIClientUnit.m_BRM->GetKey(), m_UIClientUnit.m_BRM->JSGet());
  5488. m_nBackup_Restre_Identifier = nIdent;
  5489. }
  5490. else
  5491. {
  5492. SetSH_DATA_TRANS(1,nIdent);
  5493. }
  5494. PRINTA_INFO("CallBackST_DATA_TRANS: nconfigResult = %d,m_nBackup_Restre_Identifier: %d\n",
  5495. ndata_action, m_nBackup_Restre_Identifier);
  5496. std::ostringstream buffer;
  5497. buffer << "data_action:" << ndata_action << "Identifier:" << m_nBackup_Restre_Identifier;
  5498. string str = buffer.str();
  5499. SendTelegramLog("ST_DATA_TRANS", str.c_str(), object_id);
  5500. return true;
  5501. }
  5502. ///*********************************************************************************
  5503. //函数名称:CallbackExposureNumber
  5504. //功能描述: 解析曝光的次数报文(ISERVBETRIEB)
  5505. //修改记录:
  5506. //2021-04-23 创建
  5507. //*******************************************************************************/
  5508. bool nsGEN::SMZDevice::CallbackExposureNumber(ACS_BYTE* pCommand)
  5509. {
  5510. if (pCommand == NULL)
  5511. {
  5512. PRINTA_ERROR("Get command is Null");
  5513. return false;
  5514. }//ENDIF
  5515. ACS_BYTE* stmpBuffer = pCommand;
  5516. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5517. ACS_LINT nSmallFocusNumber = (*(ACS_LINT*)(stmpBuffer + sizeof(iservbetrieb_t1) + 4));
  5518. ACS_LINT nLargeFocusNumber = (*(ACS_LINT*)(stmpBuffer + sizeof(iservbetrieb_t1) + 4 + sizeof(ACS_LINT) + 2 * sizeof(ACS_WORD)));
  5519. m_DoseUnit.m_GenTotalExpNumber->Update(nSmallFocusNumber + nLargeFocusNumber);
  5520. FireNotify(m_DoseUnit.m_GenTotalExpNumber->GetKey(), m_DoseUnit.m_GenTotalExpNumber->JSGet());
  5521. ACS_WORD nWaitTime = (*(ACS_WORD*)(stmpBuffer + sizeof(iservbetrieb_t1) + 4 + sizeof(ACS_LINT)));
  5522. m_DoseUnit.m_GenTubeCoolWaitTimes->Update((int)nWaitTime);
  5523. FireNotify(m_DoseUnit.m_GenTubeCoolWaitTimes->GetKey(), m_DoseUnit.m_GenTubeCoolWaitTimes->JSGet());
  5524. ACS_WORD nOverLoadNumber = (*(ACS_WORD*)(stmpBuffer + sizeof(iservbetrieb_t1) + 4 + sizeof(ACS_LINT) + sizeof(ACS_WORD)));
  5525. m_DoseUnit.m_GenTubeOverLoadNumber->Update((int)nOverLoadNumber);
  5526. FireNotify(m_DoseUnit.m_GenTubeOverLoadNumber->GetKey(), m_DoseUnit.m_GenTubeOverLoadNumber->JSGet());
  5527. int nExposureNumber = nSmallFocusNumber + nLargeFocusNumber;
  5528. PRINTA_INFO("CallbackExposureNumber: ExposureNumber: %d,WaitTime: %d,OverLoadNumber:%d\n",
  5529. nExposureNumber, nWaitTime, nOverLoadNumber);
  5530. std::ostringstream buffer;
  5531. buffer << "SmallFocusNumber:" << nSmallFocusNumber << "LargeFocusNumber:" << nSmallFocusNumber
  5532. << "WaitTime:" << nWaitTime << "OverLoadNumber:" << nOverLoadNumber;
  5533. string str = buffer.str();
  5534. SendTelegramLog("ISERVBETRIEB", str.c_str(), object_id);
  5535. return true;
  5536. }
  5537. /*********************************************************************************
  5538. 函数名称:CallBackSOD
  5539. 功能描述: 解析SOD信息
  5540. 对应需求:IS_rad_SOD
  5541. 修改记录:
  5542. 2017-10-09 创建
  5543. *******************************************************************************/
  5544. bool nsGEN::SMZDevice::CallBackSOD(ACS_BYTE* pCommand) //receive SOD "ISOD", unit: mm
  5545. {
  5546. if (pCommand == NULL)
  5547. {
  5548. PRINTA_ERROR("CallBackSOD: Get pCommand is NULL");
  5549. return false;
  5550. }//ENDIF
  5551. ACS_BYTE* stmpBuffer = pCommand;
  5552. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5553. ACS_INT nSOD = (*(ACS_INT*)(stmpBuffer + 8));
  5554. //m_SiemensSalmon_Element[CMD_ELEMENT_SOD].fGetValue = nSOD / 10.0f; //202110 待完善
  5555. //m_pGenSiemensSalmon_Mech->Mech::UpdateSOD(nSOD / 10.0f);
  5556. PRINTA_INFO("Callback ISOD: %d (0.1mm),SOD:%f(mm)\n", nSOD, (float)(nSOD / 10.0f));
  5557. std::ostringstream buffer;
  5558. buffer << "ISOD:" << nSOD << "(0.1mm),SOD::" << (float)(nSOD / 10.0f);
  5559. string str = buffer.str();
  5560. SendTelegramLog("ISOD", str.c_str(), object_id);
  5561. return true;
  5562. }
  5563. ///*********************************************************************************
  5564. //函数名称:CallbackIACSS
  5565. //功能描述: 解析IACSS报文(硬裁剪条件)
  5566. //修改记录:
  5567. //2021-04-23 创建
  5568. //*******************************************************************************/
  5569. bool nsGEN::SMZDevice::CallbackIACSS(ACS_BYTE* pCommand)
  5570. {
  5571. if (pCommand == NULL)
  5572. {
  5573. PRINTA_ERROR("Get command is Null");
  5574. return false;
  5575. }//ENDIF
  5576. ACS_BYTE* stmpBuffer = pCommand;
  5577. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5578. ACS_ENUM acss = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t)));
  5579. //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnHWcrop((int)acss); //202110 待完善
  5580. PRINTA_INFO("CallbackIACSS acss: %d\n", acss);
  5581. std::ostringstream buffer;
  5582. buffer << "acss:" << (int)acss;
  5583. string str = buffer.str();
  5584. SendTelegramLog("IACSS", str.c_str(), object_id);
  5585. return true;
  5586. }
  5587. /*********************************************************************************
  5588. 函数名称:CallBackSFANZLOESCHEN
  5589. 功能描述: 获取SFANZLOESCHEN报文,表示错误被清除
  5590. 修改记录:
  5591. 2021-04-23 创建
  5592. *******************************************************************************/
  5593. bool nsGEN::SMZDevice::CallBackSFANZLOESCHEN(ACS_BYTE* pCommand)
  5594. {
  5595. if (pCommand == NULL)
  5596. {
  5597. PRINTA_ERROR("Get command is Null");
  5598. return false;
  5599. }//ENDIF
  5600. ACS_BYTE* stmpBuffer = pCommand;
  5601. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5602. string code = "0";
  5603. string info = "";
  5604. int level = 0;
  5605. m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
  5606. PRINTA_INFO("CallBackSFANZLOESCHEN:Get Error Recover\n");
  5607. SendTelegramLog("SFANZLOESCHEN","", object_id);
  5608. return true;
  5609. }
  5610. ///*********************************************************************************
  5611. //函数名称:CallbackIERWALLGANZ
  5612. //功能描述:对IERWALLGANZ消息进行反馈处理,获取在屏保状态下的按下手闸的状态,用于激活屏保登录框;
  5613. //修改记录:
  5614. //2021-4-23 创建
  5615. //*******************************************************************************/
  5616. bool nsGEN::SMZDevice::CallbackIERWALLGANZ(ACS_BYTE* pCommand)
  5617. {
  5618. if (pCommand == NULL)
  5619. {
  5620. PRINTA_ERROR("CallbackIERWALLGANZ: Get command is Null");
  5621. return false;
  5622. }//ENDIF
  5623. ACS_BYTE* stmpBuffer = pCommand;
  5624. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5625. ACS_BYTE nSS = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_BYTE)));
  5626. ACS_BYTE nScreensave = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + 2 * sizeof(ACS_BYTE)));
  5627. ACS_SET xray_switch_state = (*(ACS_SET*)(stmpBuffer + sizeof(acs_obj_header_t) + 8 * sizeof(ACS_BYTE)));
  5628. ACS_BYTE battery_level = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + 7 * sizeof(ACS_BYTE)));
  5629. ACS_ENUM mains_connected = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + 10 * sizeof(ACS_BYTE) + sizeof(ACS_SET) + 3 * sizeof(ACS_ENUM)));
  5630. ACS_ENUM nLockStatus = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + 10 * sizeof(ACS_BYTE) + sizeof(ACS_SET) + 5 * sizeof(ACS_ENUM)));
  5631. int nSaftySwitch = 0;
  5632. int nScreenSaveToClient = -1;
  5633. if (nSS == EIN)
  5634. {
  5635. nSaftySwitch = EIN;
  5636. }
  5637. m_UIClientUnit.m_SHS->Update(nSaftySwitch);
  5638. FireNotify(m_UIClientUnit.m_SHS->GetKey(), m_UIClientUnit.m_SHS->JSGet());
  5639. if (nLockStatus == ACS_YES)
  5640. {
  5641. nScreenSaveToClient = 1;
  5642. }
  5643. else if (nLockStatus == ACS_NO)
  5644. {
  5645. nScreenSaveToClient = 0;
  5646. }
  5647. m_UIClientUnit.m_SCREENLOCK->Update(nScreenSaveToClient);
  5648. FireNotify(m_UIClientUnit.m_SCREENLOCK->GetKey(), m_UIClientUnit.m_SCREENLOCK->JSGet());
  5649. int nBatteryChargeState = 0;
  5650. //string code = "";
  5651. //string info = "";
  5652. //int level = AUTOCLEARERROR;
  5653. int nPlugPowerStatus = 1;
  5654. try {
  5655. nPlugPowerStatus = (int)(m_GenConfig["PowerPlugStatus"]);
  5656. }
  5657. catch (...)
  5658. {
  5659. PRINTA_ERROR("Can't get the PowerPlugStatus\n");
  5660. }
  5661. if (nPlugPowerStatus == 1)
  5662. {
  5663. if (mains_connected == ACS_YES)
  5664. {
  5665. nBatteryChargeState = POWER_AC;
  5666. //code = "Main_Contact_unplug";
  5667. //info = "";
  5668. //m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str()); //调用时会崩溃
  5669. //PRINTA_INFO("CallbackIERWALLGANZ:DelErrorMessage Mains unpluged\n");
  5670. }
  5671. else if (mains_connected == ACS_NO)
  5672. {
  5673. nBatteryChargeState = POWER_DC;
  5674. //code = "Main_Contact_unplug";
  5675. //info = "Mains unpluged";
  5676. //m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str());
  5677. }
  5678. else
  5679. {
  5680. nBatteryChargeState = POWER_DC;
  5681. //code = "Main_Contact_unplug";
  5682. //info = "Mains unpluged";
  5683. //m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str());
  5684. }
  5685. }
  5686. m_DoseUnit.m_BatteryChargeState->Update(nBatteryChargeState);
  5687. FireNotify(m_DoseUnit.m_BatteryChargeState->GetKey(), m_DoseUnit.m_BatteryChargeState->JSGet());
  5688. PRINTA_INFO("CallbackIERWALLGANZ:nScreensave: %d,xray_switch_state: %d,safety relay:%d,Battery:%d,mains_connected:%d,nScreenSaveToClient: %d\n",
  5689. (int)nScreensave, xray_switch_state, (int)nSS, (int)nBatteryChargeState, (int)mains_connected, nScreenSaveToClient);
  5690. std::ostringstream buffer;
  5691. buffer << "nScreensave:" << (int)nScreensave << ", xray_switch_state:" << (int)xray_switch_state << ", safety relay:" << (int)nSS << ", mains_connected:" << (int)mains_connected << ", LockStatus:" << (int)nLockStatus;
  5692. string str = buffer.str();
  5693. SendTelegramLog("IERWALLGANZ", str.c_str(), object_id);
  5694. return true;
  5695. }
  5696. /*********************************************************************************
  5697. 函数名称:CallbackSORTHO
  5698. 功能描述:接收到拼接图像信息
  5699. 修改记录:
  5700. 2021-04-23 创建
  5701. *******************************************************************************/
  5702. bool nsGEN::SMZDevice::CallbackSORTHO(ACS_BYTE* pCommand)
  5703. {
  5704. if (pCommand == NULL)
  5705. {
  5706. PRINTA_ERROR("Get command is Null");
  5707. return false;
  5708. }//ENDIF
  5709. ACS_BYTE* stmpBuffer = pCommand;
  5710. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5711. ACS_LINT nfull_image_size = (*(ACS_LINT*)(stmpBuffer + 8));
  5712. ACS_COUNT nr_images = (*(ACS_COUNT*)(stmpBuffer + 8 + sizeof(ACS_LINT) + sizeof(ACS_DUMMY)));
  5713. ACS_WORD image_size = (*(ACS_WORD*)(stmpBuffer + 8 + sizeof(ACS_LINT) + sizeof(ACS_DUMMY) + sizeof(ACS_COUNT)));
  5714. ACS_WORD ortho_overlap = (*(ACS_WORD*)(stmpBuffer + 8 + sizeof(ACS_LINT) + sizeof(ACS_DUMMY) + sizeof(ACS_COUNT) + sizeof(ACS_WORD)));
  5715. 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);
  5716. std::ostringstream buffer;
  5717. buffer << "nfull_image_size:" << nfull_image_size << ",nr_images:" << nr_images
  5718. << ",image_size:" << image_size << ",ortho_overlap:" << ortho_overlap;
  5719. string str = buffer.str();
  5720. SendTelegramLog("SORTHO", str.c_str(), object_id);
  5721. return true;
  5722. }
  5723. /*********************************************************************************
  5724. 函数名称:CallbackSH_STPAR_RFP
  5725. 功能描述:接收到拼接图像信息
  5726. 参数:Full_image_size、image_size、overlap、Image number
  5727. 修改记录:
  5728. 2021-04-23 创建
  5729. *******************************************************************************/
  5730. bool nsGEN::SMZDevice::CallbackSH_STPAR_RFP(ACS_BYTE* pCommand)
  5731. {
  5732. if (pCommand == NULL)
  5733. {
  5734. PRINTA_ERROR("Get command is Null");
  5735. return false;
  5736. }//ENDIF
  5737. ACS_BYTE* stmpBuffer = pCommand;
  5738. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  5739. ACS_ENUM projection = (*(ACS_ENUM*)(stmpBuffer + 8 + sizeof(ACS_BYTE)));
  5740. 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)));
  5741. 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)));
  5742. PRINTA_INFO("projection: %d, cp_position_match: %d, tube_rot_hor:%d\n", projection, cp_position_match, tube_rot_hor);
  5743. std::ostringstream buffer;
  5744. buffer << "projection:" << (int)projection << ", cp_position_match:" << (int)cp_position_match
  5745. << ",tube_rot_hor:" << (int)tube_rot_hor;
  5746. string str = buffer.str();
  5747. SendTelegramLog("SH_STPAR_RFP", str.c_str(), object_id);
  5748. return true;
  5749. }
  5750. /*********************************************************************************
  5751. 函数名称:TimeOutWaring
  5752. 功能描述: 连接超时判断
  5753. 修改记录:
  5754. 2021-04-23 创建
  5755. *******************************************************************************/
  5756. bool nsGEN::SMZDevice::TimeOutWaring(void)
  5757. {
  5758. m_nTimeoutCount++;
  5759. if (m_nTimeoutCount >= 3)
  5760. {
  5761. PRINTA_DEBUG("m_nTimeoutCount = %d,Can't communicate with generator\n", m_nTimeoutCount);
  5762. m_nTimeoutCount = 0;
  5763. }//ENDIF
  5764. return true;
  5765. }
  5766. /*********************************************************************************
  5767. 函数名称:FDCConnectXCS
  5768. 功能描述: FDC节点连接到XCU节点
  5769. 修改记录:
  5770. 2015-04-20 创建
  5771. *******************************************************************************/
  5772. bool nsGEN::SMZDevice::FDCConnectXCS()
  5773. {
  5774. axn_word wtimeout = 10;
  5775. axn_status status;
  5776. if (m_pFDCAxnClient)
  5777. {
  5778. CAxnClientIFCreator::deleteAxnClientIF(m_pFDCAxnClient);
  5779. m_pFDCAxnClient = NULL;
  5780. PRINTA_INFO("FDCConnectXCS,deleteFDCAxnClientIF\n");
  5781. }
  5782. if ((m_pFDCAxnClient = CAxnClientIFCreator::newAxnClientIF()) == NULL)
  5783. {
  5784. PRINTA_ERROR("FDC newAxnClientIF fail");
  5785. }//ENDIF
  5786. int ConnectTime = 0; //默认重连次数为1
  5787. PRINTA_INFO("== SEND == : connectToServer FDCAxnClient\n");
  5788. while ((m_pFDCAxnClient != NULL) && (status = m_pFDCAxnClient->connectToServer(FDC_Controlsender, wtimeout)) != ACS_AXN_OK)
  5789. {
  5790. PRINTA_INFO(("FDC Connect Time: %d\n"), ConnectTime);
  5791. printf("FDC Connect Time: %d\n", ConnectTime);
  5792. if (ConnectTime >= 20)
  5793. {
  5794. break;
  5795. }
  5796. else
  5797. {
  5798. ConnectTime++;
  5799. Sleep(1000);
  5800. PRINTA_INFO("Call FDC connectToServer again\n");
  5801. }
  5802. }
  5803. if (ConnectTime >= 20)
  5804. {
  5805. PRINTA_ERROR(("FDC Tried %d times, still failed to connect XCS, return\n"), ConnectTime);
  5806. string code = "ConnectError";
  5807. string info = "Can't connect to Axim, Please reboot the system.";
  5808. int level = CONNECTIONERROR;
  5809. m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(),0xF3);
  5810. return false;
  5811. }
  5812. else
  5813. {
  5814. PRINTA_INFO("Call FDC connectToServer success\n");
  5815. }
  5816. return true;
  5817. }
  5818. /*********************************************************************************
  5819. 函数名称:DisconnectFDCAxn
  5820. 功能描述: 断开FDC节点连接
  5821. 修改记录:
  5822. 2015-04-20 创建
  5823. *******************************************************************************/
  5824. void nsGEN::SMZDevice::DisconnectFDCAxn()
  5825. {
  5826. //FDC
  5827. if (m_pFDCAxnClient)
  5828. {
  5829. CAxnClientIFCreator::deleteAxnClientIF(m_pFDCAxnClient);
  5830. m_pFDCAxnClient = NULL;
  5831. PRINTA_INFO("deleteFDCAxnClientIF\n");
  5832. }//ENDIF
  5833. }
  5834. /*********************************************************************************
  5835. 函数名称:TurnOffRequest
  5836. 功能描述: 设置FLC关闭请求确认到XCU端
  5837. 修改记录:
  5838. 2021-04-20 创建
  5839. *******************************************************************************/
  5840. void nsGEN::SMZDevice::TurnOffRequest()
  5841. {
  5842. if (m_pAxnClient)
  5843. {
  5844. inlist_red_t1 inlistRedObj;
  5845. int no_objects_p = 0;
  5846. inlist_red_t2* pinlist_red_t2_p = NULL;
  5847. unsigned int iObjectSize = sizeof(*pinlist_red_t2_p) * no_objects_p;
  5848. inlistRedObj.header.length = (int)(sizeof(inlistRedObj)) + iObjectSize;
  5849. inlistRedObj.header.mode = ACS_MODE_FUNCTIONAL;
  5850. inlistRedObj.header.target = ACS_NO_TARGET;
  5851. inlistRedObj.header.group_index = 0x01;
  5852. inlistRedObj.header.sender = Clientsender;
  5853. inlistRedObj.header.id = INLIST_RED;
  5854. inlistRedObj.no_objects = (ACS_DCOUNT)no_objects_p;
  5855. // Allocate memory for the data to be sent.
  5856. ACS_BYTE* pDataForSending = new ACS_BYTE[inlistRedObj.header.length * 2];
  5857. if (pDataForSending == NULL)
  5858. {
  5859. //DO NOTHING
  5860. }//ENDIF
  5861. // Copy all objects together in a continous section of memory.
  5862. ACS_BYTE* pCh = pDataForSending;
  5863. ::memcpy(pCh, &inlistRedObj, sizeof(inlistRedObj));
  5864. pCh += sizeof(inlistRedObj);
  5865. ::memcpy(pCh, pinlist_red_t2_p, iObjectSize);
  5866. // Send the resulting memory section.
  5867. ACS_ENUM axnResult = CAxnClientIF::sendObjectToServer(pDataForSending);
  5868. // Release memory.
  5869. delete[] pDataForSending;
  5870. pDataForSending = NULL;
  5871. if (axnResult != ACS_AXN_OK)
  5872. {
  5873. //DO Nothing
  5874. }//ENDIF
  5875. pCh = NULL;
  5876. PRINTA_DEBUG("Turnoff request\n");
  5877. }//ENDIF
  5878. }
  5879. /*********************************************************************************
  5880. 函数名称:ReveiveFDCData
  5881. 功能描述: 接受探测器报文函数
  5882. 修改记录:
  5883. 2020-04-20 创建
  5884. *******************************************************************************/
  5885. DWORD nsGEN::SMZDevice::ReveiveFDCData(LPVOID pParam)
  5886. {
  5887. nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
  5888. while (true)
  5889. {
  5890. if (pCurOpr->m_pFDCBuffer == NULL)
  5891. {
  5892. return 1;
  5893. }//ENDIF
  5894. axn_status status;
  5895. try {
  5896. ::ZeroMemory(pCurOpr->m_pFDCBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
  5897. try
  5898. {
  5899. status = pCurOpr->m_pFDCAxnClient->recvObject((ACS_BYTE*)pCurOpr->m_pFDCBuffer);
  5900. }
  5901. catch (...)
  5902. {
  5903. PRINTA_ERROR("Crash FDC, m_pFDCAxnClient->recvObject\n");
  5904. }
  5905. if (status == ACS_AXN_NOK)
  5906. {
  5907. PRINTA_INFO("Some Error when AxnClient recvObject\n");
  5908. Sleep(2 * AXN_DUMMYTIME_BASE_RATE_IN_MS * 1);
  5909. if (pCurOpr->m_nFDCLostConnectNumber >= 5)
  5910. {
  5911. //m_data.m_gen.m_strsErrorCodeGet = "01000002"; //communication fail 断线
  5912. string code = "ReceiveError";
  5913. string info = "Can't receive the command from generator,Please reboot the system.";
  5914. int level = CONNECTIONERROR;
  5915. pCurOpr->m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(), 0xF3);
  5916. }
  5917. else
  5918. {
  5919. pCurOpr->m_nFDCLostConnectNumber++;
  5920. }
  5921. PRINTA_ERROR("FDC communication fail\n");
  5922. printf("!!!!!!!!FDC communication fail!!!!!!!! \n");
  5923. pCurOpr->DisconnectFDCAxn();
  5924. Sleep(2000);
  5925. pCurOpr->FDCConnectXCS();
  5926. }
  5927. else if (status == ACS_AXN_TIMEOUT)
  5928. {
  5929. PRINTA_ERROR("FDC receive communication Timeout\n");
  5930. }
  5931. else
  5932. {
  5933. if (pCurOpr->m_nFDCLostConnectNumber > 0)
  5934. {
  5935. pCurOpr->m_nFDCLostConnectNumber = 0;
  5936. }
  5937. if (pCurOpr->m_pFDCBuffer != NULL)
  5938. {
  5939. acs_obj_header_t* tel_hdr_p;
  5940. tel_hdr_p = (acs_obj_header_t*)pCurOpr->m_pFDCBuffer;
  5941. try {
  5942. if (tel_hdr_p->length <= MAX_LEN_ACS_OBJ)
  5943. {
  5944. if (tel_hdr_p->id != DUMMY_MSG)
  5945. {
  5946. axn_byte* pFDCBuffer;
  5947. pFDCBuffer = new axn_byte[MAX_LEN_ACS_OBJ];
  5948. ::ZeroMemory(pFDCBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
  5949. ::memcpy(pFDCBuffer, pCurOpr->m_pFDCBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
  5950. EnterCriticalSection(&pCurOpr->m_csFDCData);
  5951. pCurOpr->m_sFDCCallbackData.push_back(pFDCBuffer);
  5952. LeaveCriticalSection(&pCurOpr->m_csFDCData);
  5953. SetEvent(pCurOpr->m_hFDCDataEvent);
  5954. }
  5955. if (pCurOpr->m_nTimeoutCount != 0)
  5956. {
  5957. pCurOpr->m_nTimeoutCount = 0;
  5958. PRINTA_INFO("ReceiveFDCCommand get command, then set TimeoutCount to 0\n");
  5959. }
  5960. }
  5961. else
  5962. {
  5963. PRINTA_ERROR("Get a error command: > max_len_acs_obj\n");
  5964. }
  5965. }
  5966. catch (...)
  5967. {
  5968. PRINTA_ERROR("Crash log 1, other error\n");
  5969. }
  5970. }
  5971. else
  5972. {
  5973. PRINTA_ERROR("m_pFDCBuffer = NULL\n");
  5974. }
  5975. }
  5976. }
  5977. catch (...)
  5978. {
  5979. PRINTA_ERROR("Crash log 2, other error\n");
  5980. }
  5981. if (pCurOpr->m_bExited)
  5982. {
  5983. break;
  5984. }
  5985. }
  5986. return 1;
  5987. }
  5988. DWORD nsGEN::SMZDevice::FDCDataThread(LPVOID pParam)
  5989. {
  5990. nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
  5991. while (true)
  5992. {
  5993. axn_byte* dd;
  5994. bool bGetData = false;
  5995. EnterCriticalSection(&pCurOpr->m_csFDCData);
  5996. if (!pCurOpr->m_sFDCCallbackData.empty())
  5997. {
  5998. bGetData = true;
  5999. dd = pCurOpr->m_sFDCCallbackData.front();
  6000. pCurOpr->m_sFDCCallbackData.pop_front();
  6001. LeaveCriticalSection(&pCurOpr->m_csFDCData);
  6002. }
  6003. else
  6004. {
  6005. LeaveCriticalSection(&pCurOpr->m_csFDCData);
  6006. WaitForSingleObject(pCurOpr->m_hFDCDataEvent, 50);
  6007. }
  6008. if (bGetData)
  6009. {
  6010. pCurOpr->FDCCallback((acs_obj_header_t*)dd);
  6011. if (dd != NULL)
  6012. {
  6013. delete[] dd;
  6014. dd = NULL;
  6015. }
  6016. }//ENDIF
  6017. if (pCurOpr->m_bExited)
  6018. {
  6019. break;
  6020. }
  6021. }
  6022. return 0;
  6023. }
  6024. /*********************************************************************************
  6025. 函数名称:FDCCallback
  6026. 功能描述: 将获取到的与探测器相关的报文对应到相应的解析函数
  6027. 修改记录:
  6028. 2015-04-20 创建
  6029. *******************************************************************************/
  6030. bool nsGEN::SMZDevice::FDCCallback(const acs_obj_header_t* pCommand)
  6031. {
  6032. printf("== IN == FDC Telegram ID: %x \n", pCommand->id);
  6033. try
  6034. {
  6035. switch (pCommand->id)
  6036. {
  6037. case UINT16(INIT_MSG):
  6038. PRINTA_INFO("== IN == : FDC INIT_MSG\n");
  6039. SendListFDC();
  6040. SendTelegramLog("0xF4 INIT_MSG");
  6041. break;
  6042. case UINT16(TURN_ON):
  6043. PRINTA_INFO("== IN == : FDC TURN_ON\n");
  6044. CallbackFDCTurnOn((ACS_BYTE*)pCommand);
  6045. break;
  6046. case UINT16(TURN_OFF):
  6047. PRINTA_INFO("== IN == : FDC TURN_OFF\n");
  6048. CallBackFDCTurnOff((ACS_BYTE*)pCommand);
  6049. break;
  6050. case UINT16(SH_SS):
  6051. PRINTA_INFO("== IN == : FDC SH_SS\n");
  6052. CallBackSHSS((ACS_BYTE*)pCommand);
  6053. break;
  6054. case UINT16(SH_RADIATION):
  6055. PRINTA_INFO("== IN == : FDC SH_RADIATION\n");
  6056. CallBackSHRA((ACS_BYTE*)pCommand);
  6057. break;
  6058. //case UINT16(IANLBEREIT):
  6059. // PRINTA_INFO(m_pLog, _T("== IN == : FDC IANLBEREIT"));
  6060. // CallBackIANLBEREIT((ACS_BYTE*)pCommand);
  6061. // break;
  6062. case UINT16(INETZAUFNAHME):
  6063. PRINTA_INFO("== IN == : FDC INETZAUFNAHME\n");
  6064. SendTelegramLog("0xF4 INETZAUFNAHME");
  6065. EnterCriticalSection(&m_csStatus);
  6066. m_bFDCIdentStatus = true;
  6067. LeaveCriticalSection(&m_csStatus);
  6068. break;
  6069. case UINT16(DUMMY_MSG):
  6070. break;
  6071. default:
  6072. break;
  6073. }
  6074. }
  6075. catch (...)
  6076. {
  6077. PRINTA_ERROR("Call FDC Data: Carsh\n");
  6078. }
  6079. return true;
  6080. }
  6081. /*********************************************************************************
  6082. 函数名称:SendListFDC
  6083. 功能描述:设置DROC端需要从PMS端接收的报文清单
  6084. 修改记录:
  6085. 2021-04-20 创建
  6086. *******************************************************************************/
  6087. bool nsGEN::SMZDevice::SendListFDC(void)
  6088. {
  6089. ACS_WORD szID[FDC_MESSAGE_NUM] = { RQ_OBJECT,
  6090. SH_MODE,
  6091. SH_READY,
  6092. SPATWECHSEL,
  6093. ST_CONFIG,
  6094. ST_DATA_TRANS,
  6095. ST_MODE,
  6096. TURN_ON,
  6097. TURN_OFF,
  6098. SH_SS,
  6099. SH_RADIATION,
  6100. SAUFNAUSL,
  6101. SDETEKTORSTART,
  6102. SAUSLBED,
  6103. IANLBEREIT,
  6104. INETZAUFNAHME,
  6105. DUMMY_MSG
  6106. };
  6107. inlist_enh_t1_tag szSendGen = {};
  6108. m_stGenCommandFDC.id = INLIST_ENH;
  6109. m_stGenCommandFDC.sender = FDC_Controlsender;
  6110. m_stGenCommandFDC.mode = 0;
  6111. m_stGenCommandFDC.target = 0;
  6112. m_stGenCommandFDC.group_index = Clientgroup_index;
  6113. m_stGenCommandFDC.length = m_wHeaderLength + (FDC_MESSAGE_NUM + 1) * sizeof(ACS_WORD);
  6114. szSendGen.no_objects = FDC_MESSAGE_NUM;
  6115. szSendGen.header = m_stGenCommandFDC;
  6116. ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommandFDC.length * 2];
  6117. ::memset(p_ID, 0, m_stGenCommandFDC.length * sizeof(ACS_BYTE) * 2);
  6118. ::memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_wHeaderLength + sizeof(ACS_WORD));
  6119. ::memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_WORD)),
  6120. (ACS_BYTE*)(&szID), FDC_MESSAGE_NUM * sizeof(ACS_WORD));
  6121. if (m_pFDCAxnClient != NULL)
  6122. {
  6123. m_pFDCAxnClient->sendObject((ACS_BYTE*)p_ID);
  6124. SendTelegramLog("INLIST_ENH", "", m_stGenCommand.sender, 0);
  6125. }//ENDIF
  6126. delete[]p_ID;
  6127. p_ID = NULL;
  6128. PRINTA_DEBUG("== SEND == : INLIST_ENH(FDC LIST)\n");
  6129. return true;
  6130. }
  6131. /*********************************************************************************
  6132. 函数名称:SendIdentFDC
  6133. 功能描述: 设置F4状态到FO端
  6134. 修改记录:
  6135. 2021-04-20 创建
  6136. *******************************************************************************/
  6137. bool nsGEN::SMZDevice::SendIdentFDC(void)
  6138. {
  6139. iident_t1 szSendGen = {};
  6140. m_stGenCommandFDC.id = IIDENT;
  6141. m_stGenCommandFDC.length = m_wHeaderLength + 3 * sizeof(ACS_BYTE) + 10 * sizeof(ACS_STRING_8) + 3 * sizeof(ACS_DUMMY);
  6142. m_stGenCommandFDC.mode = Clientmode;
  6143. m_stGenCommandFDC.sender = FDC_Controlsender;
  6144. m_stGenCommandFDC.group_index = Clientgroup_index;
  6145. m_stGenCommandFDC.target = Clienttarget;
  6146. szSendGen.fetyp = BILDVERARBEITUNG;
  6147. szSendGen.knotenid = FDC_Controlsender;
  6148. szSendGen.apid = FDC_Controlsender;
  6149. ACS_STRING_8 temp[10] = "FLSP_COMP";
  6150. ::memcpy(szSendGen.kompname, temp, 10);
  6151. szSendGen.header = m_stGenCommandFDC;
  6152. if (m_pFDCAxnClient != NULL)
  6153. {
  6154. m_pFDCAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  6155. PRINTA_DEBUG("== SEND == : IIDENT\n");
  6156. SendTelegramLog("IIDENT", "", m_stGenCommand.sender, 0);
  6157. }//ENDIF
  6158. else
  6159. {
  6160. PRINTA_DEBUG("== SEND == : IIDENT is not successful\n");
  6161. }
  6162. return true;
  6163. }
  6164. /*********************************************************************************
  6165. 函数名称:CallbackFDCTurnOn
  6166. 功能描述:对TurnOn消息进行反馈处理
  6167. 修改记录:
  6168. 2017-10-16 创建
  6169. *******************************************************************************/
  6170. bool nsGEN::SMZDevice::CallbackFDCTurnOn(ACS_BYTE* pCommand)
  6171. {
  6172. if (pCommand == NULL)
  6173. {
  6174. PRINTA_ERROR("Get command is Null");
  6175. return false;
  6176. }//ENDIF
  6177. ACS_BYTE* stmpBuffer = pCommand;
  6178. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  6179. PRINTA_DEBUG("callback FDC Turn on : object_id: %x\n", object_id);
  6180. if ((!m_bFDCIdentStatus) && (object_id == Clienttarget))
  6181. {
  6182. SendIdentFDC();
  6183. PRINTA_INFO("callback: m_bFDCIdentStatus = true\n");
  6184. string code = "TurnOff";
  6185. string info = "";
  6186. int level = CONNECTIONERROR;
  6187. m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
  6188. }//ENDIF
  6189. std::ostringstream buffer;
  6190. buffer << "object_id:" << (int)object_id;
  6191. string str = buffer.str();
  6192. SendTelegramLog("0xF4 TURN_ON", str.c_str(), object_id);
  6193. return true;
  6194. }
  6195. ///*********************************************************************************
  6196. //函数名称:CallBackFDCTurnOff
  6197. //功能描述: 解析当前F4节点关闭状态信息(turn off message)
  6198. //修改记录:
  6199. //2021-04-20 创建
  6200. //*******************************************************************************/
  6201. bool nsGEN::SMZDevice::CallBackFDCTurnOff(ACS_BYTE* Command)
  6202. {
  6203. if (Command == NULL)
  6204. {
  6205. PRINTA_ERROR("Get command is Null");
  6206. return false;
  6207. }//ENDIF
  6208. ACS_BYTE* stmpBuffer = Command;
  6209. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  6210. PRINTA_DEBUG("callback F4 Trun Off : object_id: %x\n", object_id);
  6211. std::ostringstream buffer;
  6212. buffer << "object_id:" << std::hex << (int)object_id <<"h";
  6213. string str = buffer.str();
  6214. SendTelegramLog("0xF4 TURN_OFF", str.c_str(), object_id);
  6215. string code = "";
  6216. string info = "";
  6217. int level = 0;
  6218. if (object_id == Clienttarget)
  6219. {
  6220. TimeOutWaring();
  6221. if (m_bFDCIdentStatus)
  6222. {
  6223. m_bFDCIdentStatus = false;
  6224. PRINTA_INFO("callback: Get FDC Client sender,m_bFDCIdentStatus = false\n");
  6225. }//ENDIF
  6226. code = "TurnOff";
  6227. info = "Lost communication to generator, Please reboot the system.";
  6228. level = CONNECTIONERROR;
  6229. m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(), 0xF3);
  6230. }//ENDIF
  6231. return true;
  6232. }
  6233. /*********************************************************************************
  6234. 函数名称:CallBackSHSS
  6235. 功能描述: 用来切换DROC当前是否要处于服务模式;
  6236. 修改记录:
  6237. 2015-04-20 创建
  6238. *******************************************************************************/
  6239. bool nsGEN::SMZDevice::CallBackSHSS(ACS_BYTE* pCommand)
  6240. {
  6241. if (pCommand == NULL)
  6242. {
  6243. PRINTA_ERROR("Get command is Null");
  6244. return false;
  6245. }//ENDIF
  6246. ACS_BYTE* stmpBuffer = pCommand;
  6247. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  6248. ACS_ENUM hw_switch = (*(ACS_ENUM*)(stmpBuffer + 8));
  6249. ACS_ENUM sw_switch = (*(ACS_ENUM*)(stmpBuffer + 9));
  6250. ACS_ENUM serv_rad_switch = (*(ACS_ENUM*)(stmpBuffer + 10));
  6251. PRINTA_INFO("CallBackSHSS: hw_switch=%d, sw_switch=%d, serv_rad_switch=%d\n", hw_switch, sw_switch, serv_rad_switch);
  6252. int nCode = serv_rad_switch;
  6253. m_UIClientUnit.m_SHS->Update(nCode);
  6254. FireNotify(m_UIClientUnit.m_SHS->GetKey(), m_UIClientUnit.m_SHS->JSGet());
  6255. std::ostringstream buffer;
  6256. buffer << "hw_switch:" << (int)hw_switch << ", sw_switch:" << (int)sw_switch << ", serv_rad_switch:" << (int)serv_rad_switch;
  6257. string str = buffer.str();
  6258. SendTelegramLog("0xF4 SH_SS", str.c_str(), object_id);
  6259. return true;
  6260. }
  6261. /*********************************************************************************
  6262. 函数名称:CallBackSHRA
  6263. 功能描述: 记录状态信息,仅为记录( confirm start/stop of xray,
  6264. released by software and hands free movement controlled by software )
  6265. 对应需求:IS_automatic_calibration、IS_hm_UserCalibNoUserOperation(VERSION_RAD3-VA10)、IS_Service_xrayrelease
  6266. 修改记录:
  6267. 2021-04-20 创建
  6268. *******************************************************************************/
  6269. bool nsGEN::SMZDevice::CallBackSHRA(ACS_BYTE* pCommand)//TODO
  6270. {
  6271. if (pCommand == NULL)
  6272. {
  6273. PRINTA_ERROR("Get command is Null");
  6274. return false;
  6275. }//ENDIF
  6276. if (!m_bCalibMode)
  6277. {
  6278. PRINTA_INFO("Not in AutoCalibration, CallBackSHRA return\n");
  6279. return true;
  6280. }//ENDIF
  6281. ACS_BYTE* stmpBuffer = pCommand;
  6282. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  6283. ACS_ENUM rad_ack = (*(ACS_ENUM*)(stmpBuffer + 8));
  6284. ACS_ENUM ecg_sim_ack = (*(ACS_ENUM*)(stmpBuffer + 9));
  6285. ACS_BYTE alive_tag = (*(ACS_ENUM*)(stmpBuffer + 10));
  6286. ACS_ENUM sw_control_status = (*(ACS_ENUM*)(stmpBuffer + 9));
  6287. PRINTA_INFO("CallBackSHRA: rad_ack=%d\n", rad_ack);
  6288. std::ostringstream buffer;
  6289. buffer << "rad_ack:" << (int)rad_ack << ",ecg_sim_ack:" << (int)ecg_sim_ack << ",alive_tag:"
  6290. << (int)alive_tag << ",sw_control_status:" << (int)sw_control_status;
  6291. string str = buffer.str();
  6292. SendTelegramLog("0xF4 SH_RADIATION", str.c_str(), object_id);
  6293. return true;
  6294. }
  6295. /*********************************************************************************
  6296. 函数名称:CallbackSystemParam
  6297. 功能描述: 解析当前workstation设置状态(是否成功)
  6298. 修改记录:
  6299. 2015-04-20 创建
  6300. *******************************************************************************/
  6301. bool nsGEN::SMZDevice::CallbackWorkstationFromXCU(ACS_BYTE* pCommand)//for system status
  6302. {
  6303. if (pCommand == NULL)
  6304. {
  6305. PRINTA_ERROR("Get command is Null");
  6306. return false;
  6307. }//ENDIF
  6308. ACS_BYTE* stmpBuffer = pCommand;
  6309. ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
  6310. ACS_BYTE nSystemNr = (*(ACS_BYTE*)(stmpBuffer + 8));
  6311. ACS_BYTE nstrahler = (*(ACS_BYTE*)(stmpBuffer + 9));
  6312. ACS_BYTE nsysok = (*(ACS_BYTE*)(stmpBuffer + 10)); //if workstation set ok
  6313. int nWS = 0;
  6314. if (1 == nsysok)
  6315. {
  6316. WSGen2UI(nSystemNr, nWS);
  6317. //m_SiemensSalmon_Element[CMD_ELEMENT_WS].fGetValue = nWS; //202110 设置工作位到UI端
  6318. //m_pGenDose->GenUnitLogic::SetValue(nWS, Gen_Param_WORKSTATION);
  6319. m_DoseUnit.m_WS->Update(nWS);
  6320. FireNotify(m_DoseUnit.m_WS->GetKey(), m_DoseUnit.m_WS->JSGet());
  6321. if (m_bReGetTurnOn)
  6322. {
  6323. if (m_bCalibMode)
  6324. {
  6325. }
  6326. else
  6327. {
  6328. //202110 设置APR参数
  6329. SendOrthoLocalParam(AprParamBackup.nWS,
  6330. AprParamBackup.fKV,
  6331. AprParamBackup.fMA,
  6332. AprParamBackup.fMS,
  6333. AprParamBackup.fMAS,
  6334. AprParamBackup.nFocus,
  6335. AprParamBackup.nTechmode,
  6336. AprParamBackup.nAECField,
  6337. AprParamBackup.nAECFilm,
  6338. AprParamBackup.nAECDensity);
  6339. PRINTA_INFO("CallBack isystemanz:1 ,ReTurnOn, Resend APR Parameter\n");
  6340. }
  6341. EnterCriticalSection(&m_csStatus);
  6342. m_bReGetTurnOn = false;
  6343. PRINTA_INFO("CallBack isystemanz:m_bReGetTurnOn = false\n");
  6344. LeaveCriticalSection(&m_csStatus);
  6345. }
  6346. }
  6347. //else
  6348. //{
  6349. // m_data.m_gen.m_nmWorkStation = -2; //show workstation set fail; 20160923 //2021-04-21 待完善功能:需要设置到UI端
  6350. //}
  6351. 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);
  6352. std::ostringstream buffer;
  6353. buffer << "Number of the system:" << (int)nSystemNr
  6354. << ", Number of active tube:" << (int)nstrahler
  6355. << ", System is ready :" << (int)nsysok
  6356. << ", nWS:" << (int)nWS;
  6357. string str = buffer.str();
  6358. SendTelegramLog("ISYSTEMANZ", str.c_str(), object_id);
  6359. return true;
  6360. }
  6361. RET_STATUS nsGEN::SMZDevice::IncKV ()
  6362. {
  6363. if (!m_DoseUnit.m_KV->CanInc ()) return RET_STATUS::RET_SUCCEED;
  6364. int nKV = 0;
  6365. int nPos = 0;
  6366. if ((float)m_DoseUnit.m_KV->Get() < (float)m_fKVmin)
  6367. {
  6368. nKV = (int)((float)m_fKVmin * 10);
  6369. nPos = GetFacKvValue(nKV);
  6370. }
  6371. else if ((float)m_DoseUnit.m_KV->Get() >= (float)m_fKVmax)
  6372. {
  6373. nKV = (int)((float)m_fKVmax * 10);
  6374. nPos = GetFacKvValue(nKV);
  6375. }
  6376. else
  6377. {
  6378. nKV = (int)((float)m_DoseUnit.m_KV->Get() * 10);
  6379. nPos = GetFacKvValue(nKV);
  6380. nPos += 1;
  6381. }
  6382. if (nPos >= (int)(g_KV_List.size()))
  6383. {
  6384. nPos = (int)(g_KV_List.size()) - 1;
  6385. }
  6386. else
  6387. {
  6388. //DO NOTHING
  6389. }//ENDIF
  6390. nKV = g_KV_List[nPos];
  6391. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, KV, nKV);
  6392. return RET_STATUS::RET_SUCCEED;
  6393. }
  6394. RET_STATUS nsGEN::SMZDevice::DecKV ()
  6395. {
  6396. if (!m_DoseUnit.m_KV->CanDec ()) return RET_STATUS::RET_SUCCEED;
  6397. int nKV = 0;
  6398. int nPos = 0;
  6399. if ((float)m_DoseUnit.m_KV->Get() > (float)m_fKVmax)
  6400. {
  6401. nKV = (int)((float)m_fKVmax * 10);
  6402. nPos = GetFacKvValue(nKV);
  6403. }
  6404. else if ((float)m_DoseUnit.m_KV->Get() <= (float)m_fKVmin)
  6405. {
  6406. nKV = (int)((float)m_fKVmin * 10);
  6407. nPos = GetFacKvValue(nKV);
  6408. }
  6409. else
  6410. {
  6411. nKV = (int)((float)m_DoseUnit.m_KV->Get() * 10);
  6412. nPos = GetFacKvValue(nKV);
  6413. if (nPos > 0)
  6414. {
  6415. nPos -= 1;
  6416. }
  6417. }
  6418. //ENDIF
  6419. nKV = g_KV_List[nPos];
  6420. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, KV, nKV);
  6421. return RET_STATUS::RET_SUCCEED;
  6422. }
  6423. RET_STATUS nsGEN::SMZDevice::SetKV (float value)
  6424. {
  6425. if (! m_DoseUnit.m_KV->Verify (value)) return RET_STATUS::RET_SUCCEED;
  6426. if (abs(value - (float)m_DoseUnit.m_KV->Get()) < 0.001)
  6427. {
  6428. return RET_STATUS::RET_FAILED;
  6429. }//ENDIF
  6430. int nKV = (int)value * 10;
  6431. int nPos = GetFacKvValue(nKV);
  6432. int ntempKV = g_KV_List[nPos];
  6433. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, KV, ntempKV);
  6434. return RET_STATUS::RET_SUCCEED;
  6435. }
  6436. RET_STATUS nsGEN::SMZDevice::IncMA ()
  6437. {
  6438. return RET_STATUS::RET_SUCCEED;
  6439. }
  6440. RET_STATUS nsGEN::SMZDevice::DecMA ()
  6441. {
  6442. return RET_STATUS::RET_SUCCEED;
  6443. }
  6444. RET_STATUS nsGEN::SMZDevice::SetMA (float value)
  6445. {
  6446. return RET_STATUS::RET_SUCCEED;
  6447. }
  6448. RET_STATUS nsGEN::SMZDevice::IncMS ()
  6449. {
  6450. if (!m_DoseUnit.m_MS->CanInc ()) return RET_STATUS::RET_SUCCEED;
  6451. if (m_DoseUnit.m_Techmode->Get () == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  6452. {
  6453. printf ("\n Techmode is MAS, can't set MS\n");
  6454. return RET_STATUS::RET_FAILED;
  6455. }
  6456. int nms = 0;
  6457. int nPos = 0;
  6458. if ((float)m_DoseUnit.m_MS->Get() >= (float)m_fMSmax)
  6459. {
  6460. nms = (int)((float)m_fMSmax * 1000);
  6461. nPos = GetFacmSValue(nms);
  6462. }//ENDIF
  6463. else if ((float)m_DoseUnit.m_MS->Get() < (float)m_fMSmin)
  6464. {
  6465. nms = (int)((float)m_fMSmin * 1000);
  6466. nPos = GetFacmSValue(nms);
  6467. }
  6468. else
  6469. {
  6470. nms = (int)((float)m_DoseUnit.m_MS->Get() * 1000);
  6471. nPos = GetFacmSValue(nms);
  6472. nPos += 1;
  6473. }
  6474. if (nPos < (int)g_MS_List.size())
  6475. {
  6476. nms = g_MS_List[nPos] / 10;
  6477. }
  6478. else
  6479. {
  6480. nPos = (int)(g_MS_List.size()) - 1;
  6481. nms = g_MS_List[nPos] / 10;
  6482. }//ENDIF
  6483. if ((int)m_DoseUnit.m_Techmode->Get() != TECHMODE_NOAEC_3P)
  6484. {
  6485. nms = (int)((float)m_fMSmin * 100);
  6486. }//ENDIF
  6487. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MS, nms, 1);
  6488. PRINTA_INFO("Set INCMS: %f,To generator:%d\n", (float)m_DoseUnit.m_MS->Get(), nms);
  6489. return RET_STATUS::RET_SUCCEED;
  6490. }
  6491. RET_STATUS nsGEN::SMZDevice::DecMS ()
  6492. {
  6493. if (!m_DoseUnit.m_MS->CanDec ()) return RET_STATUS::RET_SUCCEED;
  6494. if (m_DoseUnit.m_Techmode->Get () == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  6495. {
  6496. printf ("\n Techmode is MAS, can't set MS");
  6497. return RET_STATUS::RET_FAILED;
  6498. }
  6499. int nms = 0;
  6500. int nPos = 0;
  6501. if ((float)m_DoseUnit.m_MS->Get() <= (float)m_fMSmin)
  6502. {
  6503. nms = (int)(m_fMSmin * 1000);
  6504. nPos = GetFacmSValue(nms);
  6505. }//ENDIF
  6506. else if ((float)m_DoseUnit.m_MS->Get() > (float)m_fMSmax)
  6507. {
  6508. nms = (int)((float)m_fMSmax * 1000);
  6509. nPos = GetFacmSValue(nms);
  6510. }
  6511. else
  6512. {
  6513. nms = (int)((float)m_DoseUnit.m_MS->Get() * 1000);
  6514. nPos = GetFacmSValue(nms);
  6515. if (nPos > 0)
  6516. {
  6517. nPos -= 1;
  6518. }
  6519. }
  6520. nms = g_MS_List[nPos] / 10;
  6521. if ((int)m_DoseUnit.m_MS->Get() != TECHMODE_NOAEC_3P)
  6522. {
  6523. nms = (int)(m_fMSmin * 100);
  6524. }//ENDIF
  6525. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MS, nms, 1);
  6526. PRINTA_INFO("Set DECMS: %f,To generator:%d\n", (float)m_DoseUnit.m_MS->Get(), nms);
  6527. return RET_STATUS::RET_SUCCEED;
  6528. }
  6529. RET_STATUS nsGEN::SMZDevice::SetMS (float value)
  6530. {
  6531. if (! m_DoseUnit.m_MA->Verify (value)) return RET_STATUS::RET_SUCCEED;
  6532. if (m_DoseUnit.m_Techmode->Get () == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  6533. {
  6534. printf ("\n Techmode is MAS, can't set MS\n");
  6535. return RET_STATUS::RET_FAILED;
  6536. }
  6537. if (abs(value - (float)m_DoseUnit.m_MS->Get()) < 0.001)
  6538. {
  6539. return RET_STATUS::RET_SUCCEED;
  6540. }//ENDIF
  6541. int nMS = (int)(value * 1000);
  6542. int nPos = GetFacmSValue(nMS);
  6543. int ntempmS = g_MS_List[nPos] / 100;
  6544. PRINTA_INFO("Set SetMS: %f,To generator:%d\n", value, ntempmS);
  6545. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MS, ntempmS, 1);
  6546. return RET_STATUS::RET_SUCCEED;
  6547. }
  6548. //
  6549. RET_STATUS nsGEN::SMZDevice::IncMAS ()
  6550. {
  6551. if (!m_DoseUnit.m_MAS->CanInc ()) return RET_STATUS::RET_SUCCEED;
  6552. if (m_DoseUnit.m_Techmode->Get () != AttrKey::TECHMODE_V2TYPE::ET_MAS)
  6553. {
  6554. printf ("\n Techmode is not MAS, can't set MAS\n");
  6555. return RET_STATUS::RET_FAILED;
  6556. }
  6557. int nmAs = 0;
  6558. int nPos = 0;
  6559. if ((float)(float)m_DoseUnit.m_MAS->Get() >= m_fMASmax)
  6560. {
  6561. nmAs = (int)((float)m_fMASmax * 1000);
  6562. nPos = GetFacmAsValue(nmAs);
  6563. }//ENDIF
  6564. else if ((float)(float)m_DoseUnit.m_MAS->Get() < (float)m_fMASmin)
  6565. {
  6566. nmAs = (int)((float)m_fMASmin * 1000);
  6567. nPos = GetFacmAsValue(nmAs);
  6568. }
  6569. else
  6570. {
  6571. nmAs = (int)((float)m_DoseUnit.m_MAS->Get() * 1000);
  6572. nPos = GetFacmAsValue(nmAs);
  6573. nPos += 1;
  6574. }
  6575. if (nPos < (int)(g_MAS_List.size()))
  6576. {
  6577. nmAs = g_MAS_List[nPos] / 10;
  6578. }
  6579. else
  6580. {
  6581. nPos = (int)(g_MAS_List.size()) - 1;
  6582. nmAs = g_MAS_List[nPos] / 10;
  6583. }//ENDIF
  6584. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MAS, nmAs, 1);
  6585. if (g_MAS_List[nPos] == 560) // Siemens方面特殊要求
  6586. {
  6587. SendGenData(DFR_BEDIENUNG, PLUS_MINUS_TASTEN, MAS, 20, 1); //2为Siemens方面要求 特殊要求取消 20180308
  6588. }//ENDIF
  6589. PRINTA_INFO("Set INCMAS: %f,To generator:%d,nPos:%d\n", (float)(float)m_DoseUnit.m_MAS->Get(), nmAs, nPos);
  6590. return RET_STATUS::RET_SUCCEED;
  6591. }
  6592. RET_STATUS nsGEN::SMZDevice::DecMAS ()
  6593. {
  6594. if (!m_DoseUnit.m_MAS->CanDec ()) return RET_STATUS::RET_SUCCEED;
  6595. int nmAs = 0;
  6596. int nPos = 0;
  6597. if ((float)m_DoseUnit.m_MAS->Get()<= (float)m_fMASmin)
  6598. {
  6599. nmAs = (int)((float)m_fMASmin * 1000);
  6600. nPos = GetFacmAsValue(nmAs);
  6601. }//ENDIF
  6602. else if ((float)m_DoseUnit.m_MAS->Get() > (float)m_fMASmax)
  6603. {
  6604. nmAs = (int)((float)m_fMASmax * 1000);
  6605. nPos = GetFacmAsValue(nmAs);
  6606. }
  6607. else
  6608. {
  6609. nmAs = (int)((float)m_DoseUnit.m_MAS->Get() * 1000);
  6610. nPos = GetFacmAsValue(nmAs);
  6611. if (nPos > 0)
  6612. {
  6613. nPos -= 1;
  6614. }
  6615. }
  6616. nmAs = g_MAS_List[nPos] / 10;
  6617. if (g_MAS_List[nPos] == 560) //Siemens要求
  6618. {
  6619. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MAS, 60, 1);
  6620. SendGenData(DFR_BEDIENUNG, PLUS_MINUS_TASTEN, MAS, 40, 1); //siemens要求 特殊要求取消 20180308
  6621. }//ENDIF
  6622. else
  6623. {
  6624. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MAS, nmAs, 1);
  6625. }
  6626. PRINTA_INFO("Set DECMAS: %f,To generator:%d,nPos:%d\n", (float)m_DoseUnit.m_MAS->Get(), nmAs, nPos);
  6627. return RET_STATUS::RET_SUCCEED;
  6628. }
  6629. RET_STATUS nsGEN::SMZDevice::SetMAS (float value)
  6630. {
  6631. if (! m_DoseUnit.m_MAS->Verify (value)) return RET_STATUS::RET_SUCCEED;
  6632. if (m_DoseUnit.m_Techmode->Get () != AttrKey::TECHMODE_V2TYPE::ET_MAS)
  6633. {
  6634. printf ("\n Techmode is not MAS, can't set MAS");
  6635. return RET_STATUS::RET_FAILED;
  6636. }
  6637. int nmAs = (int)(value * 1000);
  6638. int nPos = GetFacmAsValue(nmAs);
  6639. if (nPos < (int)(g_MAS_List.size()))
  6640. {
  6641. nmAs = g_MAS_List[nPos] / 10;
  6642. }
  6643. else if (nPos >= (int)g_MAS_List.size())
  6644. {
  6645. nPos = (int)(g_MAS_List.size()) - 1;
  6646. nmAs = g_MAS_List[nPos] / 10;
  6647. }
  6648. else if (nPos <= 0)
  6649. {
  6650. nPos = 0;
  6651. nmAs = g_MAS_List[0] / 10;
  6652. }
  6653. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MAS, nmAs, 1);
  6654. return RET_STATUS::RET_SUCCEED;
  6655. }
  6656. //
  6657. RET_STATUS nsGEN::SMZDevice::SetTechmode (int value)
  6658. {
  6659. if (!m_DoseUnit.m_Techmode->Verify (value)) return RET_STATUS::RET_SUCCEED;
  6660. return RET_STATUS::RET_SUCCEED;
  6661. }
  6662. //
  6663. RET_STATUS nsGEN::SMZDevice::SetFocus (int value)
  6664. {
  6665. if (!m_DoseUnit.m_Focus->Verify (value)) return RET_STATUS::RET_SUCCEED;
  6666. int nFOSetting;
  6667. nFOSetting = value;
  6668. if (value == FOCUS_SMALL)
  6669. {
  6670. value = 1; //小焦点
  6671. }
  6672. else if (value == FOCUS_LARGE)
  6673. {
  6674. value = 2; //大焦点
  6675. }
  6676. else
  6677. {
  6678. value = 3; //自动焦点
  6679. }
  6680. PRINTA_INFO("Set FocusSel: %d,To generator:%d\n", nFOSetting, value);
  6681. std::ostringstream buffer;
  6682. buffer << "Focus:" << value << "(1=small; 2=large)";
  6683. string str = buffer.str();
  6684. SendTelegramLog("SBEDGEN", str.c_str(), 0xF3,0);
  6685. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, FOKUS, value);
  6686. return RET_STATUS::RET_SUCCEED;
  6687. }
  6688. RET_STATUS nsGEN::SMZDevice::SetAECDensity (int value)
  6689. {
  6690. if (!m_DoseUnit.m_AECDensity->Verify (value)) return RET_STATUS::RET_SUCCEED;
  6691. return RET_STATUS::RET_SUCCEED;
  6692. }
  6693. RET_STATUS nsGEN::SMZDevice::SetAECField (int value)
  6694. {
  6695. if (!m_DoseUnit.m_AECField->Verify (value)) return RET_STATUS::RET_SUCCEED;
  6696. int nAECField2Gen = 0;
  6697. switch (value)
  6698. {
  6699. case FIELD_RIGHT:
  6700. nAECField2Gen = RECHTS;
  6701. break;
  6702. case FIELD_CENTER:
  6703. nAECField2Gen = MITTE;
  6704. break;
  6705. case FIELD_RIGHT_CENTER:
  6706. nAECField2Gen = MITTE_RECHTS;
  6707. break;
  6708. case FIELD_LEFT:
  6709. nAECField2Gen = LINKS;
  6710. break;
  6711. case FIELD_LEFT_RIGHT:
  6712. nAECField2Gen = LINKS_RECHTS;
  6713. break;
  6714. case FIELD_CENTER_LEFT:
  6715. nAECField2Gen = LINKS_MITTE;
  6716. break;
  6717. case FIELD_LEFT_CENTER_RIGHT:
  6718. nAECField2Gen = LINKS_MITTE_RECHTS;
  6719. break;
  6720. default:
  6721. nAECField2Gen = 0; //siemens要求 默认为0
  6722. break;
  6723. }
  6724. //若当前在非AEC模式下,设置Techmode以及与AEC相关的参数(Density、Field、Dose,避免参数缺失)
  6725. if (!((int)m_DoseUnit.m_Techmode->Get() == TECHMODE_AEC_3P)
  6726. || ((int)m_DoseUnit.m_Techmode->Get() == TECHMODE_AEC_2P)
  6727. || ((int)m_DoseUnit.m_Techmode->Get() == TECHMODE_AEC_1P)
  6728. || ((int)m_DoseUnit.m_Techmode->Get() == TECHMODE_AEC_1P_REDUCEMA))
  6729. {
  6730. SendsBEDSP(DFR_BEDIENUNG, SELEKTIONSTASTEN, DOSIS_BILD, (int)(m_fAECDensitymin * 1000));
  6731. }
  6732. SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MESSFELD, nAECField2Gen);
  6733. PRINTA_INFO("Set AECField: %d,To generator:%d\n", value, nAECField2Gen);
  6734. return RET_STATUS::RET_SUCCEED;
  6735. }
  6736. RET_STATUS nsGEN::SMZDevice::SetAECFilm (int value)
  6737. {
  6738. return RET_STATUS::RET_SUCCEED;
  6739. }
  6740. RET_STATUS nsGEN::SMZDevice::SetWS (const string value)
  6741. {
  6742. PRINTA_INFO("Set WorkStation: %s\n", value.c_str());
  6743. printf("Set WorkStation: %s\n", value.c_str());
  6744. int tempws = 0;
  6745. try
  6746. {
  6747. if (value == "Table") tempws = 0;
  6748. else if (value == "Wall") tempws = 1;
  6749. else if (value == "Direct") tempws = 2;
  6750. else if (value == "Free") tempws = 3;
  6751. }
  6752. catch (const std::exception&)
  6753. {
  6754. printf("SetWS Crash\n");
  6755. }
  6756. m_nSettingWS = tempws;
  6757. AprParamBackup.nWS = tempws; //202110
  6758. //SendOrthoLocalParam(AprParamBackup.nWS,
  6759. // AprParamBackup.fKV,
  6760. // AprParamBackup.fMA,
  6761. // AprParamBackup.fMS,
  6762. // AprParamBackup.fMAS,
  6763. // AprParamBackup.nFocus,
  6764. // AprParamBackup.nTechmode,
  6765. // AprParamBackup.nAECField,
  6766. // AprParamBackup.nAECFilm,
  6767. // AprParamBackup.nAECDensity);
  6768. SendOrthoLocalParam(AprParamBackup.nWS,
  6769. m_DoseUnit.m_KV->Get(),
  6770. m_DoseUnit.m_MA->Get(),
  6771. m_DoseUnit.m_MS->Get(),
  6772. m_DoseUnit.m_MAS->Get(),
  6773. m_DoseUnit.m_Focus->Get(),
  6774. m_DoseUnit.m_Techmode->Get(),
  6775. AprParamBackup.nAECField, //Salmon环境中没有返回该参数,直接使用APR设置的参数
  6776. AprParamBackup.nAECFilm,
  6777. AprParamBackup.nAECDensity);
  6778. PRINTA_INFO("Set WorkStation: %d,To generator:%d\n", m_nSettingWS, tempws);
  6779. return RET_STATUS::RET_SUCCEED;
  6780. }
  6781. RET_STATUS nsGEN::SMZDevice::SetAPR (const _tAPRArgs& t)
  6782. {
  6783. AprParamBackup.nWS = t.nWS;
  6784. AprParamBackup.nFocus = t.nFocus;
  6785. AprParamBackup.nTechmode = t.nTechmode;
  6786. AprParamBackup.nAECField = t.nAECField;
  6787. AprParamBackup.nAECFilm = t.nAECFilm;
  6788. AprParamBackup.nAECDensity = t.nAECDensity;
  6789. AprParamBackup.fKV = t.fKV;
  6790. AprParamBackup.fMA = t.fMA;
  6791. AprParamBackup.fMS = t.fMS;
  6792. AprParamBackup.fMAS = t.fMAS;
  6793. m_bSetAPR = true;
  6794. SendOrthoLocalParam(AprParamBackup.nWS,
  6795. AprParamBackup.fKV,
  6796. AprParamBackup.fMA,
  6797. AprParamBackup.fMS,
  6798. AprParamBackup.fMAS,
  6799. AprParamBackup.nFocus,
  6800. AprParamBackup.nTechmode,
  6801. AprParamBackup.nAECField,
  6802. AprParamBackup.nAECFilm,
  6803. AprParamBackup.nAECDensity);
  6804. if (m_bGenService) //服务模式需要设置指令到PMS端
  6805. {
  6806. Sleep(50);
  6807. SendOrthoLocalParam(AprParamBackup.nWS,
  6808. AprParamBackup.fKV,
  6809. AprParamBackup.fMA,
  6810. AprParamBackup.fMS,
  6811. AprParamBackup.fMAS,
  6812. AprParamBackup.nFocus,
  6813. AprParamBackup.nTechmode,
  6814. AprParamBackup.nAECField,
  6815. AprParamBackup.nAECFilm,
  6816. AprParamBackup.nAECDensity,
  6817. ClientPMS);
  6818. }
  6819. return RET_STATUS::RET_SUCCEED;
  6820. }
  6821. RET_STATUS nsGEN::SMZDevice::QueryHE(int& value)
  6822. {
  6823. return RET_STATUS::RET_SUCCEED;
  6824. }
  6825. RET_STATUS nsGEN::SMZDevice::QueryPostKV(float& value)
  6826. {
  6827. if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostEvent, 2000))
  6828. {
  6829. value = m_DoseUnit.m_PostKV->Get();
  6830. return RET_STATUS::RET_SUCCEED;
  6831. }
  6832. else
  6833. {
  6834. value = 0.0;
  6835. return RET_STATUS::RET_FAILED;
  6836. }
  6837. }
  6838. RET_STATUS nsGEN::SMZDevice::QueryPostMA(float& value)
  6839. {
  6840. if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostEvent, 2000))
  6841. {
  6842. value = m_DoseUnit.m_PostMA->Get();
  6843. return RET_STATUS::RET_SUCCEED;
  6844. }
  6845. else
  6846. {
  6847. value = 0.0;
  6848. return RET_STATUS::RET_FAILED;
  6849. }
  6850. }
  6851. RET_STATUS nsGEN::SMZDevice::QueryPostMS(float& value)
  6852. {
  6853. if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostEvent, 2000))
  6854. {
  6855. value = m_DoseUnit.m_PostMS->Get();
  6856. return RET_STATUS::RET_SUCCEED;
  6857. }
  6858. else
  6859. {
  6860. value = 0.0;
  6861. return RET_STATUS::RET_FAILED;
  6862. }
  6863. }
  6864. RET_STATUS nsGEN::SMZDevice::QueryPostMAS(float& value)
  6865. {
  6866. if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostEvent, 2000))
  6867. {
  6868. value = m_DoseUnit.m_PostMAS->Get();
  6869. return RET_STATUS::RET_SUCCEED;
  6870. }
  6871. else
  6872. {
  6873. value = 0.0;
  6874. return RET_STATUS::RET_FAILED;
  6875. }
  6876. }
  6877. RET_STATUS nsGEN::SMZDevice::Clear_DAP()
  6878. {
  6879. m_DoseUnit.m_PostKV->Update(0);
  6880. FireNotify(m_DoseUnit.m_PostKV->GetKey(), m_DoseUnit.m_PostKV->JSGet());
  6881. m_DoseUnit.m_PostMA->Update(0);
  6882. FireNotify(m_DoseUnit.m_PostMA->GetKey(), m_DoseUnit.m_PostMA->JSGet());
  6883. m_DoseUnit.m_PostMS->Update(0);
  6884. FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
  6885. m_DoseUnit.m_PostMAS->Update(0);
  6886. FireNotify(m_DoseUnit.m_PostMAS->GetKey(), m_DoseUnit.m_PostMAS->JSGet());
  6887. m_DAP->Update(0);
  6888. FireNotify(m_DAP->GetKey(), m_DAP->JSGet());
  6889. PRINTA_INFO("Clear_DAP: Clear Post Parameter(KV,mA,mS,mAs,Dap)");
  6890. return RET_STATUS::RET_SUCCEED;
  6891. }
  6892. RET_STATUS nsGEN::SMZDevice::GetValue_DAP(float& value)
  6893. {
  6894. if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostDAPEvent, 2000))
  6895. {
  6896. value = m_DAP->Get();
  6897. return RET_STATUS::RET_SUCCEED;
  6898. }
  6899. else
  6900. {
  6901. //string strCode = "LostPostParm";
  6902. //string strinfo = "IS can't receive IWATERVALACQ telegram from Axim,please check the DAP setting.";
  6903. //int nlevel = MESSAGEBOX_CLEARERROR;
  6904. //m_MSGUnit->AddWarnMessage(strCode.c_str(), nlevel, strinfo.c_str(), 0xF3);
  6905. value = 0.0;
  6906. return RET_STATUS::RET_FAILED;
  6907. }
  6908. }
  6909. bool SMZDevice::DoExposure()
  6910. {
  6911. PRINTA_INFO("DoExposure");
  6912. if (m_bAlreadyExposure)
  6913. {
  6914. PRINTA_INFO("AlreadyExposure by SetGenSynState");
  6915. return true;
  6916. }
  6917. m_bAlreadyExposure = true;
  6918. SendIDETEKTORSTATUS(1); //打开窗口
  6919. return true;
  6920. }
  6921. RET_STATUS nsGEN::SMZDevice::SetGenSynState(int value)
  6922. {
  6923. PRINTA_INFO("SetGenSynState: %d",value);
  6924. switch (value)
  6925. {
  6926. case AttrKey::GENERATOR_RAD_READY:
  6927. if (m_DoseUnit.m_GenState->Get() == AttrKey::GENERATOR_STATUS_STANDBY)
  6928. {
  6929. SendSAUSLBED(1); //自动曝光 按下手闸
  6930. m_bAutoHandSwitch = false;
  6931. }
  6932. else
  6933. {
  6934. m_bAutoHandSwitch = true;
  6935. }
  6936. break;
  6937. case AttrKey::GENERATOR_RAD_XRAYON:
  6938. {
  6939. try
  6940. {
  6941. m_nXwindowTime = (int)(m_GenConfig["XWindowOpenTimeout"]);
  6942. }
  6943. catch (...)
  6944. {
  6945. PRINTA_ERROR("Can't get the XWindowOpenTimeout value,default = 100ms\n");
  6946. }
  6947. DWORD tmNowTime = GetTickCount();
  6948. int nSpanTime = tmNowTime - m_tmDetectorStart;
  6949. if (nSpanTime <= 0)
  6950. {
  6951. nSpanTime += 1;
  6952. PRINTA_INFO("Span Time = 0, add 1ms"); //siemens requirement 20230220
  6953. }
  6954. PRINTA_INFO("Span Time:%d,tmNowTime:%d, m_tmDetectorStart:%d,XWindowOpenTimeout:%d", nSpanTime, tmNowTime, m_tmDetectorStart,m_nXwindowTime);
  6955. if (m_bAlreadyExposure)
  6956. {
  6957. PRINTA_INFO("AlreadyExposure by SetGenSynState");
  6958. break;
  6959. }
  6960. if (!m_bCalibMode && (nSpanTime > m_nXwindowTime))
  6961. {
  6962. PRINTA_INFO("Omit Send IDETEKTORSTATUS");
  6963. //int level = MESSAGEBOX_CLEARERROR;
  6964. //const char* strSiemensCode = "60019";
  6965. string strDisplayErrorTemp = "Omit Send IDETEKTORSTATUS,Xray isn't released, please try exposure again";
  6966. //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), 0xF3);
  6967. SendTelegramLog("IDETEKTORSTATUS", strDisplayErrorTemp.c_str(), 0xF3, 1, SYS_LOG_LEVEL_Error, "60019");
  6968. break;
  6969. }
  6970. else if (m_bCalibMode)
  6971. {
  6972. PRINTA_INFO("Send IDETEKTORSTATUS in calibration");
  6973. }
  6974. SendIDETEKTORSTATUS(1); //打开窗口
  6975. m_bAlreadyExposure = true;
  6976. break;
  6977. }
  6978. case AttrKey::GENERATOR_RAD_OFF:
  6979. if (m_DoseUnit.m_GenSynState->Get() != AttrKey::GENERATOR_RAD_OFF)
  6980. {
  6981. if (m_bCalibMode)
  6982. {
  6983. SendSAUSLBED(0); //用于FD自动校正 松开手闸
  6984. }
  6985. else
  6986. {
  6987. //此处会影响冻屏功能,对应bug13337,删除此处代码
  6988. //m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  6989. //FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  6990. //PRINTA_INFO("<GEN EXP>Get GENERATOR_RAD_OFF in normal, Direct set the synstate to RAD_OFF\n");
  6991. }
  6992. }
  6993. else
  6994. {
  6995. PRINTA_INFO("<GEN EXP>already GENERATOR_RAD_OFF, Don't need to change GenSynState value\n");
  6996. }
  6997. break;
  6998. default:
  6999. break;
  7000. }
  7001. return RET_STATUS::RET_SUCCEED;
  7002. }
  7003. RET_STATUS nsGEN::SMZDevice::SetGenState(int value)
  7004. {
  7005. return RET_STATUS::RET_SUCCEED;
  7006. }
  7007. RET_STATUS nsGEN::SMZDevice::RefreshData ()
  7008. {
  7009. return RET_STATUS::RET_SUCCEED;
  7010. }
  7011. RET_STATUS nsGEN::SMZDevice::Reset()
  7012. {
  7013. m_stGenCommand.id = SBEDALLG;
  7014. m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
  7015. m_stGenCommand.mode = Clientmode;
  7016. m_stGenCommand.sender = Clientsender;
  7017. m_stGenCommand.group_index = Clientgroup_index;
  7018. m_stGenCommand.target = Clienttarget;
  7019. sbedallg_t1_tag szSendGen = {};
  7020. szSendGen.bedeinh = DFR_BEDIENUNG;
  7021. szSendGen.bedienobj = SELEKTIONSTASTEN;
  7022. szSendGen.fktscodeallg = FEHLER_LOESCHEN;
  7023. szSendGen.param = 1; //Siemens 要求
  7024. ACS_BYTE* sCommmand = new ACS_BYTE[(m_stGenCommand.length + 1) * 2];
  7025. ::memset(sCommmand, 0, (m_stGenCommand.length + 1) * sizeof(ACS_BYTE) * 2);
  7026. ::memcpy(sCommmand, &m_stGenCommand, 8);
  7027. ::memcpy(sCommmand + 8, &szSendGen.bedeinh, 1);
  7028. ::memcpy(sCommmand + 9, &szSendGen.bedienobj, 1);
  7029. ::memcpy(sCommmand + 10, &szSendGen.fktscodeallg, 2);
  7030. ::memcpy(sCommmand + 12, &szSendGen.param, 2);
  7031. szSendGen.header = m_stGenCommand;
  7032. if (m_pAxnClient != NULL)
  7033. {
  7034. m_pAxnClient->sendObject(sCommmand);
  7035. PRINTA_DEBUG("SBEDALLG IS: Reset\n");
  7036. SendTelegramLog("SBEDALLG", "", m_stGenCommand.sender, 0);
  7037. }//ENDIF
  7038. PRINTA_DEBUG("== SEND == : SBEDALLG (Reset)\n");
  7039. delete[] sCommmand;
  7040. sCommmand = NULL;
  7041. return RET_STATUS::RET_SUCCEED;
  7042. }
  7043. RET_STATUS nsGEN::SMZDevice::SetExpMode(std::string value)
  7044. {
  7045. return RET_STATUS::RET_SUCCEED;
  7046. }
  7047. RET_STATUS nsGEN::SMZDevice::SetFrameRate(FLOAT frameRate)
  7048. {
  7049. return RET_STATUS::RET_SUCCEED;
  7050. }
  7051. RET_STATUS nsGEN::SMZDevice::SetFLFMode(std::string value)
  7052. {
  7053. return RET_STATUS::RET_SUCCEED;
  7054. }
  7055. RET_STATUS nsGEN::SMZDevice::SetEXAMMode(std::string value)
  7056. {
  7057. return RET_STATUS::RET_SUCCEED;
  7058. }
  7059. RET_STATUS nsGEN::SMZDevice::SetHET() //模拟测试热容量
  7060. {
  7061. PRINTA_INFO("SetHET\n");
  7062. TubeHeatTest();
  7063. return RET_STATUS::RET_SUCCEED;
  7064. }
  7065. RET_STATUS nsGEN::SMZDevice::SetSHO(bool state)//设置检查名称是否正确
  7066. {
  7067. PRINTA_INFO("SetSHO,set the result of view name is %d\n", state);
  7068. SetOrgNameStatus(state);
  7069. return RET_STATUS::RET_SUCCEED;
  7070. }
  7071. RET_STATUS nsGEN::SMZDevice::SetSTA(int state)//设置软件状态
  7072. {
  7073. PRINTA_INFO("SetSTA,set the software status is %d\n", state);
  7074. SendIdfrStatus(state, state);
  7075. return RET_STATUS::RET_SUCCEED;
  7076. }
  7077. RET_STATUS nsGEN::SMZDevice::SetPIM(const char* viewname)//设置当前view名称到TUI
  7078. {
  7079. PRINTA_INFO("SetPIM,set Viewname %s\n", viewname);
  7080. return RET_STATUS::RET_SUCCEED;
  7081. }
  7082. RET_STATUS nsGEN::SMZDevice::SetSSI(const char* key, const char* value)//设置系统信息
  7083. {
  7084. PRINTA_INFO("SetSSI,set SystemStatusInformation key:%s,value:%s\n", key, value);
  7085. string strCode = key;
  7086. int nCode = atoi(strCode.c_str());
  7087. SetSystemStatusInformation(nCode, value, ACS_DIAG_COMPLETED);
  7088. return RET_STATUS::RET_SUCCEED;
  7089. }
  7090. RET_STATUS nsGEN::SMZDevice::SetSMV(const char* key, const char* value)//设置组件版本信息
  7091. {
  7092. PRINTA_INFO("SetSMV,set module versionnumber:key:%s,value:%s\n", key, value);
  7093. SetVersionInfor(key, value);
  7094. return RET_STATUS::RET_SUCCEED;
  7095. }
  7096. RET_STATUS nsGEN::SMZDevice::SetCFM(const char* key, const char* value)//设置处理配置文件结果
  7097. {
  7098. PRINTA_INFO("Set configure file resul key: %s, value: %s\n",key,value);
  7099. string strCode = value;
  7100. int nCode = atoi(strCode.c_str());
  7101. SetSHCONFIG(nCode);
  7102. return RET_STATUS::RET_SUCCEED;
  7103. }
  7104. RET_STATUS nsGEN::SMZDevice::SetBRM(int state)//设置backup结果
  7105. {
  7106. PRINTA_INFO("Set Backup result\n");
  7107. SetSH_DATA_TRANS(state, m_nBackup_Restre_Identifier);
  7108. return RET_STATUS::RET_SUCCEED;
  7109. }
  7110. RET_STATUS nsGEN::SMZDevice::SetERA(int state)//检查最后错误数目
  7111. {
  7112. PRINTA_INFO("check the last Error Number\n");
  7113. GetLastErrorAmount();
  7114. return RET_STATUS::RET_SUCCEED;
  7115. }
  7116. RET_STATUS nsGEN::SMZDevice::SetPNS(int state)//病人属性
  7117. {
  7118. PRINTA_INFO("check the Patient Status:%d", state);
  7119. SetPatientStatus(state);
  7120. return RET_STATUS::RET_SUCCEED;
  7121. }
  7122. RET_STATUS nsGEN::SMZDevice::SetScreenLockState(int state)
  7123. {
  7124. PRINTA_INFO("Set ScreenLockState: %d\n", state);
  7125. SetScreenSaver(state);
  7126. return RET_STATUS::RET_SUCCEED;
  7127. }
  7128. RET_STATUS nsGEN::SMZDevice::SetFDSerialNumber(const char* key, const char* value)
  7129. {
  7130. PRINTA_INFO("Set SendFPDSerialNumber: %s:%s\n", key, value);
  7131. SendFPDSerialNumber(atoi(key),value);
  7132. return RET_STATUS::RET_SUCCEED;
  7133. }
  7134. RET_STATUS nsGEN::SMZDevice::SetUIDoing(void)
  7135. {
  7136. PRINTA_INFO("Set UIDoing\n");
  7137. m_stGenCommand.id = IBINOK;
  7138. m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_STRING) *(VERSION_XCU_LENGTH + SVN_REVISION_LENGTH + VERSION_AXCS_LENGTH);
  7139. m_stGenCommand.mode = Clientmode;
  7140. m_stGenCommand.sender = Clientsender;
  7141. m_stGenCommand.group_index = Clientgroup_index;
  7142. m_stGenCommand.target = Clienttarget;
  7143. ibinok_t1 szSendGen = {};
  7144. szSendGen.header = m_stGenCommand;
  7145. if (m_pAxnClient != NULL)
  7146. {
  7147. m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
  7148. SendTelegramLog("IBINOK", "IBINOK", m_stGenCommand.sender, 0);
  7149. }//ENDIF
  7150. PRINTA_INFO("== SEND == : IBINOK\n");
  7151. return RET_STATUS::RET_SUCCEED;
  7152. }
  7153. RET_STATUS nsGEN::SMZDevice::JSSetFPDCalibrationStatus(std::string in, std::string& out)
  7154. {
  7155. ResDataObject json;
  7156. json.decode(in.c_str());
  7157. unsigned int nValue = json[0];
  7158. PRINTA_INFO("OnCAL: %d", nValue);
  7159. if (nValue == 1)//开始校正
  7160. {
  7161. //需要先发送ORGDATE,然后GetSwitchState(RQ_OJECT)
  7162. m_bCalibMode = true;
  7163. m_bGetIGENANZ = false;
  7164. m_bSetEnable = false;
  7165. SetST_SYSTEM_STATE(ACS_STATE_FDCALIB_RUNNING);
  7166. PRINTA_INFO("--Func-- SetSatetySwitch \n");
  7167. if (!SetSatetySwitch())//发送RQ_OBJECT,收到SH_SS,发送ST_SS; TODO 002
  7168. {
  7169. return RET_STATUS::RET_SUCCEED;;
  7170. }//ENDIF
  7171. }
  7172. else if (nValue == 2)//接受校正结果;
  7173. {
  7174. if (!SendIDFRABSCHALTUNG())
  7175. {
  7176. return RET_STATUS::RET_SUCCEED;;
  7177. }//ENDIF
  7178. }
  7179. else if (nValue == 3)//拒绝校正结果;
  7180. {
  7181. if(m_DoseUnit.m_GenSynState->Get() != AttrKey::GENERATOR_RAD_OFF)
  7182. {
  7183. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  7184. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  7185. PRINTA_INFO("refuse calibration, clear the exposure status to OFF\n");
  7186. }
  7187. if (!SendIDFRABSCHALTUNG())
  7188. {
  7189. return RET_STATUS::RET_SUCCEED;;
  7190. }//ENDIF
  7191. }
  7192. else if ((nValue == 4)||(nValue == 5))//终止校正 || 完成校正;
  7193. {
  7194. if (m_DoseUnit.m_GenSynState->Get() != AttrKey::GENERATOR_RAD_OFF)
  7195. {
  7196. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  7197. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  7198. PRINTA_INFO("Stop calibration, clear the exposure status to OFF\n");
  7199. }
  7200. m_bCalibMode = false;
  7201. m_bGetIGENANZ = false;
  7202. m_bSetEnable = false;
  7203. SetST_SYSTEM_STATE(ACS_STATE_CONSISTENT);
  7204. }
  7205. //else if (nValue == 5)//完成校正;
  7206. //{
  7207. // m_bCalibMode = false;
  7208. // m_bGetIGENANZ = false;
  7209. // m_bSetEnable = false;
  7210. // SetST_SYSTEM_STATE(ACS_STATE_CONSISTENT);
  7211. //}
  7212. return RET_STATUS::RET_SUCCEED;
  7213. }
  7214. RET_STATUS nsGEN::SMZDevice::JSSetPanelSN(std::string in, std::string& out)
  7215. {
  7216. ResDataObject json;
  7217. json.decode(in.c_str());
  7218. string strValue = json[0];
  7219. PRINTA_INFO("SetPanelSN: %s", strValue);
  7220. m_strPanelSN = strValue.c_str();
  7221. SendFPDSerialNumber(ACS_FD_PORTABLE, strValue.c_str());
  7222. return RET_STATUS::RET_SUCCEED;
  7223. }
  7224. RET_STATUS nsGEN::SMZDevice::JSSendFPDError(std::string in, std::string& out)
  7225. {
  7226. ResDataObject json;
  7227. json.decode(in.c_str());
  7228. string strBackCom = (string)json["P0"]["BackCommand"];
  7229. int nValue = atoi(strBackCom.c_str());
  7230. m_strPanelSN = (string)json["P0"]["DetectorSN"];
  7231. PRINTA_INFO("SendFPDError: %d, SN: %s", nValue, m_strPanelSN.c_str());
  7232. //SetFDErrorCode(nValue, BEHEB_FEHLER, m_strPanelSN);
  7233. return RET_STATUS::RET_SUCCEED;
  7234. }
  7235. RET_STATUS nsGEN::SMZDevice::JSClearFPDError(std::string in, std::string& out)
  7236. {
  7237. ResDataObject json;
  7238. json.decode(in.c_str());
  7239. string strBackCom = (string)json["P0"]["BackCommand"];
  7240. int nValue = atoi(strBackCom.c_str());
  7241. if (nValue == 0)
  7242. {
  7243. PRINTA_INFO("Clear all FPD Error");
  7244. }
  7245. else
  7246. {
  7247. PRINTA_INFO("ClearFPDError: %d", nValue);
  7248. }
  7249. //SetFDErrorCode(nValue, BEHEB_FEHLER, m_strPanelSN);
  7250. //Reset();
  7251. return RET_STATUS::RET_SUCCEED;
  7252. }
  7253. RET_STATUS nsGEN::SMZDevice::JSSendFPDWarn(std::string in, std::string& out)
  7254. {
  7255. ResDataObject json;
  7256. json.decode(in.c_str());
  7257. string strBackCom = (string)json["BackCommand"];
  7258. int nValue = atoi(strBackCom.c_str());
  7259. m_strPanelSN = (string)json["DetectorSN"];
  7260. PRINTA_INFO("SendFPDWarn: %d, SN: %s", nValue, m_strPanelSN.c_str());
  7261. //SetFDErrorCode(nValue, WARNUNG, m_strPanelSN);
  7262. return RET_STATUS::RET_SUCCEED;
  7263. }
  7264. RET_STATUS nsGEN::SMZDevice::JSSendFPDStatus(std::string in, std::string& out)
  7265. {
  7266. ResDataObject json;
  7267. json.decode(in.c_str());
  7268. unsigned int nValue = json[0];
  7269. PRINTA_INFO("SendFPDStatus: %d", nValue);
  7270. if (m_DoseUnit.m_WS->Get() != WS_CONVENTIONAL)
  7271. {
  7272. SendIdfrStatus(nValue, nValue);
  7273. }
  7274. else
  7275. {
  7276. PRINTA_INFO("Cassette mode, don't send the Detector status");
  7277. }
  7278. return RET_STATUS::RET_SUCCEED;
  7279. }
  7280. RET_STATUS nsGEN::SMZDevice::JSFPDXWindowOpen(std::string in, std::string& out)
  7281. {
  7282. ResDataObject json;
  7283. json.decode(in.c_str());
  7284. m_tmDetectorStart = json[0];
  7285. PRINTA_INFO("JSFPDXWindowOpen time: %d", m_tmDetectorStart);
  7286. return RET_STATUS::RET_SUCCEED;
  7287. }
  7288. RET_STATUS nsGEN::SMZDevice::RefreshParameterList(const char* ParamType, float* List, int ListCount, float maxvalue, float minvalue)
  7289. {
  7290. string strtype = ParamType;
  7291. ResDataObject temp;
  7292. temp.update("Max", maxvalue);
  7293. temp.update("Min", minvalue);
  7294. temp.update("List", "");
  7295. for (int i = 0; i < ListCount; i++)
  7296. {
  7297. char chindex[4] = { 0 };
  7298. sprintf_s(chindex, "%d", i);
  7299. temp["List"].add(chindex, List[i]);
  7300. }
  7301. if (strtype == "KVList")
  7302. {
  7303. m_DoseUnit.m_KVList->Update(temp.encode());
  7304. FireNotify(m_DoseUnit.m_KVList->GetKey(),m_DoseUnit.m_KVList->JSGet());
  7305. }
  7306. else if (strtype == "MASList")
  7307. {
  7308. m_DoseUnit.m_mAsList->Update(temp.encode());
  7309. FireNotify(m_DoseUnit.m_mAsList->GetKey(), m_DoseUnit.m_mAsList->JSGet());
  7310. FireNotify(m_DoseUnit.m_KVList->GetKey(), m_DoseUnit.m_KVList->JSGet());
  7311. }
  7312. return RET_STATUS::RET_SUCCEED;
  7313. }
  7314. RET_STATUS nsGEN::SMZDevice::AuditMessage(const char* strTime, const char* strMessage)
  7315. {
  7316. ResDataObject temp;
  7317. temp.update("Time", strTime);
  7318. temp.update("Message", strMessage);
  7319. m_UIClientUnit.m_AuditMessage->Update(temp.encode());
  7320. FireDataNotify(m_UIClientUnit.m_AuditMessage->GetKey(), m_UIClientUnit.m_AuditMessage->JSGet());
  7321. return RET_STATUS::RET_SUCCEED;
  7322. }
  7323. RET_STATUS nsGEN::SMZDevice::SetCollimatorSize(unsigned short xsize, unsigned short ysize)
  7324. {
  7325. return RET_STATUS::RET_SUCCEED;
  7326. }
  7327. RET_STATUS nsGEN::SMZDevice::SetCollimatorSID(unsigned short sid)
  7328. {
  7329. return RET_STATUS::RET_SUCCEED;
  7330. }
  7331. RET_STATUS nsGEN::SMZDevice::SetCollimatorFilter(unsigned short pParams)
  7332. {
  7333. return RET_STATUS::RET_SUCCEED;
  7334. }
  7335. RET_STATUS nsGEN::SMZDevice::SetCollimatorAngle(float pParams)
  7336. {
  7337. return RET_STATUS::RET_SUCCEED;
  7338. }
  7339. RET_STATUS nsGEN::SMZDevice::SetCollimatorMode(unsigned short pParams)
  7340. {
  7341. return RET_STATUS::RET_SUCCEED;
  7342. }
  7343. RET_STATUS nsGEN::SMZDevice::SetCollimatorLight(unsigned short pParams)
  7344. {
  7345. return RET_STATUS::RET_SUCCEED;
  7346. }
  7347. //-----------------------------------------------------------------------------
  7348. // ProcessCmd
  7349. //-----------------------------------------------------------------------------
  7350. void nsGEN::SMZDevice::FireNotify (std::string key, std::string content)
  7351. {
  7352. EventCenter->OnNotify (1, key, content);
  7353. }
  7354. void nsGEN::SMZDevice::FireDataNotify(std::string key, std::string content)
  7355. {
  7356. EventCenter->OnNotify(ATTRACTION_MSG, key, content);
  7357. }
  7358. void nsGEN::SMZDevice::SendTelegramLog(const char* strTelegramKey, const char* strTelegramLog, int nSender, int nMode, int nTelegramType,const char* strCode) //已完善 20211029
  7359. {
  7360. std::ostringstream buffer;
  7361. buffer << "["<< strTelegramKey << "] " << strTelegramLog;
  7362. string str = buffer.str();
  7363. string strSender = std::to_string(nSender);
  7364. if (nMode == 1)
  7365. {
  7366. EventCenter->OnSystemLog(nTelegramType, strCode, str, strSender);
  7367. }//Endif
  7368. else
  7369. {
  7370. EventCenter->OnSystemLog(SYS_LOG_LEVEL_Telegram, strCode, str, strSender); //系统日志接口问题
  7371. }
  7372. }
  7373. /*********************************************************************************
  7374. 函数名称:WSUI2TUI
  7375. 功能描述:切换workstations从UI到XCU,用于映射对应的workstation值
  7376. 修改记录:
  7377. 2021-4-22 创建
  7378. #define ACS_PF_WP_CASS (ACS_ENUM) 1 work place cassette
  7379. #define ACS_PF_WP_FREE (ACS_ENUM) 4 work place free exposure
  7380. #define ACS_PF_WP_TABLE (ACS_ENUM) 2 work place table
  7381. #define ACS_PF_WP_WALL (ACS_ENUM) 3 work place wall stand
  7382. *******************************************************************************/
  7383. void nsGEN::SMZDevice::WSUI2TUI(int nUIWS, int& nGenWS)
  7384. {
  7385. if (nUIWS == WS_TABLE) //lying: cross mode
  7386. {
  7387. nGenWS = ACS_PF_WP_TABLE;
  7388. }
  7389. else if (nUIWS == WS_WALL) //standing mode
  7390. {
  7391. nGenWS = ACS_PF_WP_WALL;
  7392. }
  7393. else if (nUIWS == WS_FREE) //mobile mode
  7394. {
  7395. nGenWS = ACS_PF_WP_FREE;
  7396. }
  7397. else if (nUIWS == WS_TOMO) //tomo mode
  7398. {
  7399. nGenWS = ACS_PF_WP_TABLE;
  7400. }
  7401. else if (nUIWS == WS_CONVENTIONAL) //Conventional table
  7402. {
  7403. nGenWS = ACS_PF_WP_CASS;
  7404. }
  7405. else
  7406. {
  7407. nGenWS = ACS_PF_WP_CASS;
  7408. }
  7409. PRINTA_INFO("Set default WS: %d,TUI workstaion: %d\n", nUIWS, nGenWS);
  7410. }
  7411. ///*********************************************************************************
  7412. //函数名称:mb2wc
  7413. //功能描述: 字符转换函数:宽字符转多字节
  7414. //修改记录:
  7415. //2021-04-20 创建
  7416. //*******************************************************************************/
  7417. string nsGEN::SMZDevice::wc2mb(const wchar_t* pwcstr)
  7418. {
  7419. std::string strVal = "";
  7420. int nSize = WideCharToMultiByte(CP_UTF8, 0, pwcstr, -1, NULL, 0, NULL, NULL);
  7421. char* pszStr = new char[nSize + 1];
  7422. if (pszStr)
  7423. {
  7424. memset(pszStr, 0, nSize * sizeof(char));
  7425. int nRet = WideCharToMultiByte(CP_UTF8, 0, pwcstr, -1, pszStr, nSize, NULL, NULL);
  7426. if (nRet != 0) // MultiByteToWideChar returns 0 if it does not succeed.
  7427. {
  7428. strVal = pszStr;
  7429. }
  7430. delete[] pszStr;
  7431. pszStr = NULL;
  7432. }
  7433. return strVal;
  7434. }
  7435. ///*********************************************************************************
  7436. //函数名称:mb2wc
  7437. //功能描述: 字符转换函数:多字节转宽字符
  7438. //修改记录:
  7439. //2021-04-20 创建
  7440. //*******************************************************************************/
  7441. wstring nsGEN::SMZDevice::mb2wc(const char* pszStr)
  7442. {
  7443. std::wstring strVal = L"";
  7444. int nSize = MultiByteToWideChar(CP_UTF8, 0, pszStr, -1, NULL, 0);
  7445. wchar_t* pwcStr = new wchar_t[nSize + 1];
  7446. if (pwcStr)
  7447. {
  7448. memset(pwcStr, 0, nSize * sizeof(wchar_t));
  7449. int nRet = MultiByteToWideChar(CP_UTF8, 0, pszStr, -1, pwcStr, nSize);
  7450. if (nRet != 0) // MultiByteToWideChar returns 0 if it does not succeed.
  7451. {
  7452. pwcStr[nSize] = '\0';
  7453. strVal = pwcStr;
  7454. }
  7455. delete[] pwcStr;
  7456. pwcStr = NULL;
  7457. }
  7458. return strVal;
  7459. }
  7460. void nsGEN::SMZDevice::DecodeBase64(string strMessageIn, wstring& strMessageOut)
  7461. {
  7462. vector<unsigned char> listdata;
  7463. CBase64::Decode(strMessageIn, listdata);
  7464. strMessageOut = GetWString(listdata);
  7465. }
  7466. wstring nsGEN::SMZDevice::GetWString(vector<unsigned char>& listdata)
  7467. {
  7468. wstring strOutData = L"";
  7469. for (size_t i = 1; i < listdata.size(); i += 2)
  7470. {
  7471. wchar_t wchar = L'\000';
  7472. unsigned char mchar[2] = { 0 };
  7473. mchar[0] = listdata[i - 1];
  7474. mchar[1] = listdata[i];
  7475. memcpy(&wchar, mchar, 2);
  7476. strOutData += wchar;
  7477. }
  7478. return strOutData;
  7479. }
  7480. ///*********************************************************************************
  7481. //函数名称:SwitchLogLevel
  7482. //功能描述:切换日志属性类型
  7483. //对应需求:
  7484. //修改记录:
  7485. //2021-4-23 创建
  7486. //*******************************************************************************/
  7487. string nsGEN::SMZDevice::SwitchCategory2Str(ACS_ENUM nCatrgoryNumber)
  7488. {
  7489. string strCategory = "";
  7490. switch (nCatrgoryNumber)
  7491. {
  7492. case BEDIENEVENT:
  7493. strCategory = A_BEDIENEVENT;
  7494. break;
  7495. case USERMESSAGE:
  7496. strCategory = I_USERMESSAGE;
  7497. break;
  7498. case RESET_USERMSG_LEGACY:
  7499. strCategory = X_RESET_USERMSG_LEGACY;
  7500. break;
  7501. case TELEGRAM:
  7502. strCategory = T_TELEGRAM;
  7503. break;
  7504. case MSGBOX_NO_OK_NO_TUI:
  7505. strCategory = O_MSGBOX_NO_OK_NO_TUI;
  7506. break;
  7507. case ORTHOMESSAGE:
  7508. strCategory = O_ORTHOMESSAGE;
  7509. break;
  7510. case ACS_FLAG_RESET:
  7511. strCategory = A_ACS_FLAG_RESET;
  7512. break;
  7513. case WARNUNG:
  7514. strCategory = W_WARNUNG;
  7515. break;
  7516. case BEHEB_FEHLER:
  7517. strCategory = R_BEHEB_FEHLER;
  7518. break;
  7519. case NICHT_BEHEB_FEHLER:
  7520. strCategory = E_NICHT_BEHEB_FEHLER;
  7521. break;
  7522. case FATALER_FEHLER:
  7523. strCategory = F_FATALER_FEHLER;
  7524. break;
  7525. case RESET_WARNING:
  7526. strCategory = X_RESET_WARNING;
  7527. break;
  7528. case RESET_ERROR:
  7529. strCategory = X_RESET_ERROR;
  7530. break;
  7531. case RESET_SEVERE:
  7532. strCategory = X_RESET_SEVERE;
  7533. break;
  7534. case RESET_FATAL:
  7535. strCategory = X_RESET_FATAL;
  7536. break;
  7537. case RESET_USERMESSAGE:
  7538. strCategory = X_RESET_USERMESSAGE;
  7539. break;
  7540. case RESET_TELEGRAM:
  7541. strCategory = X_RESET_TELEGRAM;
  7542. break;
  7543. case RESET_MSGBOX:
  7544. strCategory = X_RESET_MSGBOX;
  7545. break;
  7546. case RESET_ORTHOMSG:
  7547. strCategory = X_RESET_ORTHOMSG;
  7548. break;
  7549. case ACS_FLAG_YESNO:
  7550. strCategory = T_ACS_FLAG_YESNO;
  7551. break;
  7552. default:
  7553. strCategory = T_ACS_FLAG_YESNO;
  7554. break;
  7555. }
  7556. return strCategory;
  7557. }
  7558. ///*********************************************************************************
  7559. //函数名称:SwitchLogLevel
  7560. //功能描述:切换日志属性类型
  7561. //对应需求:
  7562. //修改记录:
  7563. //2021-12-20 创建 提供日志属性
  7564. //*******************************************************************************/
  7565. int nsGEN::SMZDevice::SwitchCategory2ECOM(ACS_ENUM nCatrgoryNumber)
  7566. {
  7567. int strCategory = -1;
  7568. switch (nCatrgoryNumber)
  7569. {
  7570. case BEDIENEVENT:
  7571. strCategory = SYS_LOG_LEVEL_Action;
  7572. break;
  7573. case USERMESSAGE:
  7574. strCategory = SYS_LOG_LEVEL_Information;
  7575. break;
  7576. case RESET_USERMSG_LEGACY:
  7577. strCategory = SYS_LOG_LEVEL_RESET;
  7578. break;
  7579. case TELEGRAM:
  7580. strCategory = SYS_LOG_LEVEL_Telegram;
  7581. break;
  7582. case MSGBOX_NO_OK_NO_TUI:
  7583. strCategory = SYS_LOG_LEVEL_Ortho;
  7584. break;
  7585. case ORTHOMESSAGE:
  7586. strCategory = SYS_LOG_LEVEL_Ortho;
  7587. break;
  7588. case ACS_FLAG_RESET:
  7589. strCategory = SYS_LOG_LEVEL_Action;
  7590. break;
  7591. case WARNUNG:
  7592. strCategory = SYS_LOG_LEVEL_Warning;
  7593. break;
  7594. case BEHEB_FEHLER:
  7595. strCategory = SYS_LOG_LEVEL_Recoverable;
  7596. break;
  7597. case NICHT_BEHEB_FEHLER:
  7598. strCategory = SYS_LOG_LEVEL_Error;
  7599. break;
  7600. case FATALER_FEHLER:
  7601. strCategory = SYS_LOG_LEVEL_Fatal;
  7602. break;
  7603. case RESET_WARNING:
  7604. strCategory = SYS_LOG_LEVEL_RESET;
  7605. break;
  7606. case RESET_ERROR:
  7607. strCategory = SYS_LOG_LEVEL_RESET;
  7608. break;
  7609. case RESET_SEVERE:
  7610. strCategory = SYS_LOG_LEVEL_RESET;
  7611. break;
  7612. case RESET_FATAL:
  7613. strCategory = SYS_LOG_LEVEL_RESET;
  7614. break;
  7615. case RESET_USERMESSAGE:
  7616. strCategory = SYS_LOG_LEVEL_RESET;
  7617. break;
  7618. case RESET_TELEGRAM:
  7619. strCategory = SYS_LOG_LEVEL_RESET;
  7620. break;
  7621. case RESET_MSGBOX:
  7622. strCategory = SYS_LOG_LEVEL_RESET;
  7623. break;
  7624. case RESET_ORTHOMSG:
  7625. strCategory = SYS_LOG_LEVEL_RESET;
  7626. break;
  7627. case ACS_FLAG_YESNO:
  7628. strCategory = SYS_LOG_LEVEL_Telegram;
  7629. break;
  7630. default:
  7631. strCategory = SYS_LOG_LEVEL_Telegram;
  7632. break;
  7633. }
  7634. return strCategory;
  7635. }
  7636. /*********************************************************************************
  7637. 函数名称:WSGen2UI
  7638. 功能描述:切换workstations从XCU到UI,用于映射对应的workstation值
  7639. 修改记录:
  7640. 2021-04-20 创建
  7641. *******************************************************************************/
  7642. void nsGEN::SMZDevice::WSGen2UI(int nWSGen, int& nWSUI)
  7643. {
  7644. int nWSGenLying = 1;
  7645. int nWSGenStand = 2;
  7646. int nWSGenFree = 3;
  7647. int nWSGenTomo = 0; //2021-04-21 待完善功能 临时写死 可能不使用
  7648. int nWSGenConventional = 4; //2021-04-21 待完善功能 临时写死
  7649. int nWSGenConventionalTable = 7; //2021-04-21 待完善功能 临时写死 可能不使用
  7650. int nWSGenConventionalWall = 8; //2021-04-21 待完善功能 临时写死 可能不使用
  7651. int nWSGenOrthoWALL = 5; //2021-04-21 待完善功能 临时写死
  7652. int nWSGenOrthoTable = 6; //2021-04-21 待完善功能 临时写死
  7653. try
  7654. {
  7655. nWSGenLying = (int)(m_GenConfig["WorkStation"]["Table"]);
  7656. nWSGenStand = (int)(m_GenConfig["WorkStation"]["Wall"]);
  7657. nWSGenFree = (int)(m_GenConfig["WorkStation"]["Free"]);
  7658. nWSGenConventional = (int)(m_GenConfig["WorkStation"]["Conventional"]);
  7659. }
  7660. catch (ResDataObjectExption& exp)
  7661. {
  7662. PRINTA_ERROR("Get configuration failed, %s", exp.what());
  7663. }
  7664. #pragma region GEN2UI
  7665. if (nWSGen == nWSGenLying)
  7666. {
  7667. if ((nWSGenLying == nWSGenStand)
  7668. || (nWSGenLying == nWSGenTomo)
  7669. || (nWSGenLying == nWSGenFree)
  7670. || (nWSGenLying == nWSGenConventional)
  7671. || (nWSGenLying == nWSGenConventionalTable)
  7672. || (nWSGenLying == nWSGenConventionalWall))
  7673. {
  7674. nWSUI = m_nSettingWS;
  7675. }
  7676. else
  7677. {
  7678. nWSUI = WS_TABLE;
  7679. }
  7680. }
  7681. else if (nWSGen == nWSGenStand)
  7682. {
  7683. if ((nWSGenStand == nWSGenTomo)
  7684. || (nWSGenStand == nWSGenFree)
  7685. || (nWSGenStand == nWSGenConventional)
  7686. || (nWSGenStand == nWSGenConventionalTable)
  7687. || (nWSGenStand == nWSGenConventionalWall))
  7688. {
  7689. nWSUI = m_nSettingWS;
  7690. }
  7691. else
  7692. {
  7693. nWSUI = WS_WALL;
  7694. }
  7695. }
  7696. else if (nWSGen == nWSGenConventional)
  7697. {
  7698. if ((nWSGenConventional == nWSGenTomo)
  7699. || (nWSGenConventional == nWSGenFree)
  7700. || (nWSGenConventional == nWSGenConventionalTable)
  7701. || (nWSGenConventional == nWSGenConventionalWall))
  7702. {
  7703. nWSUI = m_nSettingWS;
  7704. }
  7705. else
  7706. {
  7707. nWSUI = WS_CONVENTIONAL;
  7708. }
  7709. }
  7710. else if (nWSGen == nWSGenFree)
  7711. {
  7712. if ((nWSGenFree == nWSGenTomo)
  7713. || (nWSGenFree == nWSGenConventionalTable)
  7714. || (nWSGenFree == nWSGenConventionalWall))
  7715. {
  7716. nWSUI = m_nSettingWS;
  7717. }
  7718. else
  7719. {
  7720. nWSUI = WS_FREE;
  7721. }
  7722. }
  7723. else if (nWSGen == nWSGenTomo)
  7724. {
  7725. if ((nWSGenFree == nWSGenConventionalTable)
  7726. || (nWSGenFree == nWSGenConventionalWall))
  7727. {
  7728. nWSUI = m_nSettingWS;
  7729. }
  7730. else
  7731. {
  7732. nWSUI = WS_TOMO;
  7733. }
  7734. }
  7735. else if (nWSGen == nWSGenConventionalTable)
  7736. {
  7737. if ((nWSGenConventionalTable == nWSGenConventionalWall))
  7738. {
  7739. nWSUI = m_nSettingWS;
  7740. }
  7741. else
  7742. {
  7743. nWSUI = WS_CONVENTIONAL;
  7744. }
  7745. }
  7746. else if (nWSGen == nWSGenConventionalWall)
  7747. {
  7748. nWSUI = WS_CONVENTIONAL;
  7749. }
  7750. else if (nWSGen == nWSGenOrthoWALL)
  7751. {
  7752. nWSUI = WS_WALL;
  7753. }
  7754. else if (nWSGen == nWSGenOrthoTable)
  7755. {
  7756. nWSUI = WS_TABLE;
  7757. }
  7758. else
  7759. {
  7760. PRINTA_INFO("WSGen2UI: Get workstation %d from Generator,please check the configuration\n", nWSGen);
  7761. }
  7762. #pragma endregion
  7763. }
  7764. //-----------------------------------------------------------------------------
  7765. // SMZDriver
  7766. //-----------------------------------------------------------------------------
  7767. nsGEN::SMZDriver::SMZDriver ()
  7768. {
  7769. m_bConnect = false;
  7770. CreateLogger("Salmon");
  7771. }
  7772. nsGEN::SMZDriver::~SMZDriver ()
  7773. {
  7774. ReleaseLogger();
  7775. }
  7776. auto nsGEN::SMZDriver::CreateDevice (int index) -> std::unique_ptr <IODevice>
  7777. {
  7778. PRINTA_INFO("CreateDevice");
  7779. auto dev = std::unique_ptr <IODevice>(new IODevice(new SMZDevice(EventCenter, m_ConfigFileName)));
  7780. return dev;
  7781. }
  7782. void nsGEN::SMZDriver::FireNotify (int code, std::string key, std::string content)
  7783. {
  7784. EventCenter->OnNotify (code, key, content);
  7785. }
  7786. void nsGEN::SMZDriver::Prepare ()
  7787. {
  7788. super::Prepare ();
  7789. }
  7790. bool DATA_ACTION nsGEN::SMZDriver::Connect ()
  7791. {
  7792. PRINTA_INFO("================Salmon version 3.0.32.0 =============================\n");
  7793. ResDataObject Connection = GetConnectParam(m_ConfigFileName);
  7794. printf("connections:%s \n", Connection.encode());
  7795. printf("Connect begin \n");
  7796. m_bConnect = true;
  7797. //auto rc = super::Connect();
  7798. //if (!rc)
  7799. // return 0;
  7800. return 2;
  7801. }
  7802. void nsGEN::SMZDriver::Disconnect()
  7803. {
  7804. super::Disconnect();
  7805. m_bConnect = false;
  7806. }
  7807. bool nsGEN::SMZDriver::isConnected() const
  7808. {
  7809. return m_bConnect;
  7810. }
  7811. std::string nsGEN::SMZDriver::DriverProbe ()
  7812. {
  7813. ResDataObject r_config, HardwareInfo;
  7814. if (r_config.loadFile (m_ConfigFileName.c_str ()))
  7815. {
  7816. HardwareInfo.add ("MajorID", r_config ["CONFIGURATION"] ["MajorID"]);
  7817. HardwareInfo.add ("MinorID", r_config ["CONFIGURATION"] ["MinorID"]);
  7818. HardwareInfo.add ("VendorID", r_config ["CONFIGURATION"] ["VendorID"]);
  7819. HardwareInfo.add ("ProductID", r_config ["CONFIGURATION"] ["ProductID"]);
  7820. HardwareInfo.add ("SerialID", r_config ["CONFIGURATION"] ["SerialID"]);
  7821. }
  7822. else
  7823. {
  7824. HardwareInfo.add ("MajorID", "Generator");
  7825. HardwareInfo.add ("MinorID", "Dr");
  7826. HardwareInfo.add ("VendorID", "Siemens");
  7827. HardwareInfo.add ("ProductID", "Salmon");
  7828. HardwareInfo.add ("SerialID", "Drv");
  7829. }
  7830. string ret = HardwareInfo.encode ();
  7831. return ret;
  7832. }
  7833. std::string nsGEN::SMZDriver::GetResource ()
  7834. {
  7835. ResDataObject temp;
  7836. if (!temp.loadFile (m_ConfigFileName.c_str ()))
  7837. return std::string ();
  7838. auto r_config = temp ["CONFIGURATION"];
  7839. for (auto &Item : m_ConfigInfo)
  7840. {
  7841. string key = Item.GetKey ();
  7842. if (key == ConfKey::CcosGeneratorType)
  7843. {
  7844. Item.SetCurrentValue (((string)r_config ["VendorID"]).c_str ());
  7845. }
  7846. else if (key == ConfKey::CcosGeneratorModel)
  7847. {
  7848. Item.SetCurrentValue (((string)r_config ["ProductID"]).c_str ());
  7849. }
  7850. else if (key == ConfKey::CcosWSTable || key == ConfKey::CcosWSWall || key == ConfKey::CcosWSFree
  7851. || key == ConfKey::CcosWSTomo || key == ConfKey::CcosWSConventional)
  7852. {
  7853. Item.SetCurrentValue (((string)r_config [key.c_str ()]).c_str ());
  7854. }
  7855. else if (key == ConfKey::CcosSynTable || key == ConfKey::CcosSynWall || key == ConfKey::CcosSynFree
  7856. || key == ConfKey::CcosSynTomo || key == ConfKey::CcosSynConventional)
  7857. {
  7858. Item.SetCurrentValue (((string)r_config [key.c_str ()]).c_str ());
  7859. }
  7860. else if (key == ConfKey::CcosSCFType)
  7861. {
  7862. Item.SetCurrentValue (((string)r_config ["connections"] [0] ["type"]).c_str ());
  7863. }
  7864. else if (key == ConfKey::CcosSCFPort || key == ConfKey::CcosSCFBaudrate || key == ConfKey::CcosSCFBytesize
  7865. || key == ConfKey::CcosSCFParity || key == ConfKey::CcosSCFStopbits || key == ConfKey::CcosSCFIP)
  7866. {
  7867. if (r_config ["connections"] [0].GetFirstOf (key.c_str ()) >= 0)
  7868. {
  7869. Item.SetCurrentValue (((string)r_config ["connections"] [0] [key.c_str ()]).c_str ());
  7870. }
  7871. }
  7872. }
  7873. ResDataObject resAttr, resDescription;
  7874. for (auto Item : m_ConfigInfo)
  7875. {
  7876. resAttr.add (Item.GetKey (), Item.GetCurrentValue ());
  7877. resDescription.add (Item.GetKey (), Item.GetDescription ());
  7878. }
  7879. ResDataObject resDeviceResource;
  7880. resDeviceResource.add (ConfKey::CcosGeneratorAttribute, resAttr);
  7881. resDeviceResource.add (ConfKey::CcosGeneratorDescription, resDescription);
  7882. string res = resDeviceResource.encode ();
  7883. printf ("resDeviceResource :%s \n", resDeviceResource.encode ());
  7884. ResDataObject DescriptionTempEx;
  7885. DescriptionTempEx.add(ConfKey::CcosGeneratorConfig, resDeviceResource);
  7886. m_DeviceConfig = DescriptionTempEx;
  7887. return res;
  7888. }
  7889. bool nsGEN::SMZDriver::GetDeviceConfig(std::string& Cfg)
  7890. {
  7891. Cfg = m_DeviceConfig.encode();
  7892. PRINTA_INFO("GetDeviceConfig over");
  7893. return true;
  7894. }
  7895. std::string nsGEN::SMZDriver::DeviceProbe ()
  7896. {
  7897. ResDataObject r_config, HardwareInfo;
  7898. if (r_config.loadFile (m_ConfigFileName.c_str ()))
  7899. {
  7900. HardwareInfo.add ("MajorID", r_config ["CONFIGURATION"] ["MajorID"]);
  7901. HardwareInfo.add ("MinorID", r_config ["CONFIGURATION"] ["MinorID"]);
  7902. HardwareInfo.add ("VendorID", r_config ["CONFIGURATION"] ["VendorID"]);
  7903. HardwareInfo.add ("ProductID", r_config ["CONFIGURATION"] ["ProductID"]);
  7904. HardwareInfo.add ("SerialID", r_config ["CONFIGURATION"] ["SerialID"]);
  7905. }
  7906. else
  7907. {
  7908. HardwareInfo.add ("MajorID", "Generator");
  7909. HardwareInfo.add ("MinorID", "Dr");
  7910. HardwareInfo.add ("VendorID", "Siemens");
  7911. HardwareInfo.add ("ProductID", "Salmon");
  7912. HardwareInfo.add ("SerialID", "1234");
  7913. }
  7914. string ret = HardwareInfo.encode ();
  7915. return ret;
  7916. }
  7917. void nsGEN::SMZDriver::Dequeue (const char * Packet, DWORD Length)
  7918. {
  7919. }
  7920. //-----------------------------------------------------------------------------
  7921. // GetIODriver & CreateIODriver
  7922. //-----------------------------------------------------------------------------
  7923. static nsGEN::SMZDriver gIODriver;
  7924. extern "C" CCOS::Dev::IODriver * __cdecl GetIODriver () // 返回静态对象的引用, 调用者不能删除 !
  7925. {
  7926. return &gIODriver;
  7927. }
  7928. extern "C" CCOS::Dev::IODriver * __cdecl CreateIODriver () // 返回新对象, 调用者必须自行删除此对象 !
  7929. {
  7930. return new nsGEN::SMZDriver ();
  7931. }