#pragma once #include #include #include #include "ResDataObject.h" #include "CCOS.Dev.FPD.Rayence.h" #include "VADAVIntf.h" #include "GIniFile.h" //LogicClient* m_pSynClient; constexpr auto GET_DARK = 0; constexpr auto GET_BRIGHT = 1; constexpr auto CAL_OneShot = 2; constexpr auto CAL_Flu = 3; #ifndef EDETSTATUS #define EDETSTATUS enum class eDetStatus { DetStatus_NotInit, DetStatus_NotConn, DetStatus_Sleep, DetStatus_Standby, DetStatus_Work, DetStatus_Acquire, DetStatus_Offset, DetStatus_XrayCalibration, }; #endif // !EDETSTATUS constexpr auto SCAN_EVENT_COUNT = 5; class Detector_Rayence { public: Detector_Rayence(); ~Detector_Rayence(); bool DriverEntry(void* pDrvDPC, ResDataObject& Configuration); bool Connect(void* pDrvDPC, const char* szWorkPath); bool SetAcqMode(std::string strMode); bool PrepareAcquisition(void* pDrvDPC); bool StartAcquisition(void* pDrvDPC); bool StopAcquisition(void* pDrvDPC); bool StartOffset(void* pDrvDPC, bool isAll, std::vector& m_vDetectorModeList); bool AbortOffset(); bool ActiveCalibration(void* pDrvDPC, CCOS_CALIBRATION_TYPE eType); bool PrepareCalibration(void* pDrvDPC); bool StartCalibration(void* pDrvDPC); bool StopCalibration(void* pDrvDPC); void CALLBACK_Acquisition(tVDACQ_CallBackRec* ACBR); void CALLBACK_Dark_Acquisition(tVDACQ_CallBackRec* ACBR); void DisConnect(); void EnterExamMode(int nExamMode); void CALLBACK_InfoMessage(int nCode, TCHAR* szMessage); void HandleCaptureRecvEvent(tVDACQ_CallBackRec* ACBR, bool bIsCaptureRaw); std::string GetFileVersion(std::string strFilePathName); float SetFluPPS(float fPPS); void GetFluPPS(float& fFluPPS); private: map* m_pDPC2PanelID; map* m_pPanelID2DPC; ResDataObject m_ModeConfig; //保存DPC模块下发的配置 tVADAV_InterfaceRec m_Intf; //Rayence 调用接口的实例对象 tVDACQ_CallBackRec* rACQ_CallBackRec; //用于接收回调返回数据的结构体 tVDACQ_FGRec m_qFGRec; CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式 eDetStatus m_eStatus; // 探测器状态 CRITICAL_SECTION m_cs; HANDLE m_hOffsetThread; HANDLE m_hOffsetThreadStatus; std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置 std::string m_strCurrentExamType; //当前选中的曝光模式 std::string m_strSDKPath; std::string m_strModulePath; std::string m_strCurrentLogicMode; //当前选中的LogicMode std::string m_strLastLogicMode; //上一次选中的LogicMode,避免重复设置 int m_nPanelCount; //探测器数量 int m_nCurrentPanelID; //模块中探测器的ID int m_nImageHeight; //有效图像高度 int m_nImageWidth; //有效图像宽度 int m_nCropLeft; int m_nCropRight; int m_nCropTop; int m_nCropBottom; int m_nRawImgHeight; //原始图像高度 int m_nRawImgWidth; //原始图像宽度 int m_nExiThreshold;//探测器上传的图像的阈值,只有大于这个阈值才认为是有射线照射后的图 int m_nExamMode; //记录当前的工作界面 int m_nSensitivity; //用于Rayence初始化时进行设置 int m_nFrmWidth; //探测器采集图像的宽 int m_nFrmHeight; //探测器采集图像的高 int m_nBinningMode; int m_nImageIndex; int m_nExposureTime; int m_nRecvCount; int m_nFrmAveBufSize; int m_nAveCount; int m_nSkipNum; int m_nCalToAcqNum; int m_nCalModeId; int m_nCalBinning; bool m_bSaveRaw; bool m_bCalOffset; bool m_bCalGain; bool m_bCalBPM; bool m_bDoOffset; bool m_bAbortOffset; bool m_bRefreshAllMode; bool m_bOffsetBuffer; bool m_bRayenceConnect; bool m_bRayAcqing; float m_fFrameRate; WORD* m_pFullImgBuffer; //存储裁剪后的图像 short* m_pFrm1x1Buffer; short* m_pFrm2x2Buffer; short* m_pOneShotBuffer; short* m_pDark1x1Buffer; short* m_pDark2x2Buffer; int* m_pFrm1x1AveBuffer; int* m_pFrm2x2AveBuffer; UINT m_nFlags; vector m_vecDetMode; private: eDetStatus GetRayenceDPCStatus(); bool OpenDetector(); bool LoadRayenceDLL(); bool StartGainCalibration(); bool SetRayenceDPCStatus(eDetStatus status); bool CalculateEXI(WORD* pImgData, int nImgWidth, int nImgHeight, int nImageBit, int nThreshold); bool CheckImageExi(WORD* pImgData, int nImgWidth, int nImgHeight, WORD dwExiThrethold); bool OpenRefreshOffset(); static UINT RefreshOffsetThread(LPVOID pParam); bool PerformRefreshOffset(); bool CloseRefreshOffset(); void OnProcessImage(int CaptureFrame, bool bIsCaptureRaw); void OnRadImageEvt(int CaptureFrame, bool bIsCaptureRaw); void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL); void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL); void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL); void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1); void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1); void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL); void OffsetProgressFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL); void OffsetStatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL); int CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight, LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits, int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin); std::string SaveAveFrames(unsigned short* pBuf, TCHAR* pszFileName); int GetMedian(int nNumPixel, const unsigned short* pData, int nCurPixelPro); static void iDsp_FindMinMax(int nNumPix, const unsigned short* psData, int* piMin, int* piMax); static int* iDsp_BuildHistogram(int nNumPix, const unsigned short* psData, int* piMin, int* piMax); };