Detector_TeledyneDalsa.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #pragma once
  2. #include "ResDataObject.h"
  3. #include "CCOS.Dev.FPD.TeledyneDalsa.h"
  4. #include "CallbackImp.h"
  5. #include "TeledyneGigEInterface.h"
  6. #include "CalImage.h"
  7. #ifndef EDETSTATUS
  8. #define EDETSTATUS
  9. enum class eDetStatus
  10. {
  11. DetStatus_NotIni,
  12. DetStatus_NotConn,
  13. DetStatus_Sleep,
  14. DetStatus_Standby,
  15. DetStatus_Work,
  16. DetStatus_Acquire,
  17. DetStatus_Offset,
  18. DetStatus_XrayCalibration,
  19. };
  20. #endif // !EDETSTATUS
  21. constexpr auto SCAN_EVENT_COUNT = 5;
  22. class Detector_TeledyneDalsa
  23. {
  24. public:
  25. Detector_TeledyneDalsa();
  26. ~Detector_TeledyneDalsa();
  27. bool DriverEntry(void* pDrvDPC, ResDataObject& Configuration);
  28. bool Connect(void* pDrvDPC, const char* szWorkPath);
  29. void DisConnect();
  30. void EnterExamMode(int nExamMode);
  31. bool SetAcqMode(int nMode);
  32. bool SetXrayOnNum();
  33. bool SetExposureTimes(int nTimes);
  34. bool PrepareAcquisition(void* pDrvDPC);
  35. bool StartAcquisition(void* pDrvDPC);
  36. bool StopAcquisition(void* pDrvDPC);
  37. bool ActiveCalibration(void* pDrvDPC, CCOS_CALIBRATION_TYPE eType);
  38. bool PrepareCalibration(void* pDrvDPC);
  39. bool StartCalibration(void* pDrvDPC);
  40. bool StopCalibration(void* pDrvDPC);
  41. bool CallbackProcess(int nEventID, void* context);
  42. bool DarkCallbackProcess(int nEventID, void* context);
  43. bool GainCallbackProcess(int nEventID, void* context);
  44. private:
  45. Image<unsigned short> raw;
  46. Image<unsigned short> dark;
  47. Image<unsigned short> gain_nodark;
  48. Image<unsigned short> gain;
  49. Image<unsigned short> defect;
  50. Image<unsigned short> image;
  51. map<void*, int>* m_pDPC2PanelID; //DPC转换为PanelID
  52. map<int, void*>* m_pPanelID2DPC; //PanelID转换为DPC
  53. TGI_Device m_cGigeDevice; //Dalsa的SDK句柄
  54. ResDataObject m_ModeConfig; //保存DPC模块下发的配置
  55. ResDataObject m_ModeMatch; //记录应用模式和采集模式的对应关系
  56. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式
  57. CRITICAL_SECTION m_cs;
  58. eDetStatus m_eStatus; // 探测器状态
  59. int m_nPanelCount; //探测器数量
  60. int m_nCurrentPanelID; //模块中探测器的ID
  61. int m_nLastLogicMode; //上一次选中的LogicMode,避免重复设置
  62. int m_nCurrentLogicMode; //当前选中的LogicMode
  63. int m_nImageHeight; //有效图像高度
  64. int m_nImageWidth; //有效图像宽度
  65. int m_nCropLeft;
  66. int m_nCropRight;
  67. int m_nCropTop;
  68. int m_nCropBottom;
  69. int m_nRawImgHeight; //原始图像高度
  70. int m_nRawImgWidth; //原始图像宽度
  71. int m_nImgIndex; //回调返回的图像序号,Dalsa的序号无法直接使用,所以每次采集时进行重置
  72. int m_nExiThreshold;//探测器上传的图像的阈值,只有大于这个阈值才认为是有射线照射后的图
  73. int m_nAcqReadyTimeout; //SDK Rad模式进入采集ready的超时时间,单位:秒
  74. int m_nGainReadyTimeout; //SDK Rad模式进入增益ready的超时时间,单位:秒
  75. int m_nOftRefreshTimer; //非检查界面刷新offset的超时时间,单位:分钟
  76. int m_nDropImgNum; //曝光已经丢图张数
  77. int m_nDropImgCount; //曝光总丢图张数
  78. int m_nExamMode; //记录当前的工作界面
  79. int m_nValidImgNum; //曝光图像
  80. int m_nDelayTime; //从收到曝光信号到取图的延时时间
  81. int m_nExposureCount; //曝光总数,用于TOMO模式,-1表示不设置
  82. int m_nblackOffset; //Teledyne用来进行校正的参数
  83. float m_fFrameRate; //采集帧率
  84. double m_dgainAverage; //Teledyne用来进行校正的参数
  85. std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置
  86. std::string m_strSerialNum;
  87. std::string m_strCurrentExamType; //当前选中的曝光模式
  88. bool m_bSaveRaw; //用于保存原图的配置项
  89. bool m_bIsRadMode; //true: 单帧点片模式
  90. bool m_bSendImgToUpper; //true: 向共享内存存图
  91. bool m_bAbortRefreshOft; //true:终止offset,一般是在退出软件时
  92. bool m_bValidImage; //true: 曝光图像,写入共享内存
  93. bool m_bStartGrab; //true: 开始采集
  94. bool m_bFirstImage;//是否是开始采集后探测器推的第一张图
  95. WORD* m_pImageBuffer; //SDK所需的一个大的图像buffer
  96. WORD* m_pRawImgBuffer; //单张图像的buffer
  97. WORD* m_pFullImgBuffer; //存储裁剪后的图像
  98. ULONGLONG m_dwBeginTime;
  99. ULONGLONG m_dwEndTime;
  100. //辅助线程事件
  101. HANDLE m_hAcqEvent; //开始Rad采集事件
  102. HANDLE m_hGainEvent; //开始Rad Gain事件
  103. HANDLE m_hDarkEvent; //开始dark校正
  104. HANDLE m_hStopScanEvent; //退出辅助线程事件
  105. HANDLE m_hProcessImgEvent; //处理图像
  106. HANDLE m_hArrayEvent[SCAN_EVENT_COUNT];
  107. HANDLE m_hAcqReadyEvent; //Rad采集ready事件
  108. HANDLE m_hGainReadyEvent; //Rad Gain ready事件
  109. HANDLE m_hOftEndEvent; //停止offset刷新
  110. HANDLE m_hImageEvent; //拿到曝光图像
  111. HANDLE m_hFPDScanThread; //辅助线程
  112. HANDLE m_hRefreshOftThread;
  113. HMODULE m_hTeledyneDalsaModule; //加载SDK的句柄
  114. bool OpenDetector();
  115. void OnProcessImage(int nIndex = -1);
  116. bool StartDarkCalibration(int nLogicMode);//暂时先不做处理,在测试完正常上图流程后再进行修改
  117. bool StartGainCalibration();//暂时先不做处理,在测试完正常上图流程后再进行修改
  118. static unsigned __stdcall onFPDScanThread(PVOID pvoid);
  119. void OnAcquireImage();
  120. void OnAcquireGainImage();
  121. void OnStartDarkCalibration();
  122. eDetStatus GetTeledyneDalsaDPCStatus();
  123. bool SetTeledyneDalsaDPCStatus(eDetStatus status);
  124. bool LoadCalibrationFiles();
  125. int CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight,
  126. LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits,
  127. int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin);
  128. static DWORD __stdcall RefreshOffsetThread(PVOID pvoid);
  129. bool RefreshAllOffset();
  130. void OnRefreshOffset();
  131. bool CheckTimeLimit(ULONGLONG dwBeginTime, ULONGLONG dwEndTime);
  132. //void SendZskkFPDState(ZSKK_FPD_STATE state);
  133. bool GetModeMatchInfo();
  134. bool StopAcquisitionInside();
  135. bool CalculateEXI(WORD* pImgData, int nImgWidth, int nImgHeight, int nImageBit, int nThreshold);
  136. bool CheckImageExi(WORD* pImgData, int nImgWidth, int nImgHeight, WORD dwExiThrethold);
  137. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  138. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  139. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  140. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  141. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  142. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  143. };