DIOS.Dev.Generator.Delta_80KAXB.cpp 106 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733
  1. // CCOS.Dev.GEN.Delta.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include <assert.h>
  5. #include <functional>
  6. #include <fstream>
  7. using namespace std::placeholders;
  8. #include "Helper.JSON.hpp"
  9. #include "CCOS.Dev.Generator.Delta_80KAXB.h"
  10. using namespace CCOS::Dev::Detail::Generator;
  11. namespace nsGEN = CCOS::Dev::Detail::Generator;
  12. #pragma warning (disable:4244)
  13. #pragma warning (disable:4305)
  14. #pragma warning (disable:4267)
  15. #pragma comment(lib, "version.lib")
  16. static const int msTimeOut_Lock = 500;
  17. #ifdef _WIN64
  18. #ifdef _DEBUG
  19. static const auto COM_SCFDllName = "Ccos.Dev.SerialSCFX64D.dll";
  20. static const auto TCP_SCFDllName = "Ccos.Dev.TcpipSCFX64D.dll";
  21. #else
  22. static const auto COM_SCFDllName = "Ccos.Dev.SerialSCFX64.dll";
  23. static const auto TCP_SCFDllName = "Ccos.Dev.TcpipSCFX64.dll";
  24. #endif
  25. #endif
  26. #define Delta_Com_NormalLen 20
  27. #define Delta_LoopDefTime 1500
  28. #define Delta_LoopExpTime 100
  29. #define KVP_MAX 150
  30. #define KVP_MIN 40
  31. #define WORD_HIGH(a) (a>>4)
  32. #define WORD_LOW(a) (( a & 0x0F))
  33. #define COMMANDHEAD 0xF0
  34. #define COMMANDEND 0x88
  35. #define HANDSWITCHCOMMAND 0x0D
  36. #define HANDSWITCHFIRST 0x52
  37. #define XRAYONCOMMAND 0x58
  38. #define XRAYOFFCOMMAND 0x4F
  39. /* Control characters */
  40. #define STX 0x02 /* Start of DATA */
  41. #define ETX 0x03 /* End of DATA */
  42. #define ACK 0x06 /* Acknowlage */
  43. #define NAK 0x15 /* not acknowlage */
  44. #define BYTE_1 1
  45. #define BYTE_2 2
  46. #define BYTE_4 4
  47. #define BYTE_6 6
  48. #define BYTE_10 10
  49. #define BYTE_12 12
  50. //-----------------------------------------------------------------------------
  51. // 计算校验码
  52. //-----------------------------------------------------------------------------
  53. UINT8 GetCRC8(char* pBuffer, UINT16 bufSize)
  54. {
  55. char High[16] = { 0x00, 0x70, 0xe0, 0x90, 0xc7, 0xb7, 0x27, 0x57, 0x89, 0xf9, 0x69, 0x19, 0x4e, 0x3e, 0xae, 0xde };
  56. char Low[16] = { 0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d };
  57. UINT8 crc = 0;
  58. if (bufSize <= 0)
  59. return crc;
  60. for (int i = 0; i < bufSize; i++)
  61. {
  62. UINT8 result = (crc ^ pBuffer[i]);
  63. UINT8 high = WORD_HIGH(result);
  64. UINT8 low = WORD_LOW(result);
  65. crc = High[high] ^ Low[low];
  66. }
  67. return crc;
  68. }
  69. //-----------------------------------------------------------------------------
  70. // DeltaDevice
  71. //-----------------------------------------------------------------------------
  72. nsSerialGPM::CDeliverModule nsGEN::DeltaDevice::m_tDelivermodule;
  73. nsGEN::DeltaDevice* nsGEN::DeltaDevice::g_GenDevice = NULL;
  74. atomic<int> nsGEN::DeltaDevice::m_iLoopTime = Delta_LoopDefTime;
  75. nsGEN::DeltaDevice::DeltaDevice(std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF, string configfile) : super(center, SCF)
  76. {
  77. assert(EventCenter);
  78. g_GenDevice = this;
  79. //两种日志方式自行选择
  80. string version;
  81. if (GetVersion(version, hMyModule))
  82. mLog::FINFO("\n===============log begin : module version:{$} ===================\n", version.c_str());
  83. else
  84. mLog::FINFO("\n===============log begin : version:0.0.0.0 ===================\n");
  85. //获取delta动态库版本号
  86. string strPath;
  87. strPath = GetDynamicLibraryPath() + "\\CCOS.Dev.Generator.Delta_80KAXB64.dll";
  88. string strVersion;
  89. strVersion = GetFileVersion(strPath);
  90. mLog::FINFO("=====================log begin :delta dll version{$}===strPath {$}====================", strVersion, strPath);
  91. //初始化参数
  92. m_DoseUnit.m_KV.reset(new KVMould(70.0, 40.0, 150.0, 1.0));
  93. m_DoseUnit.m_MA.reset(new MAMould(20.0, 10.0, 1000.0, 1.0));
  94. m_DoseUnit.m_MS.reset(new MSMould(20.0, 1.0, 63000.0, 1.0));
  95. m_DoseUnit.m_MAS.reset(new MASMould(0.4, 0.4, 10000.0, 1.0));
  96. m_DoseUnit.m_Techmode.reset(new TECHMODEMould(AttrKey::TECHMODE_NOAEC_3P, AttrKey::TECHMODE_NOAEC_3P, AttrKey::TECHMODE_MAX, 1));
  97. m_DoseUnit.m_WS.reset(new WORKSTATIONMould(AttrKey::TABLE, AttrKey::TABLE, AttrKey::GENWS_MAX, 1));
  98. m_DoseUnit.m_Focus.reset(new FOCUSMould(AttrKey::FOCUS_LARGE, AttrKey::FOCUS_SMALL, AttrKey::FOCUS_LARGE, 1));
  99. m_DoseUnit.m_AECField.reset(new AECFIELDMould(0, 0, 111, 1));
  100. m_DoseUnit.m_AECFilm.reset(new AECFILMMould(0, 0, 3, 1));
  101. m_DoseUnit.m_AECDensity.reset(new AECDENSITYMould(0, -4, 4, 1));
  102. m_DoseUnit.m_HE.reset(new TUBEHEATMould(0, 0, 100, 1));
  103. m_DoseUnit.m_PostKV.reset(new POSTKVMould(40.0, 40.0, 150.0, 1.0));
  104. m_DoseUnit.m_PostMA.reset(new POSTMAMould(10.0, 10.0, 1000.0, 1.0));
  105. m_DoseUnit.m_PostMS.reset(new POSTMSMould(1.0, 1.0, 63000.0, 1.0));
  106. m_DoseUnit.m_PostMAS.reset(new POSTMASMould(0.4, 0.4, 10000.0, 1.0));
  107. m_DoseUnit.m_KVList.reset(new KVLISTMould(""));
  108. m_DoseUnit.m_MAList.reset(new MALISTMould(""));
  109. m_DoseUnit.m_mAsList.reset(new MASLISTMould(""));
  110. m_DoseUnit.m_MSList.reset(new MSLISTMould(""));
  111. m_DoseUnit.m_GenSynState.reset(new GENSYNSTATEMould(AttrKey::GENERATOR_RAD_OFF, AttrKey::GENERATOR_SYNC_ERR, AttrKey::GENERATOR_SYNC_MAX, 1));
  112. m_DoseUnit.m_GenState.reset(new GENSTATEMould(AttrKey::GENERATOR_STATUS_INIT, AttrKey::GENERATOR_STATUS_SHUTDOWN, AttrKey::GENERATOR_STATUS_MAX, 1));
  113. m_DoseUnit.m_GenTotalExpNumber.reset(new TOTALEXPNUMMould(0, 0, 9999, 1));
  114. m_DoseUnit.m_GenTotalAcqTimes.reset(new TOTALACQTIMESMould(0, 0, 9999, 1));
  115. m_DoseUnit.m_GenTubeCoolWaitTimes.reset(new TUBECOOLTIMEMould(0, 0, 9999, 1));
  116. m_DoseUnit.m_GenTubeOverLoadNumber.reset(new TUBEOVERLOADNUMMould(0, 0, 9999, 1));
  117. m_DoseUnit.m_GenCurrentExpNumber.reset(new CUREXPNUMMould(0, 0, 9999, 1));
  118. m_DoseUnit.m_ExpMode.reset(new EXPMODEMould(AttrKey::EXPMODE_TYPE::Single));
  119. m_DoseUnit.m_FrameRate.reset(new FRAMERATEMould(0, 0, 30, 1));
  120. m_DoseUnit.m_FLMode.reset(new FLUModeMould(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_NOTFLU));
  121. m_DAP.reset(new DevDAP::DOSEMould(0.0, 0.0, 1000.0, 0.01));
  122. m_MSGUnit.reset(new nsDetail::MSGUnit(center, nsGEN::GeneratorUnitType));
  123. //注册
  124. Register();
  125. //使用drivermodule类,用来做ack交互
  126. m_tDelivermodule.InitSendModle(this, &ProcessClientData, WriteLog);
  127. m_nCMDType_ACK = m_tDelivermodule.SetPriority(false, true);
  128. m_nCMDType_WaitTime = m_tDelivermodule.SetPriority(true, false, false, true, 100);
  129. m_nCMDType_WaitACK = m_tDelivermodule.SetPriority(true, false, 0, false, 0, false, 0, true, 100);
  130. m_nCMDType_WaitSELF = m_tDelivermodule.SetPriority(true, false, 3, false, 0, true, 1000);
  131. char ackCMD[3] = {ACK ,ETX ,0};
  132. m_tDelivermodule.SetACKCMDHead(ackCMD,2);
  133. //从配置文件获取对应配置内容
  134. //GetConfData();
  135. //循环
  136. m_hExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  137. m_hHUstatus = CreateEvent(NULL, TRUE, FALSE, NULL);
  138. m_hGENstatus = CreateEvent(NULL, TRUE, FALSE, NULL);
  139. m_hLoopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  140. m_hArrayEvent[0] = m_hExitEvent;
  141. m_hArrayEvent[1] = m_hHUstatus;
  142. m_hArrayEvent[2] = m_hGENstatus;
  143. m_hArrayEvent[3] = m_hLoopEvent;
  144. StartHardwareStatusThread();
  145. SetEvent(m_hHUstatus);
  146. SetEvent(m_hGENstatus);
  147. SetEvent(m_hLoopEvent);
  148. m_nCountTimes = 0;
  149. //确定版本号
  150. RetrieveFirewareVersion();
  151. //警告,错误信息
  152. m_ErrorMessages = {
  153. {"DELTA_ERR_0000", "LOST CONNECT"},
  154. {"DELTA_ERR_0001", "PC Invalid Command"},
  155. {"DELTA_ERR_0002", "Door Interlock"},
  156. {"DELTA_ERR_0003", "Interlock"},
  157. {"DELTA_ERR_0004", "Prep Timeout"},
  158. {"DELTA_ERR_0005", "Ready Timeout"},
  159. {"DELTA_ERR_0006", "Filament Timeout"},
  160. {"DELTA_ERR_0007", "No Library Data"},
  161. {"DELTA_ERR_0008", "No Calibration Data"},
  162. {"DELTA_ERR_0009", "SW Configuration File Empty"},
  163. {"DELTA_ERR_0010", "Calibration Manually Terminated"},
  164. {"DELTA_ERR_0011", "Manually Terminate Exposure"},
  165. {"DELTA_ERR_0012", "PREP Manually Terminate"},
  166. {"DELTA_ERR_0013", "Seasoning Manually Terminated"},
  167. {"DELTA_ERR_0014", "AC Voltage UVP"},
  168. {"DELTA_ERR_0015", "Bucky ready open"},
  169. {"DELTA_ERR_0017", "Not get AEC Ramp"},
  170. {"DELTA_ERR_0018", "AEC calibration over range"},
  171. {"DELTA_ERR_0019", "AEC exposure time out"},
  172. {"DELTA_ERR_0020", "Snap over power rating"},
  173. {"DELTA_ERR_1001", "SW OTP"},
  174. {"DELTA_ERR_1002", "Thermal Switch"},
  175. {"DELTA_ERR_1003", "XRAY Over HU"},
  176. {"DELTA_ERR_1004", "Aux Power Off"},
  177. {"DELTA_ERR_1005", "DR reset fail"},
  178. {"DELTA_ERR_1006", "DR ready fail"},
  179. {"DELTA_ERR_1007", "Battery communication loss"},
  180. {"DELTA_ERR_1008", "DAP communication loss"},
  181. {"DELTA_ERR_1009", "Fluoroscopic time out"},
  182. {"DELTA_ERR_1010", "DAP device error"},
  183. {"DELTA_ERR_1011", "Snap over time"},
  184. {"DELTA_ERR_2001", "SW Vout OVP"},
  185. {"DELTA_ERR_2002", "SW Vout UVP"},
  186. {"DELTA_ERR_2003", "SW Anode OCP"},
  187. {"DELTA_ERR_2004", "SW Anode UCP"},
  188. {"DELTA_ERR_2005", "Input Voltage OVP" },
  189. {"DELTA_ERR_2006", "Input Voltage UVP" },
  190. {"DELTA_ERR_2007", "24 VDC UVP" },
  191. {"DELTA_ERR_2008", "HW Vout OVP"},
  192. {"DELTA_ERR_2009", "Capacitive Protection"},
  193. {"DELTA_ERR_2010", "Primary OCP"},
  194. {"DELTA_ERR_2011", "HW Cathode OCP"},
  195. {"DELTA_ERR_2012", "HW Anode OCP"},
  196. {"DELTA_ERR_2013", "Charger OTP" },
  197. {"DELTA_ERR_2014", "PFC BUS UVP" },
  198. {"DELTA_ERR_2015", "Flow fault"},
  199. {"DELTA_ERR_2016", "PFC start fail"},
  200. {"DELTA_ERR_3001", "SW Thermal sense fault"},
  201. {"DELTA_ERR_3002", "Fan 1 Fault"},
  202. {"DELTA_ERR_3003", "Fan 2 Fault"},
  203. {"DELTA_ERR_3004", "Filament Power Fault"},
  204. {"DELTA_ERR_3005", "Soft Start Fail"},
  205. {"DELTA_ERR_3006", "MA Test Point Open"},
  206. {"DELTA_ERR_3007", "Tank Connect" },
  207. {"DELTA_ERR_3008", "Self-Test FERROR"},
  208. {"DELTA_ERR_3009", "Motor Short"},
  209. {"DELTA_ERR_3010", "Motor Invalid command"},
  210. {"DELTA_ERR_3011", "Motor OCP1"},
  211. {"DELTA_ERR_3012", "Motor OCP2"},
  212. {"DELTA_ERR_3013", "Motor Communication Loss"},
  213. {"DELTA_ERR_3014", "Motor Main Open"},
  214. {"DELTA_ERR_3015", "Motor Shift Open"},
  215. {"DELTA_ERR_3016", "Charger Fail"},
  216. {"DELTA_ERR_3017", "Bus UVP"},
  217. {"DELTA_ERR_3018", "Battery UVP"},
  218. {"DELTA_ERR_3019", "Cart UVP"},
  219. {"DELTA_ERR_3020", "Inverter error"},
  220. {"DELTA_ERR_3021", "Discharge Relay Fail" },
  221. {"DELTA_ERR_3022", "Battery OVP"},
  222. {"DELTA_ERR_3023", "Battery OCP" },
  223. {"DELTA_ERR_3024", "Battery OTP" },
  224. {"DELTA_ERR_3025", "Battery Fail"},
  225. {"DELTA_ERR_3026", "APS1 Fail"},
  226. {"DELTA_ERR_3027", "APS2 Fail"},
  227. {"DELTA_ERR_3028", "APS3 Fail"},
  228. {"DELTA_ERR_3029", "Capacitator error" },
  229. {"DELTA_ERR_3030", "Fan 3 Fault"},
  230. {"DELTA_ERR_3031", "Fan 4 Fault"},
  231. {"DELTA_ERR_3032", "PFC OTP and Brown out"},
  232. {"DELTA_ERR_4001", "SW Current Unbalance"},
  233. {"DELTA_ERR_4002", "SW Filament OCP"},
  234. {"DELTA_ERR_4003", "Shoot Inv1"},
  235. {"DELTA_ERR_4004", "Shoot Inv2"},
  236. {"DELTA_ERR_4005", "HW Filament Rms"},
  237. {"DELTA_ERR_4006", "FERROR Repeat 5 Times"},
  238. };
  239. m_WarnMessages = {
  240. {"DELTA_WARN_001", "mode inhibited"},
  241. {"DELTA_WARN_002", "out of tube rating"},
  242. {"DELTA_WARN_003", "out of power"},
  243. {"DELTA_WARN_004", "out of work"},
  244. {"DELTA_WARN_005", "out of voltage range"},
  245. {"DELTA_WARN_006", "out of current range"},
  246. {"DELTA_WARN_007", "out of time or FPS range"},
  247. {"DELTA_WARN_008", "out of mas range"},
  248. {"DELTA_WARN_009", "time too small"},
  249. {"DELTA_WARN_010", "parameter ok"},
  250. {"DELTA_WARN_011", "mas too small"},
  251. {"DELTA_WARN_012", "no cmd"},
  252. {"DELTA_WARN_013", "data not complete(reserved)"},
  253. {"DELTA_WARN_014", "out of tube HU"},
  254. {"DELTA_WARN_015", "out of filament current range"},
  255. {"DELTA_WARN_016", "no library data" },
  256. {"DELTA_WARN_017", "tube PN not match"},
  257. {"DELTA_WARN_018", "focal spot not support"},
  258. {"DELTA_WARN_019", "data break"},
  259. {"DELTA_WARN_020", "EEPROM BUSY"},
  260. {"DELTA_WARN_021", "exposure result empty"},
  261. {"DELTA_WARN_022", "tube calibration data empty" },
  262. {"DELTA_WARN_023", "XRAY interval time"},
  263. {"DELTA_WARN_024", "filament current limit"},
  264. {"DELTA_WARN_025", "out of generator HU"},
  265. {"DELTA_WARN_026", "out of motor HU"},
  266. {"DELTA_WARN_160", "invalid cmd"},
  267. };
  268. }
  269. std::string CCOS::Dev::Detail::Generator::DeltaDevice::GetDynamicLibraryPath()
  270. {
  271. HMODULE hModule = GetModuleHandle("CCOS.Dev.Generator.Delta_80KAXB64.dll");
  272. char path[MAX_PATH];
  273. GetModuleFileName(hModule, path, MAX_PATH);
  274. std::string fullPath(path);
  275. size_t pos = fullPath.find_last_of("\\/");
  276. mLog::FINFO("FullPath {$}", fullPath);
  277. return fullPath.substr(0, pos);
  278. }
  279. bool CCOS::Dev::Detail::Generator::DeltaDevice::GetConfData()
  280. {
  281. //暂时使用上面定义的数组,不用非要读取配置文件。
  282. int Num;
  283. if (m_GenConfig.GetKeyCount("RadKV") > 0)
  284. {
  285. if (m_GenConfig.GetKeyCount("RadKVSize") > 0)
  286. {
  287. Num = (int)m_GenConfig["RadKVSize"];
  288. for (int i = 0; i < Num; i++)
  289. {
  290. int nKV = (int)m_GenConfig["RadKV"][i];
  291. m_vecKV.push_back(nKV);
  292. }
  293. //m_DoseUnit.m_KVList->Update((string)m_GenConfig["RadKV"]);
  294. //FireNotify(m_DoseUnit.m_KVList->GetKey(), m_DoseUnit.m_KVList->JSGet());
  295. }
  296. mLog::FINFO("m_vecKV {$}", m_vecKV.size());
  297. }
  298. else
  299. {
  300. mLog::FINFO("no RadKV");
  301. }
  302. if (m_GenConfig.GetKeyCount("RadMAS") > 0)
  303. {
  304. if (m_GenConfig.GetKeyCount("RadMASSize") > 0)
  305. {
  306. Num = (int)m_GenConfig["RadMASSize"];
  307. for (int i = 0; i < Num; i++)
  308. {
  309. float fMAS = m_GenConfig["RadMAS"][i];
  310. m_vecMAS.push_back(fMAS);
  311. }
  312. //m_DoseUnit.m_mAsList->Update((string)m_GenConfig["RadMAS"]);
  313. //FireNotify(m_DoseUnit.m_mAsList->GetKey(), m_DoseUnit.m_mAsList->JSGet());
  314. }
  315. mLog::FINFO("m_vecMAS {$}", m_vecMAS.size());
  316. }
  317. else
  318. {
  319. mLog::FINFO("no RadMAS");
  320. }
  321. if (m_GenConfig.GetKeyCount("RadMA") > 0)
  322. {
  323. if (m_GenConfig.GetKeyCount("RadMASize") > 0)
  324. {
  325. Num = (int)m_GenConfig["RadMASize"];
  326. for (int i = 0; i < Num; i++)
  327. {
  328. float fMA = m_GenConfig["RadMA"][i];
  329. m_vecMA.push_back(fMA);
  330. }
  331. //m_DoseUnit.m_MAList->Update((string)m_GenConfig["RadMA"]);
  332. //FireNotify(m_DoseUnit.m_MAList->GetKey(), m_DoseUnit.m_MAList->JSGet());
  333. }
  334. mLog::FINFO("m_vecMA {$}", m_vecMA.size());
  335. }
  336. else
  337. {
  338. mLog::FINFO("no RadMA");
  339. }
  340. if (m_GenConfig.GetKeyCount("RadMS") > 0)
  341. {
  342. if (m_GenConfig.GetKeyCount("RadMSSize") > 0)
  343. {
  344. Num = (int)m_GenConfig["RadMSSize"];
  345. for (int i = 0; i < Num; i++)
  346. {
  347. float fMS = m_GenConfig["RadMS"][i];
  348. m_vecMS.push_back(fMS);
  349. }
  350. //m_DoseUnit.m_MSList->Update((string)m_GenConfig["RadMS"]);
  351. //FireNotify(m_DoseUnit.m_MSList->GetKey(), m_DoseUnit.m_MSList->JSGet());
  352. }
  353. mLog::FINFO("m_vecMS {$}", m_vecMS.size());
  354. }
  355. else
  356. {
  357. mLog::FINFO("no RadMS");
  358. }
  359. if (m_GenConfig.GetKeyCount("TableDAEC") > 0)
  360. {
  361. m_nTableUsePanelAEC = (int)(m_GenConfig["TableDAEC"]);
  362. mLog::FINFO("TableDAEC {$}", m_nTableUsePanelAEC);
  363. }
  364. else
  365. {
  366. mLog::FINFO("TableDAEC disable");
  367. }
  368. if (m_GenConfig.GetKeyCount("FreeDAEC") > 0)
  369. {
  370. m_nFreeUsePanelAEC = (int)(m_GenConfig["FreeDAEC"]);
  371. mLog::FINFO("FreeDAEC {$}", m_nFreeUsePanelAEC);
  372. }
  373. else
  374. {
  375. mLog::FINFO("FreeDAEC disable");
  376. }
  377. if (m_GenConfig.GetKeyCount("WallDAEC") > 0)
  378. {
  379. m_nWallUsePanelAEC = (int)(m_GenConfig["WallDAEC"]);
  380. mLog::FINFO("WallDAEC {$}", m_nWallUsePanelAEC);
  381. }
  382. else
  383. {
  384. mLog::FINFO("WallDAEC disable");
  385. }
  386. if (m_GenConfig.GetKeyCount("TableDDR") > 0)
  387. {
  388. m_nTableUsePanelDDR = (int)(m_GenConfig["TableDDR"]);
  389. mLog::FINFO("TableDDR {$}", m_nTableUsePanelDDR);
  390. }
  391. else
  392. {
  393. mLog::FINFO("TableDDR disable");
  394. }
  395. if (m_GenConfig.GetKeyCount("WallDDR") > 0)
  396. {
  397. m_nWallUsePanelDDR = (int)(m_GenConfig["WallDDR"]);
  398. mLog::FINFO("WallDDR {$}", m_nWallUsePanelDDR);
  399. }
  400. else
  401. {
  402. mLog::FINFO("WallDDR disable");
  403. }
  404. if (m_GenConfig.GetKeyCount("FreeDDR") > 0)
  405. {
  406. m_nFreeUsePanelDDR = (int)(m_GenConfig["FreeDDR"]);
  407. mLog::FINFO("FreeDDR {$}", m_nFreeUsePanelDDR);
  408. }
  409. else
  410. {
  411. mLog::FINFO("FreeDDR disable");
  412. }
  413. if (m_GenConfig.GetKeyCount("SendXwindowToDetector") > 0)
  414. {
  415. m_bSendXwindowToDector = ((int)m_GenConfig["SendXwindowToDetector"] > 1) ? true : false;
  416. mLog::FINFO("SendXwindowToDetector {$}", m_bSendXwindowToDector);
  417. }
  418. if (m_GenConfig.GetKeyCount("DEframeRate") > 0)
  419. {
  420. m_nDEFrameRate = (int)m_GenConfig["DEframeRate"];
  421. }
  422. mLog::FINFO("DEframeRate {$}", m_nDEFrameRate);
  423. return false;
  424. }
  425. nsGEN::DeltaDevice::~DeltaDevice()
  426. {
  427. ResetEvent(m_hHUstatus);
  428. ResetEvent(m_hGENstatus);
  429. SetEvent(m_hExitEvent);
  430. g_GenDevice = nullptr;
  431. if (m_pDetectorClient)
  432. {
  433. if (!m_pDetectorClient->IsClosed())
  434. {
  435. m_pDetectorClient->Close();
  436. }
  437. delete m_pDetectorClient;
  438. m_pDetectorClient = NULL;
  439. }
  440. }
  441. std::string nsGEN::DeltaDevice::GetGUID() const
  442. {
  443. mLog::FINFO("\n===============GetGUID : {$} ===================\n", GeneratorUnitType);
  444. return GeneratorUnitType;
  445. }
  446. void nsGEN::DeltaDevice::Register()
  447. {
  448. auto Disp = &Dispatch;
  449. superGen::Register(Disp);
  450. superGen::RegisterRAD(Disp);
  451. superGen::RegisterAEC(Disp);
  452. superGen::RegisterExpEnable(Disp);
  453. superGen::RegisterGeneratortoSyncStatus(Disp);
  454. Disp->Get.Push(m_MSGUnit->GetKey().c_str(), [this](std::string& out) { out = m_MSGUnit->JSGet(); return RET_STATUS::RET_SUCCEED; });
  455. }
  456. RET_STATUS nsGEN::DeltaDevice::IncKV()
  457. {
  458. if (!m_DoseUnit.m_KV->CanInc()) return RET_STATUS::RET_SUCCEED;
  459. m_DoseUnit.m_KV->Inc();
  460. SetKV(m_DoseUnit.m_KV->Get());
  461. return RET_STATUS::RET_SUCCEED;
  462. }
  463. RET_STATUS nsGEN::DeltaDevice::DecKV()
  464. {
  465. if (!m_DoseUnit.m_KV->CanDec()) return RET_STATUS::RET_SUCCEED;
  466. m_DoseUnit.m_KV->Dec();
  467. SetKV(m_DoseUnit.m_KV->Get());
  468. return RET_STATUS::RET_SUCCEED;
  469. }
  470. RET_STATUS nsGEN::DeltaDevice::SetKV(float value)
  471. {
  472. if (!m_DoseUnit.m_KV->Verify(value)) return RET_STATUS::RET_SUCCEED;
  473. mLog::FINFO("KV: {$}", value);
  474. ChangeGenParam((int)value, m_DoseUnit.m_MA->Get(), m_DoseUnit.m_MS->Get(), m_DoseUnit.m_MAS->Get());
  475. return RET_STATUS::RET_SUCCEED;
  476. }
  477. RET_STATUS nsGEN::DeltaDevice::IncMA()
  478. {
  479. if (!m_DoseUnit.m_MA->CanInc()) return RET_STATUS::RET_SUCCEED;
  480. float fMA = m_DoseUnit.m_MA->Get();
  481. int pos = GetFacFloatValue(m_vecMA, fMA);
  482. mLog::FINFO("Current ma: {$}, pos: {$}", fMA, pos);
  483. pos++;
  484. if (pos >= 0 && pos < m_vecMA.size())
  485. {
  486. if (m_vecMAS[pos] == (m_nTubeMaBFMinValue * 100))
  487. {
  488. SetFocus(AttrKey::FOCUS_LARGE);
  489. }
  490. fMA = m_vecMA[pos];
  491. mLog::FINFO("Inc to MA: {$}", fMA);
  492. ChangeGenParam(m_DoseUnit.m_KV->Get(), fMA, m_DoseUnit.m_MS->Get(), m_DoseUnit.m_MAS->Get());
  493. }
  494. return RET_STATUS::RET_SUCCEED;
  495. }
  496. RET_STATUS nsGEN::DeltaDevice::DecMA()
  497. {
  498. if (!m_DoseUnit.m_MA->CanDec()) return RET_STATUS::RET_SUCCEED;
  499. float fMA = m_DoseUnit.m_MA->Get();
  500. int pos = GetFacFloatValue(m_vecMA, fMA);
  501. mLog::FINFO("Current ma: {$}, pos: {$}", fMA, pos);
  502. pos--;
  503. if (pos >= 0 && pos < m_vecMA.size())
  504. {
  505. if (m_vecMA[pos] == (m_nTubeMaSFMaxValue * 100)) //small focus max value
  506. {
  507. SetFocus(AttrKey::FOCUS_TYPE::FOCUS_SMALL);//设置为小焦点
  508. }
  509. fMA = m_vecMA[pos];
  510. mLog::FINFO("Dec to MA: {$}", fMA);
  511. ChangeGenParam(m_DoseUnit.m_KV->Get(), fMA, m_DoseUnit.m_MS->Get(), m_DoseUnit.m_MAS->Get());
  512. }
  513. return RET_STATUS::RET_SUCCEED;
  514. }
  515. RET_STATUS nsGEN::DeltaDevice::SetMA(float value)
  516. {
  517. if (!m_DoseUnit.m_MA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  518. mLog::FINFO("MA: {$}", value);
  519. ChangeGenParam(m_DoseUnit.m_KV->Get(), value, m_DoseUnit.m_MS->Get(), m_DoseUnit.m_MAS->Get());
  520. return RET_STATUS::RET_SUCCEED;
  521. }
  522. RET_STATUS nsGEN::DeltaDevice::IncMS()
  523. {
  524. if (!m_DoseUnit.m_MS->CanInc()) return RET_STATUS::RET_SUCCEED;
  525. float fMS = m_DoseUnit.m_MS->Get();
  526. int pos = GetFacFloatValue(m_vecMS, fMS);
  527. mLog::FINFO("Current ms: {$}, pos: {$}", fMS, pos);
  528. pos++;
  529. if (pos >= 0 && pos < m_vecMS.size())
  530. {
  531. fMS = m_vecMS[pos];
  532. mLog::FINFO("Inc to MS: {$}", fMS);
  533. ChangeGenParam(m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get(), fMS, m_DoseUnit.m_MAS->Get());
  534. }
  535. return RET_STATUS::RET_SUCCEED;
  536. }
  537. RET_STATUS nsGEN::DeltaDevice::DecMS()
  538. {
  539. if (!m_DoseUnit.m_MS->CanDec()) return RET_STATUS::RET_SUCCEED;
  540. float fMS = m_DoseUnit.m_MS->Get();
  541. int pos = GetFacFloatValue(m_vecMS, fMS);
  542. mLog::FINFO("Current ms: {$}, pos: {$}", fMS, pos);
  543. pos--;
  544. if (pos >= 0 && pos < m_vecMS.size())
  545. {
  546. float fms = m_vecMS[pos];
  547. mLog::FINFO("Dec to MS: {$}", fms);
  548. ChangeGenParam(m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get(), fms, m_DoseUnit.m_MAS->Get());
  549. }
  550. return RET_STATUS::RET_SUCCEED;
  551. }
  552. RET_STATUS nsGEN::DeltaDevice::SetMS(float value)
  553. {
  554. if (!m_DoseUnit.m_MA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  555. mLog::FINFO("MS: {$}", value);
  556. ChangeGenParam(m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get(), value, m_DoseUnit.m_MAS->Get());
  557. return RET_STATUS::RET_SUCCEED;
  558. }
  559. RET_STATUS nsGEN::DeltaDevice::IncMAS()
  560. {
  561. if (!m_DoseUnit.m_MAS->CanInc()) return RET_STATUS::RET_SUCCEED;
  562. float fMAS = m_DoseUnit.m_MAS->Get();
  563. int pos = GetFacFloatValue(m_vecMAS, fMAS);
  564. mLog::FINFO("Current mas: {$}, pos: {$}", fMAS, pos);
  565. pos++;
  566. if (pos >= 0 && pos < m_vecMAS.size())
  567. {
  568. fMAS = m_vecMAS[pos];
  569. mLog::FINFO("Inc to MAS: {$}", fMAS);
  570. ChangeGenParam(m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get(), m_DoseUnit.m_MS->Get(), fMAS);
  571. }
  572. return RET_STATUS::RET_SUCCEED;
  573. }
  574. RET_STATUS nsGEN::DeltaDevice::DecMAS()
  575. {
  576. if (!m_DoseUnit.m_MAS->CanDec()) return RET_STATUS::RET_SUCCEED;
  577. float fMAS = m_DoseUnit.m_MAS->Get();
  578. int pos = GetFacFloatValue(m_vecMAS, fMAS);
  579. mLog::FINFO("Current mas: {$}, pos: {$}", fMAS, pos);
  580. pos--;
  581. if (pos >= 0 && pos < m_vecMAS.size())
  582. {
  583. fMAS = m_vecMAS[pos];
  584. mLog::FINFO("Dec to MAS: {$}", fMAS);
  585. ChangeGenParam(m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get(), m_DoseUnit.m_MS->Get(), fMAS);
  586. }
  587. return RET_STATUS::RET_SUCCEED;
  588. }
  589. RET_STATUS nsGEN::DeltaDevice::SetMAS(float value)
  590. {
  591. if (!m_DoseUnit.m_MA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  592. mLog::FINFO("MAS: {$}", value);
  593. ChangeGenParam(m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get(), m_DoseUnit.m_MS->Get(), value);
  594. return RET_STATUS::RET_SUCCEED;
  595. }
  596. RET_STATUS nsGEN::DeltaDevice::SetTechmode(int value)
  597. {
  598. //0 MS 1 MAS 2 AEC
  599. //if (!m_DoseUnit.m_Techmode->Verify(value)) return RET_STATUS::RET_SUCCEED;
  600. mLog::FINFO("[0xF0, 0x51, 0xA1, 0x0{$}]", value);
  601. char cmdbuf[20] = { 0xF0, 0x51, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x88 };
  602. m_DoseUnit.m_Techmode->Update(value);
  603. if (value == 0)
  604. {
  605. SetDAECEnable(0);//禁用DAEC
  606. cmdbuf[3] = 2;
  607. }
  608. else if (value == 1)
  609. {
  610. SetDAECEnable(0);//禁用DAEC
  611. cmdbuf[3] = 3;
  612. }
  613. else if (value == 2)
  614. {
  615. if (m_DoseUnit.m_WS->Get() == AttrKey::TABLE)
  616. {
  617. if (m_nTableUsePanelAEC == 1)
  618. {
  619. SetDAECEnable(1);
  620. cmdbuf[3] = 2;//time
  621. }
  622. else
  623. {
  624. SetDAECEnable(0);
  625. cmdbuf[3] = 1;//应用GEN的aec功能
  626. cmdbuf[4] = m_nChamberIndex;//chabmer index
  627. int nAECFieldSel = 2;
  628. switch (m_DoseUnit.m_AECField->Get())
  629. {
  630. case 100:
  631. nAECFieldSel = 1;
  632. break;
  633. case 10:
  634. nAECFieldSel = 2;
  635. break;
  636. case 110:
  637. nAECFieldSel = 3;
  638. break;
  639. case 1:
  640. nAECFieldSel = 4;
  641. break;
  642. case 101:
  643. nAECFieldSel = 5;
  644. break;
  645. case 11:
  646. nAECFieldSel = 6;
  647. break;
  648. case 111:
  649. nAECFieldSel = 7;
  650. break;
  651. default:
  652. nAECFieldSel = 2;
  653. break;
  654. }
  655. cmdbuf[5] = nAECFieldSel;//field
  656. cmdbuf[6] = 0;
  657. cmdbuf[7] = 0;
  658. SetAECInformation(m_nChamberIndex, m_DoseUnit.m_AECField->Get(), m_DoseUnit.m_AECDensity->Get(), m_DoseUnit.m_AECFilm->Get());
  659. }
  660. }
  661. else if (m_DoseUnit.m_WS->Get() == AttrKey::WALL)
  662. {
  663. if (m_nWallUsePanelAEC == 1)
  664. {
  665. SetDAECEnable(1);
  666. cmdbuf[3] = 2;//time
  667. }
  668. else
  669. {
  670. SetDAECEnable(0);
  671. cmdbuf[3] = 1;//应用GEN的aec功能
  672. cmdbuf[4] = m_nChamberIndex;//chabmer index
  673. int nAECFieldSel = 2;
  674. switch (m_DoseUnit.m_AECField->Get())
  675. {
  676. case 100:
  677. nAECFieldSel = 1;
  678. break;
  679. case 10:
  680. nAECFieldSel = 2;
  681. break;
  682. case 110:
  683. nAECFieldSel = 3;
  684. break;
  685. case 1:
  686. nAECFieldSel = 4;
  687. break;
  688. case 101:
  689. nAECFieldSel = 5;
  690. break;
  691. case 11:
  692. nAECFieldSel = 6;
  693. break;
  694. case 111:
  695. nAECFieldSel = 7;
  696. break;
  697. default:
  698. nAECFieldSel = 2;
  699. break;
  700. }
  701. cmdbuf[5] = nAECFieldSel;//field
  702. cmdbuf[6] = 0;
  703. cmdbuf[7] = 0;
  704. }
  705. }
  706. else if (m_DoseUnit.m_WS->Get() == AttrKey::MOBILE)
  707. {
  708. if (m_nFreeUsePanelAEC == 1)
  709. {
  710. SetDAECEnable(1);
  711. cmdbuf[3] = 2;//time
  712. }
  713. else
  714. {
  715. SetDAECEnable(0);
  716. cmdbuf[3] = 1;//应用GEN的aec功能
  717. cmdbuf[4] = m_nChamberIndex;//chabmer index
  718. int nAECFieldSel = 2;
  719. switch (m_DoseUnit.m_AECField->Get())
  720. {
  721. case 100:
  722. nAECFieldSel = 1;
  723. break;
  724. case 10:
  725. nAECFieldSel = 2;
  726. break;
  727. case 110:
  728. nAECFieldSel = 3;
  729. break;
  730. case 1:
  731. nAECFieldSel = 4;
  732. break;
  733. case 101:
  734. nAECFieldSel = 5;
  735. break;
  736. case 11:
  737. nAECFieldSel = 6;
  738. break;
  739. case 111:
  740. nAECFieldSel = 7;
  741. break;
  742. default:
  743. nAECFieldSel = 2;
  744. break;
  745. }
  746. cmdbuf[5] = nAECFieldSel;//field
  747. cmdbuf[6] = 0;
  748. cmdbuf[7] = 0;
  749. if (m_DoseUnit.m_AECFilm->Get() == 0)
  750. SetAECInformation(m_nChamberIndex, m_DoseUnit.m_AECField->Get(), m_DoseUnit.m_AECDensity->Get(), m_DoseUnit.m_AECFilm->Get());
  751. }
  752. }
  753. }
  754. FormatCommand(cmdbuf, 13);
  755. string temp(cmdbuf, 13);
  756. m_strCommand = temp;
  757. HWSendWaitACKCMD(m_strCommand, 4);
  758. return RET_STATUS::RET_SUCCEED;
  759. }
  760. RET_STATUS nsGEN::DeltaDevice::SetFocus(int value)
  761. {
  762. if (!m_DoseUnit.m_Focus->Verify(value)) return RET_STATUS::RET_SUCCEED;
  763. mLog::FINFO("[0xF0, 0x5A, 0xA1, 0x00] focus: {$}", value);
  764. char cmdbuf[20] = { 0xF0, 0x5A, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x88 };
  765. if (value == 0)
  766. {
  767. cmdbuf[3] = 2;
  768. }
  769. else if (value == 1)
  770. {
  771. cmdbuf[3] = 1;
  772. }
  773. else
  774. {
  775. cmdbuf[3] = 3;
  776. }
  777. FormatCommand(cmdbuf, 13);
  778. string temp(cmdbuf, 13);
  779. m_strCommand = temp;
  780. HWSendWaitACKCMD(m_strCommand, 4);
  781. return RET_STATUS::RET_SUCCEED;
  782. }
  783. RET_STATUS nsGEN::DeltaDevice::SetAECDensity(int value)
  784. {
  785. if (!m_DoseUnit.m_AECDensity->Verify(value)) return RET_STATUS::RET_SUCCEED;
  786. mLog::FINFO("AECDensity: {$}", value);
  787. if (value < -3)
  788. {
  789. value = -3;
  790. }
  791. else if (value > 3)
  792. {
  793. value = 3;
  794. }
  795. if (m_DoseUnit.m_AECDensity->Get() != value)
  796. {
  797. SetAECInformation(1, m_DoseUnit.m_AECField->Get(), value, m_DoseUnit.m_AECFilm->Get());
  798. }
  799. return RET_STATUS::RET_SUCCEED;
  800. }
  801. RET_STATUS nsGEN::DeltaDevice::SetAECField(int value)
  802. {
  803. if (!m_DoseUnit.m_AECField->Verify(value)) return RET_STATUS::RET_SUCCEED;
  804. mLog::FINFO("AECField: {$}", value);
  805. if (m_DoseUnit.m_AECField->Get() != value)
  806. {
  807. SetAECInformation(1, value, m_DoseUnit.m_AECDensity->Get(), m_DoseUnit.m_AECFilm->Get());
  808. }
  809. return RET_STATUS::RET_SUCCEED;
  810. }
  811. RET_STATUS nsGEN::DeltaDevice::SetAECFilm(int value)
  812. {
  813. if (!m_DoseUnit.m_AECFilm->Verify(value)) return RET_STATUS::RET_SUCCEED;
  814. mLog::FINFO("AECFilm: {$}", value);
  815. if (m_DoseUnit.m_AECFilm->Get() != value)
  816. {
  817. SetAECInformation(1, m_DoseUnit.m_AECField->Get(), m_DoseUnit.m_AECDensity->Get(), value);
  818. }
  819. return RET_STATUS::RET_SUCCEED;
  820. }
  821. RET_STATUS nsGEN::DeltaDevice::SetWS(const string value)
  822. {
  823. return RET_STATUS::RET_SUCCEED;
  824. }
  825. RET_STATUS nsGEN::DeltaDevice::SetAPR(const _tAPRArgs& t)
  826. {
  827. m_tAPRdata = t;
  828. mLog::FINFO("Focus: {$}, Techmode: {$}, AECField: {$}, AECFilm: {$}, AECDensity: {$}, KV: {$}, MA: {$}, MS: {$}, KV2: {$}, MA2: {$}, MS2: {$}, MAS: {$}",
  829. m_tAPRdata.nFocus, m_tAPRdata.nTechmode, m_tAPRdata.nAECField, m_tAPRdata.nAECFilm, m_tAPRdata.nAECDensity, m_tAPRdata.fKV, m_tAPRdata.fMA, m_tAPRdata.fMS, m_tAPRdata.fKV2, m_tAPRdata.fMA2, m_tAPRdata.fMS2, m_tAPRdata.fMAS);
  830. if (m_tAPRdata.fKV2 != 0)
  831. {
  832. SetDualEnergyCommand(m_tAPRdata);
  833. }
  834. else
  835. {
  836. SetRadMode(0, 0);
  837. if ((int)m_tAPRdata.fMA > m_nTubeMaSFMaxValue)
  838. {
  839. SetFocus(1);
  840. }
  841. else
  842. {
  843. SetFocus(0);
  844. }
  845. SetTechmode(m_tAPRdata.nTechmode);
  846. if (m_tAPRdata.nTechmode == AttrKey::TECHMODE_AEC_3P)
  847. {
  848. if (m_tAPRdata.nWS == AttrKey::TABLE)
  849. {
  850. if (m_nTableUsePanelAEC != 1)
  851. {
  852. if (m_DoseUnit.m_AECFilm->Get() == 0)
  853. m_DoseUnit.m_AECFilm->Update(1);
  854. SetAECInformation(m_nChamberIndex, m_tAPRdata.nAECField, m_tAPRdata.nAECDensity, m_tAPRdata.nAECFilm);
  855. SetAECKV_MA_MS((int)m_tAPRdata.fKV, m_tAPRdata.fMA, m_tAPRdata.fMS);
  856. }
  857. else
  858. {
  859. SetRADKV_MA_MS((int)m_tAPRdata.fKV, m_tAPRdata.fMA, m_tAPRdata.fMS);
  860. }
  861. }
  862. else if (m_tAPRdata.nWS == AttrKey::WALL)
  863. {
  864. if (m_nWallUsePanelAEC != 1)
  865. {
  866. if (m_tAPRdata.nAECFilm == 0)
  867. m_tAPRdata.nAECFilm = 1;
  868. SetAECInformation(m_nChamberIndex, m_tAPRdata.nAECField, m_tAPRdata.nAECDensity, m_tAPRdata.nAECFilm);
  869. SetAECKV_MA_MS((int)m_tAPRdata.fKV, m_tAPRdata.fMA, m_tAPRdata.fMS);
  870. }
  871. else
  872. {
  873. SetRADKV_MA_MS((int)m_tAPRdata.fKV, m_tAPRdata.fMA, m_tAPRdata.fMS);
  874. }
  875. }
  876. else if (m_tAPRdata.nWS == AttrKey::MOBILE)
  877. {
  878. if (m_nFreeUsePanelAEC != 1)
  879. {
  880. if (m_tAPRdata.nAECFilm == 0)
  881. m_tAPRdata.nAECFilm = 1;
  882. SetAECInformation(m_nChamberIndex, m_tAPRdata.nAECField, m_tAPRdata.nAECDensity, m_tAPRdata.nAECFilm);
  883. SetAECKV_MA_MS((int)m_tAPRdata.fKV, m_tAPRdata.fMA, m_tAPRdata.fMS);
  884. }
  885. else
  886. {
  887. SetRADKV_MA_MS((int)m_tAPRdata.fKV, m_tAPRdata.fMA, m_tAPRdata.fMS);
  888. }
  889. }
  890. }
  891. else if (m_tAPRdata.nTechmode == AttrKey::TECHMODE_NOAEC_2P)
  892. {
  893. SetRADKV_MAS((int)m_tAPRdata.fKV, m_tAPRdata.fMAS);
  894. }
  895. else
  896. {
  897. SetRADKV_MA_MS((int)m_tAPRdata.fKV, m_tAPRdata.fMA, m_tAPRdata.fMS);
  898. }
  899. }
  900. m_bSetAPR = true;
  901. return RET_STATUS::RET_SUCCEED;
  902. }
  903. bool nsGEN::DeltaDevice::SetDualEnergyCommand(const _tAPRArgs& t)
  904. {
  905. if (!m_bIsDualExp)
  906. SetRadMode(1, 1);
  907. if (m_nExposureNumber == 0)
  908. {
  909. mLog::FINFO("Dual Energy First APR KV: {$}, MA: {$}, MS: {$}, MAS: {$}", t.fKV, t.fMA, t.fMS, t.fMAS);
  910. m_bIsDualExp = true;
  911. //设置双能第一组曝光参数
  912. SetAPRForDual(t.nWS, t.nFocus, t.nTechmode, t.nAECField, t.nAECFilm, t.nAECDensity, t.fKV, t.fMA, t.fMS, t.fMAS);
  913. //双能是序列点片,是需要配置帧率的
  914. mLog::FINFO("Set de framerate[0xF0, 0x6D, 0xAD, 0xxx]");
  915. char cmdbuf[20] = { 0xF0, 0x6D, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xDB, 0x00, 0x88 };
  916. cmdbuf[3] = m_nDEFrameRate * 10;
  917. FormatCommand(cmdbuf, 19);
  918. string temp(cmdbuf, 19);
  919. m_strCommand = temp;
  920. HWSendWaitACKCMD(m_strCommand, 4);
  921. }
  922. else if (m_nExposureNumber == 1)
  923. {
  924. //2 set 2nd array param
  925. mLog::FINFO("Dual Energy Second APR KV: {$}, MA: {$}, MS: {$}", t.fKV2, t.fMA2, t.fMS2);
  926. //设置第二组参数
  927. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_AEC_3P)
  928. {
  929. SetAECInformation(m_nChamberIndex, t.nAECField, t.nAECDensity, 0);
  930. SetAECKV_MA_MS((int)t.fKV2, t.fMA2, t.fMS2);
  931. }
  932. else if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_NOAEC_2P)
  933. {
  934. SetRADKV_MAS((int)t.fKV2, t.fMA2 * t.fMS2 / 1000);
  935. }
  936. else
  937. {
  938. SetRADKV_MA_MS((int)t.fKV2, t.fMA2, t.fMS2);
  939. }
  940. //m_bIsDualExp = false; //第二次设定之后,主动false
  941. //m_nExposureNumber = 0;
  942. }
  943. return true;
  944. }
  945. bool nsGEN::DeltaDevice::SetAPRForDual(int nWS, int nFO, int nET, int nAECFieldSel, int nAECFilmSel, float fAECDensity, float fKV, float fMA, float fMS, float fMAS)
  946. {
  947. mLog::FINFO("Focus: {$}, Techmode: {$}, AECField: {$},AECFilm: {$}, AECDensity: {$}, KV: {$}, MA: {$}, MS: {$}, MAS: {$}",
  948. m_tAPRdata.nFocus, m_tAPRdata.nTechmode, m_tAPRdata.nAECField, m_tAPRdata.nAECFilm, m_tAPRdata.nAECDensity, m_tAPRdata.fKV, m_tAPRdata.fMA, m_tAPRdata.fMS, m_tAPRdata.fMAS);
  949. //客户说160是 small FO的最大值。 180是大焦点的最小值
  950. if ((int)fMA > m_nTubeMaSFMaxValue)
  951. {
  952. SetFocus(1);
  953. }
  954. else
  955. {
  956. SetFocus(0);
  957. }
  958. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_AEC_3P)
  959. {
  960. if (nAECFilmSel == 0)
  961. nAECFilmSel = 1;
  962. SetAECInformation(m_nChamberIndex, nAECFieldSel, fAECDensity, nAECFilmSel);
  963. SetAECKV_MA_MS((int)fKV, fMA, fMS);
  964. }
  965. else if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_NOAEC_2P)
  966. {
  967. SetRADKV_MAS((int)fKV, fMAS);
  968. }
  969. else
  970. {
  971. SetRADKV_MA_MS((int)fKV, fMA, fMS);
  972. }
  973. return true;
  974. }
  975. RET_STATUS nsGEN::DeltaDevice::QueryHE(int& value)
  976. {
  977. return RET_STATUS::RET_SUCCEED;
  978. }
  979. RET_STATUS nsGEN::DeltaDevice::QueryPostKV(float& value)
  980. {
  981. m_DoseUnit.m_PostKV->Update(m_DoseUnit.m_KV->Get());
  982. value = m_DoseUnit.m_PostKV->Get();
  983. return RET_STATUS::RET_FAILED;
  984. }
  985. RET_STATUS nsGEN::DeltaDevice::QueryPostMA(float& value)
  986. {
  987. value = m_DoseUnit.m_PostMA->Get();
  988. return RET_STATUS::RET_SUCCEED;
  989. }
  990. RET_STATUS nsGEN::DeltaDevice::QueryPostMS(float& value)
  991. {
  992. value = m_DoseUnit.m_PostMS->Get();
  993. return RET_STATUS::RET_SUCCEED;
  994. }
  995. RET_STATUS nsGEN::DeltaDevice::QueryPostMAS(float& value)
  996. {
  997. value = m_DoseUnit.m_PostMAS->Get();
  998. return RET_STATUS::RET_SUCCEED;
  999. }
  1000. RET_STATUS nsGEN::DeltaDevice::SetGenSynState(int value)
  1001. {
  1002. mLog::FINFO("GenSynState: {$}", value);
  1003. return RET_STATUS::RET_SUCCEED;
  1004. }
  1005. RET_STATUS nsGEN::DeltaDevice::SetGenState(int value)
  1006. {
  1007. mLog::FINFO("GenState: {$}", value);
  1008. return RET_STATUS::RET_SUCCEED;
  1009. }
  1010. RET_STATUS nsGEN::DeltaDevice::SetExpMode(std::string value)
  1011. {
  1012. mLog::FINFO("ExpMode: {$}", value.c_str());
  1013. m_DoseUnit.m_ExpMode->Update(value);
  1014. return RET_STATUS::RET_SUCCEED;
  1015. }
  1016. RET_STATUS nsGEN::DeltaDevice::SetFLFMode(std::string value)
  1017. {
  1018. mLog::FINFO("FLFMode: {$}", value.c_str());
  1019. return RET_STATUS::RET_SUCCEED;
  1020. }
  1021. RET_STATUS nsGEN::DeltaDevice::SetEXAMMode(std::string value)
  1022. {
  1023. mLog::FINFO("EXAMMode: {$}", value.c_str());
  1024. return RET_STATUS::RET_SUCCEED;
  1025. }
  1026. RET_STATUS nsGEN::DeltaDevice::SetFrameRate(FLOAT frameRate)
  1027. {
  1028. if (m_DoseUnit.m_FrameRate->Verify(frameRate))
  1029. {
  1030. mLog::FINFO("[0xF0, 0x56, 0xA2, 0x00] FrameRate: {$}", frameRate);
  1031. char cmdbuf[13] = { 0xF0, 0x56, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x88 };
  1032. int nPPS = (int)(frameRate * 10);
  1033. cmdbuf[3] = nPPS / 256;
  1034. cmdbuf[4] = nPPS % 256;
  1035. FormatCommand(cmdbuf, 13);
  1036. string temp(cmdbuf, 13);
  1037. m_strCommand = temp;
  1038. HWSendWaitACKCMD(m_strCommand, 4);
  1039. }
  1040. return RET_STATUS::RET_SUCCEED;
  1041. }
  1042. //貌似最好有时间间隔
  1043. RET_STATUS nsGEN::DeltaDevice::RefreshData()
  1044. {
  1045. mLog::FINFO("RefreshData");
  1046. return RET_STATUS::RET_SUCCEED;
  1047. }
  1048. RET_STATUS nsGEN::DeltaDevice::SetExpEnable()
  1049. {
  1050. char cmdbuf[13] = { 0xF0, 0x5C, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x00, 0x88 };
  1051. mLog::FINFO("[0xF0, 0x5C, 0xA3, 0x00]");
  1052. FormatCommand(cmdbuf, 13);
  1053. string temp(cmdbuf, 13);
  1054. m_strCommand = temp;
  1055. HWSendWaitACKCMD(m_strCommand, 4);
  1056. return RET_STATUS::RET_SUCCEED;
  1057. }
  1058. RET_STATUS nsGEN::DeltaDevice::SetExpDisable()
  1059. {
  1060. char cmdbuf[13] = { 0xF0, 0x5C, 0xA3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x88 };
  1061. mLog::FINFO("ExpEnable[0xF0, 0x5C, 0xA3, 0x01]");
  1062. FormatCommand(cmdbuf, 13);
  1063. string temp(cmdbuf, 13);
  1064. m_strCommand = temp;
  1065. HWSendWaitACKCMD(m_strCommand, 4);
  1066. m_nProcessXrayon = false;
  1067. return RET_STATUS::RET_SUCCEED;
  1068. }
  1069. RET_STATUS nsGEN::DeltaDevice::Reset()
  1070. {
  1071. mLog::FINFO("[0xF0 ,0x59 ,0xA1 ,CurErrLevel{$}]", m_nCurErrLevel);
  1072. char cmdbuf[13] = { 0xF0 ,0x59 ,0xA1 ,0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x88 };
  1073. cmdbuf[3] = m_nCurErrLevel;
  1074. FormatCommand(cmdbuf, 13);
  1075. string temp(cmdbuf, 13);
  1076. m_strCommand = temp;
  1077. HWSendWaitACKCMD(m_strCommand, 4);
  1078. return RET_STATUS::RET_SUCCEED;
  1079. }
  1080. //-----------------------------------------------------------------------------
  1081. // ProcessCmd
  1082. //-----------------------------------------------------------------------------
  1083. void nsGEN::DeltaDevice::ProcessClientData(const char* pData, unsigned long nDataLength, void* lparam)
  1084. {
  1085. DeltaDevice* pCurGen = (DeltaDevice*)lparam;
  1086. pCurGen->HWSend(pData, nDataLength);
  1087. }
  1088. void nsGEN::DeltaDevice::WriteLog(const char* pData, nsSerialGPM::LOG_V2_LEVEL level)
  1089. {
  1090. }
  1091. RET_STATUS nsGEN::DeltaDevice::HWSendWaitACKCMD(string strCommand, int headLengh)
  1092. {
  1093. return m_tDelivermodule.ProcessCommand(strCommand, m_nCMDType_WaitACK, headLengh);
  1094. }
  1095. RET_STATUS nsGEN::DeltaDevice::HWSend(const char* strCommand, int lengh, int nTimeOut)
  1096. {
  1097. mLog::FINFO("{$}", m_SCF.isConnected());
  1098. if (m_SCF.isConnected())
  1099. {
  1100. char strtemp[10] = { 0 };
  1101. string str = "";
  1102. for (int i = 0; i < lengh; i++)
  1103. {
  1104. sprintf_s(strtemp, sizeof(strtemp), "%02X", (BYTE)strCommand[i]);
  1105. str += strtemp;
  1106. str += ",";
  1107. }
  1108. mLog::FINFO("==OUT==: {$}", str);
  1109. if (!m_SCF)
  1110. return RET_STATUS::RET_FAILED;
  1111. int retLength;
  1112. m_SCF.Lock(msTimeOut_Lock)
  1113. .SendPacket(strCommand, lengh, nTimeOut, retLength);
  1114. }
  1115. return RET_STATUS::RET_SUCCEED;
  1116. }
  1117. void nsGEN::DeltaDevice::FireErrorMessage(const bool Act, const int Code, const char* ResInfo)
  1118. {
  1119. string ErrorCode("DELTA_ERR_");
  1120. ErrorCode += std::to_string(Code);
  1121. int level = DELTA_ABNORMAL_LEVEL::REG_ERRO;
  1122. if (Act)
  1123. {
  1124. mLog::FERROR("add {$}:{$}", ErrorCode.c_str(), ResInfo);
  1125. m_MSGUnit->AddErrorMessage(ErrorCode.c_str(), level, ResInfo);
  1126. }
  1127. else
  1128. {
  1129. mLog::FERROR("del {$}:{$}", ErrorCode.c_str(), ResInfo);
  1130. m_MSGUnit->DelErrorMessage(ErrorCode.c_str(), level, ResInfo);
  1131. }
  1132. }
  1133. void nsGEN::DeltaDevice::FireWarnMessage(const bool Act, const int Code, const char* ResInfo)
  1134. {
  1135. string WarnCode("DELTA_WAR_");
  1136. WarnCode += std::to_string(Code);
  1137. int level = DELTA_ABNORMAL_LEVEL::REG_WARN;
  1138. if (Act)
  1139. {
  1140. mLog::FERROR("add {$}:{$}", WarnCode.c_str(), ResInfo);
  1141. m_MSGUnit->AddWarnMessage(WarnCode.c_str(), level, ResInfo);
  1142. }
  1143. else
  1144. {
  1145. mLog::FERROR("del {$}:{$}", WarnCode.c_str(), ResInfo);
  1146. m_MSGUnit->DelWarnMessage(WarnCode.c_str(), level, ResInfo);
  1147. }
  1148. }
  1149. //-----------------------------------------------------------------------------
  1150. // ProcessCmd
  1151. //-----------------------------------------------------------------------------
  1152. void nsGEN::DeltaDevice::FireNotify(std::string key, std::string content)
  1153. {
  1154. EventCenter->OnNotify(1, key, content);
  1155. }
  1156. void nsGEN::DeltaDevice::ProcessCommand(const char* strPackage, int Index, int End)
  1157. {
  1158. if ((BYTE)strPackage[Index] == 0xF0)
  1159. {
  1160. if (strPackage[End - 4] != 0x0A)
  1161. {
  1162. //GetLastExpParamenters();
  1163. char WarnCode[20];
  1164. sprintf_s(WarnCode, "DELTA_WARN_%03d", (BYTE)strPackage[End - 4]);
  1165. int level = 1;
  1166. mLog::FINFO("{$}", WarnCode);
  1167. auto it = m_WarnMessages.find(WarnCode);
  1168. if (it != m_WarnMessages.end())
  1169. {
  1170. m_MSGUnit->AddWarnMessage(WarnCode, level, it->second.c_str());
  1171. //return false;
  1172. }
  1173. }
  1174. }
  1175. m_bReconnect = false;
  1176. const char* chdigital;
  1177. m_nCountTimes = 0;
  1178. if (UINT8(strPackage[Index]) != 0xF0)
  1179. {
  1180. mLog::FINFO("simple cmd:{$}", strPackage);
  1181. if (strPackage[Index] == 'C' && strPackage[Index + 1] == 'X' && strPackage[Index + 2] == 'L')
  1182. {
  1183. m_nProcessXrayon = false;
  1184. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  1185. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1186. }
  1187. if (strPackage[Index] == 'E' && strPackage[Index + 1] == 'R' && strPackage[Index + 2] == 'R')
  1188. {
  1189. m_nProcessXrayon = false;
  1190. chdigital = strPackage + 3;
  1191. int errornumber = atoi(chdigital);
  1192. if (errornumber < 3000) //warn
  1193. {
  1194. char WarnCode[20];
  1195. sprintf_s(WarnCode, "DELTA_WARN_%03d", (BYTE)strPackage[End - 4]);
  1196. int level = 1;
  1197. mLog::FINFO("{$}", WarnCode);
  1198. auto itwarn = m_WarnMessages.find(WarnCode);
  1199. if (itwarn != m_WarnMessages.end())
  1200. {
  1201. m_MSGUnit->AddWarnMessage(WarnCode, level, itwarn->second.c_str());
  1202. //return false;
  1203. }
  1204. //如果error=0012,那么表示一档松开。那么应该发送release,取消本次曝光,否则会出现超时的问题
  1205. if (errornumber == 12 || errornumber == 1006)
  1206. {
  1207. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  1208. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1209. }
  1210. if (errornumber >= 4000)
  1211. {
  1212. m_nCurErrLevel = 3;
  1213. }
  1214. if (errornumber >= 3000)
  1215. {
  1216. m_nCurErrLevel = 1;
  1217. }
  1218. char ErrCode[20];
  1219. sprintf_s(ErrCode, "DELTA_ERR_%04d", (BYTE)strPackage[3]);
  1220. mLog::FINFO("{$}", ErrCode);
  1221. auto iterr = m_ErrorMessages.find(ErrCode);
  1222. if (iterr != m_ErrorMessages.end())
  1223. {
  1224. m_MSGUnit->AddErrorMessage(ErrCode, level, iterr->second.c_str());
  1225. //return false;
  1226. }
  1227. }
  1228. }
  1229. if (strPackage[Index] == 'R' && strPackage[Index + 1] == 'O' && strPackage[Index + 2] == 'N')//RON RDY XON OFF
  1230. {
  1231. m_nProcessXrayon = true;
  1232. if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::CONVENTIONAL)
  1233. {
  1234. m_DoseUnit.m_Handswitch->Update(AttrKey::HANDSWITCH_STATUS::HANDSWITCH_STATUS_Release);
  1235. FireNotify(m_DoseUnit.m_Handswitch->GetKey(), m_DoseUnit.m_Handswitch->JSGet());
  1236. mLog::FINFO("Updata m_DoseUnit.m_Handswitch: {$}", m_DoseUnit.m_Handswitch->JSGet());
  1237. }
  1238. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_SYNC::GENERATOR_RAD_PREPARE);
  1239. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1240. mLog::FINFO("Updata m_DoseUnit.m_GenSynState: {$}", m_DoseUnit.m_GenSynState->JSGet());
  1241. }
  1242. if (strPackage[Index] == 'R' && strPackage[Index + 1] == 'D' && strPackage[Index + 2] == 'Y')//RON RDY XON OFF
  1243. {
  1244. m_nProcessXrayon = true;
  1245. if (m_DoseUnit.m_GenSynState->Get() != AttrKey::GENERATOR_SYNC::GENERATOR_RAD_PREPARE)
  1246. {
  1247. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_SYNC::GENERATOR_RAD_PREPARE);
  1248. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1249. mLog::FINFO("Updata m_DoseUnit.m_GenSynState: {$}", m_DoseUnit.m_GenSynState->JSGet());
  1250. }
  1251. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_SYNC::GENERATOR_RAD_READY);
  1252. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1253. mLog::FINFO("Updata m_DoseUnit.m_GenSynState: {$}", m_DoseUnit.m_GenSynState->JSGet());
  1254. Sleep(20);//此发生器RDY和XON有时消息会过快,导致工作流没反应过来。所以加个睡眠。
  1255. mLog::FINFO("m_bIsDualExp: {$} m_nExposureNumber: {$}", m_bIsDualExp, m_nExposureNumber);
  1256. if (m_bIsDualExp && (m_nExposureNumber == 1))
  1257. {
  1258. if (m_bSendXwindowToDector)
  1259. {
  1260. m_pDetectorClient = new LogicClient("DV3_Detector", "", "NSQ", false);
  1261. if (m_pDetectorClient->Open("CCOS/DEVICE/Detector", ALL_ACCESS)) //换成探测器的路径
  1262. {
  1263. mLog::FDEBUG("Ccos_V3 Create DV3_Detector Client success");
  1264. }
  1265. }
  1266. if (m_pDetectorClient != NULL)
  1267. {
  1268. if (!m_pDetectorClient->IsClosed())
  1269. {
  1270. mLog::FINFO("m_pDetectorClient is open");
  1271. ResDataObject Request, Response;
  1272. Request.add("P0", 1);
  1273. m_pDetectorClient->Action("DualSecondExpReady", Request, Response, 4993);
  1274. }
  1275. else
  1276. {
  1277. mLog::FINFO("DV3_Detector Client is Close");
  1278. }
  1279. }
  1280. else
  1281. {
  1282. mLog::FINFO("DV3_FullUCB Client is NULL");
  1283. }
  1284. m_bIsDualExp = false; //第二次设定之后,主动false
  1285. m_nExposureNumber = 0;
  1286. }
  1287. }
  1288. if (strPackage[Index] == 'X' && strPackage[Index + 1] == 'O' && strPackage[Index + 2] == 'N')//RON RDY XON OFF
  1289. {
  1290. m_nProcessXrayon = true;
  1291. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_SYNC::GENERATOR_RAD_XRAYON);
  1292. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1293. mLog::FINFO("Updata m_DoseUnit.m_GenSynState: {$}", m_DoseUnit.m_GenSynState->JSGet());
  1294. m_bXronMsg = true;
  1295. }
  1296. if (strPackage[Index] == 'O' && strPackage[Index + 1] == 'F' && strPackage[Index + 2] == 'F')//RON RDY XON OFF
  1297. {
  1298. if (m_bXronMsg == false)
  1299. {
  1300. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_SYNC::GENERATOR_RAD_XRAYON);
  1301. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1302. mLog::FINFO("Updata m_DoseUnit.m_GenSynState: {$}", m_DoseUnit.m_GenSynState->JSGet());
  1303. }
  1304. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_SYNC::GENERATOR_RAD_XRAYOFF);
  1305. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1306. mLog::FINFO("Updata m_DoseUnit.m_GenSynState: {$}", m_DoseUnit.m_GenSynState->JSGet());
  1307. GetLastExpParamenters();
  1308. if (m_bIsDualExp)
  1309. {
  1310. m_nExposureNumber = 1;
  1311. SetDualEnergyCommand(m_tAPRdata);
  1312. mLog::FINFO("dual: setapr 2nd.");
  1313. }
  1314. m_nProcessXrayon = false;
  1315. m_bXronMsg = false;
  1316. }
  1317. return;
  1318. }
  1319. switch (UINT8(strPackage[Index + 1]))
  1320. {
  1321. case 0x50:
  1322. {
  1323. switch (UINT8(strPackage[Index + 2]))
  1324. {
  1325. case 0xA1:
  1326. //50A1
  1327. mLog::FINFO("Restore factory settings successfully");
  1328. break;
  1329. default:
  1330. break;
  1331. }
  1332. break;
  1333. }
  1334. case 0x51:
  1335. {
  1336. switch (UINT8(strPackage[Index + 2]))
  1337. {
  1338. case 0x01:
  1339. {
  1340. //5101
  1341. int nET = (int)(strPackage[Index + 3]);
  1342. mLog::FINFO("ET{$}", nET);
  1343. if (nET == 1)//AEC
  1344. {
  1345. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_AEC_3P);
  1346. }
  1347. else if (nET == 2)//MS
  1348. {
  1349. if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::TABLE)
  1350. {
  1351. if (m_nTableUsePanelAEC == 1)
  1352. {
  1353. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_AEC_3P);
  1354. }
  1355. else
  1356. {
  1357. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_3P);
  1358. }
  1359. }
  1360. else if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::WALL)
  1361. {
  1362. if (m_nWallUsePanelAEC == 1)
  1363. {
  1364. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_AEC_3P);
  1365. }
  1366. else
  1367. {
  1368. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_3P);
  1369. }
  1370. }
  1371. else if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::MOBILE)
  1372. {
  1373. if (m_nFreeUsePanelAEC == 1)
  1374. {
  1375. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_AEC_3P);
  1376. }
  1377. else
  1378. {
  1379. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_3P);
  1380. }
  1381. }
  1382. else
  1383. {
  1384. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_3P);
  1385. }
  1386. }
  1387. else if (nET == 3)//MAS
  1388. {
  1389. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_2P);
  1390. }
  1391. FireNotify(m_DoseUnit.m_Techmode->GetKey(), m_DoseUnit.m_Techmode->JSGet());
  1392. mLog::FINFO("[51 01]: ET {$}", m_DoseUnit.m_Techmode->Get());
  1393. break;
  1394. }
  1395. case 0xA1:
  1396. {
  1397. //51A1
  1398. int nET = (int)(strPackage[Index + 3]);
  1399. if (nET == 1)//AEC
  1400. {
  1401. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_TYPE::TECHMODE_AEC_3P);
  1402. FireNotify(m_DoseUnit.m_Techmode->GetKey(), m_DoseUnit.m_Techmode->JSGet());
  1403. m_AECinformation.Chamber = (int)(strPackage[4]);
  1404. m_AECinformation.Field = (int)(strPackage[5]);
  1405. m_AECinformation.Density = (int)(strPackage[6]);
  1406. m_AECinformation.FilmScreenSpeed = (int)(strPackage[7]);
  1407. UpdataAECInformation(m_AECinformation);
  1408. }
  1409. else if (nET == 2)//如果当前是DAEC模式,那么返回的是time,但是可能需要选中 AEC 按钮
  1410. {
  1411. if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::TABLE)
  1412. {
  1413. if (m_nTableUsePanelAEC == 1)
  1414. {
  1415. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_AEC_3P);
  1416. }
  1417. else
  1418. {
  1419. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_3P);
  1420. }
  1421. }
  1422. else if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::WALL)
  1423. {
  1424. if (m_nWallUsePanelAEC == 1)
  1425. {
  1426. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_AEC_3P);
  1427. }
  1428. else
  1429. {
  1430. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_3P);
  1431. }
  1432. }
  1433. else if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::MOBILE)
  1434. {
  1435. if (m_nFreeUsePanelAEC == 1)
  1436. {
  1437. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_AEC_3P);
  1438. }
  1439. else
  1440. {
  1441. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_3P);
  1442. }
  1443. }
  1444. else
  1445. {
  1446. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_3P);
  1447. }
  1448. FireNotify(m_DoseUnit.m_MA->GetKey(), m_DoseUnit.m_MA->JSGet());
  1449. FireNotify(m_DoseUnit.m_MS->GetKey(), m_DoseUnit.m_MS->JSGet());
  1450. }
  1451. else if (nET == 3)
  1452. {
  1453. m_DoseUnit.m_Techmode->Update(AttrKey::TECHMODE_NOAEC_2P);
  1454. }
  1455. FireNotify(m_DoseUnit.m_Techmode->GetKey(), m_DoseUnit.m_Techmode->JSGet());
  1456. mLog::FINFO("[51 A1]: ET {$}", m_DoseUnit.m_Techmode->Get());
  1457. break;
  1458. }
  1459. default:
  1460. break;
  1461. }
  1462. break;
  1463. }
  1464. case 0x52:
  1465. {
  1466. switch (UINT8(strPackage[Index + 2]))
  1467. {
  1468. case 0x01:
  1469. {
  1470. //5201
  1471. mLog::FINFO("[52 01]");
  1472. break;
  1473. }
  1474. case 0xA1:
  1475. {
  1476. //52A1
  1477. mLog::FINFO("[52 A1]");
  1478. break;
  1479. }
  1480. default:
  1481. break;
  1482. }
  1483. break;
  1484. }
  1485. case 0x53:
  1486. {
  1487. switch (UINT8(strPackage[2]))
  1488. {
  1489. case 0x01:
  1490. {
  1491. //5301
  1492. mLog::FINFO("[53 01]");
  1493. break;
  1494. }
  1495. default:
  1496. break;
  1497. }
  1498. break;
  1499. }
  1500. case 0x54:
  1501. {
  1502. switch (UINT8(strPackage[Index + 2]))
  1503. {
  1504. case 0x01:
  1505. {
  1506. //5401
  1507. mLog::FINFO("[54 01]");
  1508. break;
  1509. }
  1510. case 0x02:
  1511. {
  1512. //5402
  1513. mLog::FINFO("[54 02]");
  1514. break;
  1515. }
  1516. case 0xA1:
  1517. {
  1518. //54A1
  1519. mLog::FINFO("[54 A1]");
  1520. break;
  1521. }
  1522. case 0xA2:
  1523. {
  1524. //54A2
  1525. mLog::FINFO("[54 A2]");
  1526. break;
  1527. }
  1528. default:
  1529. break;
  1530. }
  1531. break;
  1532. }
  1533. case 0x55:
  1534. {
  1535. switch (UINT8(strPackage[Index + 2]))
  1536. {
  1537. case 0x01:
  1538. case 0xA1:
  1539. {
  1540. //55A1
  1541. m_AECinformation.Chamber = (int)(strPackage[Index + 3]);
  1542. m_AECinformation.Field = (int)(strPackage[Index + 4]);
  1543. m_AECinformation.Density = (int)(strPackage[Index + 5]);
  1544. m_AECinformation.FilmScreenSpeed = (int)(strPackage[Index + 6]);
  1545. UpdataAECInformation(m_AECinformation);
  1546. mLog::FINFO("[55 A1]: AEC");
  1547. break;
  1548. }
  1549. case 0xA2:
  1550. {
  1551. //55A2
  1552. //kv
  1553. int nKv = (BYTE)(strPackage[Index + 3]);
  1554. m_DoseUnit.m_KV->Update(nKv);
  1555. FireNotify(m_DoseUnit.m_KV->GetKey(), m_DoseUnit.m_KV->JSGet());
  1556. //ma
  1557. float fMA = ((BYTE)(strPackage[Index + 4]) * 256 + (BYTE)strPackage[Index + 5]) / 10.0f;
  1558. m_DoseUnit.m_MA->Update(fMA);
  1559. FireNotify(m_DoseUnit.m_MA->GetKey(), m_DoseUnit.m_MA->JSGet());
  1560. //aec reference kv
  1561. //not ms
  1562. float m_fMS = ((BYTE)strPackage[Index + 6] * 256 + (BYTE)strPackage[Index + 7]) / 10.0f;
  1563. m_DoseUnit.m_MS->Update(m_fMS);
  1564. FireNotify(m_DoseUnit.m_MS->GetKey(), m_DoseUnit.m_MS->JSGet());
  1565. int hundred_aec_referenc_kv = (BYTE)strPackage[Index + 6] * 256 + (BYTE)strPackage[Index + 7];
  1566. float mas = m_DoseUnit.m_MA->Get() * m_DoseUnit.m_MS->Get() / 1000.0f;
  1567. GetFacFloatValue(m_vecMAS, mas);
  1568. m_DoseUnit.m_MAS->Update(mas);
  1569. FireNotify(m_DoseUnit.m_MAS->GetKey(), m_DoseUnit.m_MAS->JSGet());
  1570. mLog::FINFO("[55 A2]: Updata: KV: {$}, MA: {$}, MS: {$}, MAS: {$}",
  1571. m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get(), m_DoseUnit.m_MS->Get(), m_DoseUnit.m_MAS->Get());
  1572. break;
  1573. }
  1574. default:
  1575. break;
  1576. }
  1577. break;
  1578. }
  1579. case 0x56:
  1580. {
  1581. switch (UINT8(strPackage[Index + 2]))
  1582. {
  1583. case 0x02:
  1584. {
  1585. //5602
  1586. //查询脉冲帧率,不用
  1587. mLog::FINFO("[56 02]: AEC.");
  1588. break;
  1589. }
  1590. case 0xA1:
  1591. {
  1592. //56A1
  1593. //kv
  1594. int nKv = (BYTE)(strPackage[Index + 3]);
  1595. m_DoseUnit.m_KV->Update(nKv);
  1596. FireNotify(m_DoseUnit.m_KV->GetKey(), m_DoseUnit.m_KV->JSGet());
  1597. //ma
  1598. float fMA = ((BYTE)(strPackage[Index + 4]) * 256 + (BYTE)strPackage[Index + 5]) / 10.0f;
  1599. m_DoseUnit.m_MA->Update(fMA);
  1600. FireNotify(m_DoseUnit.m_MA->GetKey(), m_DoseUnit.m_MA->JSGet());
  1601. //ms
  1602. float fMS = ((BYTE)(strPackage[Index + 6]) * 65536 + (BYTE)strPackage[Index + 7] * 256 + (BYTE)strPackage[Index + 8]) / 10.0f;
  1603. m_DoseUnit.m_MS->Update(fMS);
  1604. FireNotify(m_DoseUnit.m_MS->GetKey(), m_DoseUnit.m_MS->JSGet());
  1605. float mas = m_DoseUnit.m_MA->Get() * m_DoseUnit.m_MS->Get() / 1000.0f;
  1606. GetFacFloatValue(m_vecMAS, mas);
  1607. m_DoseUnit.m_MAS->Update(mas);
  1608. FireNotify(m_DoseUnit.m_MAS->GetKey(), m_DoseUnit.m_MAS->JSGet());
  1609. mLog::FINFO("[56 A1]: Time mode: Updata: KV: {$}, MA: {$}, MS: {$}, MAS: {$}",
  1610. m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get(), m_DoseUnit.m_MS->Get(), m_DoseUnit.m_MAS->Get());
  1611. break;
  1612. }
  1613. case 0xA2:
  1614. {
  1615. //56A2设置脉冲帧率,暂时不用
  1616. mLog::FINFO("[56 A2]:");
  1617. break;
  1618. }
  1619. case 0xA3:
  1620. {
  1621. //56A3透视检查的kv ma mas,暂时用不到,不解析了。
  1622. mLog::FINFO("[56 A3]:");
  1623. break;
  1624. }
  1625. default:
  1626. break;
  1627. }
  1628. break;
  1629. }
  1630. case 0x57://-----------------------------------------------------------首次进入时,直接切换到mas,ma ms 没有消失****************bug
  1631. {
  1632. switch (UINT8(strPackage[Index + 2]))
  1633. {
  1634. case 0xA1:
  1635. {
  1636. //57A1mas模式下的 kv mas 解析
  1637. //kv
  1638. int nKv = (int)(strPackage[Index + 3]);
  1639. m_DoseUnit.m_KV->Update(nKv);
  1640. FireNotify(m_DoseUnit.m_KV->GetKey(), m_DoseUnit.m_KV->JSGet());
  1641. //ma
  1642. float fMA = ((BYTE)(strPackage[Index + 4]) * 256 + (BYTE)strPackage[Index + 5]) / 10.0f;
  1643. m_DoseUnit.m_MA->Update(fMA);
  1644. FireNotify(m_DoseUnit.m_MA->GetKey(), m_DoseUnit.m_MA->JSGet());
  1645. //ms----MAS 模式下,返回的ms值。
  1646. float fMS = ((BYTE)(strPackage[Index + 6]) * 65536 + (BYTE)strPackage[Index + 7] * 256 + (BYTE)strPackage[Index + 8]) / 10.0f;
  1647. m_DoseUnit.m_MS->Update(fMS);
  1648. FireNotify(m_DoseUnit.m_MS->GetKey(), m_DoseUnit.m_MS->JSGet());
  1649. float mas = m_DoseUnit.m_MA->Get() * m_DoseUnit.m_MS->Get() / 1000.0f;
  1650. GetFacFloatValue(m_vecMAS, mas);
  1651. m_DoseUnit.m_MAS->Update(mas);
  1652. FireNotify(m_DoseUnit.m_MAS->GetKey(), m_DoseUnit.m_MAS->JSGet());
  1653. mLog::FINFO("[57 A1]: MAS mode: Updata: KV: {$}, MA: {$}, MS: {$}, MAS: {$}(calc)", m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get(), m_DoseUnit.m_MS->Get(), m_DoseUnit.m_MAS->Get());
  1654. break;
  1655. }
  1656. default:
  1657. break;
  1658. }
  1659. break;
  1660. }
  1661. case 0x58:
  1662. {
  1663. switch (UINT8(strPackage[Index + 2]))
  1664. {
  1665. case 1:
  1666. {
  1667. int dapStatus = (int)(strPackage[Index + 2]);
  1668. if (1 == dapStatus)
  1669. {
  1670. //dap enable
  1671. float fDap = 0;
  1672. UINT8 tmpBuf[4] = { 0 };
  1673. tmpBuf[0] = strPackage[Index + 7];
  1674. tmpBuf[1] = strPackage[Index + 6];
  1675. tmpBuf[2] = strPackage[Index + 5];
  1676. tmpBuf[3] = strPackage[Index + 4];
  1677. memcpy(&fDap, tmpBuf, 4);
  1678. int nDAP = (int)fDap;
  1679. }
  1680. else
  1681. {
  1682. //dap disable
  1683. }
  1684. break;
  1685. }
  1686. case 2:
  1687. {
  1688. //dap rate
  1689. float fDapRate = 0;
  1690. UINT8 tmpBuf[4] = { 0 };
  1691. tmpBuf[0] = strPackage[Index + 6];
  1692. tmpBuf[1] = strPackage[Index + 5];
  1693. tmpBuf[2] = strPackage[Index + 4];
  1694. tmpBuf[3] = strPackage[Index + 3];
  1695. memcpy(&fDapRate, tmpBuf, 4);
  1696. //mGycm^2/s
  1697. break;
  1698. }
  1699. case 0xA1:
  1700. {
  1701. mLog::FINFO("[58 A1]: clear dap and dap rate success!");
  1702. break;
  1703. }
  1704. default:
  1705. break;
  1706. }
  1707. break;
  1708. }
  1709. case 0x59:
  1710. {
  1711. switch (UINT8(strPackage[Index + 2]))
  1712. {
  1713. case 0xA1:
  1714. {
  1715. //59A1
  1716. int nResetLevel = (int)(strPackage[Index + 3]);
  1717. mLog::FINFO("[59 A1]:");
  1718. break;
  1719. }
  1720. default:
  1721. break;
  1722. }
  1723. break;
  1724. }
  1725. case 0x5A:
  1726. {
  1727. switch (UINT8(strPackage[Index + 2]))
  1728. {
  1729. case 0x01:
  1730. {
  1731. //5A01
  1732. mLog::FINFO("[5A 01]:");
  1733. break;
  1734. }
  1735. case 0xA1:
  1736. {
  1737. //5AA1
  1738. int nFo = (int)(strPackage[Index + 3]);
  1739. if (1 == nFo)
  1740. {
  1741. m_DoseUnit.m_Focus->Update(1);
  1742. }
  1743. else if (2 == nFo)
  1744. {
  1745. m_DoseUnit.m_Focus->Update(0);
  1746. }
  1747. else//auto
  1748. {
  1749. m_DoseUnit.m_Focus->Update(0);
  1750. }
  1751. FireNotify(m_DoseUnit.m_Focus->GetKey(), m_DoseUnit.m_Focus->JSGet());
  1752. //RetrieveGeneratroDerating();
  1753. mLog::FINFO("[5A A1]: FO= {$}", m_DoseUnit.m_Focus->Get());
  1754. break;
  1755. }
  1756. default:
  1757. break;
  1758. }
  1759. break;
  1760. }
  1761. case 0x5B:
  1762. {
  1763. switch (UINT8(strPackage[Index + 2]))
  1764. {
  1765. case 0x01:
  1766. {
  1767. //5B01
  1768. mLog::FINFO("[5B 01]");
  1769. break;
  1770. }
  1771. case 0xA1:
  1772. {
  1773. //5BA1
  1774. mLog::FINFO("[5B A1]");
  1775. break;
  1776. }
  1777. default:
  1778. break;
  1779. }
  1780. break;
  1781. }
  1782. case 0x5C:
  1783. {
  1784. switch (UINT8(strPackage[Index + 2]))
  1785. {
  1786. case 0xA1:
  1787. {
  1788. //5CA1
  1789. mLog::FINFO("[5C A1]:Gen Operate Status is Shutdown");
  1790. break;
  1791. }
  1792. case 0xA2:
  1793. {
  1794. //5CA2
  1795. mLog::FINFO("[5C A2]:Gen Operate Status is StandBy");
  1796. break;
  1797. }
  1798. case 0x03:
  1799. case 0xA3:
  1800. {
  1801. //5CA3
  1802. int nExpEnable = (int)(strPackage[Index + 3]);
  1803. mLog::FINFO("[5C A3/03]:m_bExpEnable");
  1804. break;
  1805. }
  1806. default:
  1807. break;
  1808. }
  1809. break;
  1810. }
  1811. case 0x5E:
  1812. {
  1813. switch (UINT8(strPackage[Index + 2]))
  1814. {
  1815. case 0x01:
  1816. {
  1817. mLog::FINFO("[5E 01]:tube id is 1");
  1818. break;
  1819. }
  1820. case 0x02:
  1821. {
  1822. mLog::FINFO("[5E 01]:tube id is 2");
  1823. break;
  1824. }
  1825. case 0x03:
  1826. {
  1827. mLog::FINFO("[5E 03]");
  1828. break;
  1829. }
  1830. default:
  1831. break;
  1832. }
  1833. break;
  1834. }
  1835. case 0x5F:
  1836. {
  1837. switch (UINT8(strPackage[Index + 2]))
  1838. {
  1839. case 0x01:
  1840. {
  1841. //5F01
  1842. int TenTubeHU = BYTE(strPackage[Index + 3]) * 256 + (BYTE)strPackage[Index + 4];
  1843. m_DoseUnit.m_HE->Update(TenTubeHU / 10);
  1844. FireNotify(m_DoseUnit.m_HE->GetKey(), m_DoseUnit.m_HE->JSGet());
  1845. ////::PostMessage(this->m_hWnd, MSG_GEN_PARAM, GEN_PARAM_HE, this->m_nTubeHeat);
  1846. //int TenGenHU = BYTE(strPackage[5]) * 256 + (BYTE)strPackage[6];
  1847. //m_nGenHeat = TenGenHU / 10;
  1848. ////GEN_PARAM_GENHEAT->侯雷确认 是温度。不应该用于这里
  1849. ////::PostMessage(this->m_hWnd, MSG_GEN_PARAM, GEN_PARAM_GENHEAT, this->m_nGenHeat);
  1850. ////GEN_TUBEHU_STATUS 是状态,协议中没有根据genhu的值来定义状态的规定。因此不用这段代码
  1851. ////::PostMessage(this->m_hWnd, MSG_GEN_PARAM, GEN_TUBEHU_STATUS, this->m_nGenHeat);
  1852. //int TenMotorHU = BYTE(strPackage[7]) * 256 + (BYTE)strPackage[8];
  1853. //strlog.Format("5F 01,tube HU = %d,gen HU*10=%d MotorHU*10=%d", m_nTubeHeat, TenGenHU, TenMotorHU);
  1854. //logfile->WriteLog(strlog, LOG_INFORMATION, LOG_DEBUG, true);
  1855. break;
  1856. }
  1857. default:
  1858. break;
  1859. }
  1860. break;
  1861. }
  1862. case 0x61:
  1863. {
  1864. switch (UINT8(strPackage[Index + 2]))
  1865. {
  1866. case 0x01:
  1867. {
  1868. string GenFirmwareVersion = AnalysisCommand(BYTE_6, chdigital, TransToType::tochar);
  1869. string ConsoleFirmwareVersion = AnalysisCommand(BYTE_6, chdigital, TransToType::tochar);
  1870. mLog::FINFO("[61 01]:Generator firmware version {$}, Console firmware version {$}", GenFirmwareVersion, ConsoleFirmwareVersion);
  1871. break;
  1872. }
  1873. case 0x02:
  1874. {
  1875. break;
  1876. }
  1877. case 0x03:
  1878. {
  1879. break;
  1880. }
  1881. case 0x04:
  1882. {
  1883. int maxKw = (int)(strPackage[Index + 3] << 8 | strPackage[Index + 4]);
  1884. int maxMa = (int)(strPackage[Index + 5] << 8 | strPackage[Index + 6]);
  1885. int maxMas = (int)(strPackage[Index + 7] << 8 | strPackage[Index + 8]);
  1886. int maxKv = (int)(strPackage[Index + 9]);
  1887. int nFo = (int)(strPackage[Index + 10]);
  1888. int nRotor = (int)(strPackage[Index + 11]);
  1889. int nMotorFirmwareVersion = (int)(strPackage[Index + 12] << 8 | strPackage[Index + 13]);
  1890. int nSWCfgFileVersion = (int)(strPackage[Index + 14]);
  1891. break;
  1892. }
  1893. case 0x05:
  1894. {
  1895. m_nMaxKW = (int)(strPackage[Index + 3] << 8 | strPackage[Index + 4]);
  1896. int maxDeratingMa = (int)(strPackage[Index + 5] << 8 | strPackage[Index + 6]);
  1897. int maxDeratingMas = (int)(strPackage[Index + 7] << 8 | strPackage[Index + 8]);
  1898. int maxDeratingKv = (int)(strPackage[Index + 9]);
  1899. int minDeratingMa = (int)(strPackage[Index + 10] << 8 | strPackage[Index + 11]);
  1900. int maxDeratingMs = (int)(strPackage[Index + 12] << 8 | strPackage[Index + 13]);
  1901. break;
  1902. }
  1903. case 0x06:
  1904. {
  1905. break;
  1906. }
  1907. case 0xA5:
  1908. {
  1909. break;
  1910. }
  1911. case 0x07:
  1912. case 0xA7:
  1913. {
  1914. int nAccuracy = (int)(strPackage[Index + 3]);
  1915. if (1 == nAccuracy)
  1916. {
  1917. //logfile->WriteLog("61 07 / A7 :now is R10' series.", LOG_INFORMATION, LOG_DEBUG, true);
  1918. }
  1919. else if (2 == nAccuracy)
  1920. {
  1921. //logfile->WriteLog("61 07 / A7 :now is R20' series.", LOG_INFORMATION, LOG_DEBUG, true);
  1922. }
  1923. break;
  1924. }
  1925. case 0xAC:
  1926. {
  1927. //DAEC enable status
  1928. int nDaecStatus = (int)(strPackage[Index + 3]);
  1929. //m_nDAECStatus = nDaecStatus;
  1930. //if (nDaecStatus == 1)
  1931. //{
  1932. // logfile->WriteLog("recv 6e AC: daec enable", LOG_INFORMATION, LOG_DEBUG, true);
  1933. //}
  1934. //else if (nDaecStatus == 2)
  1935. //{
  1936. // logfile->WriteLog("recv 6e AC: daec disable", LOG_INFORMATION, LOG_DEBUG, true);
  1937. //}
  1938. break;
  1939. }
  1940. default:
  1941. break;
  1942. }
  1943. break;
  1944. }
  1945. case 0x62:
  1946. {
  1947. switch (UINT8(strPackage[Index + 2]))
  1948. {
  1949. case 0x01:
  1950. {
  1951. break;
  1952. }
  1953. case 0x02:
  1954. {
  1955. chdigital = strPackage + 3;
  1956. int SF_LS_MaxPower = (int)(strPackage[Index + 3] << 8 | strPackage[Index + 4]);
  1957. int LF_LS_MaxPower = (int)(strPackage[Index + 5] << 8 | strPackage[Index + 6]);
  1958. int SF_HS_MaxPower = (int)(strPackage[Index + 7] << 8 | strPackage[Index + 8]);
  1959. int LF_HS_MaxPower = (int)(strPackage[Index + 9] << 8 | strPackage[Index + 10]);
  1960. break;
  1961. }
  1962. case 0x03:
  1963. {
  1964. int SF_standbycurrent = (int)(strPackage[Index + 3] << 8 | strPackage[Index + 4]);
  1965. int SF_maxcurrent = (int)(strPackage[Index + 5] << 8 | strPackage[Index + 6]);
  1966. int LF_standbycurrent = (int)(strPackage[Index + 7] << 8 | strPackage[Index + 8]);
  1967. int LF_maxcurrent = (int)(strPackage[Index + 9] << 8 | strPackage[Index + 10]);
  1968. break;
  1969. }
  1970. case 0x04:
  1971. {
  1972. int HUWarning = (int)(strPackage[Index + 3]);
  1973. int HULimit = (int)(strPackage[Index + 4]);
  1974. break;
  1975. }
  1976. case 0x05:
  1977. {
  1978. int maxTubeKv = (int)(strPackage[Index + 3]);
  1979. int max_SF_TubecurrentMA = (int)(strPackage[Index + 4] << 8 | strPackage[Index + 5]);
  1980. int max_LF_TubecurrentMA = (int)(strPackage[Index + 6] << 8 | strPackage[Index + 7]);
  1981. break;
  1982. }
  1983. case 0xA2:
  1984. {
  1985. int SF_LS_MaxPower = (int)(strPackage[Index + 3] << 8 | strPackage[Index + 4]);
  1986. int LF_LS_MaxPower = (int)(strPackage[Index + 5] << 8 | strPackage[Index + 6]);
  1987. int SF_HS_MaxPower = (int)(strPackage[Index + 7] << 8 | strPackage[Index + 8]);
  1988. int LF_HS_MaxPower = (int)(strPackage[Index + 9] << 8 | strPackage[Index + 10]);
  1989. break;
  1990. }
  1991. case 0xA3:
  1992. {
  1993. int SF_standbycurrent = (int)(strPackage[Index + 3] << 8 | strPackage[Index + 4]);
  1994. int SF_maxcurrent = (int)(strPackage[Index + 5] << 8 | strPackage[Index + 6]);
  1995. int LF_standbycurrent = (int)(strPackage[Index + 7] << 8 | strPackage[Index + 8]);
  1996. int LF_maxcurrent = (int)(strPackage[Index + 9] << 8 | strPackage[Index + 10]);
  1997. break;
  1998. }
  1999. case 0xA4:
  2000. {
  2001. int HUWarning = (int)(strPackage[Index + 3]);
  2002. int HULimit = (int)(strPackage[Index + 4]);
  2003. break;
  2004. }
  2005. case 0xA5:
  2006. {
  2007. break;
  2008. }
  2009. default:
  2010. break;
  2011. }
  2012. break;
  2013. }
  2014. case 0x63:
  2015. {
  2016. switch (UINT8(strPackage[Index + 2]))
  2017. {
  2018. case 0x01:
  2019. {
  2020. break;
  2021. }
  2022. case 0x02:
  2023. {
  2024. break;
  2025. }
  2026. default:
  2027. break;
  2028. }
  2029. break;
  2030. }
  2031. case 0x64:
  2032. {
  2033. switch (UINT8(strPackage[Index + 2]))
  2034. {
  2035. case 0x01:
  2036. {
  2037. /*
  2038. 0x00 = INITIAL
  2039. 0x01 = STANDBY
  2040. 0x02 = READY
  2041. 0x03 = OPERATE
  2042. 0x04 = SHUTDOWN
  2043. 0x05 = CALIBRATION
  2044. 0x06 = SEASON
  2045. */
  2046. //6401
  2047. int nGenStatus = (int)(strPackage[Index + 3]);
  2048. if (0 == nGenStatus)
  2049. {
  2050. mLog::FINFO("[64 01 01]:GENERATOR_STATUS_INIT");
  2051. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS::GENERATOR_STATUS_INIT);
  2052. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  2053. }
  2054. else if (1 == nGenStatus)
  2055. {
  2056. mLog::FINFO("[64 01 01]:GENERATOR_STATUS_STANDBY");
  2057. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS::GENERATOR_STATUS_STANDBY);
  2058. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  2059. }
  2060. else if (2 == nGenStatus)
  2061. {
  2062. mLog::FINFO("[64 01 02]: GENERATOR_STATUS_STANDBY");
  2063. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS::GENERATOR_STATUS_STANDBY);
  2064. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  2065. }
  2066. else if (3 == nGenStatus)
  2067. {
  2068. mLog::FINFO("[64 01 03]: GENERATOR_STATUS_EXP");
  2069. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS::GENERATOR_STATUS_EXP);
  2070. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  2071. }
  2072. else if (4 == nGenStatus)
  2073. {
  2074. mLog::FINFO("[64 01 04]: GENERATOR_STATUS_SHUTDOWN");
  2075. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS::GENERATOR_STATUS_SHUTDOWN);
  2076. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  2077. }
  2078. else if (5 == nGenStatus)
  2079. {
  2080. mLog::FINFO("[64 01 05]: GENERATOR_STATUS_CALIBRATION");
  2081. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS::GENERATOR_STATUS_CALIBRATION);
  2082. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  2083. }
  2084. else if (6 == nGenStatus)
  2085. {
  2086. mLog::FINFO("[64 01 06]: GENERATOR_STATUS_ERROR");
  2087. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS::GENERATOR_STATUS_ERROR);
  2088. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  2089. }
  2090. break;
  2091. }
  2092. case 0x02:
  2093. {
  2094. break;
  2095. }
  2096. case 0x03:
  2097. {
  2098. break;
  2099. }
  2100. default:
  2101. break;
  2102. }
  2103. break;
  2104. }
  2105. case 0x65:
  2106. {
  2107. switch (UINT8(strPackage[Index + 2]))
  2108. {
  2109. case 0x01:
  2110. {
  2111. //6501
  2112. //kv
  2113. int postKv = (BYTE)(strPackage[Index + 3]) << 8 + (BYTE)strPackage[Index + 4];
  2114. m_DoseUnit.m_PostKV->Update(postKv);
  2115. FireNotify(m_DoseUnit.m_PostKV->GetKey(), m_DoseUnit.m_PostKV->JSGet());
  2116. //ma
  2117. int nPostMa = (BYTE)(strPackage[Index + 5]) << 8 + (BYTE)strPackage[Index + 6];
  2118. float fpostMa = nPostMa / 10.0f;
  2119. m_DoseUnit.m_PostMA->Update(fpostMa);
  2120. FireNotify(m_DoseUnit.m_PostMA->GetKey(), m_DoseUnit.m_PostMA->JSGet());
  2121. //ap-postmas
  2122. int nPostMas = (BYTE)(strPackage[Index + 7]) << 16 + (BYTE)strPackage[Index + 8] << 8 + (BYTE)strPackage[Index + 9];
  2123. float fpostMAS = nPostMas / 100.0f;
  2124. m_DoseUnit.m_PostMAS->Update(fpostMAS);
  2125. FireNotify(m_DoseUnit.m_PostMAS->GetKey(), m_DoseUnit.m_PostMAS->JSGet());
  2126. //at-postms
  2127. int nPostMs = (BYTE)(strPackage[Index + 10]) << 16 + (BYTE)strPackage[Index + 11] << 8 + (BYTE)strPackage[Index + 12];
  2128. float fpostMS = nPostMs / 10.0f;
  2129. m_DoseUnit.m_PostMS->Update(fpostMS);
  2130. FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
  2131. mLog::FINFO("[65 01]: post{$}kv, post{$}ma, post{$}mas, post{$}Ms", postKv, fpostMa, fpostMAS, fpostMS);
  2132. break;
  2133. }
  2134. default:
  2135. break;
  2136. }
  2137. break;
  2138. }
  2139. case 0x6B:
  2140. {
  2141. }
  2142. break;
  2143. case 0x6C:
  2144. {
  2145. int soc = (BYTE)(strPackage[Index + 3]) << 8 + (BYTE)strPackage[Index + 4];
  2146. int vol = (BYTE)(strPackage[Index + 5]) << 8 + (BYTE)strPackage[Index + 6];
  2147. int charge = (BYTE)(strPackage[Index + 7]) << 8 + (BYTE)strPackage[Index + 8];
  2148. int temperature = (BYTE)(strPackage[Index + 9]) << 8 + (BYTE)strPackage[Index + 10];
  2149. int ac = (BYTE)strPackage[Index + 11];
  2150. }
  2151. break;
  2152. case 0x6E:
  2153. {
  2154. switch (UINT8(strPackage[Index + 2]))
  2155. {
  2156. case 0x01:
  2157. case 0xA1:
  2158. {
  2159. //6EA1
  2160. break;
  2161. }
  2162. case 0x02:
  2163. case 0xA2:
  2164. {
  2165. //6EA2
  2166. //此命令比较特殊,切换为胶片模式,需要把下面俩值都设置为0.
  2167. int nDetector1SynMode = (int)(strPackage[Index + 3]);
  2168. int nDetector2SynMode = (int)(strPackage[Index + 4]);
  2169. if (nDetector1SynMode == 0 && nDetector2SynMode == 0)//no detector.
  2170. {
  2171. // m_nWS = WSGen2UI(m_DoseUnit.m_WS->Get());
  2172. //::PostMessage(this->m_hWnd, MSG_GEN_PARAM, GEN_PARAM_WS, m_nWS);//
  2173. //logfile->WriteLog("6E A2:ws convertion mode", LOG_INFORMATION, LOG_DEBUG, true);
  2174. }
  2175. break;
  2176. }
  2177. default:
  2178. break;
  2179. }
  2180. break;
  2181. }
  2182. default:
  2183. break;
  2184. }
  2185. }
  2186. bool nsGEN::DeltaDevice::DecodeFrame(const char* strPackage, int nLength)
  2187. {
  2188. if (strPackage == nullptr || nLength <= 0) {
  2189. mLog::FINFO("strPackage: nullptr, nLength: <= 0");
  2190. return false;
  2191. }
  2192. char strSendCommand[10] = { 0 };
  2193. string str = "";
  2194. int PacketLength = 0;
  2195. for (int i = 0; i < nLength; i++)
  2196. {
  2197. sprintf_s(strSendCommand, sizeof(strSendCommand), "%02X", (BYTE)strPackage[i]);
  2198. str += strSendCommand;
  2199. str += ",";
  2200. }
  2201. mLog::FINFO("==IN== {$}", str);
  2202. // 将新数据追加到缓冲区
  2203. if (bufferLength + nLength > sizeof(buffer)) {
  2204. mLog::FINFO("Buffer overflow!");
  2205. bufferLength = 0;
  2206. return false;
  2207. }
  2208. std::memcpy(buffer + bufferLength, strPackage, nLength);
  2209. bufferLength += nLength;
  2210. int index = 0;
  2211. while (index < bufferLength) {
  2212. str = ""; // 清空 str 字符串
  2213. // 规则 1:F0 开头,88 结尾,长度为 13
  2214. if (index + 12 < bufferLength && static_cast<uint8_t>(buffer[index]) == 0xF0 && static_cast<uint8_t>(buffer[index + 12]) == 0x88) {
  2215. for (int i = 0; i < 13; ++i) {
  2216. sprintf_s(strSendCommand, sizeof(strSendCommand), "%02X", (BYTE)buffer[index + i]);
  2217. str += strSendCommand;
  2218. str += ",";
  2219. }
  2220. mLog::FINFO("Rule 1: ==IN== {$}", str);
  2221. ProcessCommand(strPackage, index, index + 13);
  2222. index += 13;
  2223. }
  2224. // 规则 2:F0 开头,88 结尾,长度为 19
  2225. else if (index + 18 < bufferLength && static_cast<uint8_t>(buffer[index]) == 0xF0 && static_cast<uint8_t>(buffer[index + 18]) == 0x88) {
  2226. for (int i = 0; i < 19; ++i) {
  2227. sprintf_s(strSendCommand, sizeof(strSendCommand), "%02X", (BYTE)buffer[index + i]);
  2228. str += strSendCommand;
  2229. str += ",";
  2230. }
  2231. mLog::FINFO("Rule 2: ==IN== {$}", str);
  2232. ProcessCommand(strPackage, index, index + 19);
  2233. index += 19;
  2234. }
  2235. // 规则 3:以 0D 结尾,指令包含 0D 和 0D 前三个字符
  2236. else if (index >= 3 && static_cast<uint8_t>(buffer[index]) == 0x0D) {
  2237. for (int i = 0; i < 4; ++i) {
  2238. sprintf_s(strSendCommand, sizeof(strSendCommand), "%02X", (BYTE)buffer[index - 3 + i]);
  2239. str += strSendCommand;
  2240. str += ",";
  2241. }
  2242. mLog::FINFO("Rule 3: ==IN== {$}", str);
  2243. ProcessCommand(strPackage, index - 3, index + 1);
  2244. index++;
  2245. }
  2246. else {
  2247. index++;
  2248. }
  2249. }
  2250. // 移除已处理的数据
  2251. int processedLength = index;
  2252. std::memmove(buffer, buffer + processedLength, bufferLength - processedLength);
  2253. bufferLength -= processedLength;
  2254. return true;
  2255. }
  2256. bool nsGEN::DeltaDevice::ChangeGenParam(int kv, float fma, float fms, float fmas)
  2257. {
  2258. mLog::FINFO("KV: {$}, MA: {$}, MS: {$}, MAS: {$}", kv, fma, fms, fmas);
  2259. if (m_DoseUnit.m_Techmode->Get() == 0)
  2260. {
  2261. SetRADKV_MA_MS(kv, fma, fms);
  2262. }
  2263. else if (m_DoseUnit.m_Techmode->Get() == 1)
  2264. {
  2265. SetRADKV_MAS(kv, fmas);
  2266. }
  2267. else if (m_DoseUnit.m_Techmode->Get() == 2)
  2268. {
  2269. if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::TABLE)
  2270. {
  2271. if (m_nTableUsePanelAEC == 1)
  2272. {
  2273. SetRADKV_MA_MS(kv, fma, fms);
  2274. }
  2275. else
  2276. {
  2277. SetAECKV_MA_MS(kv, fma, fms);
  2278. }
  2279. }
  2280. else if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::WALL)
  2281. {
  2282. if (m_nWallUsePanelAEC == 1)
  2283. {
  2284. SetRADKV_MA_MS(kv, fma, fms);
  2285. }
  2286. else
  2287. {
  2288. SetAECKV_MA_MS(kv, fma, fms);
  2289. }
  2290. }
  2291. else if (m_DoseUnit.m_WS->Get() == AttrKey::GENWS_TYPE::MOBILE)
  2292. {
  2293. if (m_nFreeUsePanelAEC == 1)
  2294. {
  2295. SetRADKV_MA_MS(kv, fma, fms);
  2296. }
  2297. else
  2298. {
  2299. SetAECKV_MA_MS(kv, fma, fms);
  2300. }
  2301. }
  2302. }
  2303. return true;
  2304. }
  2305. //F0 6E A2 01 01 00 00 00 00 00 00 00 00 00 00 00 6C 00 88 发送消息
  2306. bool nsGEN::DeltaDevice::SetRADKV_MA_MS(int kv, float ma, float ms)
  2307. {
  2308. mLog::FINFO("[0xF0, 0x56, 0xA1]: KV: {$}, MA: {$}, MS: {$}", kv, ma, ms);
  2309. char cmdbuf[20] = { 0xF0, 0x56, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x88 };
  2310. cmdbuf[3] = kv;
  2311. //确保ma合理
  2312. int posMA = GetFacFloatValue(m_vecMA, ma);//找到之后,再缩小10倍,写入数据帧
  2313. int nTemp = ma * 10;
  2314. cmdbuf[4] = nTemp >> 8;
  2315. cmdbuf[5] = nTemp % 256;
  2316. //确保ms合理
  2317. int posMS = GetFacFloatValue(m_vecMS, ms);
  2318. nTemp = ms * 10;
  2319. cmdbuf[6] = nTemp >> 16;
  2320. cmdbuf[7] = nTemp >> 8;
  2321. cmdbuf[8] = nTemp % 256;
  2322. FormatCommand(cmdbuf, 13);
  2323. string temp(cmdbuf, 13);
  2324. m_strCommand = temp;
  2325. HWSendWaitACKCMD(m_strCommand, 4);
  2326. return true;
  2327. }
  2328. bool nsGEN::DeltaDevice::SetRADKV_MAS(int kv, float mas)
  2329. {
  2330. //57A1
  2331. mLog::FINFO("[0xF0, 0x57, 0xA1]:KV: {$}, MAS: {$}", kv, mas);
  2332. char cmdbuf[13] = { 0xF0, 0x57, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x88 };
  2333. cmdbuf[3] = kv;
  2334. //确保mas合理
  2335. int posMAS = GetFacFloatValue(m_vecMAS, mas);
  2336. //设置mas指令中的数= 实际想要下发的数*100
  2337. int nTemp = mas * 100;
  2338. cmdbuf[6] = nTemp >> 16;
  2339. cmdbuf[7] = nTemp >> 8;
  2340. cmdbuf[8] = nTemp % 256;
  2341. FormatCommand(cmdbuf, 13);
  2342. string temp(cmdbuf, 13);
  2343. m_strCommand = temp;
  2344. HWSendWaitACKCMD(m_strCommand, 4);
  2345. return true;
  2346. }
  2347. bool nsGEN::DeltaDevice::SetAECKV_MA_MS(int kv, float ma, float ms)
  2348. {
  2349. //55A2
  2350. mLog::FINFO("[0xF0, 0x55, 0xA2]: KV: {$}, MA; {$}, MS: {$}", kv, ma, ms);
  2351. char cmdbuf[13] = { 0xF0, 0x55, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x88 };
  2352. cmdbuf[3] = kv;
  2353. //确保ma合理
  2354. int posMA = GetFacFloatValue(m_vecMA, ma);
  2355. int nTemp = ma *10;
  2356. cmdbuf[4] = nTemp >> 8;
  2357. cmdbuf[5] = nTemp % 256;
  2358. //确保ms合理
  2359. int posMS = GetFacFloatValue(m_vecMS, ms);
  2360. nTemp = ms * 10;
  2361. cmdbuf[6] = nTemp >> 16;
  2362. cmdbuf[7] = nTemp >> 8;
  2363. cmdbuf[8] = nTemp % 256;
  2364. FormatCommand(cmdbuf, 13);
  2365. string temp(cmdbuf, 13);
  2366. m_strCommand = temp;
  2367. HWSendWaitACKCMD(m_strCommand, 4);
  2368. return true;
  2369. }
  2370. bool nsGEN::DeltaDevice::SetAECInformation(int chamber, int field, int density, int film)
  2371. {
  2372. mLog::FINFO("[0xF0, 0x55, 0xA1]: chamber: {$}, field: {$}, density: {$}, film: {$}", chamber, field, density, film);
  2373. char cmdbuf[13] = { 0xF0, 0x55, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x88 };
  2374. cmdbuf[3] = chamber;
  2375. //field转换
  2376. switch (field)
  2377. {
  2378. case 1:
  2379. cmdbuf[4] = 0x04;
  2380. break;
  2381. case 10:
  2382. cmdbuf[4] = 0x02;
  2383. break;
  2384. case 100:
  2385. cmdbuf[4] = 0x01;
  2386. break;
  2387. case 101:
  2388. cmdbuf[4] = 0x05;
  2389. break;
  2390. case 110:
  2391. cmdbuf[4] = 0x03;
  2392. break;
  2393. case 11:
  2394. cmdbuf[4] = 0x06;
  2395. break;
  2396. case 111:
  2397. cmdbuf[4] = 0x07;
  2398. break;
  2399. default:
  2400. break;
  2401. }
  2402. //density转换
  2403. switch (density)
  2404. {
  2405. case -3:
  2406. cmdbuf[5] = 0;
  2407. break;
  2408. case -2:
  2409. cmdbuf[5] = 1;
  2410. break;
  2411. case -1:
  2412. cmdbuf[5] = 2;
  2413. break;
  2414. case 0:
  2415. cmdbuf[5] = 3;
  2416. break;
  2417. case 1:
  2418. cmdbuf[5] = 4;
  2419. break;
  2420. case 2:
  2421. cmdbuf[5] = 5;
  2422. break;
  2423. case 3:
  2424. cmdbuf[5] = 6;
  2425. break;
  2426. default:
  2427. cmdbuf[5] = 0;
  2428. break;
  2429. }
  2430. if (film > 3)
  2431. {
  2432. film = 3;
  2433. }
  2434. cmdbuf[6] = 0;
  2435. FormatCommand(cmdbuf, 13);
  2436. string temp(cmdbuf, 13);
  2437. m_strCommand = temp;
  2438. HWSendWaitACKCMD(m_strCommand, 4);
  2439. return true;
  2440. }
  2441. //int nsGEN::DeltaDevice::GetFacValue(vector<int> Index, int& value)
  2442. //{
  2443. // int nlength = static_cast <int>(Index.size());
  2444. // if (nlength == 0)
  2445. // {
  2446. // return -1;
  2447. // }
  2448. //
  2449. // int nPos = 0;
  2450. // int nValue = 0;
  2451. // for (int i = 0; i < nlength; i++)
  2452. // {
  2453. // if (value == Index[i])
  2454. // {
  2455. // nPos = i;
  2456. // break;
  2457. // }
  2458. // else if (i == nlength - 1)
  2459. // {
  2460. // nPos = i;
  2461. // break;
  2462. // }
  2463. // else if ((value > Index[i]) && (value < Index[i + 1]))
  2464. // {
  2465. // nPos = (abs(value - Index[i + 1]) > abs(value - Index[i])) ? i : (i + 1);//就近原则
  2466. // break;
  2467. // }
  2468. // else if (value < Index[0])
  2469. // {
  2470. // nPos = 0;
  2471. // break;
  2472. // }
  2473. // }
  2474. // value = Index[nPos];
  2475. // return nPos;
  2476. //}
  2477. int CCOS::Dev::Detail::Generator::DeltaDevice::GetFacFloatValue(vector<float> Index, float& value)
  2478. {
  2479. int nlength = static_cast <int>(Index.size());
  2480. if (nlength == 0)
  2481. {
  2482. return -1;
  2483. }
  2484. int nPos = 0;
  2485. int nValue = 0;
  2486. for (int i = 0; i < nlength; i++)
  2487. {
  2488. if (value == Index[i])
  2489. {
  2490. nPos = i;
  2491. break;
  2492. }
  2493. else if (i == nlength - 1)
  2494. {
  2495. nPos = i;
  2496. break;
  2497. }
  2498. else if ((value > Index[i]) && (value < Index[i + 1]))
  2499. {
  2500. nPos = (abs(value - Index[i + 1]) > abs(value - Index[i])) ? i : (i + 1);//就近原则
  2501. break;
  2502. }
  2503. else if (value < Index[0])
  2504. {
  2505. nPos = 0;
  2506. break;
  2507. }
  2508. }
  2509. value = Index[nPos];
  2510. return nPos;
  2511. }
  2512. bool nsGEN::DeltaDevice::SetRadMode(int radmode, int desmode)
  2513. {
  2514. mLog::FINFO("[0xF0, 0x54, 0xA1]: RadMode: {$}, desmode: {$}", radmode, desmode);
  2515. char cmdbuf[13] = { 0xF0, 0x54, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x88 };
  2516. cmdbuf[3] = radmode;
  2517. cmdbuf[4] = desmode;
  2518. FormatCommand(cmdbuf, 13);
  2519. string temp(cmdbuf, 13);
  2520. m_strCommand = temp;
  2521. HWSendWaitACKCMD(m_strCommand, 4);
  2522. return true;
  2523. }
  2524. std::string nsGEN::DeltaDevice::uint8ArrayToHexStr(const UINT8* array, size_t length)
  2525. {
  2526. std::ostringstream ss;
  2527. ss << std::hex << std::setfill('0'); // 设置十六进制格式和填充字符
  2528. for (size_t i = 0; i < length; ++i) {
  2529. ss << std::setw(2) << static_cast<int>(array[i]) << ' '; // 转换为int以支持十六进制输出,并设置宽度为2
  2530. }
  2531. return ss.str(); // 返回转换后的字符串
  2532. }
  2533. bool nsGEN::DeltaDevice::SetDAECEnable(int enable)
  2534. {
  2535. if (enable)
  2536. {
  2537. mLog::FINFO("[0xF0, 0x61, 0xAC, 0x01]: DAECEnable: {$}", enable);
  2538. char cmdbuf[19] = { 0xF0, 0x61, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xDB, 0x00, 0x88 };
  2539. FormatCommand(cmdbuf, 19);
  2540. string temp(cmdbuf, 19);
  2541. m_strCommand = temp;
  2542. HWSendWaitACKCMD(m_strCommand, 4);
  2543. }
  2544. else
  2545. {
  2546. mLog::FINFO("[0xF0, 0x61, 0xAC, 0x02]: DAECEnable: {$}", enable);
  2547. char cmdbuf[19] = { 0xF0, 0x61, 0xAC, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x88 };
  2548. FormatCommand(cmdbuf, 19);
  2549. string temp(cmdbuf, 19);
  2550. m_strCommand = temp;
  2551. HWSendWaitACKCMD(m_strCommand, 4);
  2552. }
  2553. return true;
  2554. }
  2555. int nsGEN::DeltaDevice::WSGen2UI(int InputWS)
  2556. {
  2557. int OutputWS = -1;
  2558. //if (m_nSettingWS == GEN_WS_TABLE) //table lying
  2559. //{
  2560. // if (InputWS == GenConfig.m_nGenWSLying)
  2561. // {
  2562. // OutputWS = GEN_WS_TABLE;
  2563. // }
  2564. //}
  2565. //else if (m_nSettingWS == GEN_WS_WALL) //table standing
  2566. //{
  2567. // if (InputWS == GenConfig.m_nGenWSStand)
  2568. // {
  2569. // OutputWS = GEN_WS_WALL;
  2570. // }
  2571. //}
  2572. //else if (m_nSettingWS == GEN_WS_CONVENTIONAL)
  2573. //{
  2574. // if (InputWS == GenConfig.m_nGenWSConventional)
  2575. // {
  2576. // OutputWS = GEN_WS_CONVENTIONAL;
  2577. // }
  2578. //}
  2579. //else if (m_nSettingWS == GEN_WS_MOBILE) //Free ws
  2580. //{
  2581. // if (InputWS == GenConfig.m_nGenWSFree)
  2582. // {
  2583. // OutputWS = GEN_WS_MOBILE;
  2584. // }
  2585. //}
  2586. //else if (m_nSettingWS == GEN_WS_TOMO)
  2587. //{
  2588. // if (InputWS == GenConfig.m_nGenWSTomo)
  2589. // {
  2590. // OutputWS = GEN_WS_TOMO;
  2591. // }
  2592. //}
  2593. //else
  2594. //{
  2595. // this->logfile->WriteLog("Input WS is wrong", LOG_INFORMATION, LOG_DEBUG, true);
  2596. //}
  2597. //if (OutputWS < 0)
  2598. //{
  2599. // this->logfile->WriteLog("Seting WS is different with Geting WS!", LOG_INFORMATION, LOG_DEBUG, true);
  2600. // if (InputWS == GenConfig.m_nGenWSLying)
  2601. // {
  2602. // OutputWS = GEN_WS_TABLE;
  2603. // }
  2604. // else if (InputWS == GenConfig.m_nGenWSStand)
  2605. // {
  2606. // OutputWS = GEN_WS_WALL;
  2607. // }
  2608. // else if (InputWS == GenConfig.m_nGenWSConventional)
  2609. // {
  2610. // OutputWS = GEN_WS_CONVENTIONAL;
  2611. // }
  2612. // else if (InputWS == GenConfig.m_nGenWSFree)
  2613. // {
  2614. // OutputWS = GEN_WS_MOBILE;
  2615. // }
  2616. // else if (InputWS == GenConfig.m_nGenWSTomo)
  2617. // {
  2618. // OutputWS = GEN_WS_TOMO;
  2619. // }
  2620. // else
  2621. // {
  2622. // //OutputWS = GEN_WS_TABLE;
  2623. // OutputWS = -1;
  2624. // this->logfile->WriteLog("Geting WS is wrong", LOG_INFORMATION, LOG_DEBUG, true);
  2625. // }
  2626. //}
  2627. return OutputWS;
  2628. }
  2629. //-----------------------------------------------------------------------------
  2630. // DecodeFrame
  2631. //-----------------------------------------------------------------------------
  2632. static bool DecodeFrame(const char* strFrame, int length)
  2633. {
  2634. if (nsGEN::DeltaDevice::g_GenDevice)
  2635. {
  2636. nsGEN::DeltaDevice::g_GenDevice->DecodeFrame(strFrame, length);
  2637. }
  2638. return true;
  2639. }
  2640. bool nsGEN::DeltaDevice::GetLastExpParamenters(void)
  2641. {
  2642. mLog::FINFO("[0xF0, 0x65, 0x01]");
  2643. char cmdbuf[19] = { 0xF0, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0x00, 0x88 };
  2644. FormatCommand(cmdbuf, 19);
  2645. string temp(cmdbuf, 19);
  2646. m_strCommand = temp;
  2647. HWSendWaitACKCMD(m_strCommand, 4);
  2648. return true;
  2649. }
  2650. int nsGEN::DeltaDevice::FormatCommand(char* buf, int len)
  2651. {
  2652. if (len < 4)
  2653. {
  2654. return -1;
  2655. }
  2656. UINT8 crc = GetCRC8(buf + 1, len - 4);
  2657. buf[len - 3] = crc;
  2658. return crc;
  2659. }
  2660. void nsGEN::DeltaDevice::RetrieveFirewareVersion()
  2661. {
  2662. mLog::FINFO("[0xF0, 0x61, 0x01, 0x00]");
  2663. char cmdbuf[19] = { 0xF0, 0x61, 0x01, 0x00, 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00, 0x00, 0x00, 0x00, 0x88 };
  2664. FormatCommand(cmdbuf, 19);
  2665. string temp(cmdbuf, 19);
  2666. m_strCommand = temp;
  2667. HWSendWaitACKCMD(m_strCommand, 4);
  2668. }
  2669. std::string nsGEN::DeltaDevice::GetFileVersion(std::string strFilePathName)
  2670. {
  2671. DWORD dwVerSize = GetFileVersionInfoSize(strFilePathName.c_str(), NULL);
  2672. if (dwVerSize == 0)
  2673. {
  2674. return false;
  2675. }
  2676. LPVOID pVersionBuffer = malloc(dwVerSize);
  2677. GetFileVersionInfo(strFilePathName.c_str(), 0, dwVerSize, pVersionBuffer);
  2678. VS_FIXEDFILEINFO* pInfo;
  2679. UINT nInfoLen;
  2680. std::string strVersion = "";
  2681. if (VerQueryValue(pVersionBuffer, "\\", (void**)&pInfo, &nInfoLen))
  2682. {
  2683. strVersion = to_string(HIWORD(pInfo->dwFileVersionMS)) + "." + to_string(LOWORD(pInfo->dwFileVersionMS)) + "."
  2684. + to_string(HIWORD(pInfo->dwFileVersionLS)) + "." + to_string(LOWORD(pInfo->dwFileVersionLS));
  2685. }
  2686. return strVersion;
  2687. }
  2688. //"HWS": "1",
  2689. //"CMD" : "2",
  2690. //"FRE" : "3"
  2691. RET_STATUS nsGEN::DeltaDevice::ActiveSyncMode(_tSyncModeArgs value)
  2692. {
  2693. m_cfgCurrentWSSYN = value;
  2694. mLog::FINFO("WS: {$}, SyncMode: {$}, SyncValue: {$}", m_cfgCurrentWSSYN.strWS, m_cfgCurrentWSSYN.strSyncMode, m_cfgCurrentWSSYN.strSyncValue);
  2695. if (m_cfgCurrentWSSYN.strWS == "Free")
  2696. {
  2697. SetNoDrMode();
  2698. }
  2699. else
  2700. {
  2701. if (m_cfgCurrentWSSYN.strSyncMode == "FRE")
  2702. {
  2703. SetNoDrMode();
  2704. }
  2705. else
  2706. {
  2707. SetSyncOutMode();
  2708. //if (m_cfgCurrentWSSYN.strWS == "Table")
  2709. //{
  2710. SeleckDetectorNumber(1);
  2711. //}
  2712. //else
  2713. //{
  2714. //SeleckDetectorNumber(2);
  2715. //}
  2716. }
  2717. }
  2718. return RET_STATUS::RET_SUCCEED;
  2719. }
  2720. void nsGEN::DeltaDevice::SetNoDrMode()
  2721. {
  2722. mLog::FINFO("[0xF0, 0x6E, 0xA2, 0x00]");
  2723. char cmdbuf[20] = { 0xF0, 0x6E, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x00, 0x88 };
  2724. FormatCommand(cmdbuf, 19);
  2725. string temp(cmdbuf, 19);
  2726. m_strCommand = temp;
  2727. HWSendWaitACKCMD(m_strCommand, 4);
  2728. }
  2729. void nsGEN::DeltaDevice::SetSyncOutMode()
  2730. {
  2731. mLog::FINFO("[0xF0, 0x6E, 0xA2, 0x01]");
  2732. char cmdbuf[20] = { 0xF0, 0x6E, 0xA2, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x88 };
  2733. FormatCommand(cmdbuf, 19);
  2734. string temp(cmdbuf, 19);
  2735. m_strCommand = temp;
  2736. HWSendWaitACKCMD(m_strCommand, 4);
  2737. }
  2738. void nsGEN::DeltaDevice::SeleckDetectorNumber(int detectorID)
  2739. {
  2740. mLog::FINFO("[0xF0, 0x6E, 0xA1, 0x0{$}]", detectorID);
  2741. char cmdbuf[20] = { 0xF0, 0x6E, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x88 };
  2742. cmdbuf[3] = detectorID;
  2743. FormatCommand(cmdbuf, 19);
  2744. string temp(cmdbuf, 19);
  2745. m_strCommand = temp;
  2746. HWSendWaitACKCMD(m_strCommand, 4);
  2747. }
  2748. /*下面的线程函数,其实用来充当定时器功能。*/
  2749. bool nsGEN::DeltaDevice::StartHardwareStatusThread()
  2750. {
  2751. mLog::FDEBUG("Enter StartHardwareStatusThread");
  2752. if (m_pHardwareStatusThread == NULL)
  2753. {
  2754. DWORD m_HardwareStatusID;
  2755. m_pHardwareStatusThread = CreateThread(0, 0, HardwareStatusThread, this, 0, &m_HardwareStatusID);
  2756. if (m_pHardwareStatusThread == NULL)
  2757. {
  2758. mLog::FERROR("Start HardwareStatus Thread Failed");
  2759. return false;
  2760. }
  2761. }
  2762. return true;
  2763. }
  2764. DWORD nsGEN::DeltaDevice::HardwareStatusThread(LPVOID pParam)
  2765. {
  2766. mLog::FDEBUG("Enter HardwareStatusThread");
  2767. DeltaDevice* pCurGen = (DeltaDevice*)pParam;
  2768. if (pCurGen == NULL)
  2769. {
  2770. return 0;
  2771. }
  2772. if (pCurGen->m_GenConfig.GetFirstOf("loopTime") >= 0)
  2773. {
  2774. if ((int)pCurGen->m_GenConfig["loopTime"] >= 100)
  2775. {
  2776. pCurGen->m_iLoopTime = (int)pCurGen->m_GenConfig["loopTime"];
  2777. }
  2778. }
  2779. mLog::FINFO("loopTime = {$}", pCurGen->m_iLoopTime.load());
  2780. int currtTime = pCurGen->m_iLoopTime;
  2781. int waitTime = INFINITE;
  2782. DWORD event = 0;
  2783. bool bExit = false;
  2784. int cmdNumber = 1;
  2785. while (!bExit)
  2786. {
  2787. event = WaitForMultipleObjects(4, pCurGen->m_hArrayEvent, FALSE, waitTime);
  2788. switch (event)
  2789. {
  2790. case WAIT_OBJECT_0:
  2791. {
  2792. mLog::FDEBUG("HardwareStatusThread: exited");
  2793. bExit = TRUE;
  2794. return 0;
  2795. }break;
  2796. case (WAIT_TIMEOUT):
  2797. {
  2798. mLog::FWARN("HardwareStatusThread: Get loop EVENT timeout");
  2799. }break;
  2800. case (WAIT_OBJECT_0 + 1):
  2801. {
  2802. if (pCurGen->m_nProcessXrayon == false)
  2803. {
  2804. currtTime = pCurGen->m_iLoopTime;
  2805. Sleep(currtTime);
  2806. pCurGen->RetrieveHU();
  2807. pCurGen->CheckGeneratorStatus();
  2808. mLog::FINFO("ConnectStatus: {$}", pCurGen->m_bReconnect);
  2809. if (!pCurGen->m_bSetAPR)
  2810. {
  2811. pCurGen->m_tAPRdata.nWS = pCurGen->m_DoseUnit.m_WS->Get();
  2812. pCurGen->m_tAPRdata.nTechmode = pCurGen->m_DoseUnit.m_Techmode->Get();
  2813. pCurGen->m_tAPRdata.nFocus = pCurGen->m_DoseUnit.m_Focus->Get();
  2814. pCurGen->m_tAPRdata.fKV = pCurGen->m_DoseUnit.m_KV->Get();
  2815. pCurGen->m_tAPRdata.fMA = pCurGen->m_DoseUnit.m_MA->Get();
  2816. pCurGen->m_tAPRdata.fMS = pCurGen->m_DoseUnit.m_MS->Get();
  2817. pCurGen->m_tAPRdata.fMAS = pCurGen->m_DoseUnit.m_MAS->Get();
  2818. pCurGen->m_tAPRdata.nAECDensity = pCurGen->m_DoseUnit.m_AECDensity->Get();
  2819. pCurGen->m_tAPRdata.nAECFilm = pCurGen->m_DoseUnit.m_AECFilm->Get();
  2820. pCurGen->m_tAPRdata.nAECField = pCurGen->m_DoseUnit.m_AECField->Get();
  2821. pCurGen->SetAPR(pCurGen->m_tAPRdata);
  2822. }
  2823. m_nCountTimes++;
  2824. if (m_nCountTimes >= 25)
  2825. {
  2826. char ErrCode[20];
  2827. sprintf_s(ErrCode, "DELTA_ERR_%04d", 0);
  2828. mLog::FINFO("{$}", ErrCode);
  2829. int level = DELTA_ABNORMAL_LEVEL::REG_ERRO;
  2830. auto iterr = pCurGen->m_ErrorMessages.find(ErrCode);
  2831. if (iterr != pCurGen->m_ErrorMessages.end())
  2832. {
  2833. pCurGen->m_bReconnect = true;
  2834. pCurGen->m_MSGUnit->AddErrorMessage(ErrCode, level, iterr->second.c_str());
  2835. exit(0);
  2836. }
  2837. }
  2838. }
  2839. }break;
  2840. default:
  2841. {
  2842. mLog::FDEBUG("HardwareStatusThread: unknown event");
  2843. }break;
  2844. }
  2845. }
  2846. return 0;
  2847. }
  2848. void CCOS::Dev::Detail::Generator::DeltaDevice::RetrieveHU()
  2849. {
  2850. if (!m_nProcessXrayon)
  2851. {
  2852. mLog::FINFO("[0xF0, 0x5F, 0x01]");
  2853. char cmdbuf[13] = { 0xF0, 0x5F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x88 };
  2854. FormatCommand(cmdbuf, 13);
  2855. string temp(cmdbuf, 13);
  2856. m_strCommand = temp;
  2857. HWSendWaitACKCMD(m_strCommand, 4);
  2858. }
  2859. else
  2860. {
  2861. mLog::FINFO("Xrayon Processing Dont RetrieveHU");
  2862. }
  2863. }
  2864. void CCOS::Dev::Detail::Generator::DeltaDevice::CheckGeneratorStatus()
  2865. {
  2866. if (!m_nProcessXrayon)
  2867. {
  2868. mLog::FINFO("[0xF0, 0x64, 0x01]");
  2869. char cmdbuf[19] = { 0xF0, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x88 };
  2870. FormatCommand(cmdbuf, 19);
  2871. string temp(cmdbuf, 19);
  2872. m_strCommand = temp;
  2873. HWSendWaitACKCMD(m_strCommand, 4);
  2874. }
  2875. else
  2876. {
  2877. mLog::FINFO("Xrayon Processing Dont CheckGeneratorStatus");
  2878. }
  2879. }
  2880. void CCOS::Dev::Detail::Generator::DeltaDevice::RetrieveMaxRating()
  2881. {
  2882. //6104
  2883. mLog::FINFO("[0xF0, 0x61, 0x04]");
  2884. char cmdbuf[19] = { 0xF0, 0x61, 0x04, 0x00, 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00, 0x00, 0x00, 0x00, 0x88 };
  2885. FormatCommand(cmdbuf, 19);
  2886. string temp(cmdbuf, 19);
  2887. m_strCommand = temp;
  2888. HWSendWaitACKCMD(m_strCommand, 4);
  2889. }
  2890. void CCOS::Dev::Detail::Generator::DeltaDevice::UpdataAECInformation(AECINFORM aec)
  2891. {
  2892. switch (aec.Field)
  2893. {
  2894. case 1:
  2895. m_DoseUnit.m_AECField->Update(AttrKey::AEC_100);
  2896. break;
  2897. case 2:
  2898. m_DoseUnit.m_AECField->Update(AttrKey::AEC_010);
  2899. break;
  2900. case 3:
  2901. m_DoseUnit.m_AECField->Update(AttrKey::AEC_110);
  2902. break;
  2903. case 4:
  2904. m_DoseUnit.m_AECField->Update(AttrKey::AEC_001);
  2905. break;
  2906. case 5:
  2907. m_DoseUnit.m_AECField->Update(AttrKey::AEC_101);
  2908. break;
  2909. case 6:
  2910. m_DoseUnit.m_AECField->Update(AttrKey::AEC_010);
  2911. break;
  2912. case 7:
  2913. m_DoseUnit.m_AECField->Update(AttrKey::AEC_111);
  2914. break;
  2915. default:
  2916. m_DoseUnit.m_AECField->Update(AttrKey::AEC_010);
  2917. break;
  2918. }
  2919. FireNotify(m_DoseUnit.m_AECField->GetKey(), m_DoseUnit.m_AECField->JSGet());
  2920. mLog::FINFO("AEC: field: {$}", m_DoseUnit.m_AECField->GetKey());
  2921. //density
  2922. switch (aec.Density)
  2923. {
  2924. case 0:
  2925. m_DoseUnit.m_AECDensity->Update(-3);
  2926. break;
  2927. case 1:
  2928. m_DoseUnit.m_AECDensity->Update(-2);
  2929. break;
  2930. case 2:
  2931. m_DoseUnit.m_AECDensity->Update(-1);
  2932. break;
  2933. case 3:
  2934. m_DoseUnit.m_AECDensity->Update(0);
  2935. break;
  2936. case 4:
  2937. m_DoseUnit.m_AECDensity->Update(1);
  2938. break;
  2939. case 5:
  2940. m_DoseUnit.m_AECDensity->Update(2);
  2941. break;
  2942. case 6:
  2943. m_DoseUnit.m_AECDensity->Update(3);
  2944. break;
  2945. default:
  2946. m_DoseUnit.m_AECDensity->Update(0);
  2947. break;
  2948. }
  2949. FireNotify(m_DoseUnit.m_AECDensity->GetKey(), m_DoseUnit.m_AECDensity->JSGet());
  2950. mLog::FINFO("AEC: Density: {$}", m_DoseUnit.m_AECDensity->GetKey());
  2951. //film --->ysj++ 是否需要转换??
  2952. int nAECFilmSpeed = 0;
  2953. switch (aec.FilmScreenSpeed)
  2954. {
  2955. case 0:
  2956. nAECFilmSpeed = 100;
  2957. break;
  2958. case 1:
  2959. nAECFilmSpeed = 200;
  2960. break;
  2961. case 2:
  2962. nAECFilmSpeed = 400;
  2963. break;
  2964. case 3:
  2965. nAECFilmSpeed = 800;
  2966. break;
  2967. default:
  2968. break;
  2969. }
  2970. m_DoseUnit.m_AECFilm->Update(nAECFilmSpeed);
  2971. FireNotify(m_DoseUnit.m_AECFilm->GetKey(), m_DoseUnit.m_AECFilm->JSGet());
  2972. mLog::FINFO("AEC: Film: {$}", m_DoseUnit.m_AECFilm->GetKey());
  2973. }
  2974. void CCOS::Dev::Detail::Generator::DeltaDevice::RetrieveGeneratroDerating()
  2975. {
  2976. //6105
  2977. mLog::FINFO("[0xF0, 0x61, 0x05]");
  2978. char cmdbuf[19] = { 0xF0, 0x61, 0x05, 0x00, 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00, 0x00, 0x00, 0x00, 0x88 };
  2979. FormatCommand(cmdbuf, 19);
  2980. string temp(cmdbuf, 19);
  2981. m_strCommand = temp;
  2982. HWSendWaitACKCMD(m_strCommand, 4);
  2983. }
  2984. bool CCOS::Dev::Detail::Generator::DeltaDevice::LoadConfig(string configfile)
  2985. {
  2986. std::ifstream file(configfile);
  2987. if (!file) {
  2988. mLog::FINFO("Config file does not exist: {$}", configfile.c_str());
  2989. return false;
  2990. }
  2991. if (m_bLoadConfigFile)
  2992. {
  2993. mLog::FINFO("Configuration already loaded");
  2994. return true;
  2995. }
  2996. m_strConfigPath = configfile;
  2997. ResDataObject temp;
  2998. temp.loadFile(m_strConfigPath.c_str());
  2999. m_GenConfig = temp["CONFIGURATION"];
  3000. TransJsonText(m_GenConfig);
  3001. GetConfData();
  3002. m_bLoadConfigFile = true;
  3003. return true;
  3004. }
  3005. int CCOS::Dev::Detail::Generator::DeltaDevice::GetGenState()
  3006. {
  3007. if (m_DoseUnit.m_GenState != NULL)
  3008. {
  3009. return m_DoseUnit.m_GenState->Get();
  3010. }
  3011. else
  3012. {
  3013. return 0;
  3014. }
  3015. }
  3016. string CCOS::Dev::Detail::Generator::DeltaDevice::AnalysisCommand(int number, const char* chdigital, int type)
  3017. {
  3018. string str = "";
  3019. char arrChar[BYTE_4] = { 0 };
  3020. for (int i = 0; i < number; i++)
  3021. {
  3022. if (type == TransToType::tochar)
  3023. {
  3024. //转成符号
  3025. sprintf_s(arrChar, sizeof(arrChar) / sizeof(arrChar[0]), "%c", (BYTE)chdigital[i]);
  3026. }
  3027. else if (type == TransToType::toint)
  3028. {
  3029. //转成int数
  3030. sprintf_s(arrChar, sizeof(arrChar) / sizeof(arrChar[0]), "%d", (BYTE)chdigital[i]);
  3031. }
  3032. else
  3033. {
  3034. //转成hex
  3035. sprintf_s(arrChar, sizeof(arrChar) / sizeof(arrChar[0]), "%X", (BYTE)chdigital[i]);
  3036. }
  3037. str += arrChar;
  3038. }
  3039. return str;
  3040. }
  3041. //-----------------------------------------------------------------------------
  3042. // DeltaDriver
  3043. //-----------------------------------------------------------------------------
  3044. nsGEN::DeltaDriver::DeltaDriver()
  3045. {
  3046. m_bDemoConnected = false;
  3047. m_pAttribute.reset(new ResDataObject);
  3048. m_pDescription.reset(new ResDataObject);
  3049. }
  3050. nsGEN::DeltaDriver::~DeltaDriver()
  3051. {
  3052. }
  3053. auto nsGEN::DeltaDriver::CreateDevice(int index) -> std::unique_ptr <IODevice>
  3054. {
  3055. mLog::FINFO("CreateDevice:{$}", index);
  3056. m_pDevice = new DeltaDevice(EventCenter, m_SCF, m_ConfigFileName);
  3057. auto dev = std::unique_ptr <IODevice>(new IODevice(m_pDevice));
  3058. return dev;
  3059. }
  3060. void nsGEN::DeltaDriver::FireNotify(int code, std::string key, std::string content)
  3061. {
  3062. EventCenter->OnNotify(code, key, content);
  3063. }
  3064. Log4CPP::Logger* mLog::gLogger = nullptr;
  3065. void nsGEN::DeltaDriver::Prepare()
  3066. {
  3067. string strLogPath = GetProcessDirectory() + R"(\OEMDrivers\Generator\Conf\Log4CPP.Config.GEN.xml)";
  3068. Log4CPP::GlobalContext::Map::Set(ECOM::Utility::Hash("LogFileName"), "GEN.Delta80KAXB");
  3069. auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  3070. mLog::gLogger = Log4CPP::LogManager::GetLogger("GEN.Delta80KAXB");
  3071. m_SCFDllName = GetConnectDLL(m_ConfigFileName);
  3072. super::Prepare();
  3073. }
  3074. bool nsGEN::DeltaDriver::Connect()
  3075. {
  3076. mLog::FINFO("ConfigFileName: {$}", m_ConfigFileName.c_str());
  3077. super::Disconnect();
  3078. m_SCF.Disconnect();
  3079. std::ifstream file(m_ConfigFileName);
  3080. if (!file) {
  3081. // 文件不存在,直接返回空的Connection对象
  3082. mLog::FINFO("{$} does not exist", m_ConfigFileName);
  3083. return false;
  3084. }
  3085. ResDataObject Connection = GetConnectParam(m_ConfigFileName);
  3086. mLog::FINFO("Connections:{$} \n", Connection.encode());
  3087. printf("Connections:%s \n", Connection.encode());
  3088. auto erCode = m_SCF.Connect(Connection.encode(), &nsGEN::DeltaDriver::callbackPackageProcess, SCF_PACKET_TRANSFER, 3000);
  3089. if (erCode != SCF_ERR::SCF_SUCCEED)
  3090. {
  3091. mLog::FINFO("SCF connection failed: erCode != SCF_ERR::SCF_SUCCEED");
  3092. super::Disconnect();
  3093. m_SCF.Disconnect();
  3094. return false;
  3095. }
  3096. auto rc = super::Connect();
  3097. if (!rc)
  3098. {
  3099. mLog::FINFO("super::Connect() failed");
  3100. super::Disconnect();
  3101. m_SCF.Disconnect();
  3102. return false;
  3103. }
  3104. if (m_pDevice == nullptr)
  3105. {
  3106. return false;
  3107. }
  3108. mLog::FINFO("Connect Successful");
  3109. return true;
  3110. }
  3111. void nsGEN::DeltaDriver::Disconnect()
  3112. {
  3113. mLog::FINFO("Enter Disconnect");
  3114. super::Disconnect();
  3115. m_SCF.Disconnect();
  3116. m_bDemoConnected = false;
  3117. }
  3118. bool nsGEN::DeltaDriver::isConnected() const
  3119. {
  3120. if (!super::isConnected())
  3121. {
  3122. mLog::FINFO("No valid connection!!!");
  3123. return false;
  3124. }
  3125. if (m_pDevice == nullptr)
  3126. {
  3127. mLog::FINFO("m_pDevice: nullptr");
  3128. return false;
  3129. }
  3130. if (!m_pDevice->LoadConfig(m_ConfigFileName))
  3131. {
  3132. return false; //return 0;
  3133. }
  3134. int genState = m_pDevice->GetGenState();
  3135. mLog::FINFO("m_pDevice->GetGenState(): {$}", genState);
  3136. return genState > 0;
  3137. }
  3138. std::string nsGEN::DeltaDriver::DriverProbe()
  3139. {
  3140. ResDataObject r_config, HardwareInfo;
  3141. if (r_config.loadFile(m_ConfigFileName.c_str()))
  3142. {
  3143. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  3144. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  3145. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  3146. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  3147. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  3148. }
  3149. else
  3150. {
  3151. HardwareInfo.add("MajorID", "Generator");
  3152. HardwareInfo.add("MinorID", "Dr");
  3153. HardwareInfo.add("VendorID", "Delta");
  3154. HardwareInfo.add("ProductID", "DMG80KAXB");
  3155. HardwareInfo.add("SerialID", "Drv");
  3156. }
  3157. string ret = HardwareInfo.encode();
  3158. return ret;
  3159. }
  3160. std::string nsGEN::DeltaDriver::GetResource()
  3161. {
  3162. ResDataObject r_config, temp;
  3163. if (!temp.loadFile(m_ConfigFileName.c_str()))
  3164. {
  3165. return "";
  3166. }
  3167. m_ConfigAll = temp;
  3168. r_config = temp["CONFIGURATION"];
  3169. m_Configurations = r_config;
  3170. ResDataObject DescriptionTemp;
  3171. ResDataObject DescriptionSend;
  3172. ResDataObject m_DescriptionSend;
  3173. ResDataObject ListTemp;
  3174. string strTemp = ""; //用于读取字符串配置信息
  3175. string strIndex = ""; //用于读取配置信息中的List项
  3176. int nTemp = -1; //用于读取整型配置信息
  3177. char sstream[10] = { 0 }; //用于转换值
  3178. string strValue = ""; //用于存储配置的值
  3179. string strType = ""; //用于存储配置的类型 int/float/string...
  3180. /***
  3181. * 1. 通过循环,将所有配置项写到pDeviceConfig
  3182. * 2. 记录配置项的内部key以及配置类型,类型对应了不同配置文件路径,用于读写真实值
  3183. ***/
  3184. try
  3185. {
  3186. //便利ConfigToolInfo 中 所有的AttributeInfo 属性段
  3187. int nConfigInfoCount = (int)m_Configurations["ConfigToolInfo"].GetKeyCount("AttributeInfo");
  3188. m_pAttribute->clear();
  3189. m_pDescription->clear();
  3190. for (int nInfoIndex = 0; nInfoIndex < nConfigInfoCount; nInfoIndex++)
  3191. {
  3192. DescriptionTemp.clear();
  3193. DescriptionSend.clear();
  3194. ListTemp.clear();
  3195. //AttributeType
  3196. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["Type"];
  3197. DescriptionTemp.add(ConfKey::CcosType, strTemp.c_str());//CcosGeneratorAttribute
  3198. DescriptionSend.add(ConfKey::CcosType, strTemp.c_str());//CcosGeneratorAttribute
  3199. strType = strTemp; //记录配置项的类型
  3200. //AttributeKey
  3201. //1. 根据AttributeType,内部key和配置路径,拿到当前的真实值
  3202. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["InnerKey"];
  3203. nTemp = (int)m_Configurations["ConfigToolInfo"][nInfoIndex]["PathID"];
  3204. GetDeviceConfigValue(r_config, strTemp.c_str(), nTemp, strValue); //得到strValue的值
  3205. //2. 赋值
  3206. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeKey"];
  3207. if ("int" == strType)
  3208. {
  3209. (*m_pAttribute).add(strTemp.c_str(), atoi(strValue.c_str()));
  3210. }
  3211. else if ("float" == strType)
  3212. {
  3213. (*m_pAttribute).add(strTemp.c_str(), atoi(strValue.c_str()));
  3214. }
  3215. else //其它先按string类型处理
  3216. {
  3217. (*m_pAttribute).add(strTemp.c_str(), strValue.c_str());
  3218. }
  3219. //AttributeAccess
  3220. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["Access"];
  3221. DescriptionTemp.add(ConfKey::CcosAccess, strTemp.c_str());
  3222. DescriptionSend.add(ConfKey::CcosAccess, strTemp.c_str());
  3223. /*
  3224. //AttributeRangeMin
  3225. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["RangeMin"];
  3226. if (strTemp != "") //不需要的配置项为空
  3227. {
  3228. DescriptionTemp.add(ConfKey::CcosRangeMin, strTemp.c_str());
  3229. }
  3230. //AttributeRangeMax
  3231. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["RangeMax"];
  3232. if (strTemp != "") //不需要的配置项为空
  3233. {
  3234. DescriptionTemp.add(ConfKey::CcosRangeMax, strTemp.c_str());
  3235. }
  3236. */
  3237. //AttributeList
  3238. nTemp = m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["ListNum"];
  3239. if (nTemp > 0) //ListNum不大于0时说明不需要list配置
  3240. {
  3241. for (int nListIndex = 0; nListIndex < nTemp; nListIndex++)
  3242. {
  3243. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["ListInfo"][nListIndex];
  3244. auto temKey = std::to_string(nListIndex);
  3245. ListTemp.add(temKey.c_str(), strTemp.c_str());
  3246. }
  3247. DescriptionTemp.add(ConfKey::CcosList, ListTemp);
  3248. DescriptionSend.add(ConfKey::CcosList, ListTemp.encode());
  3249. }
  3250. //AttributeRequired
  3251. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["Required"];
  3252. DescriptionTemp.add(ConfKey::CcosRequired, strTemp.c_str());
  3253. DescriptionSend.add(ConfKey::CcosRequired, strTemp.c_str());
  3254. //AttributeDefaultValue
  3255. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["DefaultValue"];
  3256. if (strTemp != "") //不需要的配置项为空
  3257. {
  3258. DescriptionTemp.add(ConfKey::CcosDefaultValue, strTemp.c_str());
  3259. DescriptionSend.add(ConfKey::CcosDefaultValue, strTemp.c_str());
  3260. }
  3261. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeKey"];
  3262. (*m_pDescription).add(strTemp.c_str(), DescriptionTemp);
  3263. m_DescriptionSend.add(strTemp.c_str(), DescriptionSend.encode());
  3264. }
  3265. }
  3266. catch (ResDataObjectExption& e)
  3267. {
  3268. mLog::FERROR("Get config error: {$}", e.what());
  3269. return "";
  3270. }
  3271. ResDataObject resDeviceResource;
  3272. resDeviceResource.add(ConfKey::CcosGeneratorAttribute, (*m_pAttribute));
  3273. resDeviceResource.add(ConfKey::CcosGeneratorDescription, (*m_pDescription));
  3274. ResDataObject DescriptionTempEx;
  3275. DescriptionTempEx.add(ConfKey::CcosGeneratorConfig, resDeviceResource);
  3276. m_DeviceConfig.clear();
  3277. m_DeviceConfig = DescriptionTempEx;
  3278. //mLog::FINFO("local ************* get resource over {$}", DescriptionTempEx.encode());
  3279. resDeviceResource.clear();
  3280. resDeviceResource.add(ConfKey::CcosGeneratorAttribute, (*m_pAttribute));
  3281. resDeviceResource.add(ConfKey::CcosGeneratorDescription, m_DescriptionSend);
  3282. DescriptionTempEx.clear();
  3283. DescriptionTempEx.add(ConfKey::CcosGeneratorConfig, resDeviceResource);
  3284. m_DeviceConfigSend.clear();
  3285. m_DeviceConfigSend = DescriptionTempEx;
  3286. string res = m_DeviceConfigSend.encode();
  3287. //mLog::FINFO("get resource over {$}", DescriptionTempEx.encode());
  3288. return res;
  3289. }
  3290. std::string nsGEN::DeltaDriver::DeviceProbe()
  3291. {
  3292. ResDataObject r_config, HardwareInfo;
  3293. if (r_config.loadFile(m_ConfigFileName.c_str()))
  3294. {
  3295. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  3296. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  3297. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  3298. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  3299. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  3300. }
  3301. else
  3302. {
  3303. HardwareInfo.add("MajorID", "Generator");
  3304. HardwareInfo.add("MinorID", "Dr");
  3305. HardwareInfo.add("VendorID", "Delta");
  3306. HardwareInfo.add("ProductID", "DMG80KAXB");
  3307. HardwareInfo.add("SerialID", "Dev");
  3308. }
  3309. string ret = HardwareInfo.encode();
  3310. return ret;
  3311. }
  3312. void nsGEN::DeltaDriver::Dequeue(const char* Packet, DWORD Length)
  3313. {
  3314. DecodeFrame(Packet, Length);
  3315. }
  3316. PACKET_RET nsGEN::DeltaDriver::callbackPackageProcess(const char* RecData, DWORD nLength, DWORD& PacketLength)
  3317. {
  3318. //PacketLength = nLength + 1; //+1 because ETX
  3319. //char strtemp[Delta_Com_NormalLen] = { 0 };
  3320. //memcpy(strtemp, RecData, PacketLength); //只有ETX+数据,-2 排除 checkSum ETX。
  3321. //mLog::FINFO("==IN==: {$}, nLength: {$}", strtemp, nLength);
  3322. //DeltaDevice::m_tDelivermodule.CheckReceive(strtemp, 2);
  3323. //return PACKET_ISPACKET;
  3324. char strSendCommand[10] = { 0 };
  3325. string str = "";
  3326. //int PacketLength = 0;
  3327. for (int i = 0; i < nLength; i++)
  3328. {
  3329. sprintf_s(strSendCommand, sizeof(strSendCommand), "%02X", (BYTE)RecData[i]);
  3330. str += strSendCommand;
  3331. str += ",";
  3332. }
  3333. mLog::FINFO("==IN== {$}, nLength: {$}", str, nLength);
  3334. bool bHasHead = false;
  3335. for (DWORD i = 0; i < nLength; i++)
  3336. {
  3337. //寻找包头
  3338. if ((UINT8)RecData[i] == COMMANDHEAD)
  3339. {
  3340. if ((i != 0) && (bHasHead == false)) //包头之前的数据格式不对,全部扔掉
  3341. {
  3342. PacketLength = i;
  3343. char strtemp[Delta_Com_NormalLen] = { 0 };
  3344. memcpy(strtemp, RecData, PacketLength);
  3345. mLog::FERROR("==IN unknown format data ==:{$},UselessDataLength={$},TotalLength={$} \n", strtemp, PacketLength, nLength);
  3346. return PACKET_USELESS;
  3347. }
  3348. else
  3349. {
  3350. bHasHead = true;
  3351. }
  3352. }
  3353. //寻找包尾
  3354. if (((UINT8)RecData[i] == COMMANDEND) && ((nLength - 1) == i))
  3355. {
  3356. if (bHasHead)
  3357. {
  3358. PacketLength = i + 1; //+1 because ETX
  3359. char strtemp[Delta_Com_NormalLen] = { 0 };
  3360. memcpy(strtemp, RecData, PacketLength); //只有ETX+数据,-2 排除 checkSum ETX。
  3361. mLog::FINFO("==IN==:[{$}]", strtemp);
  3362. DeltaDevice::m_tDelivermodule.CheckReceive(strtemp, 2);
  3363. return PACKET_ISPACKET;
  3364. }
  3365. else //有包尾但无包头
  3366. {
  3367. PacketLength = i + 1;
  3368. char strtemp[Delta_Com_NormalLen] = { 0 };
  3369. memcpy(strtemp, RecData, PacketLength);
  3370. mLog::FERROR("==IN no head data ==:[{$:X}],NoHeadDataLength={$},TotalLength={$} \n", (UINT8)strtemp, PacketLength, nLength);
  3371. return PACKET_USELESS;
  3372. }
  3373. }
  3374. else if (((BYTE)RecData[i] == 0x0D) && (3 == i))
  3375. {
  3376. bHasHead = true;
  3377. PacketLength = i + 1; //+1 because ETX
  3378. char strtemp[Delta_Com_NormalLen] = { 0 };
  3379. memcpy(strtemp, RecData, PacketLength); //只有ETX+数据,-2 排除 checkSum ETX。
  3380. mLog::FINFO("==IN==:[{$}]", strtemp);
  3381. DeltaDevice::m_tDelivermodule.CheckReceive(strtemp, 2);
  3382. return PACKET_ISPACKET;
  3383. }
  3384. }
  3385. if (bHasHead)
  3386. {
  3387. PacketLength = 0;
  3388. }
  3389. return PACKET_NOPACKET;
  3390. }
  3391. bool nsGEN::DeltaDriver::GetDeviceConfig(std::string& Cfg)
  3392. {
  3393. Cfg = m_DeviceConfigSend.encode();
  3394. return true;
  3395. }
  3396. bool nsGEN::DeltaDriver::SetDeviceConfig(std::string Cfg)
  3397. {
  3398. mLog::FINFO("--Func-- SetDeviceConfig {$}", Cfg.c_str());
  3399. ResDataObject DeviceConfig;
  3400. DeviceConfig.decode(Cfg.c_str());
  3401. ResDataObject DescriptionTempEx;
  3402. DescriptionTempEx = DeviceConfig["DeviceConfig"]["Attribute"];
  3403. mLog::FINFO("Attribute:{$}", DescriptionTempEx.encode());
  3404. bool bSaveFile = false; //true:重新保存配置文件
  3405. string strAccess = "";
  3406. for (int i = 0; i < DescriptionTempEx.size(); i++)
  3407. {
  3408. string strKey = DescriptionTempEx.GetKey(i);
  3409. mLog::FINFO("{$}", strKey.c_str());
  3410. try
  3411. {
  3412. if (m_pAttribute->GetFirstOf(strKey.c_str()) >= 0)
  3413. {
  3414. strAccess = (string)(*m_pDescription)[strKey.c_str()]["Access"];
  3415. if ("RW" == strAccess)
  3416. {
  3417. //修改对应配置,在其他单元的配置项要同时调用其修改函数修改真实值
  3418. //1. 修改内存中的值,用于给上层发消息
  3419. (*m_pAttribute)[strKey.c_str()] = DescriptionTempEx[i];
  3420. //2. 拿到Innerkey
  3421. int nConfigInfoCount = (int)m_Configurations["ConfigToolInfo"].GetKeyCount("AttributeInfo");
  3422. mLog::FINFO("nConfigInfoCount {$}", nConfigInfoCount);
  3423. string strTemp = ""; //存储AttributeKey
  3424. for (int nInfoIndex = 0; nInfoIndex < nConfigInfoCount; nInfoIndex++)
  3425. {
  3426. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeKey"];
  3427. if (strTemp == strKey)
  3428. {
  3429. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["InnerKey"];
  3430. break;
  3431. }
  3432. }
  3433. //3. 修改配置文件中的值
  3434. if (SetDeviceConfigValue(m_Configurations, strTemp.c_str(), 1, DescriptionTempEx[i]))
  3435. {
  3436. mLog::FINFO("SetDeviceConfigValue over");
  3437. bSaveFile = true;
  3438. }
  3439. }
  3440. else
  3441. {
  3442. mLog::FINFO("{$} is not a RW configuration item", strKey.c_str());
  3443. }
  3444. }
  3445. else
  3446. {
  3447. mLog::FINFO("without this attribute {$}", strKey.c_str());
  3448. }
  3449. }
  3450. catch (ResDataObjectExption& e)
  3451. {
  3452. mLog::FERROR("SetDriverConfig crashed: {$}", e.what());
  3453. return false;
  3454. }
  3455. }
  3456. if (bSaveFile)
  3457. {
  3458. //3. 重新保存配置文件
  3459. SaveConfigFile(true);
  3460. }
  3461. return true;
  3462. }
  3463. bool nsGEN::DeltaDriver::SaveConfigFile(bool bSendNotify)
  3464. {
  3465. m_ConfigAll["CONFIGURATION"] = m_Configurations;
  3466. bool bRt = m_ConfigAll.SaveFile(m_ConfigFileName.c_str());
  3467. mLog::FINFO("SaveConfigFile over {$}", bRt);
  3468. return true;
  3469. }
  3470. bool nsGEN::DeltaDriver::GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue)
  3471. {
  3472. strValue = "";
  3473. string strTemp = pInnerKey;
  3474. if (1 == nPathID) //从DriverConfig路径下每个DPC自己的配置文件读取
  3475. {
  3476. int pos = 0;
  3477. ResDataObject resTemp = config;
  3478. while ((pos = strTemp.find_first_of(',')) != string::npos)
  3479. {
  3480. string Key = strTemp.substr(0, pos);
  3481. string TempValue = resTemp[Key.c_str()].encode();
  3482. resTemp.clear();
  3483. resTemp.decode(TempValue.c_str());
  3484. strTemp = strTemp.substr(pos + 1, strTemp.length() - pos - 1);
  3485. }
  3486. if (strTemp != "")
  3487. {
  3488. strValue = (string)resTemp[strTemp.c_str()];
  3489. }
  3490. else
  3491. {
  3492. strValue = (string)resTemp;
  3493. }
  3494. }
  3495. return true;
  3496. }
  3497. bool nsGEN::DeltaDriver::SetDeviceConfigValue(ResDataObject& config, const char* pInnerKey, int nPathID, const char* szValue)
  3498. {
  3499. string strTemp = pInnerKey;
  3500. mLog::FINFO("Begin to change {$} item value to {$}", pInnerKey, szValue);
  3501. if (1 == nPathID) //从DriverConfig路径下每个DPC自己的配置文件读取
  3502. {
  3503. try {
  3504. int pos = 0;
  3505. ResDataObject* resTemp = &config;
  3506. while ((pos = strTemp.find_first_of(',')) != string::npos)
  3507. {
  3508. string Key = strTemp.substr(0, pos);
  3509. resTemp = &(*resTemp)[Key.c_str()];
  3510. strTemp = strTemp.substr(pos + 1, strTemp.length() - pos - 1);
  3511. }
  3512. if (strTemp != "")
  3513. {
  3514. (*resTemp)[strTemp.c_str()] = szValue;
  3515. }
  3516. else
  3517. {
  3518. *resTemp = szValue;
  3519. }
  3520. }
  3521. catch (ResDataObjectExption& e)
  3522. {
  3523. mLog::FERROR("SetDriverConfigvalue crashed: {$}", e.what());
  3524. return false;
  3525. }
  3526. }
  3527. return true;
  3528. }
  3529. //-----------------------------------------------------------------------------
  3530. // GetIODriver & CreateIODriver
  3531. //-----------------------------------------------------------------------------
  3532. static nsGEN::DeltaDriver gIODriver;
  3533. extern "C" CCOS::Dev::IODriver * __cdecl GetIODriver() // 返回静态对象的引用, 调用者不能删除 !
  3534. {
  3535. return &gIODriver;
  3536. }
  3537. extern "C" CCOS::Dev::IODriver * __cdecl CreateIODriver() // 返回新对象, 调用者必须自行删除此对象 !
  3538. {
  3539. return new nsGEN::DeltaDriver();
  3540. }