Detector_Rayence.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #pragma once
  2. #include <filesystem>
  3. #include <iostream>
  4. #include <fstream>
  5. #include "ResDataObject.h"
  6. #include "CCOS.Dev.FPD.Rayence.h"
  7. #include "VADAVIntf.h"
  8. #include "GIniFile.h"
  9. //LogicClient* m_pSynClient;
  10. constexpr auto GET_DARK = 0;
  11. constexpr auto GET_BRIGHT = 1;
  12. constexpr auto CAL_OneShot = 2;
  13. constexpr auto CAL_Flu = 3;
  14. #ifndef EDETSTATUS
  15. #define EDETSTATUS
  16. enum class eDetStatus
  17. {
  18. DetStatus_NotInit,
  19. DetStatus_NotConn,
  20. DetStatus_Sleep,
  21. DetStatus_Standby,
  22. DetStatus_Work,
  23. DetStatus_Acquire,
  24. DetStatus_Offset,
  25. DetStatus_XrayCalibration,
  26. };
  27. #endif // !EDETSTATUS
  28. constexpr auto SCAN_EVENT_COUNT = 5;
  29. class Detector_Rayence
  30. {
  31. public:
  32. Detector_Rayence();
  33. ~Detector_Rayence();
  34. bool DriverEntry(void* pDrvDPC, ResDataObject& Configuration);
  35. bool Connect(void* pDrvDPC, const char* szWorkPath);
  36. bool SetAcqMode(std::string strMode);
  37. bool PrepareAcquisition(void* pDrvDPC);
  38. bool StartAcquisition(void* pDrvDPC);
  39. bool StopAcquisition(void* pDrvDPC);
  40. bool StartOffset(void* pDrvDPC, bool isAll, std::vector<DetectorMode>& m_vDetectorModeList);
  41. bool AbortOffset();
  42. bool ActiveCalibration(void* pDrvDPC, CCOS_CALIBRATION_TYPE eType);
  43. bool PrepareCalibration(void* pDrvDPC);
  44. bool StartCalibration(void* pDrvDPC);
  45. bool StopCalibration(void* pDrvDPC);
  46. void CALLBACK_Acquisition(tVDACQ_CallBackRec* ACBR);
  47. void CALLBACK_Dark_Acquisition(tVDACQ_CallBackRec* ACBR);
  48. void DisConnect();
  49. void EnterExamMode(int nExamMode);
  50. void CALLBACK_InfoMessage(int nCode, TCHAR* szMessage);
  51. void HandleCaptureRecvEvent(tVDACQ_CallBackRec* ACBR, bool bIsCaptureRaw);
  52. std::string GetFileVersion(std::string strFilePathName);
  53. float SetFluPPS(float fPPS);
  54. void GetFluPPS(float& fFluPPS);
  55. private:
  56. map<void*, int>* m_pDPC2PanelID;
  57. map<int, void*>* m_pPanelID2DPC;
  58. ResDataObject m_ModeConfig; //保存DPC模块下发的配置
  59. tVADAV_InterfaceRec m_Intf; //Rayence 调用接口的实例对象
  60. tVDACQ_CallBackRec* rACQ_CallBackRec; //用于接收回调返回数据的结构体
  61. tVDACQ_FGRec m_qFGRec;
  62. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式
  63. eDetStatus m_eStatus; // 探测器状态
  64. CRITICAL_SECTION m_cs;
  65. HANDLE m_hOffsetThread;
  66. HANDLE m_hOffsetThreadStatus;
  67. std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置
  68. std::string m_strCurrentExamType; //当前选中的曝光模式
  69. std::string m_strSDKPath;
  70. std::string m_strModulePath;
  71. std::string m_strCurrentLogicMode; //当前选中的LogicMode
  72. std::string m_strLastLogicMode; //上一次选中的LogicMode,避免重复设置
  73. int m_nPanelCount; //探测器数量
  74. int m_nCurrentPanelID; //模块中探测器的ID
  75. int m_nImageHeight; //有效图像高度
  76. int m_nImageWidth; //有效图像宽度
  77. int m_nCropLeft;
  78. int m_nCropRight;
  79. int m_nCropTop;
  80. int m_nCropBottom;
  81. int m_nRawImgHeight; //原始图像高度
  82. int m_nRawImgWidth; //原始图像宽度
  83. int m_nExiThreshold;//探测器上传的图像的阈值,只有大于这个阈值才认为是有射线照射后的图
  84. int m_nExamMode; //记录当前的工作界面
  85. int m_nSensitivity; //用于Rayence初始化时进行设置
  86. int m_nFrmWidth; //探测器采集图像的宽
  87. int m_nFrmHeight; //探测器采集图像的高
  88. int m_nBinningMode;
  89. int m_nImageIndex;
  90. int m_nExposureTime;
  91. int m_nRecvCount;
  92. int m_nFrmAveBufSize;
  93. int m_nAveCount;
  94. int m_nSkipNum;
  95. int m_nCalToAcqNum;
  96. int m_nCalModeId;
  97. int m_nCalBinning;
  98. bool m_bSaveRaw;
  99. bool m_bCalOffset;
  100. bool m_bCalGain;
  101. bool m_bCalBPM;
  102. bool m_bDoOffset;
  103. bool m_bAbortOffset;
  104. bool m_bRefreshAllMode;
  105. bool m_bOffsetBuffer;
  106. bool m_bRayenceConnect;
  107. bool m_bRayAcqing;
  108. float m_fFrameRate;
  109. WORD* m_pFullImgBuffer; //存储裁剪后的图像
  110. short* m_pFrm1x1Buffer;
  111. short* m_pFrm2x2Buffer;
  112. short* m_pOneShotBuffer;
  113. short* m_pDark1x1Buffer;
  114. short* m_pDark2x2Buffer;
  115. int* m_pFrm1x1AveBuffer;
  116. int* m_pFrm2x2AveBuffer;
  117. UINT m_nFlags;
  118. vector<DetectorMode> m_vecDetMode;
  119. private:
  120. eDetStatus GetRayenceDPCStatus();
  121. bool OpenDetector();
  122. bool LoadRayenceDLL();
  123. bool StartGainCalibration();
  124. bool SetRayenceDPCStatus(eDetStatus status);
  125. bool CalculateEXI(WORD* pImgData, int nImgWidth, int nImgHeight, int nImageBit, int nThreshold);
  126. bool CheckImageExi(WORD* pImgData, int nImgWidth, int nImgHeight, WORD dwExiThrethold);
  127. bool OpenRefreshOffset();
  128. static UINT RefreshOffsetThread(LPVOID pParam);
  129. bool PerformRefreshOffset();
  130. bool CloseRefreshOffset();
  131. void OnProcessImage(int CaptureFrame, bool bIsCaptureRaw);
  132. void OnRadImageEvt(int CaptureFrame, bool bIsCaptureRaw);
  133. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  134. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  135. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  136. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  137. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  138. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  139. void OffsetProgressFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  140. void OffsetStatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  141. int CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight,
  142. LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits,
  143. int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin);
  144. std::string SaveAveFrames(unsigned short* pBuf, TCHAR* pszFileName);
  145. int GetMedian(int nNumPixel, const unsigned short* pData, int nCurPixelPro);
  146. static void iDsp_FindMinMax(int nNumPix, const unsigned short* psData, int* piMin, int* piMax);
  147. static int* iDsp_BuildHistogram(int nNumPix, const unsigned short* psData, int* piMin, int* piMax);
  148. };