#pragma once #include "ResDataObject.h" #include "CCOS.Dev.FPD.CareRayRF.h" #include "include\IntlMsgAliasID.h" #include "CallbackImp.h" #include "CareRayLib.h" enum eDetStatus { DetStatus_NotIni, DetStatus_NotConn, DetStatus_Sleep, DetStatus_Standby, DetStatus_Work, DetStatus_Acquire, DetStatus_Offset, DetStatus_XrayCalibration, }; constexpr auto SCAN_EVENT_COUNT = 5; constexpr auto OFFSET_EVENT_COUNT = 4; class Detector_CareRayRF { public: Detector_CareRayRF(); ~Detector_CareRayRF(); bool DriverEntry(void* pDrvDPC, ResDataObject& Configuration); bool Connect(void* pDrvDPC, const char* szWorkPath, ResDataObject& DetectorModeList); void DisConnect(); void EnterExamMode(int nExamMode); bool SetAcqMode(int nMode); bool SetXrayOnNum(); bool SetExposureTimes(int nTimes); bool PrepareAcquisition(void* pDrvDPC); bool StartAcquisition(void* pDrvDPC); bool StopAcquisition(void* pDrvDPC); bool ActiveCalibration(void* pDrvDPC, CCOS_CALIBRATION_TYPE eType); bool PrepareCalibration(void* pDrvDPC); bool StartCalibration(void* pDrvDPC); bool StopCalibration(void* pDrvDPC); bool CallbackProcess(int nEventID, CR_Event* pEventParam); //根据设置的帧率选择适配帧率的并且分辨率最大的模式 float SetFluPPS(float fPPS, std::vector& v_DetectorModeList); void GetFluPPS(float& fFluPPS); bool RefreshAllOffset(std::vector& v_DetectorModeList); void OnRefreshOffset(); void AbortFreshOffset(); void SetAbortOffsetEvent(); void SetFreshAllOffsetEvent(std::vector& v_DetectorModeList); void SetfreshOffsetEvent(); void UpdateModeInRunning(int nMode,float fFrequency); private: map* m_pDPC2PanelID; map* m_pPanelID2DPC; int m_nPanelCount; //探测器数量 ResDataObject m_ModeConfig; //保存DPC模块下发的配置 std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置 int m_nCurrentPanelID; //模块中探测器的ID int m_nCurrentDetIndex; //SDK中当前探测器的index ICallback* m_pCallbackPtrs; CR_ModeInfo* m_mapModeInfo; CR_SystemInfo m_stSystemInfo; int m_nModeNum; //当前探测器支持的模式总数 bool m_bFPDConnected; //true: 探测器连接成功 int m_nFrmHeaderLen; //探测器图像头长度 int m_nLastLogicMode; //上一次选中的LogicMode,避免重复设置 int m_nCurrentLogicMode; //当前选中的LogicMode int m_nModeID;//探测器采集模式ID int m_nGainLevel;//亮场增益值 //CF时发送图片的帧率(以秒为单位,例 60/s)PF设置帧率后,由于探测器开窗信号是由外部触发的,故帧率由外部信号决定(当外部触发信号频率大于最大帧率时,由最大帧率决定) float m_fFrameRate; //采集帧率 int m_nExpTime;//开窗时间,为0时探测器将修改为真正的开窗时间 int m_nExamType; //触发模式 内触发/外触发 WORD* m_pImageBuffer; //SDK所需的一个大的图像buffer WORD* m_pRawImgBuffer; //单张图像的buffer WORD* m_pFullImgBuffer; //存储裁剪后的图像 bool m_bSaveRaw; CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式 eDetStatus m_eStatus; // 探测器状态 bool m_bCancelFlag; //true: 取消SDK rad模式采集 int m_nImageWidth; //有效图像宽度 int m_nImageHeight; //有效图像高度 int m_nCropLeft; int m_nCropRight; int m_nCropTop; int m_nCropBottom; int m_nRawImgWidth; //原始图像宽度 int m_nRawImgHeight; //原始图像高度 int m_nCbImgIndex; //CR_EVT_NEW_FRAME回调返回的图像序号 int m_nExiThreshold;//探测器上传的图像的阈值,只有大于这个阈值才认为是有射线照射后的图 int m_nImageBits; int m_nOftRefreshTime; //刷新offset的超时时间,单位:分钟 bool m_bAbortRefreshOft; //true-终止offset bool m_bAbortCalibration; int m_nAcqReadyTimeout; //SDK Rad模式进入采集ready的超时时间,单位:秒 int m_nGainReadyTimeout; //SDK Rad模式进入增益ready的超时时间,单位:秒 bool m_bIsRadMode; //true: 单帧点片模式 bool m_bSendImgToUpper; //true: 向共享内存存图 int m_nDropImgNum; //曝光已经丢图张数 int m_nDropImgCount; //曝光总丢图张数 int m_nExamMode; //记录当前的工作界面 ULONGLONG m_dwBeginTime; ULONGLONG m_dwEndTime; int m_nValidImgNum; //曝光图像 int m_nReadoutTime; //记录不同模式的读出时间 int m_nDelayTime; //从收到曝光信号到取图的延时时间 int m_nTimePercentage; //延时占开窗时间百分比 bool m_bValidImage; //true: 曝光图像,写入共享内存 bool m_bStartGrab; //true: 开始采集 int m_nExposureCount; //曝光总数,用于TOMO模式,-1表示不设置 bool m_bFirstImage;//是否是开始采集后探测器推的第一张图 std::vector m_vCtrlDetectorModeList; bool m_bHaveRadMode;//当前动态探测器是否有单独的点片模式 //辅助线程事件 static unsigned __stdcall onFPDScanThread(PVOID pvoid); HANDLE m_hFPDScanThread; //辅助线程 HANDLE m_hArrayEvent[SCAN_EVENT_COUNT]; HANDLE m_hStopScanEvent; //退出辅助线程事件 HANDLE m_hAcqEvent; //开始Rad采集事件 HANDLE m_hGainEvent; //开始Rad Gain事件 HANDLE m_hDarkEvent; //开始dark校正 HANDLE m_hProcessImgEvent; //处理图像 static unsigned __stdcall RefreshOffsetThread(PVOID pvoid); HANDLE m_hOffsetThread; HANDLE m_hOffsetEvent[OFFSET_EVENT_COUNT]; HANDLE m_hStopOffsetEvent; HANDLE m_hStartAllOffset; HANDLE m_hStartOffset; HANDLE m_hAbortOffset; HANDLE m_hGainReadyEvent; //Rad Gain ready事件 HANDLE m_hImageEvent; //拿到曝光图像 HMODULE m_hCareRayRFModule; //加载SDK的句柄 bool LoadDll(string strWorkPath); bool OpenDetector(); bool TestError(int nErrorCode); void PrintModeList(ResDataObject& DetectorModeList); bool GetSystemInfo(int nFpdIndex); bool RegisterAppMode(int nNewAppModeKey, int nModeID, int nGainID, float fFrameRate, int nExpTime, int nTrigType); void OnProcessImage(int nWidth, int nHeight, int nIndex = -1); bool StartDarkCalibration(int nLogicMode); bool StartGainCalibration(); void OnAcquireImage(); void OnAcquireGainImage(); void OnStartDarkCalibration(); eDetStatus GetCareRayDPCStatus(); bool SetCareRayDPCStatus(eDetStatus status); bool LoadCalibrationFiles(); int CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight, LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits, int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin); bool CheckTimeLimit(ULONGLONG dwBeginTime, ULONGLONG dwEndTime); bool StopAcquisitionInside(); bool CalculateEXI(WORD* pImgData, int nImgWidth, int nImgHeight, int nImageBit, int nThreshold); bool CheckImageExi(WORD* pImgData, int nImgWidth, int nImgHeight, WORD dwExiThrethold); void SaveImage(int nIndex,bool bImageCrop); 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); CB_CR_InitializeLibrary CR_InitializeLibrary; CB_CR_DeinitializeLibrary CR_DeinitializeLibrary; CB_CR_GetDetectorIndexAndIPAddress CR_GetDetectorIndexAndIPAddress; CB_CR_Connect CR_Connect; CB_CR_Disconnect CR_Disconnect; CB_CR_ResetDetector CR_ResetDetector; CB_CR_GetSystemInformation CR_GetSystemInformation; CB_CR_GetApplicationMode CR_GetApplicationMode; CB_CR_RegisterApplicationMode CR_RegisterApplicationMode; CB_CR_StartAcquisition CR_StartAcquisition; CB_CR_StopAcquisition CR_StopAcquisition; CB_CR_StartDarkCalibration CR_StartDarkCalibration; CB_CR_StartGainCalibration CR_StartGainCalibration; CB_CR_StopCalibration CR_StopCalibration; CB_CR_QueryCalibrationStatus CR_QueryCalibrationStatus; CB_CR_GetDetrStatus CR_GetDetrStatus; CB_CR_RegisterEventCallback CR_RegisterEventCallback; CB_CR_LoadReference CR_LoadReference; CB_CR_UnloadReference CR_UnloadReference; CB_CR_QueryAcquisitionStatus CR_QueryAcquisitionStatus; CB_CR_PermitExposure CR_PermitExposure; CB_CR_GetImage CR_GetImage; CB_CR_GetConnectionStatus CR_GetConnectionStatus; CB_CR_StartDarkAcquisition CR_StartDarkAcquisition; CB_CR_GetLastIntlMsg CR_GetLastIntlMsg; };