#pragma once #include "CCOS.Dev.FPD.HaoBoRF.h" #include "HaoBoInterface.h" enum eDetStatus { DetStatus_NotIni, DetStatus_NotConn, DetStatus_Sleep, DetStatus_Standby, DetStatus_Acquire, DetStatus_OffsetCalibration, DetStatus_GainCalibration, }; constexpr auto SCAN_EVENT_COUNT = 5; constexpr auto OFFSET_EVENT_COUNT = 4; class Detector_HaoBoRF { public: Detector_HaoBoRF(); ~Detector_HaoBoRF(); bool DriverEntry(void* pDrvDPC, ResDataObject& Configuration, const char* szWorkPath); bool Connect(void* pDrvDPC); void DisConnect(); void EnterExamMode(int nExamMode); bool SetAcqMode(int nMode); 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); float SetFluPPS(float fPPS); void GetFluPPS(float& fFluPPS); bool RefreshAllOffset(); void OnRefreshOffset(); void AbortFreshOffset(); void SetAbortOffsetEvent(); void SetFreshAllOffsetEvent(); void SetfreshOffsetEvent(); void UpdateModeInRunning(int nMode,float fFrequency); void PrintDetectorCfg(RegCfgInfo* pCfg); bool GetPanelInfo(); void* m_nFpdHandle;//SDK初始化后返回的句柄 int m_nMaxImgWidth; //图像原始尺寸 int m_nMaxImgHeight; //图像原始尺寸 int m_nRawImageWidth; //实际出图尺寸 int m_nRawImageHeight; //实际出图尺寸 int m_nImageWidth; //裁剪后的尺寸 int m_nImageHeight; //裁剪后的尺寸 int m_nFrameID; WORD* m_pRawImgBuffer; //存储未裁剪的图像 WORD* m_pFullImgBuffer; //存储裁剪后的图像 //辅助线程事件 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; 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); API_HBI_Init HBI_Init;// API_HBI_Destroy HBI_Destroy;// API_HBI_ConnectDetector HBI_ConnectDetector;// API_HBI_DisConnectDetector HBI_DisConnectDetector;// API_HBI_RegEventCallBackFun HBI_RegEventCallBackFun;// API_HBI_GetFPDSerialNumber HBI_GetFPDSerialNumber;// API_HBI_GetSDKVerion HBI_GetSDKVerion;// API_HBI_GetFirmareVerion HBI_GetFirmareVerion;// API_HBI_GetError HBI_GetError;// API_HBI_GetFpdCfgInfo HBI_GetFpdCfgInfo;// API_HBI_GetImageProperty HBI_GetImageProperty;// API_HBI_LiveAcquisition HBI_LiveAcquisition;// API_HBI_StopAcquisition HBI_StopAcquisition;// API_HBI_SetSelfDumpingTime HBI_SetSelfDumpingTime;//设置采集时间间隔(动态平板)(未使用) API_HBI_TriggerAndCorrectApplay HBI_TriggerAndCorrectApplay;//设置触发模式和图像校正使能(工作站)新版本(未使用) API_HBI_UpdateTriggerMode HBI_UpdateTriggerMode; API_HBI_UpdateCorrectEnable HBI_UpdateCorrectEnable;//更新图像固件校正使能 (未使用) API_HBI_SetBinning HBI_SetBinning; API_HBI_GenerateTemplate HBI_GenerateTemplate;//快速生成校正模板,可用于刷暗场 API_HBI_TriggerBinningAcqTime HBI_TriggerBinningAcqTime;//设置触发模式、binning方式以及帧率(采集图像时间间隔) API_HBI_IsMutilMode HBI_IsMutilMode;//是否支持多mode private: map* m_pDPC2PanelID; map* m_pPanelID2DPC; int m_nPanelCount; //探测器数量 ResDataObject m_ModeConfig; //保存DPC模块下发的配置 std::string m_strCtrlWorkPath; //保存工作路径,用于加载SDK和配置 int m_nCurrentPanelID; //模块中探测器的ID bool m_bConnected; //true: 探测器连接成功 int m_nCurrentLogicMode; //当前选中的LogicMode int m_nModeID;//自定义探测器采集模式ID int m_nGainLevel;//亮场增益值 //CF时发送图片的帧率(以秒为单位,例 60/s)PF设置帧率后,由于探测器开窗信号是由外部触发的,故帧率由外部信号决定(当外部触发信号频率大于最大帧率时,由最大帧率决定) float m_fFrameRate; //采集帧率 int m_nTriggerMode; //触发模式 int m_nSaveRaw; CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式 eDetStatus m_eStatus; // 探测器状态 int m_nCropLeft;//左侧裁剪 int m_nCropRight;//右侧裁剪 int m_nCropTop;//上边裁剪 int m_nCropBottom;//下边裁剪 int m_nExiThreshold;//探测器上传的图像的阈值,只有大于这个阈值才认为是有射线照射后的图 int m_nImageBits; int m_nDropImgNum; //曝光已经丢图张数 int m_nDropImgCount; //曝光总丢图张数 int m_nExamMode; //记录当前的工作界面 ULONGLONG m_dwBeginTime; ULONGLONG m_dwEndTime; int m_nDelayTime; //从收到曝光信号到取图的延时时间 bool m_bValidImage; //是否已经发送合适的点片图像 bool m_bFirstImage;//是否是开始采集后探测器推的第一张图 HMODULE m_hSDKModule; //加载SDK动态库的句柄 bool m_bLoaded;//SDK库文件是否加载 int nPGALevel; int nBinning; int nPrepareTime; COMM_CFG commCfg; int nLiveAcqTime;//透视时的采集间隔,可以通过设置采集间隔控制上图时的帧率 bool LoadDll(string strWorkPath); bool ConnectDetector(); bool TestError(int nErrorCode, const char* szFuncName = "Func"); void OnProcessImage(int nWidth, int nHeight, int nFrameID = -1); bool StartDarkCalibration(); bool StartGainCalibration(); void OnAcquireImage(); void OnAcquireGainImage(); void OnStartDarkCalibration(); eDetStatus GetDpcStatus(); bool SetDpcStatus(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 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); int GetPGA(unsigned short usValue); };