Detector_CareRayRF.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #pragma once
  2. #include "ResDataObject.h"
  3. #include "CCOS.Dev.FPD.CareRayRF.h"
  4. #include "include\IntlMsgAliasID.h"
  5. #include "CallbackImp.h"
  6. #include "CareRayLib.h"
  7. enum eDetStatus
  8. {
  9. DetStatus_NotIni,
  10. DetStatus_NotConn,
  11. DetStatus_Sleep,
  12. DetStatus_Standby,
  13. DetStatus_Work,
  14. DetStatus_Acquire,
  15. DetStatus_Offset,
  16. DetStatus_XrayCalibration,
  17. };
  18. constexpr auto SCAN_EVENT_COUNT = 5;
  19. constexpr auto OFFSET_EVENT_COUNT = 4;
  20. class Detector_CareRayRF
  21. {
  22. public:
  23. Detector_CareRayRF();
  24. ~Detector_CareRayRF();
  25. bool DriverEntry(void* pDrvDPC, ResDataObject& Configuration);
  26. bool Connect(void* pDrvDPC, const char* szWorkPath, ResDataObject& DetectorModeList);
  27. void DisConnect();
  28. void EnterExamMode(int nExamMode);
  29. bool SetAcqMode(int nMode);
  30. bool SetXrayOnNum();
  31. bool SetExposureTimes(int nTimes);
  32. bool PrepareAcquisition(void* pDrvDPC);
  33. bool StartAcquisition(void* pDrvDPC);
  34. bool StopAcquisition(void* pDrvDPC);
  35. bool ActiveCalibration(void* pDrvDPC, CCOS_CALIBRATION_TYPE eType);
  36. bool PrepareCalibration(void* pDrvDPC);
  37. bool StartCalibration(void* pDrvDPC);
  38. bool StopCalibration(void* pDrvDPC);
  39. bool CallbackProcess(int nEventID, CR_Event* pEventParam);
  40. //根据设置的帧率选择适配帧率的并且分辨率最大的模式
  41. float SetFluPPS(float fPPS, std::vector<DetectorMode>& v_DetectorModeList);
  42. void GetFluPPS(float& fFluPPS);
  43. bool RefreshAllOffset(std::vector<DetectorMode>& v_DetectorModeList);
  44. void OnRefreshOffset();
  45. void AbortFreshOffset();
  46. void SetAbortOffsetEvent();
  47. void SetFreshAllOffsetEvent(std::vector<DetectorMode>& v_DetectorModeList);
  48. void SetfreshOffsetEvent();
  49. void UpdateModeInRunning(int nMode,float fFrequency);
  50. private:
  51. map<void*, int>* m_pDPC2PanelID;
  52. map<int, void*>* m_pPanelID2DPC;
  53. int m_nPanelCount; //探测器数量
  54. ResDataObject m_ModeConfig; //保存DPC模块下发的配置
  55. std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置
  56. int m_nCurrentPanelID; //模块中探测器的ID
  57. int m_nCurrentDetIndex; //SDK中当前探测器的index
  58. ICallback* m_pCallbackPtrs;
  59. CR_ModeInfo* m_mapModeInfo;
  60. CR_SystemInfo m_stSystemInfo;
  61. int m_nModeNum; //当前探测器支持的模式总数
  62. bool m_bFPDConnected; //true: 探测器连接成功
  63. int m_nFrmHeaderLen; //探测器图像头长度
  64. int m_nLastLogicMode; //上一次选中的LogicMode,避免重复设置
  65. int m_nCurrentLogicMode; //当前选中的LogicMode
  66. int m_nModeID;//探测器采集模式ID
  67. int m_nGainLevel;//亮场增益值
  68. //CF时发送图片的帧率(以秒为单位,例 60/s)PF设置帧率后,由于探测器开窗信号是由外部触发的,故帧率由外部信号决定(当外部触发信号频率大于最大帧率时,由最大帧率决定)
  69. float m_fFrameRate; //采集帧率
  70. int m_nExpTime;//开窗时间,为0时探测器将修改为真正的开窗时间
  71. int m_nExamType; //触发模式 内触发/外触发
  72. WORD* m_pImageBuffer; //SDK所需的一个大的图像buffer
  73. WORD* m_pRawImgBuffer; //单张图像的buffer
  74. WORD* m_pFullImgBuffer; //存储裁剪后的图像
  75. bool m_bSaveRaw;
  76. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式
  77. eDetStatus m_eStatus; // 探测器状态
  78. bool m_bCancelFlag; //true: 取消SDK rad模式采集
  79. int m_nImageWidth; //有效图像宽度
  80. int m_nImageHeight; //有效图像高度
  81. int m_nCropLeft;
  82. int m_nCropRight;
  83. int m_nCropTop;
  84. int m_nCropBottom;
  85. int m_nRawImgWidth; //原始图像宽度
  86. int m_nRawImgHeight; //原始图像高度
  87. int m_nCbImgIndex; //CR_EVT_NEW_FRAME回调返回的图像序号
  88. int m_nExiThreshold;//探测器上传的图像的阈值,只有大于这个阈值才认为是有射线照射后的图
  89. int m_nImageBits;
  90. int m_nOftRefreshTime; //刷新offset的超时时间,单位:分钟
  91. bool m_bAbortRefreshOft; //true-终止offset
  92. bool m_bAbortCalibration;
  93. int m_nAcqReadyTimeout; //SDK Rad模式进入采集ready的超时时间,单位:秒
  94. int m_nGainReadyTimeout; //SDK Rad模式进入增益ready的超时时间,单位:秒
  95. bool m_bIsRadMode; //true: 单帧点片模式
  96. bool m_bSendImgToUpper; //true: 向共享内存存图
  97. int m_nDropImgNum; //曝光已经丢图张数
  98. int m_nDropImgCount; //曝光总丢图张数
  99. int m_nExamMode; //记录当前的工作界面
  100. ULONGLONG m_dwBeginTime;
  101. ULONGLONG m_dwEndTime;
  102. int m_nValidImgNum; //曝光图像
  103. int m_nReadoutTime; //记录不同模式的读出时间
  104. int m_nDelayTime; //从收到曝光信号到取图的延时时间
  105. int m_nTimePercentage; //延时占开窗时间百分比
  106. bool m_bValidImage; //true: 曝光图像,写入共享内存
  107. bool m_bStartGrab; //true: 开始采集
  108. int m_nExposureCount; //曝光总数,用于TOMO模式,-1表示不设置
  109. bool m_bFirstImage;//是否是开始采集后探测器推的第一张图
  110. std::vector<DetectorMode> m_vCtrlDetectorModeList;
  111. bool m_bHaveRadMode;//当前动态探测器是否有单独的点片模式
  112. //辅助线程事件
  113. static unsigned __stdcall onFPDScanThread(PVOID pvoid);
  114. HANDLE m_hFPDScanThread; //辅助线程
  115. HANDLE m_hArrayEvent[SCAN_EVENT_COUNT];
  116. HANDLE m_hStopScanEvent; //退出辅助线程事件
  117. HANDLE m_hAcqEvent; //开始Rad采集事件
  118. HANDLE m_hGainEvent; //开始Rad Gain事件
  119. HANDLE m_hDarkEvent; //开始dark校正
  120. HANDLE m_hProcessImgEvent; //处理图像
  121. static unsigned __stdcall RefreshOffsetThread(PVOID pvoid);
  122. HANDLE m_hOffsetThread;
  123. HANDLE m_hOffsetEvent[OFFSET_EVENT_COUNT];
  124. HANDLE m_hStopOffsetEvent;
  125. HANDLE m_hStartAllOffset;
  126. HANDLE m_hStartOffset;
  127. HANDLE m_hAbortOffset;
  128. HANDLE m_hGainReadyEvent; //Rad Gain ready事件
  129. HANDLE m_hImageEvent; //拿到曝光图像
  130. HMODULE m_hCareRayRFModule; //加载SDK的句柄
  131. bool LoadDll(string strWorkPath);
  132. bool OpenDetector();
  133. bool TestError(int nErrorCode);
  134. void PrintModeList(ResDataObject& DetectorModeList);
  135. bool GetSystemInfo(int nFpdIndex);
  136. bool RegisterAppMode(int nNewAppModeKey, int nModeID, int nGainID, float fFrameRate, int nExpTime, int nTrigType);
  137. void OnProcessImage(int nWidth, int nHeight, int nIndex = -1);
  138. bool StartDarkCalibration(int nLogicMode);
  139. bool StartGainCalibration();
  140. void OnAcquireImage();
  141. void OnAcquireGainImage();
  142. void OnStartDarkCalibration();
  143. eDetStatus GetCareRayDPCStatus();
  144. bool SetCareRayDPCStatus(eDetStatus status);
  145. bool LoadCalibrationFiles();
  146. int CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight,
  147. LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits,
  148. int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin);
  149. bool CheckTimeLimit(ULONGLONG dwBeginTime, ULONGLONG dwEndTime);
  150. bool StopAcquisitionInside();
  151. bool CalculateEXI(WORD* pImgData, int nImgWidth, int nImgHeight, int nImageBit, int nThreshold);
  152. bool CheckImageExi(WORD* pImgData, int nImgWidth, int nImgHeight, WORD dwExiThrethold);
  153. void SaveImage(int nIndex,bool bImageCrop);
  154. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  155. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  156. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  157. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  158. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  159. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  160. CB_CR_InitializeLibrary CR_InitializeLibrary;
  161. CB_CR_DeinitializeLibrary CR_DeinitializeLibrary;
  162. CB_CR_GetDetectorIndexAndIPAddress CR_GetDetectorIndexAndIPAddress;
  163. CB_CR_Connect CR_Connect;
  164. CB_CR_Disconnect CR_Disconnect;
  165. CB_CR_ResetDetector CR_ResetDetector;
  166. CB_CR_GetSystemInformation CR_GetSystemInformation;
  167. CB_CR_GetApplicationMode CR_GetApplicationMode;
  168. CB_CR_RegisterApplicationMode CR_RegisterApplicationMode;
  169. CB_CR_StartAcquisition CR_StartAcquisition;
  170. CB_CR_StopAcquisition CR_StopAcquisition;
  171. CB_CR_StartDarkCalibration CR_StartDarkCalibration;
  172. CB_CR_StartGainCalibration CR_StartGainCalibration;
  173. CB_CR_StopCalibration CR_StopCalibration;
  174. CB_CR_QueryCalibrationStatus CR_QueryCalibrationStatus;
  175. CB_CR_GetDetrStatus CR_GetDetrStatus;
  176. CB_CR_RegisterEventCallback CR_RegisterEventCallback;
  177. CB_CR_LoadReference CR_LoadReference;
  178. CB_CR_UnloadReference CR_UnloadReference;
  179. CB_CR_QueryAcquisitionStatus CR_QueryAcquisitionStatus;
  180. CB_CR_PermitExposure CR_PermitExposure;
  181. CB_CR_GetImage CR_GetImage;
  182. CB_CR_GetConnectionStatus CR_GetConnectionStatus;
  183. CB_CR_StartDarkAcquisition CR_StartDarkAcquisition;
  184. CB_CR_GetLastIntlMsg CR_GetLastIntlMsg;
  185. };