Detector_CareRayRF.cpp 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428
  1. #include "stdafx.h"
  2. #include "Detector_CareRayRF.h"
  3. #include "CCOS.Dev.FPD.CareRayRF.h"
  4. extern Log4CPP::Logger* gLogger;
  5. Detector_CareRayRF* g_pCarerayInstance = NULL;
  6. constexpr auto FRAME_NUMBER = 60;
  7. constexpr auto RAD_HEADER_SIZE = 65536; //SDK Rad模式图像头
  8. inline int GetReturnCode(int nCode) { return nCode / 100000; }
  9. Detector_CareRayRF* g_pDetector = nullptr;
  10. #define LOAD_PROC_ADDRESS(handle,func) \
  11. if ((func = (CB_##func)GetProcAddress(handle, #func)) == NULL) { printf("Error occurs while loading entry point!!! \n'%s'\n", #func); }\
  12. Detector_CareRayRF::Detector_CareRayRF()
  13. {
  14. g_pCarerayInstance = this;
  15. m_pDPC2PanelID = new map<void*, int>();
  16. m_pPanelID2DPC = new map<int, void*>();
  17. m_nPanelCount = 0;
  18. m_hCareRayRFModule = nullptr;
  19. m_pCallbackPtrs = nullptr;
  20. m_nCurrentPanelID = 0;
  21. m_nCurrentDetIndex = -1;
  22. m_mapModeInfo = nullptr;
  23. m_bFPDConnected = false;
  24. m_nFrmHeaderLen = 0;
  25. m_nLastLogicMode = -1;
  26. m_nCurrentLogicMode = -1;
  27. m_nExamType = CR_FluExtSync;
  28. m_pImageBuffer = nullptr;
  29. m_pRawImgBuffer = nullptr;
  30. m_pFullImgBuffer = nullptr;
  31. m_bSaveRaw = false;
  32. m_strWorkPath = "";
  33. m_eCaliType = CCOS_CALIBRATION_TYPE_NONE;
  34. m_eStatus = DetStatus_NotIni;
  35. m_bAbortCalibration = false;
  36. m_bCancelFlag = false;
  37. m_nImageHeight = 0;
  38. m_nImageWidth = 0;
  39. m_nCropLeft = 0;
  40. m_nCropRight = 0;
  41. m_nCropTop = 0;
  42. m_nCropBottom = 0;
  43. m_nRawImgHeight = 0;
  44. m_nRawImgWidth = 0;
  45. m_nCbImgIndex = 0;
  46. m_nAcqReadyTimeout = 20;
  47. m_nGainReadyTimeout = 20;
  48. m_nOftRefreshTime = 20;
  49. m_bIsRadMode = false;
  50. m_bSendImgToUpper = true;
  51. m_nDropImgNum = 0;
  52. m_nDropImgCount = 0;
  53. m_nExamMode = APP_STATUS_MAX;
  54. m_bAbortRefreshOft = false;
  55. m_hFPDScanThread = nullptr;
  56. m_fFrameRate = 10.0f; //缺省值,10帧每秒
  57. m_nReadoutTime = 0;
  58. m_nDelayTime = 0;
  59. m_nTimePercentage = 100;
  60. m_bStartGrab = false;
  61. m_nValidImgNum = 0;
  62. m_nExposureCount = 0;
  63. m_nExiThreshold = 200;//新增配置
  64. m_nImageBits = 16;
  65. m_bFirstImage = true;
  66. m_nModeID = 0;
  67. m_nGainLevel = 3;
  68. m_nExpTime = 0;
  69. m_vCtrlDetectorModeList.clear();
  70. m_bHaveRadMode = false;
  71. m_hStopScanEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  72. m_hAcqEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  73. m_hGainEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  74. m_hDarkEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  75. m_hProcessImgEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  76. m_hArrayEvent[0] = m_hStopScanEvent;
  77. m_hArrayEvent[1] = m_hAcqEvent;
  78. m_hArrayEvent[2] = m_hGainEvent;
  79. m_hArrayEvent[3] = m_hDarkEvent;
  80. m_hArrayEvent[4] = m_hProcessImgEvent;
  81. m_hStopOffsetEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  82. m_hStartAllOffset = CreateEvent(NULL, FALSE, FALSE, NULL);
  83. m_hStartOffset = CreateEvent(NULL, FALSE, FALSE, NULL);
  84. m_hAbortOffset = CreateEvent(NULL, FALSE, FALSE, NULL);
  85. m_hOffsetEvent[0] = m_hStopOffsetEvent;
  86. m_hOffsetEvent[1] = m_hStartAllOffset;
  87. m_hOffsetEvent[2] = m_hStartOffset;
  88. m_hOffsetEvent[3] = m_hAbortOffset;
  89. m_hGainReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  90. m_hImageEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  91. }
  92. Detector_CareRayRF::~Detector_CareRayRF()
  93. {
  94. FINFO("~Detector_CareRayRF");
  95. if (m_hStopScanEvent)
  96. {
  97. CloseHandle(m_hStopScanEvent);
  98. m_hStopScanEvent = nullptr;
  99. }
  100. if (m_hAcqEvent)
  101. {
  102. CloseHandle(m_hAcqEvent);
  103. m_hAcqEvent = nullptr;
  104. }
  105. if (m_hGainEvent)
  106. {
  107. CloseHandle(m_hGainEvent);
  108. m_hGainEvent = nullptr;
  109. }
  110. if (m_hGainReadyEvent)
  111. {
  112. CloseHandle(m_hGainReadyEvent);
  113. m_hGainReadyEvent = nullptr;
  114. }
  115. if (m_hDarkEvent)
  116. {
  117. CloseHandle(m_hDarkEvent);
  118. m_hDarkEvent = nullptr;
  119. }
  120. if (m_hProcessImgEvent)
  121. {
  122. CloseHandle(m_hProcessImgEvent);
  123. m_hProcessImgEvent = nullptr;
  124. }
  125. if (m_hImageEvent)
  126. {
  127. CloseHandle(m_hImageEvent);
  128. m_hImageEvent = nullptr;
  129. }
  130. if (m_pCallbackPtrs)
  131. {
  132. delete m_pCallbackPtrs;
  133. m_pCallbackPtrs = nullptr;
  134. }
  135. if (m_pImageBuffer)
  136. {
  137. free(m_pImageBuffer);
  138. m_pImageBuffer = nullptr;
  139. }
  140. if (m_pRawImgBuffer)
  141. {
  142. delete[]m_pRawImgBuffer;
  143. m_pRawImgBuffer = nullptr;
  144. }
  145. if (m_pFullImgBuffer != nullptr)
  146. {
  147. delete[]m_pFullImgBuffer;
  148. m_pFullImgBuffer = nullptr;
  149. }
  150. if (m_mapModeInfo != nullptr)
  151. {
  152. delete[]m_mapModeInfo;
  153. m_mapModeInfo = nullptr;
  154. }
  155. m_vCtrlDetectorModeList.clear();
  156. }
  157. bool Detector_CareRayRF::DriverEntry(void* pDrvDPC, ResDataObject& Configuration)
  158. {
  159. printf("========DriverEntry %p\n", pDrvDPC);
  160. FINFO("========DriverEntry {$}", pDrvDPC);
  161. map<void*, int>::iterator DPCsIter = m_pDPC2PanelID->find(pDrvDPC);
  162. if (DPCsIter != m_pDPC2PanelID->end())
  163. {
  164. //printf("This DPC already exist\n");
  165. FERROR("This DPC already exist");
  166. return false;
  167. }
  168. m_pDPC2PanelID->insert(pair<void*, int>(pDrvDPC, m_nPanelCount));
  169. m_pPanelID2DPC->insert(pair<int, void*>(m_nPanelCount, pDrvDPC));
  170. m_nPanelCount++;
  171. m_ModeConfig = Configuration; //记录配置 --目前只有一个平板,多板时应该分别存储
  172. FINFO("m_ModeConfig:{$}", m_ModeConfig.encode());
  173. return true;
  174. }
  175. bool Detector_CareRayRF::Connect(void* pDrvDPC, const char* szWorkPath, ResDataObject& DetectorModeList)
  176. {
  177. printf("========Connect detector begin \r\n");
  178. FINFO("========Connect detector begin \n");
  179. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  180. {
  181. FERROR("Not current DPC, return true");
  182. return true;
  183. }
  184. m_strWorkPath = szWorkPath;
  185. if (!LoadDll(szWorkPath))
  186. {
  187. FERROR("Load dll failed, Connect failed \n");
  188. return false;
  189. }
  190. if (!OpenDetector())
  191. {
  192. FERROR("Open detector failed, Connect failed \n");
  193. return false;
  194. }
  195. PrintModeList(DetectorModeList);
  196. GetSystemInfo(m_nCurrentDetIndex);
  197. try
  198. {
  199. int nModeCount = (int)m_ModeConfig["ModeTable"].size();
  200. FINFO("nModeCount:{$}", nModeCount);
  201. //FINFO("m_ModeConfig[ModeTable][i]:{$}", m_ModeConfig["ModeTable"][0].encode());
  202. for (int i = 0; i < nModeCount; i++)
  203. {
  204. int nAppModeID = (int)m_ModeConfig["ModeTable"][i]["LogicMode"];
  205. int nModeID = (int)m_ModeConfig["ModeTable"][i]["OperationMode"];
  206. int nGainID = (int)m_ModeConfig["ModeTable"][i]["GainValue"];
  207. string strFrameRate = (string)m_ModeConfig["ModeTable"][i]["Frequency"];
  208. float fFrameRate = stof(strFrameRate.c_str());
  209. int nExpTime = (int)m_ModeConfig["ModeTable"][i]["ExpTime"];//为0时,探测器将赋值为真正的开窗时间(积分时间)
  210. int nTrigType = (int)m_ModeConfig["ModeTable"][i]["ExamType"];
  211. m_nDelayTime = (int)m_ModeConfig["ModeTable"][i]["DelayTime"];
  212. if (!RegisterAppMode(nAppModeID, nModeID, nGainID, fFrameRate, nExpTime, nTrigType))//Connect
  213. {
  214. FERROR("Connect-Register appmode failed, Connect failed!");
  215. return false;
  216. }
  217. }
  218. m_nExiThreshold = (int)m_ModeConfig["ExiThreshold"];
  219. FINFO("image exi threshold:{$}", m_nExiThreshold);
  220. m_nAcqReadyTimeout = (int)m_ModeConfig["WorkReadyTimeout"];
  221. m_nGainReadyTimeout = (int)m_ModeConfig["GainReadyTimeout"];
  222. m_nOftRefreshTime = (int)m_ModeConfig["OffsetInterval"];
  223. FINFO("Acq ready timeout({$}), Gain timeout({$}), OftRefresh time({$})", m_nAcqReadyTimeout, m_nGainReadyTimeout, m_nOftRefreshTime);
  224. }
  225. catch (ResDataObjectExption &e)
  226. {
  227. FERROR("Get config error: {$}", e.what());
  228. return false;
  229. }
  230. if (nullptr == m_hFPDScanThread)
  231. {
  232. unsigned uThreadId;
  233. _beginthreadex(NULL, 0, onFPDScanThread, this, 0, &uThreadId);
  234. m_hFPDScanThread = OpenThread(THREAD_ALL_ACCESS, TRUE, uThreadId);
  235. }
  236. if (nullptr == m_hOffsetThread)
  237. {
  238. unsigned uThreadId;
  239. _beginthreadex(NULL, 0, RefreshOffsetThread, this, 0, &uThreadId);
  240. m_hOffsetThread = OpenThread(THREAD_ALL_ACCESS, TRUE, uThreadId);
  241. }
  242. m_bFPDConnected = true;
  243. FINFO("Connect over");
  244. printf("Connect over \n");
  245. return true;
  246. }
  247. void Detector_CareRayRF::DisConnect()
  248. {
  249. printf("========DisConnect with detector \n");
  250. FINFO("========DisConnect");
  251. int nRet = CR_OK;
  252. if (DetStatus_XrayCalibration == GetCareRayDPCStatus() || DetStatus_Offset == GetCareRayDPCStatus())
  253. {
  254. FINFO("DisConnect Calling StopCalibration");
  255. nRet = CR_StopCalibration(m_nCurrentDetIndex);
  256. if (TestError(nRet))
  257. {
  258. FERROR("StopCalibration command failed");
  259. }
  260. m_bAbortRefreshOft = true; //退出时停止offset线程
  261. }
  262. FINFO("Calling Disconnect");
  263. nRet = CR_Disconnect(m_nCurrentDetIndex);
  264. if (TestError(nRet))
  265. {
  266. FERROR("Disconnect command failed");
  267. }
  268. }
  269. void Detector_CareRayRF::EnterExamMode(int nExamMode)
  270. {
  271. switch (nExamMode)
  272. {
  273. case APP_STATUS_WORK_BEGIN:
  274. FINFO("Enter into Exam Windows");
  275. m_nExamMode = APP_STATUS_WORK_BEGIN;
  276. break;
  277. case APP_STATUS_WORK_END:
  278. FINFO("Quit Exam Windows");
  279. m_nExamMode = APP_STATUS_WORK_END;
  280. break;
  281. case APP_STATUS_DETSHARE_BEGIN:
  282. FINFO("Enter into Detector Share Windows");
  283. m_nExamMode = APP_STATUS_DETSHARE_BEGIN;
  284. break;
  285. case APP_STATUS_DETSHAR_END:
  286. m_nExamMode = APP_STATUS_IDLE;
  287. FINFO("Quit Detector Share Windows");
  288. m_nExamMode = APP_STATUS_DETSHAR_END;
  289. break;
  290. case APP_STATUS_CAL_BEGIN:
  291. FINFO("Enter into Calibration Windows");
  292. m_nExamMode = APP_STATUS_CAL_BEGIN;
  293. break;
  294. case APP_STATUS_CAL_END:
  295. FINFO("Quit Calibration Windows");
  296. m_nExamMode = APP_STATUS_CAL_END;
  297. break;
  298. case APP_STATUS_WORK_IN_SENSITIVITY:
  299. FINFO("Enter into sensitivity test interface");
  300. m_nExamMode = APP_STATUS_WORK_IN_SENSITIVITY;
  301. break;
  302. default:
  303. break;
  304. }
  305. if (APP_STATUS_WORK_END == m_nExamMode)
  306. {
  307. if (DetStatus_Acquire == GetCareRayDPCStatus())
  308. {
  309. FINFO("quit exam but detector status is acquire,so stop acquire");
  310. StopAcquisitionInside();
  311. }
  312. }
  313. }
  314. bool Detector_CareRayRF::SetAcqMode(int nMode)
  315. {
  316. printf("========SetAcqMode nMode:%d \n", nMode);
  317. FINFO("========SetAcqMode nMode:{$}",nMode);
  318. if (m_nCurrentLogicMode == nMode)
  319. {
  320. FINFO("Same mode, return");
  321. return true;
  322. }
  323. if (DetStatus_Acquire == GetCareRayDPCStatus())
  324. {
  325. FINFO("SetAcqMode stop acquisition inside");
  326. StopAcquisitionInside();
  327. }
  328. //只有RAD模式读取全部的配置文件,CF和PF不读取全部配置,只读取部分
  329. try
  330. {
  331. int nModeCount = (int)m_ModeConfig["ModeTable"].size();
  332. for (int i = 0; i < nModeCount; i++)
  333. {
  334. int logicMode = (int)m_ModeConfig["ModeTable"][i]["LogicMode"];//SetAcqMode
  335. if (logicMode == nMode)
  336. {
  337. //FINFO("ModeTable22 {$}, {$}", i, m_ModeConfig["ModeTable"][i].encode());
  338. printf("find LogicMode == nMode \n");
  339. FINFO("find LogicMode == nMode");
  340. if (nMode == RAD)
  341. {
  342. m_nRawImgWidth = (int)m_ModeConfig["ModeTable"][i]["RawImgHeight"];
  343. m_nRawImgHeight = (int)m_ModeConfig["ModeTable"][i]["RawImgWidth"];
  344. m_nImageWidth = (int)m_ModeConfig["ModeTable"][i]["ImageWidth"];
  345. m_nImageHeight = (int)m_ModeConfig["ModeTable"][i]["ImageHeight"];
  346. m_nModeID = (int)m_ModeConfig["ModeTable"][i]["OperationMode"];
  347. string strFrameRate = (string)m_ModeConfig["ModeTable"][i]["Frequency"];
  348. m_fFrameRate = stof(strFrameRate);
  349. FINFO("m_nRawImgWidth: {$}, m_nRawImgHeight: {$},m_nImageWidth: {$}, m_nImageHeight: {$}, m_nModeID: {$}, m_fFrameRate: {$}",
  350. m_nRawImgWidth, m_nRawImgHeight, m_nImageWidth, m_nImageHeight, m_nModeID, m_fFrameRate);
  351. //1800RF单独的点片模式ID是16
  352. if (m_bHaveRadMode && m_nModeID == 16)
  353. {
  354. m_bIsRadMode = true;
  355. }
  356. }
  357. else
  358. {
  359. m_bIsRadMode = false;
  360. }
  361. //每次采集前裁剪值都重新从模型文件中读取,避免点片和透视使用相同的裁剪值
  362. m_nCropLeft = (int)m_ModeConfig["ModeTable"][i]["CropLeft"];
  363. m_nCropRight = (int)m_ModeConfig["ModeTable"][i]["CropRight"];
  364. m_nCropTop = (int)m_ModeConfig["ModeTable"][i]["CropTop"];
  365. m_nCropBottom = (int)m_ModeConfig["ModeTable"][i]["CropBottom"];
  366. FINFO("m_nCropLeft: {$}, m_nCropRight: {$}, m_nCropTop: {$}, m_nCropBottom:{$}",
  367. m_nCropLeft, m_nCropRight, m_nCropTop, m_nCropBottom);
  368. m_nImageBits = (int)m_ModeConfig["ModeTable"][i]["PhySizeInfoBit"];
  369. m_nDropImgCount = (int)m_ModeConfig["ModeTable"][i]["DropImgCount"];
  370. m_bSaveRaw = (int)m_ModeConfig["ModeTable"][i]["IsSaveRaw"];
  371. m_nReadoutTime = (int)m_ModeConfig["ModeTable"][i]["ReadoutTime"];
  372. m_nTimePercentage = (int)m_ModeConfig["ModeTable"][i]["TimePercentage"];
  373. FINFO("m_nImageBits: {$}, DropImgCount: {$}, SaveRaw: {$}, ReadoutTime:{$}, TimePercentage:{$}",
  374. m_nImageBits, m_nDropImgCount, m_bSaveRaw, m_nReadoutTime, m_nTimePercentage);
  375. m_nGainLevel = (int)m_ModeConfig["ModeTable"][i]["GainValue"];
  376. m_nExpTime = (int)m_ModeConfig["ModeTable"][i]["ExpTime"];//为0时,探测器将赋值为真正的开窗时间(积分时间)
  377. m_nExamType = (int)m_ModeConfig["ModeTable"][i]["ExamType"];
  378. FINFO("GainValue:{$},ExpTime:{$},ExamType:{$}", m_nGainLevel, m_nExpTime, m_nExamType);
  379. break;
  380. }
  381. }
  382. }
  383. catch (ResDataObjectExption& e)
  384. {
  385. FERROR("Read configuration failed, Error code: {$}", e.what());
  386. return false;
  387. }
  388. m_nCurrentLogicMode = nMode;
  389. m_nValidImgNum = 0; //选择模式,恢复初值
  390. return true;
  391. }
  392. /***
  393. ** 说明:曝光开始时调用
  394. ***/
  395. bool Detector_CareRayRF::SetXrayOnNum()
  396. {
  397. printf("========SetXrayOnNum \n");
  398. FINFO("========SetXrayOnNum");
  399. m_bStartGrab = true; //曝光第一次,表示开始采集
  400. m_dwBeginTime = GetTickCount64();
  401. FINFO("SetXrayOnNum m_dwBeginTime:{$}", m_dwBeginTime);
  402. return true;
  403. }
  404. /***
  405. ** 说明:设置曝光总数
  406. ** TOMO模式根据这个值自动停止采集
  407. ** 参数:nTimes,曝光总数,如果小于0,则不用这个逻辑来停止采集
  408. ***/
  409. bool Detector_CareRayRF::SetExposureTimes(int nTimes)
  410. {
  411. FINFO("========SetExposureTimes({$})", nTimes);
  412. m_nExposureCount = nTimes;
  413. return true;
  414. }
  415. bool Detector_CareRayRF::PrepareAcquisition(void* pDrvDPC)
  416. {
  417. printf("========PrepareAcquisition \n");
  418. FINFO("========PrepareAcquisition ");
  419. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  420. {
  421. FERROR("Not current DPC, return");
  422. return false;
  423. }
  424. if (-1 == m_nCurrentLogicMode)
  425. {
  426. FERROR("Illegal exam mode");
  427. return false;
  428. }
  429. return true;
  430. }
  431. bool Detector_CareRayRF::StartAcquisition(void* pDrvDPC)
  432. {
  433. printf("========StartAcquisition \n");
  434. FINFO("========StartAcquisition ");
  435. bool bRet = false;
  436. int nRet = 0;
  437. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  438. {
  439. FERROR("Not current DPC, return");
  440. return bRet;
  441. }
  442. if (-1 == m_nCurrentLogicMode)
  443. {
  444. FERROR("Illegal exam mode");
  445. }
  446. else
  447. {
  448. m_bSendImgToUpper = true; //开始采集,恢复初值
  449. m_bValidImage = false; //开始采集,恢复初值
  450. m_nDropImgNum = 0; //开始采集,恢复初值
  451. m_bFirstImage = true;
  452. }
  453. //重新注册模式相关信息
  454. FINFO("StartAcquisition RegisterAppMode appModeKey:{$},m_nModeID:{$},m_nGainLevel:{$},m_fFrameRate:{$},m_nExpTime:{$},m_nExamType:{$}",
  455. m_nCurrentLogicMode, m_nModeID, m_nGainLevel, m_fFrameRate, m_nExpTime, m_nExamType);
  456. if (!RegisterAppMode(m_nCurrentLogicMode, m_nModeID, m_nGainLevel, m_fFrameRate, m_nExpTime, m_nExamType))//StartAcquisition
  457. {
  458. FERROR("StartAcquisition-Register appmode failed!");
  459. return bRet;
  460. }
  461. FINFO("StartAcquisition m_nLastLogicMode:{$},m_nCurrentLogicMode:{$}", m_nLastLogicMode, m_nCurrentLogicMode);
  462. //模式发生变化,重新加载校正文件
  463. if (m_nLastLogicMode != m_nCurrentLogicMode)
  464. {
  465. m_nLastLogicMode = m_nCurrentLogicMode;
  466. LoadCalibrationFiles();
  467. }
  468. m_bCancelFlag = false;
  469. if (m_bIsRadMode)
  470. {
  471. SetEvent(m_hAcqEvent);
  472. bRet = true;
  473. }
  474. else
  475. {
  476. //开始采集
  477. int nBuffSize = (m_stSystemInfo.nRawImageWidth * m_stSystemInfo.nRawImageHeight * sizeof(unsigned short) + m_stSystemInfo.nFrmHeaderLen) * FRAME_NUMBER;
  478. FINFO("Calling CR_StartAcquisition appmode:{$},nBuffSize:{$}", m_nCurrentLogicMode, nBuffSize);
  479. nRet = CR_StartAcquisition(m_nCurrentDetIndex, m_nCurrentLogicMode, m_pImageBuffer, nBuffSize, -1);//StartAcquisition
  480. if (TestError(nRet))
  481. {
  482. FERROR("Call CR_StartAcquisition failed!");
  483. }
  484. else
  485. {
  486. SetCareRayDPCStatus(DetStatus_Acquire); //动态模式激活采集,设置状态
  487. bRet = true;
  488. }
  489. }
  490. return bRet;
  491. }
  492. bool Detector_CareRayRF::StopAcquisition(void* pDrvDPC)
  493. {
  494. printf("========StopAcquisition \n");
  495. FINFO("========StopAcquisition ");
  496. bool bRet = false;
  497. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  498. {
  499. //printf("Not current DPC, return\n");
  500. FERROR("Not current DPC, return");
  501. return bRet;
  502. }
  503. if (DetStatus_Acquire == GetCareRayDPCStatus())
  504. {
  505. if (m_nExposureCount > 0 && m_bStartGrab)
  506. {
  507. //TOMO模式等图
  508. //1.窗口最大1000ms,所以每次等1000ms
  509. int nLoop = 0;
  510. int nLoopCount = m_nExposureCount - m_nValidImgNum + 2;
  511. FINFO("Exposure count: {$}, valid image count: {$}", m_nExposureCount, m_nValidImgNum);
  512. while (m_bStartGrab && (m_nValidImgNum < m_nExposureCount) && (nLoop < nLoopCount))
  513. {
  514. DWORD dwRet = WaitForSingleObject(m_hImageEvent, 1000);
  515. if (WAIT_TIMEOUT == dwRet)
  516. {
  517. FINFO("Waited 1000ms ({$}/{$})", nLoop, nLoopCount);
  518. }
  519. nLoop++;
  520. }
  521. }
  522. m_bCancelFlag = true; //rad采集,如果没采集到图像,设置标记位,退出采集
  523. FINFO("Calling StopAcquisition");
  524. int nRet = CR_StopAcquisition(m_nCurrentDetIndex);//StopAcquisition
  525. if (TestError(nRet))
  526. {
  527. FERROR("StopAcquisition command failed");
  528. }
  529. else
  530. {
  531. bRet = true;
  532. }
  533. m_bStartGrab = false; //停止采集,恢复初值
  534. m_nValidImgNum = 0; //停止采集,恢复初值
  535. m_nExposureCount = 0; //停止采集,恢复初值
  536. SetCareRayDPCStatus(DetStatus_Standby); //停止采集,设置状态
  537. }
  538. else
  539. {
  540. FINFO("Not in acquire status");
  541. //切换到静态采集后,进入了ready状态。但此时可以不开始采集,切换到别的模式,
  542. //因此需要将m_bCancelFlag置为true,停止轮询
  543. m_bCancelFlag = true; //rad采集,如果没采集到图像,设置标记位,退出采集
  544. // RAD PrepareAcquisition时,会设置m_bCancelFlag为false
  545. bRet = true;
  546. }
  547. return bRet;
  548. }
  549. bool Detector_CareRayRF::StopAcquisitionInside()
  550. {
  551. printf("========StopAcquisitionInside \n");
  552. FINFO("========StopAcquisitionInside ");
  553. bool bRet = false;
  554. if (DetStatus_Acquire == GetCareRayDPCStatus())
  555. {
  556. if (m_nExposureCount > 0 && m_bStartGrab)
  557. {
  558. //TOMO模式等图
  559. //1.窗口最大1000ms,所以每次等1000ms
  560. int nLoop = 0;
  561. int nLoopCount = m_nExposureCount - m_nValidImgNum + 2;
  562. FINFO("Exposure count: {$}, valid image count: {$}", m_nExposureCount, m_nValidImgNum);
  563. while (m_bStartGrab && (m_nValidImgNum < m_nExposureCount) && (nLoop < nLoopCount))
  564. {
  565. DWORD dwRet = WaitForSingleObject(m_hImageEvent, 1000);
  566. if (WAIT_TIMEOUT == dwRet)
  567. {
  568. FINFO("Waited 1000ms ({$}/{$})", nLoop, nLoopCount);
  569. }
  570. nLoop++;
  571. }
  572. }
  573. m_bCancelFlag = true; //rad采集,如果没采集到图像,设置标记位,退出采集
  574. FINFO("Calling StopAcquisition");
  575. int nRet = CR_StopAcquisition(m_nCurrentDetIndex);//StopAcquisitionInside
  576. if (TestError(nRet))
  577. {
  578. FERROR("StopAcquisition command failed");
  579. }
  580. else
  581. {
  582. bRet = true;
  583. }
  584. m_bStartGrab = false; //停止采集,恢复初值
  585. m_nValidImgNum = 0; //停止采集,恢复初值
  586. m_nExposureCount = 0; //停止采集,恢复初值
  587. SetCareRayDPCStatus(DetStatus_Standby); //停止采集,设置状态
  588. }
  589. else
  590. {
  591. FINFO("Not in acquire status");
  592. //切换到静态采集后,进入了ready状态。但此时可以不开始采集,切换到别的模式,
  593. //因此需要将m_bCancelFlag置为true,停止轮询
  594. m_bCancelFlag = true; //rad采集,如果没采集到图像,设置标记位,退出采集
  595. // RAD PrepareAcquisition时,会设置m_bCancelFlag为false
  596. bRet = true;
  597. }
  598. return bRet;
  599. }
  600. bool Detector_CareRayRF::ActiveCalibration(void* pDrvDPC, CCOS_CALIBRATION_TYPE eType)
  601. {
  602. printf("========ActiveCalibration \n");
  603. FINFO("========ActiveCalibration ");
  604. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  605. {
  606. //printf("Not current DPC, return\n");
  607. FERROR("Not current DPC, return");
  608. return false;
  609. }
  610. if (-1 == m_nCurrentLogicMode)
  611. {
  612. FERROR("Illegal exam mode");
  613. return false;
  614. }
  615. if (CCOS_CALIBRATION_TYPE_XRAY == eType)
  616. {
  617. SetCareRayDPCStatus(DetStatus_XrayCalibration);
  618. }
  619. m_eCaliType = eType;
  620. return true;
  621. }
  622. /***
  623. ** 校正时响应上层调用的FramePrep
  624. ** 目前只有纯点片模式,例如 1800RF的mode 16需要这个流程
  625. ***/
  626. bool Detector_CareRayRF::PrepareCalibration(void* pDrvDPC)
  627. {
  628. printf("========PrepareCalibration \n");
  629. FINFO("========PrepareCalibration ");
  630. bool bRet = false;
  631. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  632. {
  633. //printf("Not current DPC, return\n");
  634. FERROR("Not current DPC, return");
  635. return bRet;
  636. }
  637. if (GetCareRayDPCStatus() != DetStatus_XrayCalibration)
  638. {
  639. FINFO("Current status is not XrayCalibration, return succeed");
  640. return true;
  641. }
  642. if (m_nExamType == CR_RadExtSync)//PrepareCalibration
  643. {
  644. //这里应该只在第一次prepare时setevent,但第一次setevent之后,线程一直被占用着,
  645. //所以每次setevent也无所谓了,线程执行完毕后resetevent
  646. SetEvent(m_hGainEvent);
  647. DWORD dwRet = WaitForSingleObject(m_hGainReadyEvent, m_nGainReadyTimeout * 1000);
  648. if (dwRet != WAIT_OBJECT_0)
  649. {
  650. FERROR("Prepare calibration failed({$}), cancle it", dwRet);
  651. m_bAbortCalibration = true; //异常,多数是超时,终止校正轮询
  652. }
  653. else
  654. {
  655. bRet = true;
  656. }
  657. }
  658. else
  659. {
  660. bRet = true;
  661. }
  662. return bRet;
  663. }
  664. bool Detector_CareRayRF::StartCalibration(void* pDrvDPC)
  665. {
  666. printf("========StartCalibration \n");
  667. FINFO("========StartCalibration ");
  668. bool bRet = false;
  669. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  670. {
  671. //printf("Not current DPC, return\n");
  672. FERROR("Not current DPC, return");
  673. return bRet;
  674. }
  675. if (CCOS_CALIBRATION_TYPE_DARK == m_eCaliType)
  676. {
  677. SetEvent(m_hDarkEvent);
  678. bRet = true;
  679. }
  680. else if (CCOS_CALIBRATION_TYPE_XRAY == m_eCaliType)
  681. {
  682. bRet = StartGainCalibration();
  683. }
  684. return bRet;
  685. }
  686. bool Detector_CareRayRF::StopCalibration(void* pDrvDPC)
  687. {
  688. printf("========StopCalibration \n");
  689. FINFO("========StopCalibration ");
  690. bool bRet = false;
  691. int nRet = CR_OK;
  692. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  693. {
  694. //printf("Not current DPC, return\n");
  695. FERROR("Not current DPC, return");
  696. return bRet;
  697. }
  698. FINFO("StopCalibration Calling StopCalibration");
  699. nRet = CR_StopCalibration(m_nCurrentDetIndex);
  700. if (TestError(nRet))
  701. {
  702. FERROR("StopCalibration command failed");
  703. }
  704. else
  705. {
  706. bRet = true;
  707. }
  708. return bRet;
  709. }
  710. bool Detector_CareRayRF::LoadDll(string strWorkPath)
  711. {
  712. printf("========LoadDll \n");
  713. FINFO("========LoadDll start");
  714. string strSDKPath = "";
  715. try
  716. {
  717. strSDKPath = (string)m_ModeConfig["SDKPath"];
  718. }
  719. catch (ResDataObjectExption& e)
  720. {
  721. FERROR("Read configuration failed, Error code: {$}", e.what());
  722. return false;
  723. }
  724. string workpath = strWorkPath + strSDKPath;
  725. string drvpath = workpath + "\\CRInterface.dll";
  726. SetDllDirectory(workpath.c_str());
  727. m_hCareRayRFModule = LoadLibrary(drvpath.c_str());
  728. if (m_hCareRayRFModule == nullptr)
  729. {
  730. DWORD dw = GetLastError();
  731. FERROR("Load {$} failed! error code:{$}", drvpath, dw);
  732. return false;
  733. }
  734. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_InitializeLibrary);
  735. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_DeinitializeLibrary);
  736. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_GetDetectorIndexAndIPAddress);
  737. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_Connect);
  738. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_Disconnect);
  739. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_ResetDetector);
  740. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_GetSystemInformation);
  741. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_GetApplicationMode);
  742. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_RegisterApplicationMode);
  743. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_StartAcquisition);
  744. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_StopAcquisition);
  745. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_StartDarkCalibration);
  746. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_StartGainCalibration);
  747. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_StopCalibration);
  748. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_QueryCalibrationStatus);
  749. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_GetDetrStatus);
  750. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_RegisterEventCallback);
  751. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_LoadReference);
  752. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_UnloadReference);
  753. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_QueryAcquisitionStatus);
  754. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_PermitExposure);
  755. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_GetImage);
  756. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_GetConnectionStatus);
  757. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_StartDarkAcquisition);
  758. LOAD_PROC_ADDRESS(m_hCareRayRFModule, CR_GetLastIntlMsg);
  759. FINFO("LoadDll end");
  760. return true;
  761. }
  762. bool Detector_CareRayRF::OpenDetector()
  763. {
  764. printf("========OpenDetector \n");
  765. FINFO("========OpenDetector ");
  766. FINFO("Calling InitializeLibrary");
  767. CR_InitializeLibrary();
  768. int nRet = CR_OK;
  769. int nDetrNum = 0;
  770. CR_DetrIdxAndIPAddr oDetrIdxAndIPAddr[16];
  771. FINFO("Calling GetDetectorIndexAndIPAddress");
  772. nRet = CR_GetDetectorIndexAndIPAddress(oDetrIdxAndIPAddr, &nDetrNum);
  773. if (TestError(nRet))
  774. {
  775. FERROR("GetDetectorIndexAndIPAddress command failed");
  776. return false;
  777. }
  778. for (int i = 0; i < nDetrNum; i++)
  779. {
  780. FINFO("Detector index:{$}, IP:{$}", oDetrIdxAndIPAddr[i].nIdx, oDetrIdxAndIPAddr[i].szIPAddr);
  781. }
  782. m_nCurrentDetIndex = oDetrIdxAndIPAddr[0].nIdx; //一般只能拿到1,除非在SDK db文件里配置"IP1;IP2"
  783. FINFO("OpenDetector m_nCurrentDetIndex:{$}", m_nCurrentDetIndex);
  784. m_pCallbackPtrs = new CallbackImp();
  785. FINFO("Calling RegisterEventCallback");
  786. CR_RegisterEventCallback(m_nCurrentDetIndex, m_pCallbackPtrs);
  787. FINFO("Calling Connect");
  788. nRet = CR_Connect(m_nCurrentDetIndex);
  789. if (TestError(nRet))
  790. {
  791. FERROR("Connect command failed");
  792. //return false;
  793. }
  794. FINFO("Calling ResetDetector");
  795. nRet = CR_ResetDetector(m_nCurrentDetIndex, false);
  796. if (TestError(nRet))
  797. {
  798. FERROR("ResetDetector command failed");
  799. //return false;
  800. }
  801. m_mapModeInfo = new CR_ModeInfo[16];
  802. FINFO("Calling GetApplicationMode");
  803. nRet = CR_GetApplicationMode(m_nCurrentDetIndex, m_mapModeInfo, &m_nModeNum);
  804. if (TestError(nRet))
  805. {
  806. FERROR("GetApplicationMode command failed");
  807. //return false;
  808. }
  809. FINFO("support mode number: {$}", m_nModeNum);
  810. FINFO("Open Detector Success--->");
  811. return true;
  812. }
  813. bool Detector_CareRayRF::TestError(int nErrorCode)
  814. {
  815. if (GetReturnCode(nErrorCode) >= CR_WARN)
  816. {
  817. char info[256];
  818. CR_GetLastIntlMsg(info, 256, -1);
  819. FINFO("ErrorCode:{$}, info:{$}", nErrorCode, info);
  820. //printf("ErrorCode:%d, %s \n", nErrorCode, info);
  821. if (GetReturnCode(nErrorCode) != CR_WARN) //warn返回成功,比如缺少校正文件,其它待考察 ys
  822. return nErrorCode;
  823. }
  824. return CR_OK;
  825. }
  826. void Detector_CareRayRF::PrintModeList(ResDataObject& DetectorModeList)
  827. {
  828. FINFO("========List of Supported Application Modes");
  829. unsigned long dpi = 0;
  830. for (int i = 0; i < m_nModeNum; i++)
  831. {
  832. FINFO("--> ModeID {$} Image dimension: {$} x {$} ", m_mapModeInfo[i].nModeID, m_mapModeInfo[i].nImageWidth, m_mapModeInfo[i].nImageHeight);
  833. FINFO("CutOffX:{$} CutOffY:{$}", m_mapModeInfo[i].nCutoffX, m_mapModeInfo[i].nCutoffY);
  834. FINFO("Binning scheme:{$} x {$}", m_mapModeInfo[i].nBinX, m_mapModeInfo[i].nBinY);
  835. FINFO("Pixel depth:{$},Max frame rate:{$},Description:{$}", m_mapModeInfo[i].nPixelDepth, m_mapModeInfo[i].fMaxFrmRate, m_mapModeInfo[i].szDesc);
  836. FINFO("DefaultGainLevel:{$} MaxExpTime:{$}", m_mapModeInfo[i].nDefaultGainLevel, m_mapModeInfo[i].fMaxExpTime);
  837. if ((unsigned long)m_mapModeInfo[i].nImageWidth * (unsigned long)m_mapModeInfo[i].nImageHeight > dpi)
  838. {
  839. dpi = m_mapModeInfo[i].nImageWidth * m_mapModeInfo[i].nImageHeight;
  840. m_nRawImgWidth = m_mapModeInfo[i].nImageWidth;
  841. m_nRawImgHeight = m_mapModeInfo[i].nImageHeight;
  842. }
  843. ResDataObject ModeInfo;
  844. ModeInfo.add("ModeID", m_mapModeInfo[i].nModeID);
  845. ModeInfo.add("ImageWidth", m_mapModeInfo[i].nImageWidth);
  846. ModeInfo.add("ImageHeight", m_mapModeInfo[i].nImageHeight);
  847. ModeInfo.add("CutOffX", m_mapModeInfo[i].nCutoffX);
  848. ModeInfo.add("CutOffY", m_mapModeInfo[i].nCutoffY);
  849. string temp;
  850. temp = to_string(m_mapModeInfo[i].nBinX) + "x" + to_string(m_mapModeInfo[i].nBinY);
  851. ModeInfo.add("BinningMode", temp.c_str());
  852. ModeInfo.add("MaxFrameRate", m_mapModeInfo[i].fMaxFrmRate);
  853. ModeInfo.add("GainID", m_mapModeInfo[i].nDefaultGainLevel);
  854. if (m_mapModeInfo[i].nModeID == 16)
  855. {
  856. ModeInfo.add("ExpTime", 500);
  857. }
  858. else
  859. {
  860. ModeInfo.add("ExpTime", 0);
  861. }
  862. DetectorModeList.add("ModeInfo", ModeInfo);
  863. }
  864. FINFO("DetectorModeList:{$}", DetectorModeList.encode());
  865. FINFO("Max image width:{$}, Max image height:{$}", m_nRawImgWidth, m_nRawImgHeight);
  866. if (nullptr != m_pRawImgBuffer)
  867. {
  868. delete[]m_pRawImgBuffer;
  869. m_pRawImgBuffer = nullptr;
  870. }
  871. m_pRawImgBuffer = new WORD[(size_t)m_nRawImgWidth * (size_t)m_nRawImgHeight];
  872. if (nullptr != m_pFullImgBuffer)
  873. {
  874. delete[]m_pFullImgBuffer;
  875. m_pFullImgBuffer = nullptr;
  876. }
  877. m_pFullImgBuffer = new WORD[(size_t)m_nRawImgWidth * (size_t)m_nRawImgHeight];
  878. FINFO("End of List");
  879. }
  880. bool Detector_CareRayRF::GetSystemInfo(int nFpdIndex)
  881. {
  882. CR_DetrStatus detrStatus;
  883. FINFO("Calling GetSystemInformation Get System information:");
  884. int nRet = CR_GetSystemInformation(nFpdIndex, &m_stSystemInfo);
  885. if (CR_OK == nRet)
  886. {
  887. FINFO("Raw image width (unit: pixels) = {$}", m_stSystemInfo.nRawImageWidth);//探测器出图最大宽度
  888. FINFO("Raw image height (unit: pixels) = {$}", m_stSystemInfo.nRawImageHeight);//探测器出图最大高度
  889. FINFO("tHardware version = {$}", m_stSystemInfo.szHardwareVersion);
  890. FINFO("Serial number = {$}", m_stSystemInfo.szSerialNumber);
  891. FINFO("Software version = {$}", m_stSystemInfo.szSoftwareVersion);
  892. FINFO("Firmware version = {$}", m_stSystemInfo.szFirmwareVersion);
  893. FINFO("Machine ID = {$}", m_stSystemInfo.szDetrMachineID);
  894. FINFO("Detector description = {$}", m_stSystemInfo.szDetrDesc);//"Product Model: CareView 1800RF" "Product Model: CareView 560RF" strstr
  895. m_nFrmHeaderLen = m_stSystemInfo.nFrmHeaderLen; //256
  896. FINFO("Frame Header Length:{$}", m_nFrmHeaderLen);
  897. //根据探测器描述识别当前探测器是否支持单独的点片(560RF不支持、1800RF支持)
  898. char* pTemp = nullptr;
  899. pTemp = strstr(m_stSystemInfo.szDetrDesc,"1800RF");
  900. if (pTemp)
  901. {
  902. FINFO("Current detector have rad mode!");
  903. m_bHaveRadMode = true;
  904. }
  905. else
  906. {
  907. FINFO("Current detector doesn't have rad mode!");
  908. m_bHaveRadMode = false;
  909. }
  910. unsigned long nBuffSize = (m_stSystemInfo.nRawImageWidth * m_stSystemInfo.nRawImageHeight * sizeof(unsigned short) + m_stSystemInfo.nFrmHeaderLen) * FRAME_NUMBER;
  911. FINFO("m_stSystemInfo.nRawImageWidth:{$},m_stSystemInfo.nRawImageHeight:{$},nBuffSize:{$}",
  912. m_stSystemInfo.nRawImageWidth, m_stSystemInfo.nRawImageHeight, nBuffSize);
  913. if (nullptr == m_pImageBuffer)
  914. {
  915. m_pImageBuffer = (WORD*)malloc(nBuffSize);
  916. if (nullptr == m_pImageBuffer)
  917. {
  918. FERROR("Image buffer is NULL");
  919. return false;
  920. }
  921. }
  922. memset(m_pImageBuffer, 0x0, nBuffSize);
  923. FINFO("Calling GetDetrStatus");
  924. nRet = CR_GetDetrStatus(nFpdIndex, &detrStatus);
  925. if (CR_OK == nRet)
  926. {
  927. FINFO("Current operating temperature = {$}", detrStatus.oDetrTemperature.fCurrent);
  928. FINFO("Current degrees Celsius = {$} degrees Fahrenheit", 32 + 9 * detrStatus.oDetrTemperature.fAvg / 5);
  929. FINFO("Overheat = {$} ", (1 == detrStatus.oDetrTemperature.nOverheat) ? "true" : "false");
  930. }
  931. }
  932. FINFO("Get System infor Over");
  933. return true;
  934. }
  935. bool Detector_CareRayRF::RegisterAppMode(int nNewAppModeKey, int nModeID, int nGainID, float fFrameRate, int nExpTime, int nTrigType)
  936. {
  937. FINFO("RegisterAppMode nNewAppModeKey:{$},ModeID:{$},GainID:{$},FrameRate:{$},ExpTime:{$},TriggerType:{$}",
  938. nNewAppModeKey, nModeID, nGainID, fFrameRate, nExpTime, nTrigType);
  939. bool bFindModeID = false;
  940. for (int nModeIndex = 0; nModeIndex < m_nModeNum; nModeIndex++)
  941. {
  942. if (nModeID == m_mapModeInfo[nModeIndex].nModeID)
  943. {
  944. bFindModeID = true;
  945. }
  946. }
  947. if (!bFindModeID)
  948. {
  949. FERROR("No coresponding ModeID in detector");
  950. return false;
  951. }
  952. switch (nTrigType)
  953. {
  954. case CR_RadExtSync:
  955. FINFO("1: rad external trigger");
  956. break;
  957. case CR_RadSoftSync:
  958. FINFO("2: rad soft trigger");
  959. break;
  960. case CR_RadAutoSync:
  961. FINFO("3: rad auto trigger");
  962. break;
  963. case CR_RadManualSync:
  964. FINFO("4: rad manual trigger");
  965. break;
  966. case CR_RadAedSync:
  967. FINFO("5: rad aed trigger");
  968. break;
  969. case CR_RadDaecSync:
  970. FINFO("6: rad daec trigger");
  971. break;
  972. case CR_FluReserved:
  973. FINFO("7: fluo free trigger");
  974. break;
  975. case CR_FluExtSync:
  976. FINFO("8: fluo external trigger");
  977. break;
  978. case CR_FluIntSync:
  979. FINFO("9: fluo internal trigger");
  980. break;
  981. default:
  982. FINFO("Unkown trigger type");
  983. break;
  984. }
  985. bool bIsFluoroMode = true;
  986. float fExpTime = nExpTime * 1.0f;
  987. int nRet = CR_OK;
  988. //rad mode id: 16,max frame rate:1; flu mode id: 101,max frame rate:4 如果mode id和triggertype 对不上会有问题,故配置文件中要慎重配置
  989. FINFO("Calling RegisterApplicationMode mode id:{$},trigger type:{$} ", nModeID, nTrigType);
  990. nRet = CR_RegisterApplicationMode(m_nCurrentDetIndex, nNewAppModeKey, nModeID, &fFrameRate, &fExpTime, nTrigType, nGainID,0,0);
  991. if (TestError(nRet))
  992. {
  993. FERROR("Register ApplicationMode failed!");
  994. return false;
  995. }
  996. else
  997. {
  998. FINFO("Register AppMode:{$},FrameRate:{$},ExpTime:{$},TriggerType:{$} Success", nNewAppModeKey, fFrameRate, fExpTime, nTrigType);
  999. }
  1000. return true;
  1001. }
  1002. bool Detector_CareRayRF::CalculateEXI(WORD* pImgData, int nImgWidth, int nImgHeight, int nImageBit, int nThreshold)
  1003. {
  1004. int nROIXL = static_cast<int>(0.3 * nImgWidth);
  1005. int nROIXR = static_cast<int>(0.7 * nImgWidth);
  1006. int nROIYL = static_cast<int>(0.3 * nImgHeight);
  1007. int nROIYR = static_cast<int>(0.7 * nImgHeight);
  1008. WORD* pSrc = NULL;
  1009. long nCount = 0;
  1010. DWORD64 nSum = 0;
  1011. int nEXI = 0;
  1012. try
  1013. {
  1014. for (int i = nROIYL; i < nROIYR; i++)
  1015. {
  1016. pSrc = pImgData + (i * nImgWidth);
  1017. for (int j = nROIXL; j < nROIXR; j++)
  1018. {
  1019. nSum += *(pSrc + j);
  1020. nCount++;
  1021. }
  1022. }
  1023. nEXI = (int)(nSum / nCount);
  1024. }
  1025. catch (...)
  1026. {
  1027. return false;
  1028. }
  1029. FINFO("Image EXI:{$}, Threshold:{$}", nEXI, nThreshold);
  1030. if (nEXI >= nThreshold)
  1031. {
  1032. FINFO("Image has xray!");
  1033. return true;//有x射线
  1034. }
  1035. return false;
  1036. }
  1037. bool Detector_CareRayRF::CheckImageExi(WORD* pImgData, int nImgWidth, int nImgHeight, WORD dwExiThrethold)
  1038. {
  1039. if (dwExiThrethold <= 0)
  1040. {
  1041. return true;
  1042. }
  1043. FINFO("Check image exi...");
  1044. bool bResult = CalculateEXI(pImgData, nImgWidth, nImgHeight, 16, dwExiThrethold);
  1045. if (bResult)
  1046. {
  1047. return true;
  1048. }
  1049. FINFO("Check image exi---black Image");
  1050. return false;
  1051. }
  1052. //nIndex 缺省-1,当使用缺省值时代表是静态模式,图像名不记录序号
  1053. void Detector_CareRayRF::OnProcessImage(int nWidth, int nHeight, int nIndex)
  1054. {
  1055. printf("========OnProcessImage \n");
  1056. FINFO("========OnProcessImage nWidth:{$},nHeight:{$},nIndex:{$}", nWidth, nHeight, nIndex);
  1057. int ret = 0;
  1058. bool bImageCrop = false;
  1059. if (m_nCropLeft != 0 || m_nCropTop != 0 || m_nCropRight != 0 || m_nCropBottom != 0)
  1060. {
  1061. ret = CropImageMargin(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight,
  1062. m_pRawImgBuffer, m_nRawImgWidth, m_nRawImgHeight, m_nImageBits,
  1063. m_nCropLeft, m_nCropTop, m_nCropRight, m_nCropBottom);
  1064. if (ret)
  1065. {
  1066. FERROR("CropImageMargin fail!!");
  1067. }
  1068. else
  1069. {
  1070. FINFO("CropImageMargin success!");
  1071. bImageCrop = true;
  1072. }
  1073. }
  1074. //上图之前回调图像的宽高,使得上层在拷贝内存时是正确的图像大小
  1075. if (bImageCrop)
  1076. {
  1077. ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "", m_nImageWidth);
  1078. ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "", m_nImageHeight);
  1079. }
  1080. else
  1081. {
  1082. ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "", m_nRawImgWidth);
  1083. ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "", m_nRawImgHeight);
  1084. }
  1085. if (!m_bValidImage && m_nDelayTime > 0)
  1086. {
  1087. m_dwEndTime = GetTickCount64();
  1088. }
  1089. /***
  1090. ** 1.康众探测器,第一个trigIn信号触发trigOut升高,此时代表读图,所以基本需要丢掉第一帧图像
  1091. ** 此处灵活应用,可配置丢图张数
  1092. ** 2.由于先采集,后曝光,此处还需要根据曝光和拿图时间间隔来判断是否为曝光图像
  1093. ****/
  1094. FINFO("OnProcessImage m_nDropImgNum:{$} m_nDropImgCount:{$}", m_nDropImgNum, m_nDropImgCount);
  1095. if (m_nDropImgNum < m_nDropImgCount)//配置为0时表示不丢图
  1096. {
  1097. m_nDropImgNum++;
  1098. FINFO("Drop {$} image", m_nDropImgNum);
  1099. }
  1100. else if (!CheckTimeLimit(m_dwBeginTime, m_dwEndTime))//m_nDelayTime 配置为0时表示不延时
  1101. {
  1102. m_nDropImgNum++;
  1103. FERROR("CheckTimeLimit Drop {$} image", m_nDropImgNum);
  1104. }
  1105. else
  1106. {
  1107. //1800RF有单独的点片模式
  1108. if (m_bIsRadMode)
  1109. {
  1110. FINFO("OnProcessImage rad mode");
  1111. if (m_bSendImgToUpper)
  1112. {
  1113. FINFO("rad mode send image to upper!");
  1114. m_nValidImgNum++;
  1115. m_bSendImgToUpper = false; //单帧点片,发送一张图像后不再发送图像
  1116. if (bImageCrop)
  1117. {
  1118. DataFeedback(EVT_DATA_RAW_IMAGE, m_pFullImgBuffer);
  1119. }
  1120. else
  1121. {
  1122. DataFeedback(EVT_DATA_RAW_IMAGE, m_pRawImgBuffer);
  1123. }
  1124. //自动停止采集(发送standby,触发上层流程)
  1125. StatusFeedback(EVT_STATUS_PANEL, PANEL_END_ACQ);
  1126. }
  1127. else
  1128. {
  1129. FINFO("Already send image");
  1130. }
  1131. }
  1132. else
  1133. {
  1134. if (m_bFirstImage)
  1135. {
  1136. FINFO("m_bFirstImage is true");
  1137. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1138. m_bFirstImage = false;
  1139. }
  1140. FINFO("OnProcessImage flu mode,m_nExamType:{$},m_nCurrentLogicMode:{$}", m_nExamType, m_nCurrentLogicMode);
  1141. //560RF动态模式做点片
  1142. if (m_nExamType == CR_FluExtSync && m_nCurrentLogicMode == 1)
  1143. {
  1144. FINFO("m_nExamType == 8, m_nCurrentLogicMode == 1");
  1145. if (bImageCrop)
  1146. {
  1147. //计算图像EXI 不满足的不往上推
  1148. if (!CheckImageExi(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight, m_nExiThreshold)) //true 有射线 false 没射线
  1149. {
  1150. return;
  1151. }
  1152. }
  1153. else
  1154. {
  1155. //计算图像EXI 不满足的不往上推
  1156. if (!CheckImageExi(m_pRawImgBuffer, m_nRawImgWidth, m_nRawImgHeight, m_nExiThreshold)) //true 有射线 false 没射线
  1157. {
  1158. return;
  1159. }
  1160. }
  1161. if (m_bValidImage)
  1162. {
  1163. //RAD模式已经推过图了就不在推图了
  1164. FINFO("RAD has send one image! return");
  1165. return;
  1166. }
  1167. }
  1168. m_bValidImage = true; //合法图像,不再判断时间间隔
  1169. m_nValidImgNum++;
  1170. SetEvent(m_hImageEvent);
  1171. if (bImageCrop)
  1172. {
  1173. DataFeedback(EVT_DATA_RAW_IMAGE, m_pFullImgBuffer);
  1174. }
  1175. else
  1176. {
  1177. DataFeedback(EVT_DATA_RAW_IMAGE, m_pRawImgBuffer);
  1178. }
  1179. }
  1180. }
  1181. if (m_bSaveRaw)
  1182. {
  1183. SaveImage(nIndex, bImageCrop);
  1184. }
  1185. }
  1186. void Detector_CareRayRF::SaveImage(int nIndex, bool bImageCrop)
  1187. {
  1188. FINFO("========Begin save image");
  1189. char szTemp[30] = { 0 };
  1190. FILE* fp;
  1191. string strFileName = m_strWorkPath + "\\rawdata";
  1192. if (-1 == nIndex)
  1193. {
  1194. strFileName += "\\Image_Rad.raw";
  1195. }
  1196. else
  1197. {
  1198. sprintf_s(szTemp, "\\Image_%d.raw", nIndex);
  1199. strFileName += szTemp;
  1200. }
  1201. if ((fp = fopen(strFileName.c_str(), "wb+")) == NULL)
  1202. {
  1203. DWORD dw = GetLastError();
  1204. FERROR("fopen {$} failed, {$}", strFileName, dw);
  1205. return;
  1206. }
  1207. if (bImageCrop)
  1208. {
  1209. fwrite(m_pFullImgBuffer, sizeof(WORD), m_nImageWidth * m_nImageHeight, fp);
  1210. }
  1211. else
  1212. {
  1213. fwrite(m_pRawImgBuffer, sizeof(WORD), m_nRawImgWidth * m_nRawImgHeight, fp);
  1214. }
  1215. fclose(fp);
  1216. FINFO("Save {$} image over", strFileName);
  1217. }
  1218. /***
  1219. ** 说明:调用SDK接口,执行offset校正流程
  1220. ** dark校正、闲时offset刷新都会调用这个函数
  1221. ***/
  1222. bool Detector_CareRayRF::StartDarkCalibration(int nLogicMode)
  1223. {
  1224. printf("========StartDarkCalibration \n");
  1225. FINFO("========StartDarkCalibration Logic mode:{$}", nLogicMode);
  1226. bool bRet = false;
  1227. int nRet = CR_OK, nCurrFrmNum = 0, nPrevFrmNum = nCurrFrmNum - 1;
  1228. FINFO("Calling StartDarkCalibration");
  1229. nRet = CR_StartDarkCalibration(m_nCurrentDetIndex, nLogicMode, true, false);
  1230. if (TestError(nRet))
  1231. {
  1232. FERROR("StartDarkCalibration command failed!");
  1233. return bRet;
  1234. }
  1235. CR_CalibrationInfo calProgInfo;
  1236. FINFO("Calling QueryCalibrationStatus");
  1237. CR_QueryCalibrationStatus(m_nCurrentDetIndex, &calProgInfo);
  1238. nCurrFrmNum = 0;
  1239. nPrevFrmNum = nCurrFrmNum;
  1240. while (-1 == calProgInfo.nResult)
  1241. {
  1242. if (m_bAbortCalibration || m_bAbortRefreshOft)
  1243. {
  1244. FINFO("StartDarkCalibration Calling CR_StopCalibration");
  1245. nRet = CR_StopCalibration(m_nCurrentDetIndex);
  1246. if (TestError(nRet))
  1247. {
  1248. FERROR("StopCalibration command failed!");
  1249. }
  1250. return true;
  1251. }
  1252. if (nCurrFrmNum > nPrevFrmNum)
  1253. {
  1254. nPrevFrmNum = nCurrFrmNum;
  1255. }
  1256. nCurrFrmNum = calProgInfo.nCurrentFrameNum;
  1257. CR_QueryCalibrationStatus(m_nCurrentDetIndex, &calProgInfo);
  1258. Sleep(20);
  1259. }
  1260. nRet = calProgInfo.nResult;
  1261. if (!TestError(nRet))
  1262. {
  1263. FINFO("Appmode({$}) dark calibration completes successfully", nLogicMode);
  1264. //printf("Appmode(%d) dark calibration completes successfully \n", nLogicMode);
  1265. bRet = true;
  1266. }
  1267. else
  1268. {
  1269. FERROR("Appmode({$}) offset calibration failed!", nLogicMode);
  1270. //printf("Appmode(%d) offset calibration failed \n", nLogicMode);
  1271. }
  1272. return bRet;
  1273. }
  1274. bool Detector_CareRayRF::StartGainCalibration()
  1275. {
  1276. printf("========StartGainCalibration \n");
  1277. FINFO("========StartGainCalibration ");
  1278. if (-1 == m_nCurrentLogicMode)
  1279. {
  1280. FERROR("Illegal exam mode");
  1281. return false;
  1282. }
  1283. if (m_nExamType == CR_RadExtSync) //SDK Rad校正模式,准备工作已经在PrepareCalibration准备好,直接发ACQ状态就行
  1284. {
  1285. return true;
  1286. }
  1287. int nCurrFrmNum = 0, nPrevFrmNum = 0;
  1288. //改为先发状态,再调用SDK接口
  1289. //如果后发,SDK接口执行失败会导致不发送这个状态,进而导致停止校正流程不能正确执行
  1290. //静态点片模式的增益校正流程还需要考虑
  1291. FINFO("Calling StartGainCalibration");
  1292. int nRet = CR_StartGainCalibration(m_nCurrentDetIndex, m_nCurrentLogicMode);
  1293. if (TestError(nRet))
  1294. {
  1295. FERROR("StartGainCalibration command failed");
  1296. SetCareRayDPCStatus(DetStatus_Standby); //Gain校正执行失败,置回Standby
  1297. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_ERROR);
  1298. return false;
  1299. }
  1300. return true;
  1301. }
  1302. unsigned __stdcall Detector_CareRayRF::onFPDScanThread(PVOID pvoid)
  1303. {
  1304. Detector_CareRayRF* pOpr = (Detector_CareRayRF*)pvoid;
  1305. FINFO("Enter scan thread");
  1306. bool bExit = false;
  1307. while (!bExit)
  1308. {
  1309. DWORD dwRet = WaitForMultipleObjects(SCAN_EVENT_COUNT, pOpr->m_hArrayEvent, FALSE, INFINITE);
  1310. if (WAIT_OBJECT_0 == dwRet) //m_hStopScanEvent
  1311. {
  1312. bExit = true;
  1313. }
  1314. else if (WAIT_OBJECT_0 + 1 == dwRet) //m_hAcqEvent
  1315. {
  1316. pOpr->OnAcquireImage();
  1317. }
  1318. else if (WAIT_OBJECT_0 + 2 == dwRet) //m_hGainEvent
  1319. {
  1320. pOpr->OnAcquireGainImage();
  1321. }
  1322. else if (WAIT_OBJECT_0 + 3 == dwRet) //m_hDarkEvent
  1323. {
  1324. pOpr->OnStartDarkCalibration();
  1325. }
  1326. else if (WAIT_OBJECT_0 + 4 == dwRet) //m_hProcessImgEvent
  1327. {
  1328. pOpr->OnProcessImage(pOpr->m_nRawImgWidth, pOpr->m_nRawImgHeight, pOpr->m_nCbImgIndex);
  1329. }
  1330. }
  1331. FINFO("Level scan thread");
  1332. return 0;
  1333. }
  1334. unsigned __stdcall Detector_CareRayRF::RefreshOffsetThread(PVOID pvoid)
  1335. {
  1336. Detector_CareRayRF* pOpr = (Detector_CareRayRF*)pvoid;
  1337. FINFO("========Enter fresh offset thread");
  1338. bool bExit = false;
  1339. while (!bExit)
  1340. {
  1341. DWORD dwRet = WaitForMultipleObjects(OFFSET_EVENT_COUNT, pOpr->m_hOffsetEvent, FALSE, INFINITE);
  1342. if (WAIT_OBJECT_0 == dwRet) //m_hStopOffsetEvent
  1343. {
  1344. bExit = true;
  1345. }
  1346. else if (WAIT_OBJECT_0 + 1 == dwRet) //m_hStartAllOffset
  1347. {
  1348. pOpr->RefreshAllOffset(pOpr->m_vCtrlDetectorModeList);
  1349. }
  1350. else if (WAIT_OBJECT_0 + 2 == dwRet) //m_hStartOffset
  1351. {
  1352. pOpr->OnRefreshOffset();
  1353. }
  1354. else if (WAIT_OBJECT_0 + 3 == dwRet) //m_hAbortOffset
  1355. {
  1356. pOpr->AbortFreshOffset();
  1357. }
  1358. }
  1359. FINFO("Level fresh offset thread");
  1360. return 0;
  1361. }
  1362. //1800RF支持单独的RAD模式
  1363. void Detector_CareRayRF::OnAcquireImage()
  1364. {
  1365. printf("========OnAcquireImage \n");
  1366. FINFO("========OnAcquireImage ");
  1367. int nExpPermittedHint = 0, nWaitPermissionHint = 0, nLastExpStatus = CR_EXP_ERROR, nFrmSize = 0;
  1368. int nAppMode = m_nCurrentLogicMode;
  1369. FINFO("Call CR_StartAcquisition appmode:{$}", nAppMode);
  1370. int nRet = CR_StartAcquisition(m_nCurrentDetIndex, nAppMode, NULL, 0, -1);//OnAcquireImage
  1371. if (TestError(nRet))
  1372. {
  1373. FERROR("OnAcquireImage StartAcquisition failed!");
  1374. return;
  1375. }
  1376. SetCareRayDPCStatus(DetStatus_Acquire); //动态模式激活采集,设置状态
  1377. CR_ExpProgress oExpProg;
  1378. memset(&oExpProg, 0x0, sizeof(CR_ExpProgress));
  1379. do
  1380. {
  1381. //FINFO("Calling QueryAcquisitionStatus");
  1382. nRet = CR_QueryAcquisitionStatus(m_nCurrentDetIndex, &oExpProg);
  1383. if (TestError(nRet))
  1384. {
  1385. FERROR("QueryAcquisitionStatus command failed!");
  1386. break;
  1387. }
  1388. switch (oExpProg.nExpStatus)
  1389. {
  1390. case CR_EXP_INIT:
  1391. if (nLastExpStatus != CR_EXP_INIT)
  1392. {
  1393. FINFO("CR_EXP_INIT(0)");
  1394. nLastExpStatus = CR_EXP_INIT;
  1395. }
  1396. break;
  1397. case CR_EXP_READY:
  1398. if (0 == nExpPermittedHint)
  1399. {
  1400. FINFO("CR_EXP_READY(1)");
  1401. nExpPermittedHint++;
  1402. //StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1403. }
  1404. break;
  1405. case CR_EXP_WAIT_PERMISSION:
  1406. if (0 == nWaitPermissionHint)
  1407. {
  1408. FINFO("CR_EXP_WAIT_PERMISSION(2)");
  1409. FINFO("Calling CR_PermitExposure");
  1410. nRet = CR_PermitExposure(m_nCurrentDetIndex);
  1411. if (TestError(nRet))
  1412. {
  1413. FERROR("PermitExposure command failed");
  1414. break;
  1415. }
  1416. nWaitPermissionHint++;
  1417. }
  1418. break;
  1419. case CR_EXP_PERMITTED:
  1420. if (nLastExpStatus != CR_EXP_PERMITTED)
  1421. {
  1422. FINFO("CR_EXP_PERMITTED(3)");
  1423. nLastExpStatus = CR_EXP_PERMITTED;
  1424. }
  1425. break;
  1426. case CR_EXP_EXPOSE:
  1427. if (nLastExpStatus != CR_EXP_EXPOSE)
  1428. {
  1429. FINFO("CR_EXP_EXPOSE(4)");
  1430. nLastExpStatus = CR_EXP_EXPOSE;
  1431. }
  1432. break;
  1433. case CR_EXP_COMPLETE:
  1434. if (nLastExpStatus != CR_EXP_COMPLETE)
  1435. {
  1436. FINFO("CR_EXP_COMPLETE(5)");
  1437. nLastExpStatus = CR_EXP_COMPLETE;
  1438. }
  1439. break;
  1440. default:
  1441. FINFO("Exp Status:{$}", oExpProg.nExpStatus);
  1442. nExpPermittedHint = 0;
  1443. break;
  1444. }
  1445. if (oExpProg.bIsFetchable)
  1446. {
  1447. FINFO("Image is fetchable now");
  1448. break;
  1449. }
  1450. else
  1451. {
  1452. if (m_bCancelFlag) //结束这个循环,否则一直在这个循环里
  1453. {
  1454. m_bCancelFlag = false; //结束轮询,恢复初值
  1455. FINFO("[ Leave this loop ]");
  1456. break;
  1457. }
  1458. }
  1459. Sleep(30);
  1460. } while (true);
  1461. if (oExpProg.bIsFetchable)
  1462. {
  1463. int nImageSize = m_nRawImgHeight * m_nRawImgWidth * 2;
  1464. nFrmSize = nImageSize + RAD_HEADER_SIZE;
  1465. unsigned char* pImage = (unsigned char*)malloc(nFrmSize);
  1466. if (nullptr != pImage)
  1467. {
  1468. FINFO("Calling GetImage");
  1469. nRet = CR_GetImage(m_nCurrentDetIndex, pImage, nFrmSize, 9000);
  1470. if (TestError(nRet))
  1471. {
  1472. FERROR("GetImage command failed");
  1473. }
  1474. else
  1475. {
  1476. FINFO("Get Image success!");
  1477. memcpy(m_pRawImgBuffer, pImage + RAD_HEADER_SIZE, nImageSize);
  1478. OnProcessImage(m_nRawImgWidth, m_nRawImgHeight);
  1479. SetCareRayDPCStatus(DetStatus_Standby); //rad采集结束,设置状态
  1480. }
  1481. free(pImage);
  1482. pImage = nullptr;
  1483. }
  1484. }
  1485. else
  1486. {
  1487. FINFO("Calling StopAcquisition");
  1488. nRet = CR_StopAcquisition(m_nCurrentDetIndex);
  1489. if (TestError(nRet))
  1490. {
  1491. FERROR("StopAcquisition failed");
  1492. }
  1493. SetCareRayDPCStatus(DetStatus_Standby); //rad采集失败,设置状态
  1494. }
  1495. }
  1496. //SDK Rad模式增益校正流程
  1497. void Detector_CareRayRF::OnAcquireGainImage()
  1498. {
  1499. printf("========OnAcquireGainImage \n");
  1500. FINFO("========OnAcquireGainImage ");
  1501. int nRet = CR_OK, nCurrFrmNum = 0, nPrevFrmNum = nCurrFrmNum - 1;
  1502. int nExpPermittedHint = 0, nExpForbiddenHint = 0;
  1503. FINFO("Calling StartGainCalibration");
  1504. nRet = CR_StartGainCalibration(m_nCurrentDetIndex, m_nCurrentLogicMode);
  1505. if (TestError(nRet))
  1506. {
  1507. FERROR("StartGainCalibration command failed");
  1508. }
  1509. else
  1510. {
  1511. CR_CalibrationInfo calProgInfo;
  1512. FINFO("Calling QueryCalibrationStatus");
  1513. nRet = CR_QueryCalibrationStatus(m_nCurrentDetIndex, &calProgInfo);
  1514. while (-1 == calProgInfo.nResult)
  1515. {
  1516. if (CR_EXP_READY == calProgInfo.nExpStatus)
  1517. {
  1518. if (0 == nExpPermittedHint)
  1519. {
  1520. FINFO("Detector is ready for Gain Acquisition");
  1521. SetEvent(m_hGainReadyEvent); //探测器ready,可以采图
  1522. nExpPermittedHint++;
  1523. nExpForbiddenHint = 0;
  1524. }
  1525. }
  1526. else
  1527. {
  1528. if (0 == nExpForbiddenHint)
  1529. {
  1530. FINFO("Now you can't press x-ray hand switch...");
  1531. nExpForbiddenHint++;
  1532. nExpPermittedHint = 0;
  1533. }
  1534. }
  1535. if (m_bAbortCalibration)
  1536. {
  1537. FINFO("OnAcquireGainImage Calling StopCalibration");
  1538. nRet = CR_StopCalibration(m_nCurrentDetIndex);
  1539. if (TestError(nRet))
  1540. {
  1541. FERROR("StopCalibration command failed");
  1542. }
  1543. break;
  1544. }
  1545. if (nCurrFrmNum > nPrevFrmNum)
  1546. {
  1547. nPrevFrmNum = nCurrFrmNum;
  1548. FINFO("Gain calibration progress:{$} / {$},current frame mean = {$} TargetGray={$}",
  1549. calProgInfo.nCurrentFrameNum, calProgInfo.nTotalFrameNum, calProgInfo.nCurrentFrameMeanValue, calProgInfo.nTargetGrayValue);
  1550. }
  1551. nCurrFrmNum = calProgInfo.nCurrentFrameNum;
  1552. StatusFeedback(EVT_STATUS_SINGLEEXP, DOSE_ACCEPT);
  1553. CR_QueryCalibrationStatus(m_nCurrentDetIndex, &calProgInfo);
  1554. Sleep(5);
  1555. }
  1556. nRet = calProgInfo.nResult;
  1557. if (TestError(nRet))
  1558. {
  1559. FERROR("Gain calibration failed");
  1560. }
  1561. else
  1562. {
  1563. FINFO("Gain calibration over");
  1564. }
  1565. SetCareRayDPCStatus(DetStatus_Standby); //rad校正结束,设置状态
  1566. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_OK);
  1567. }
  1568. }
  1569. /***
  1570. ** 说明:开始暗场校正
  1571. ***/
  1572. void Detector_CareRayRF::OnStartDarkCalibration()
  1573. {
  1574. printf("========OnStartDarkCalibration \n");
  1575. FINFO("========OnStartDarkCalibration ");
  1576. SetCareRayDPCStatus(DetStatus_Offset); //开始offset校正
  1577. if (StartDarkCalibration(m_nCurrentLogicMode))
  1578. {
  1579. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_OK);
  1580. }
  1581. else
  1582. {
  1583. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_ERROR);
  1584. }
  1585. SetCareRayDPCStatus(DetStatus_Standby); //offset校正完成,置回Standby
  1586. }
  1587. //获取只用于本DPC记录的探测器状态
  1588. eDetStatus Detector_CareRayRF::GetCareRayDPCStatus()
  1589. {
  1590. string strStatus = "Unknown";
  1591. switch (m_eStatus)
  1592. {
  1593. case DetStatus_NotIni:
  1594. strStatus = "NotIni";
  1595. break;
  1596. case DetStatus_NotConn:
  1597. strStatus = "NotConn";
  1598. break;
  1599. case DetStatus_Sleep:
  1600. strStatus = "Sleep";
  1601. break;
  1602. case DetStatus_Standby:
  1603. strStatus = "Standby";
  1604. break;
  1605. case DetStatus_Work:
  1606. strStatus = "Work";
  1607. break;
  1608. case DetStatus_Acquire:
  1609. strStatus = "Acquire";
  1610. break;
  1611. case DetStatus_Offset:
  1612. strStatus = "Offset";
  1613. break;
  1614. case DetStatus_XrayCalibration:
  1615. strStatus = "XrayCalibration";
  1616. break;
  1617. default:
  1618. break;
  1619. }
  1620. FINFO("Driver status: {$}", strStatus.c_str());
  1621. return m_eStatus;
  1622. }
  1623. //设置只用于本DPC的探测器状态
  1624. bool Detector_CareRayRF::SetCareRayDPCStatus(eDetStatus status)
  1625. {
  1626. string strStatus = "Unknown";
  1627. bool bSetStatus = true;
  1628. switch (status)
  1629. {
  1630. case DetStatus_NotIni:
  1631. strStatus = "NotIni";
  1632. break;
  1633. case DetStatus_NotConn:
  1634. strStatus = "NotConn";
  1635. break;
  1636. case DetStatus_Sleep:
  1637. strStatus = "Sleep";
  1638. break;
  1639. case DetStatus_Standby:
  1640. strStatus = "Standby";
  1641. break;
  1642. case DetStatus_Work:
  1643. strStatus = "Work";
  1644. break;
  1645. case DetStatus_Acquire:
  1646. strStatus = "Acquire";
  1647. break;
  1648. case DetStatus_Offset:
  1649. strStatus = "Offset";
  1650. break;
  1651. case DetStatus_XrayCalibration:
  1652. strStatus = "XrayCalibration";
  1653. break;
  1654. default:
  1655. bSetStatus = false;
  1656. break;
  1657. }
  1658. if (bSetStatus)
  1659. {
  1660. m_eStatus = status;
  1661. FINFO("Set driver status: {$}", strStatus.c_str());
  1662. }
  1663. else
  1664. {
  1665. FERROR("{$} {$} is a illegal status", strStatus.c_str(), (int)status);
  1666. }
  1667. return bSetStatus;
  1668. }
  1669. bool Detector_CareRayRF::LoadCalibrationFiles()
  1670. {
  1671. FINFO("Calling LoadReference m_nCurrentLogicMode:{$}", m_nCurrentLogicMode);
  1672. int nRet = CR_LoadReference(m_nCurrentDetIndex, m_nCurrentLogicMode);
  1673. if (TestError(nRet))
  1674. {
  1675. FERROR("LoadReference command failed");
  1676. return false;
  1677. }
  1678. FINFO("LoadReference command succeed");
  1679. return true;
  1680. }
  1681. //参照RFOC康众动态代码整理的图像裁剪功能
  1682. int Detector_CareRayRF::CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight,
  1683. LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits,
  1684. int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin)
  1685. {
  1686. printf("========CropImageMargin \n");
  1687. FINFO("========CropImageMargin ");
  1688. if ((pDstData == NULL) || (pScrData == NULL) || (nSrcWidth <= 0) || (nSrcHeight <= 0) || (nBits <= 0))
  1689. return -1;
  1690. if ((nLeftMargin >= nSrcWidth) || (nTopMargin >= nSrcHeight))
  1691. return -1;
  1692. int nBitsToBYTE = (int)((nBits + 7) * 0.125);
  1693. if (nBitsToBYTE < 1)
  1694. return -1;
  1695. int nXL, nXR, nYL, nYR;
  1696. nXL = nLeftMargin;//32
  1697. nYL = nTopMargin;
  1698. if (nSrcWidth - nRightMargin < 0)
  1699. return -1;
  1700. nXR = nSrcWidth - nRightMargin - 1; //2783
  1701. if (nXR < nXL)
  1702. return -1;
  1703. if (nSrcHeight - nBottomMargin < 0)
  1704. return -1;
  1705. nYR = nSrcHeight - nBottomMargin - 1;
  1706. if (nYR < nYL)
  1707. return -1;
  1708. nDstWidth = nXR - nXL + 1;
  1709. nDstHeight = nYR - nYL + 1;
  1710. FINFO("TopCrop:{$};Bottom:{$},nDstWidth:{$},nDstHeight:{$},Bits:{$}", nYL, nYR, nDstWidth, nDstHeight, nBitsToBYTE);
  1711. int i = 0;
  1712. #pragma omp parallel private(i)
  1713. {
  1714. #pragma omp for
  1715. for (i = nYL; i <= nYR; i++)
  1716. {
  1717. ::memcpy((WORD*)pDstData + (i - nYL) * nDstWidth, (WORD*)pScrData + (i * nSrcWidth + nXL), nDstWidth * nBitsToBYTE);
  1718. }
  1719. }
  1720. return 0;
  1721. }
  1722. /***
  1723. ** 说明:初始化时刷新所有模式的offset 配置文件的OffsetInterval配置为0时则不会运行此段代码
  1724. ***/
  1725. bool Detector_CareRayRF::RefreshAllOffset(std::vector<DetectorMode>& v_DetectorModeList)
  1726. {
  1727. printf("========Refresh all mode offset begin \n");
  1728. FINFO("========Refresh all mode offset begin");
  1729. int nAppMode; //配置文件中LogicMode
  1730. int nModeID; //SDK的operation mode
  1731. int nGainID;
  1732. float fFrameRate;
  1733. int nExpTime;
  1734. size_t nModeCount = v_DetectorModeList.size();
  1735. bool bRet;
  1736. m_bAbortRefreshOft = false;
  1737. SetCareRayDPCStatus(DetStatus_Offset); //开始全模式offset刷新
  1738. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_START);
  1739. StatusFeedback(EVT_STATUS_OFFSET_PROGRESS, 0);
  1740. for (size_t i = 0; i < nModeCount; i++)
  1741. {
  1742. //初始化阶段的offset刷新流程不在整个软件的控制之内,所以不会给探测器外触发信号,
  1743. //因此刷新之前将模式改成内触发重新注册,SDK可同时生成外触发的校正文件
  1744. nAppMode = (int)(i + 1);
  1745. nModeID = v_DetectorModeList[i].modeID;
  1746. nGainID = v_DetectorModeList[i].gainID;
  1747. fFrameRate = v_DetectorModeList[i].maxFrameRate;
  1748. nExpTime = v_DetectorModeList[i].expTime;
  1749. //offset 都用内触发做,因为校正文件不区分内外触发,内触发不需要外部触发信号即可使用
  1750. if (nModeID == 16)
  1751. {
  1752. bRet = RegisterAppMode(nAppMode, nModeID, nGainID, fFrameRate, nExpTime, CR_RadExtSync);//RefreshAllOffset
  1753. }
  1754. else
  1755. {
  1756. bRet = RegisterAppMode(nAppMode, nModeID, nGainID, fFrameRate, nExpTime, CR_FluIntSync);//RefreshAllOffset
  1757. }
  1758. if (!bRet)
  1759. {
  1760. FERROR("RefreshAllOffset RegisterAppMode failed! appmode:{$}", nAppMode);
  1761. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_END_ERROR);
  1762. continue;
  1763. }
  1764. if (m_bAbortRefreshOft)
  1765. {
  1766. FINFO("Abort Offset Refresh");
  1767. break;
  1768. }
  1769. bRet = StartDarkCalibration(nAppMode); //当前mode失败,仍可以进行下一个mode的刷新
  1770. if (!bRet)
  1771. {
  1772. FERROR("RefreshAllOffset StartDarkCalibration failed! appmode:{$}", nAppMode);
  1773. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_END_ERROR);
  1774. continue;
  1775. }
  1776. if (m_bAbortRefreshOft)
  1777. {
  1778. FINFO("Abort Offset Refresh");
  1779. break;
  1780. }
  1781. StatusFeedback(EVT_STATUS_OFFSET_PROGRESS, (int)(i + 1));
  1782. }
  1783. SetCareRayDPCStatus(DetStatus_Standby); //全模式offset刷新结束,置回Standby
  1784. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_END_OK);
  1785. FINFO("Refresh all mode offset over");
  1786. return true;
  1787. }
  1788. /***
  1789. ** 说明:刷当前模式的offset,什么时候刷由前端控制
  1790. ***/
  1791. void Detector_CareRayRF::OnRefreshOffset()
  1792. {
  1793. FINFO("========OnRefreshOffset begin");
  1794. bool bRet = false;
  1795. m_bAbortRefreshOft = false;
  1796. SetCareRayDPCStatus(DetStatus_Offset);
  1797. StatusFeedback(EVT_STATUS_OFFSET_PROGRESS, 0);
  1798. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_START);
  1799. FINFO("OnRefreshOffset RegisterAppMode appModeKey:{$},m_nModeID:{$},m_nGainLevel:{$},m_fFrameRate:{$},m_nExpTime:{$}",
  1800. m_nCurrentLogicMode, m_nModeID, m_nGainLevel, m_fFrameRate, m_nExpTime);
  1801. if (RegisterAppMode(m_nCurrentLogicMode, m_nModeID, m_nGainLevel, m_fFrameRate, m_nExpTime, CR_FluIntSync))//OnRefreshOffset
  1802. {
  1803. bRet = StartDarkCalibration(m_nCurrentLogicMode);
  1804. if (bRet)
  1805. {
  1806. StatusFeedback(EVT_STATUS_OFFSET_PROGRESS, 1);
  1807. }
  1808. else
  1809. {
  1810. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_END_ERROR);
  1811. }
  1812. }
  1813. else
  1814. {
  1815. FERROR("OnRefreshOffset RegisterAppMode failed!");
  1816. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_END_ERROR);
  1817. }
  1818. //刷点片的offset
  1819. int nAppMode = 0;
  1820. float fFrequency = 0.0f;
  1821. int nGainValue = 0;
  1822. int nExpTime = 0;
  1823. try
  1824. {
  1825. int nModeCount = (int)m_ModeConfig["ModeTable"].size();
  1826. for (int i = 0; i < nModeCount; i++)
  1827. {
  1828. int logicMode = (int)m_ModeConfig["ModeTable"][i]["LogicMode"];//OnRefreshOffset
  1829. if (logicMode == RAD)
  1830. {
  1831. FINFO("find LogicMode == RAD");
  1832. nAppMode = (int)m_ModeConfig["ModeTable"][i]["OperationMode"];
  1833. string strFrameRate = (string)m_ModeConfig["ModeTable"][i]["Frequency"];
  1834. fFrequency = stof(strFrameRate.c_str());
  1835. nGainValue = (int)m_ModeConfig["ModeTable"][i]["GainValue"];
  1836. nExpTime = (int)m_ModeConfig["ModeTable"][i]["ExpTime"];//为0时,探测器将赋值为真正的开窗时间(积分时间)
  1837. FINFO("nAppMode:{$}, fFrequency:{$}, GainValue:{$}, ExpTime:{$}", nAppMode, fFrequency, nGainValue, nExpTime);
  1838. break;
  1839. }
  1840. }
  1841. }
  1842. catch (ResDataObjectExption& e)
  1843. {
  1844. FERROR("Read configuration failed, Error code: {$}", e.what());
  1845. }
  1846. if (nAppMode == 16)
  1847. {
  1848. bRet = RegisterAppMode(RAD, nAppMode, nGainValue, fFrequency, nExpTime, CR_RadExtSync);//OnRefreshOffset
  1849. }
  1850. else
  1851. {
  1852. bRet = RegisterAppMode(RAD, nAppMode, nGainValue, fFrequency, nExpTime, CR_FluIntSync);//OnRefreshOffset
  1853. }
  1854. if (bRet)
  1855. {
  1856. bRet = StartDarkCalibration(RAD);
  1857. if (bRet)
  1858. {
  1859. StatusFeedback(EVT_STATUS_OFFSET_PROGRESS, 2);
  1860. }
  1861. else
  1862. {
  1863. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_END_ERROR);
  1864. }
  1865. }
  1866. else
  1867. {
  1868. FERROR("OnRefreshOffset RegisterAppMode failed!");
  1869. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_END_ERROR);
  1870. }
  1871. SetCareRayDPCStatus(DetStatus_Standby);
  1872. StatusFeedback(EVT_STATUS_OFFSET, PANEL_EVENT_END_OK);
  1873. FINFO("OnRefreshOffset over");
  1874. }
  1875. bool Detector_CareRayRF::CheckTimeLimit(ULONGLONG dwBeginTime, ULONGLONG dwEndTime)
  1876. {
  1877. if (m_bValidImage) //合法图像,不再判断时间间隔,直接返回true
  1878. {
  1879. FINFO("CheckTimeLimit m_bValidImage is true!");
  1880. return true;
  1881. }
  1882. if (m_nDelayTime == 0) //没有开启延时机制
  1883. {
  1884. FINFO("The delay time is invalid, return");
  1885. return true;
  1886. }
  1887. if ((int)(dwEndTime - dwBeginTime) > m_nDelayTime)
  1888. {
  1889. FINFO("The interval({$}) is ok", dwEndTime - dwBeginTime);
  1890. return true;
  1891. }
  1892. FERROR("The interval({$}) is shorter than the delay({$})",dwEndTime - dwBeginTime, m_nDelayTime);
  1893. return false;
  1894. }
  1895. bool Detector_CareRayRF::CallbackProcess(int nEventID, CR_Event* pEventParam)
  1896. {
  1897. //FINFO("CallbackProcess event id:{$}",nEventID);
  1898. switch (nEventID)
  1899. {
  1900. case CR_EVT_SERVER_DISCONNECTED:
  1901. {
  1902. FINFO("CR_EVT_SERVER_DISCONNECTED");
  1903. break;
  1904. }
  1905. case CR_EVT_DETR_DISCONNECTED:
  1906. {
  1907. FINFO("CR_EVT_DETR_DISCONNECTED");
  1908. DisConnect();
  1909. break;
  1910. }
  1911. case CR_EVT_EXPOSURE_INFO:
  1912. {
  1913. FINFO("CR_EVT_EXPOSURE_INFO");
  1914. break;
  1915. }
  1916. case CR_EVT_TEMPERATURE_INFO:
  1917. {
  1918. //FINFO("CR_EVT_TEMPERATURE_INFO");
  1919. break;
  1920. }
  1921. case CR_EVT_BATTERY_INFO:
  1922. {
  1923. FINFO("CR_EVT_BATTERY_INFO");
  1924. break;
  1925. }
  1926. case CR_EVT_WIRELESS_INFO:
  1927. {
  1928. FINFO("CR_EVT_WIRELESS_INFO");
  1929. break;
  1930. }
  1931. case CR_EVT_NEW_FRAME:
  1932. {
  1933. FINFO("Image Arrived!");
  1934. int nBuffIdx = *(int*)pEventParam->pData;
  1935. int nImageDataSize = pEventParam->nWidth * pEventParam->nHeight * 2;
  1936. int nImgSize = nImageDataSize + m_nFrmHeaderLen;
  1937. //SDK回调的宽和高都是原始宽高不是裁剪后的值
  1938. FINFO("Image Index:{$} Width:{$},Height:{$},nImageDataSize:{$},nImgSize:{$}", nBuffIdx, pEventParam->nWidth, pEventParam->nHeight, nImageDataSize, nImgSize);
  1939. if (m_pImageBuffer != NULL)
  1940. {
  1941. char* pCurrFrame = (char*)m_pImageBuffer + nBuffIdx * nImgSize;
  1942. int nFrameId = *(int*)(pCurrFrame + 8);
  1943. FINFO("Frame ID:{$}", nFrameId);
  1944. m_nRawImgWidth = pEventParam->nWidth;
  1945. m_nRawImgHeight = pEventParam->nHeight;
  1946. m_nCbImgIndex = nFrameId;
  1947. memcpy(m_pRawImgBuffer, pCurrFrame + m_nFrmHeaderLen, nImageDataSize);
  1948. //获取图像后需要调用停止采集,所以改到子线程处理
  1949. SetEvent(m_hProcessImgEvent);
  1950. }
  1951. break;
  1952. }
  1953. case CR_EVT_CALIBRATION_IN_PROGRESS:
  1954. {
  1955. FINFO("CR_EVT_CALIBRATION_IN_PROGRESS");
  1956. CR_CalibrationInfo calInfo = *(CR_CalibrationInfo*)pEventParam->pData;
  1957. FINFO("Calibration progress:{$}/{$},current frame mean:{$}", calInfo.nCurrentFrameNum, calInfo.nTotalFrameNum, calInfo.nCurrentFrameMeanValue);
  1958. break;
  1959. }
  1960. case CR_EVT_CALIBRATION_FINISHED:
  1961. {
  1962. FINFO("CR_EVT_CALIBRATION_FINISHED");
  1963. CR_CalibrationInfo calInfo = *(CR_CalibrationInfo*)pEventParam->pData;
  1964. FINFO("Calibration result: {$}", calInfo.nResult);
  1965. //printf("Calibration result: %d \r\n", calInfo.nResult);
  1966. if (TestError(calInfo.nResult))
  1967. {
  1968. //用于记录错误信息
  1969. }
  1970. else
  1971. {
  1972. if (CCOS_CALIBRATION_TYPE_XRAY == m_eCaliType)
  1973. {
  1974. SetCareRayDPCStatus(DetStatus_Standby); //rad校正结束,设置状态
  1975. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_OK);
  1976. }
  1977. }
  1978. break;
  1979. }
  1980. case CR_EVT_ACQ_STAT_INFO:
  1981. {
  1982. FINFO("CR_EVT_ACQ_STAT_INFO");
  1983. CR_AcquisitionStatInfo acqStatInfo = *(CR_AcquisitionStatInfo*)pEventParam->pData;
  1984. FINFO("Statistic of current acquisition:duration:{$},received total frame:{$},lost frame:{$},frame rate:{$},Speed:{$}",
  1985. acqStatInfo.nAcqDuration / 1000.0, acqStatInfo.nTotalFrameNum, acqStatInfo.nLostFrameNum, acqStatInfo.fStatFrameRate, acqStatInfo.fTransmissionSpeed);
  1986. break;
  1987. }
  1988. case CR_EVT_RAD_ACQ_IN_PROGRESS:
  1989. {
  1990. FINFO("CR_EVT_RAD_ACQ_IN_PROGRESS");
  1991. break;
  1992. }
  1993. case CR_EVT_SERVER_RECONNECTED:
  1994. {
  1995. FINFO("CR_EVT_SERVER_RECONNECTED");
  1996. break;
  1997. }
  1998. case CR_EVT_DETR_RECONNECTED:
  1999. {
  2000. FINFO("CR_EVT_DETR_RECONNECTED");
  2001. break;
  2002. }
  2003. case CR_EVT_IMAGE_QUEUE_BLOCKED:
  2004. {
  2005. FINFO("CR_EVT_IMAGE_QUEUE_BLOCKED");
  2006. break;
  2007. }
  2008. case CR_EVT_DISCARD_FRAME:
  2009. {
  2010. FINFO("CR_EVT_DISCARD_FRAME");
  2011. break;
  2012. }
  2013. default:
  2014. FINFO("default Event id:{$}", nEventID);
  2015. break;
  2016. }
  2017. return true;
  2018. }
  2019. void Detector_CareRayRF::ConfFeedback(int nEventID, int nDetectorID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  2020. {
  2021. if (-1 == nDetectorID)
  2022. {
  2023. nDetectorID = m_nCurrentPanelID;
  2024. }
  2025. ((FPDDeviceCareRay*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2026. nEventID, EVT_LEVEL_CONFIGURATION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2027. }
  2028. void Detector_CareRayRF::InfoFeedback(int nEventID, int nDetectorID, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, void* pParam)
  2029. {
  2030. if (-1 == nDetectorID)
  2031. {
  2032. nDetectorID = m_nCurrentPanelID;
  2033. }
  2034. ((FPDDeviceCareRay*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2035. nEventID, EVT_LEVEL_INFORMATOION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2036. }
  2037. void Detector_CareRayRF::StatusFeedback(int nEventID, int nParam1, const char* pszMsg, int nDetectorID, float fParam2, int nPtrParamLen, void* pParam)
  2038. {
  2039. if (-1 == nDetectorID)
  2040. {
  2041. nDetectorID = m_nCurrentPanelID;
  2042. }
  2043. ((FPDDeviceCareRay*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2044. nEventID, EVT_LEVEL_STATUS, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2045. }
  2046. void Detector_CareRayRF::DataFeedback(int nEventID, void* pParam, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, int nDetectorID)
  2047. {
  2048. if (-1 == nDetectorID)
  2049. {
  2050. nDetectorID = m_nCurrentPanelID;
  2051. }
  2052. ((FPDDeviceCareRay*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2053. nEventID, EVT_LEVEL_DATA, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2054. }
  2055. void Detector_CareRayRF::WarnFeedback(int nEventID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam, int nDetectorID)
  2056. {
  2057. if (-1 == nDetectorID)
  2058. {
  2059. nDetectorID = m_nCurrentPanelID;
  2060. }
  2061. ((FPDDeviceCareRay*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2062. nEventID, EVT_LEVEL_WARNING, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2063. }
  2064. void Detector_CareRayRF::ErrorFeedback(int nEventID, const char* pszMsg, int nDetectorID, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  2065. {
  2066. if (-1 == nDetectorID)
  2067. {
  2068. nDetectorID = m_nCurrentPanelID;
  2069. }
  2070. ((FPDDeviceCareRay*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2071. nEventID, EVT_LEVEL_ERROR, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2072. }
  2073. float Detector_CareRayRF::SetFluPPS(float fPPS, std::vector<DetectorMode>& v_DetectorModeList)
  2074. {
  2075. FINFO("========SetFluPPS {$}", fPPS);
  2076. //根据设置的帧率值查找符合帧率值的最大分辨率的模式
  2077. //首先查找支持的帧率大于等于当前设置帧率的模式集合
  2078. std::vector<int> v_result;//保存符合条件的模式的索引值
  2079. float epsilon = (float)1e-9;
  2080. int maxFrameRateIndex = 0;//帧率最大的模式的索引(此值不看分辨率)
  2081. float fTempMax = 0.0f;
  2082. for (int i = 0; i < v_DetectorModeList.size(); i++)
  2083. {
  2084. if (std::abs(v_DetectorModeList[i].maxFrameRate - fPPS) < epsilon)//相等
  2085. {
  2086. v_result.push_back(i);
  2087. }
  2088. else if (v_DetectorModeList[i].maxFrameRate > fPPS)
  2089. {
  2090. v_result.push_back(i);
  2091. }
  2092. if (v_DetectorModeList[i].maxFrameRate > fTempMax)
  2093. {
  2094. fTempMax = v_DetectorModeList[i].maxFrameRate;
  2095. maxFrameRateIndex = i;
  2096. }
  2097. }
  2098. FINFO("v_result.size() == {$}, maxFrameRateIndex = {$}", v_result.size(), maxFrameRateIndex);
  2099. //结果1:不止一个模式支持的情况
  2100. // 筛选后如果还有多个分辨率相同的模式那么就用第一个找到的
  2101. //结果2:只有一个模式支持
  2102. //结果3:没有模式支持当前帧率,那么就用帧率最高的那个模式的分辨率
  2103. unsigned long maxDpi = 0;
  2104. int maxDpiIndex = 0;
  2105. if (v_result.size() > 1)
  2106. {
  2107. for (size_t j = 0; j < v_result.size(); j++)
  2108. {
  2109. int currentIndex = v_result[j];
  2110. if ((unsigned long)v_DetectorModeList[currentIndex].imageWidth * (unsigned long)v_DetectorModeList[currentIndex].imageHeight > maxDpi)
  2111. {
  2112. maxDpi = (unsigned long)v_DetectorModeList[currentIndex].imageWidth * (unsigned long)v_DetectorModeList[currentIndex].imageHeight;
  2113. maxDpiIndex = currentIndex;
  2114. }
  2115. }
  2116. if (fPPS == 0.0f)
  2117. {
  2118. FINFO("fPPS == 0.0f");
  2119. m_fFrameRate = v_DetectorModeList[maxDpiIndex].maxFrameRate;
  2120. }
  2121. else
  2122. {
  2123. m_fFrameRate = fPPS;
  2124. }
  2125. }
  2126. else if (v_result.size() == 1)
  2127. {
  2128. maxDpiIndex = v_result[0];
  2129. m_fFrameRate = fPPS;
  2130. }
  2131. else
  2132. {
  2133. maxDpiIndex = maxFrameRateIndex;
  2134. m_fFrameRate = v_DetectorModeList[maxDpiIndex].maxFrameRate;
  2135. }
  2136. FINFO("maxDpiIndex:{$},m_fFrameRate:{$}", maxDpiIndex, m_fFrameRate);
  2137. m_nModeID = v_DetectorModeList[maxDpiIndex].modeID;
  2138. FINFO("m_nModeID:{$}", m_nModeID);
  2139. //回调当前选中模式的图像宽高到上层,让上层存储图像的buffer重新调整为当前模式的出图大小
  2140. int nRawImageWidth = v_DetectorModeList[maxDpiIndex].imageWidth;
  2141. int nRawImageHeight = v_DetectorModeList[maxDpiIndex].imageHeight;
  2142. int nCutX = v_DetectorModeList[maxDpiIndex].cutOffX;
  2143. int nCutY = v_DetectorModeList[maxDpiIndex].cutOffY;
  2144. int nImageWidth = nRawImageWidth - 2 * nCutX;
  2145. int nImageHeight = nRawImageHeight - 2 * nCutY;
  2146. m_nRawImgWidth = nRawImageWidth;
  2147. m_nRawImgHeight = nRawImageHeight;
  2148. m_nCropLeft = nCutX;
  2149. m_nCropRight = nCutX;
  2150. m_nCropTop = nCutY;
  2151. m_nCropBottom = nCutY;
  2152. m_nImageWidth = nImageWidth;
  2153. m_nImageHeight = nImageHeight;
  2154. FINFO("SetFluPPS m_nRawImgWidth:{$},m_nRawImgHeight:{$},m_nCropLeft:{$},m_nCropRight:{$},m_nCropTop:{$},m_nCropBottom:{$},m_nImageWidth:{$},m_nImageHeight:{$}",
  2155. m_nRawImgWidth, m_nRawImgHeight, m_nCropLeft, m_nCropRight, m_nCropTop, m_nCropBottom, m_nImageWidth, m_nImageHeight);
  2156. return m_fFrameRate;
  2157. }
  2158. void Detector_CareRayRF::GetFluPPS(float& fFluPPS)
  2159. {
  2160. fFluPPS = m_fFrameRate;
  2161. FINFO("========GetFluPPS {$}", fFluPPS);
  2162. }
  2163. void Detector_CareRayRF::AbortFreshOffset()
  2164. {
  2165. FINFO("========AbortFreshOffset");
  2166. m_bAbortRefreshOft = true;
  2167. }
  2168. void Detector_CareRayRF::SetAbortOffsetEvent()
  2169. {
  2170. FINFO("========SetAbortOffsetEvent");
  2171. SetEvent(m_hAbortOffset);
  2172. }
  2173. void Detector_CareRayRF::SetFreshAllOffsetEvent(std::vector<DetectorMode>& v_DetectorModeList)
  2174. {
  2175. FINFO("========SetFreshAllOffsetEvent");
  2176. m_vCtrlDetectorModeList = v_DetectorModeList;
  2177. SetEvent(m_hStartAllOffset);
  2178. }
  2179. void Detector_CareRayRF::SetfreshOffsetEvent()
  2180. {
  2181. FINFO("========SetfreshOffsetEvent");
  2182. SetEvent(m_hStartOffset);
  2183. }
  2184. void Detector_CareRayRF::UpdateModeInRunning(int nMode, float fFrequency)
  2185. {
  2186. FINFO("========UpdateModeInRunning ModeID:{$},Frequency:{$}", nMode, fFrequency);
  2187. m_nModeID = nMode;
  2188. m_fFrameRate = fFrequency;
  2189. //这里增加裁剪值的赋值
  2190. for (int i=0;i< m_nModeNum;i++)
  2191. {
  2192. if (m_mapModeInfo[i].nModeID == m_nModeID)
  2193. {
  2194. FINFO("Current mode cutX = {$}, cutY = {$}", m_mapModeInfo[i].nCutoffX, m_mapModeInfo[i].nCutoffY);
  2195. m_nCropLeft = m_mapModeInfo[i].nCutoffX;
  2196. m_nCropRight = m_mapModeInfo[i].nCutoffX;
  2197. m_nCropTop = m_mapModeInfo[i].nCutoffY;
  2198. m_nCropBottom = m_mapModeInfo[i].nCutoffY;
  2199. }
  2200. }
  2201. }