Detector_HaoBoRF.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #pragma once
  2. #include "CCOS.Dev.FPD.HaoBoRF.h"
  3. #include "HaoBoInterface.h"
  4. enum eDetStatus
  5. {
  6. DetStatus_NotIni,
  7. DetStatus_NotConn,
  8. DetStatus_Sleep,
  9. DetStatus_Standby,
  10. DetStatus_Acquire,
  11. DetStatus_OffsetCalibration,
  12. DetStatus_GainCalibration,
  13. };
  14. constexpr auto SCAN_EVENT_COUNT = 5;
  15. constexpr auto OFFSET_EVENT_COUNT = 4;
  16. class Detector_HaoBoRF
  17. {
  18. public:
  19. Detector_HaoBoRF();
  20. ~Detector_HaoBoRF();
  21. bool DriverEntry(void* pDrvDPC, ResDataObject& Configuration, const char* szWorkPath);
  22. bool Connect(void* pDrvDPC);
  23. void DisConnect();
  24. void EnterExamMode(int nExamMode);
  25. bool SetAcqMode(int nMode);
  26. bool SetExposureTimes(int nTimes);
  27. bool PrepareAcquisition(void* pDrvDPC);
  28. bool StartAcquisition(void* pDrvDPC);
  29. bool StopAcquisition(void* pDrvDPC);
  30. bool ActiveCalibration(void* pDrvDPC, CCOS_CALIBRATION_TYPE eType);
  31. bool PrepareCalibration(void* pDrvDPC);
  32. bool StartCalibration(void* pDrvDPC);
  33. bool StopCalibration(void* pDrvDPC);
  34. float SetFluPPS(float fPPS);
  35. void GetFluPPS(float& fFluPPS);
  36. bool RefreshAllOffset();
  37. void OnRefreshOffset();
  38. void AbortFreshOffset();
  39. void SetAbortOffsetEvent();
  40. void SetFreshAllOffsetEvent();
  41. void SetfreshOffsetEvent();
  42. void UpdateModeInRunning(int nMode,float fFrequency);
  43. void PrintDetectorCfg(RegCfgInfo* pCfg);
  44. bool GetPanelInfo();
  45. void* m_nFpdHandle;//SDK初始化后返回的句柄
  46. int m_nMaxImgWidth; //图像原始尺寸
  47. int m_nMaxImgHeight; //图像原始尺寸
  48. int m_nRawImageWidth; //实际出图尺寸
  49. int m_nRawImageHeight; //实际出图尺寸
  50. int m_nImageWidth; //裁剪后的尺寸
  51. int m_nImageHeight; //裁剪后的尺寸
  52. int m_nFrameID;
  53. WORD* m_pRawImgBuffer; //存储未裁剪的图像
  54. WORD* m_pFullImgBuffer; //存储裁剪后的图像
  55. //辅助线程事件
  56. static unsigned __stdcall onFPDScanThread(PVOID pvoid);
  57. HANDLE m_hFPDScanThread; //辅助线程
  58. HANDLE m_hArrayEvent[SCAN_EVENT_COUNT];
  59. HANDLE m_hStopScanEvent; //退出辅助线程事件
  60. HANDLE m_hAcqEvent; //开始Rad采集事件
  61. HANDLE m_hGainEvent; //开始Rad Gain事件
  62. HANDLE m_hDarkEvent; //开始dark校正
  63. HANDLE m_hProcessImgEvent; //处理图像
  64. static unsigned __stdcall RefreshOffsetThread(PVOID pvoid);
  65. HANDLE m_hOffsetThread;
  66. HANDLE m_hOffsetEvent[OFFSET_EVENT_COUNT];
  67. HANDLE m_hStopOffsetEvent;
  68. HANDLE m_hStartAllOffset;
  69. HANDLE m_hStartOffset;
  70. HANDLE m_hAbortOffset;
  71. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  72. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  73. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  74. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  75. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  76. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  77. API_HBI_Init HBI_Init;//
  78. API_HBI_Destroy HBI_Destroy;//
  79. API_HBI_ConnectDetector HBI_ConnectDetector;//
  80. API_HBI_DisConnectDetector HBI_DisConnectDetector;//
  81. API_HBI_RegEventCallBackFun HBI_RegEventCallBackFun;//
  82. API_HBI_GetFPDSerialNumber HBI_GetFPDSerialNumber;//
  83. API_HBI_GetSDKVerion HBI_GetSDKVerion;//
  84. API_HBI_GetFirmareVerion HBI_GetFirmareVerion;//
  85. API_HBI_GetError HBI_GetError;//
  86. API_HBI_GetFpdCfgInfo HBI_GetFpdCfgInfo;//
  87. API_HBI_GetImageProperty HBI_GetImageProperty;//
  88. API_HBI_LiveAcquisition HBI_LiveAcquisition;//
  89. API_HBI_StopAcquisition HBI_StopAcquisition;//
  90. API_HBI_SetSelfDumpingTime HBI_SetSelfDumpingTime;//设置采集时间间隔(动态平板)(未使用)
  91. API_HBI_TriggerAndCorrectApplay HBI_TriggerAndCorrectApplay;//设置触发模式和图像校正使能(工作站)新版本(未使用)
  92. API_HBI_UpdateTriggerMode HBI_UpdateTriggerMode;
  93. API_HBI_UpdateCorrectEnable HBI_UpdateCorrectEnable;//更新图像固件校正使能 (未使用)
  94. API_HBI_SetBinning HBI_SetBinning;
  95. API_HBI_GenerateTemplate HBI_GenerateTemplate;//快速生成校正模板,可用于刷暗场
  96. API_HBI_TriggerBinningAcqTime HBI_TriggerBinningAcqTime;//设置触发模式、binning方式以及帧率(采集图像时间间隔)
  97. API_HBI_IsMutilMode HBI_IsMutilMode;//是否支持多mode
  98. private:
  99. map<void*, int>* m_pDPC2PanelID;
  100. map<int, void*>* m_pPanelID2DPC;
  101. int m_nPanelCount; //探测器数量
  102. ResDataObject m_ModeConfig; //保存DPC模块下发的配置
  103. std::string m_strCtrlWorkPath; //保存工作路径,用于加载SDK和配置
  104. int m_nCurrentPanelID; //模块中探测器的ID
  105. bool m_bConnected; //true: 探测器连接成功
  106. int m_nCurrentLogicMode; //当前选中的LogicMode
  107. int m_nModeID;//自定义探测器采集模式ID
  108. int m_nGainLevel;//亮场增益值
  109. //CF时发送图片的帧率(以秒为单位,例 60/s)PF设置帧率后,由于探测器开窗信号是由外部触发的,故帧率由外部信号决定(当外部触发信号频率大于最大帧率时,由最大帧率决定)
  110. float m_fFrameRate; //采集帧率
  111. int m_nTriggerMode; //触发模式
  112. int m_nSaveRaw;
  113. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式
  114. eDetStatus m_eStatus; // 探测器状态
  115. int m_nCropLeft;//左侧裁剪
  116. int m_nCropRight;//右侧裁剪
  117. int m_nCropTop;//上边裁剪
  118. int m_nCropBottom;//下边裁剪
  119. int m_nExiThreshold;//探测器上传的图像的阈值,只有大于这个阈值才认为是有射线照射后的图
  120. int m_nImageBits;
  121. int m_nDropImgNum; //曝光已经丢图张数
  122. int m_nDropImgCount; //曝光总丢图张数
  123. int m_nExamMode; //记录当前的工作界面
  124. ULONGLONG m_dwBeginTime;
  125. ULONGLONG m_dwEndTime;
  126. int m_nDelayTime; //从收到曝光信号到取图的延时时间
  127. bool m_bValidImage; //是否已经发送合适的点片图像
  128. bool m_bFirstImage;//是否是开始采集后探测器推的第一张图
  129. HMODULE m_hSDKModule; //加载SDK动态库的句柄
  130. bool m_bLoaded;//SDK库文件是否加载
  131. int nPGALevel;
  132. int nBinning;
  133. int nPrepareTime;
  134. COMM_CFG commCfg;
  135. int nLiveAcqTime;//透视时的采集间隔,可以通过设置采集间隔控制上图时的帧率
  136. bool LoadDll(string strWorkPath);
  137. bool ConnectDetector();
  138. bool TestError(int nErrorCode, const char* szFuncName = "Func");
  139. void OnProcessImage(int nWidth, int nHeight, int nFrameID = -1);
  140. bool StartDarkCalibration();
  141. bool StartGainCalibration();
  142. void OnAcquireImage();
  143. void OnAcquireGainImage();
  144. void OnStartDarkCalibration();
  145. eDetStatus GetDpcStatus();
  146. bool SetDpcStatus(eDetStatus status);
  147. bool LoadCalibrationFiles();
  148. int CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight,
  149. LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits,
  150. int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin);
  151. bool CheckTimeLimit(ULONGLONG dwBeginTime, ULONGLONG dwEndTime);
  152. bool CalculateEXI(WORD* pImgData, int nImgWidth, int nImgHeight, int nImageBit, int nThreshold);
  153. bool CheckImageExi(WORD* pImgData, int nImgWidth, int nImgHeight, WORD dwExiThrethold);
  154. void SaveImage(int nIndex,bool bImageCrop);
  155. int GetPGA(unsigned short usValue);
  156. };