#pragma once #include "ResDataObject.h" #include "CCOS.Dev.FPD.TeledyneDalsa.h" #include "CallbackImp.h" #include "TeledyneGigEInterface.h" #include "CalImage.h" #ifndef EDETSTATUS #define EDETSTATUS enum class eDetStatus { DetStatus_NotIni, DetStatus_NotConn, DetStatus_Sleep, DetStatus_Standby, DetStatus_Work, DetStatus_Acquire, DetStatus_Offset, DetStatus_XrayCalibration, }; #endif // !EDETSTATUS constexpr auto SCAN_EVENT_COUNT = 5; class Detector_TeledyneDalsa { public: Detector_TeledyneDalsa(); ~Detector_TeledyneDalsa(); bool DriverEntry(void* pDrvDPC, ResDataObject& Configuration); bool Connect(void* pDrvDPC, const char* szWorkPath); 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, void* context); bool DarkCallbackProcess(int nEventID, void* context); bool GainCallbackProcess(int nEventID, void* context); private: Image raw; Image dark; Image gain_nodark; Image gain; Image defect; Image image; map* m_pDPC2PanelID; //DPC转换为PanelID map* m_pPanelID2DPC; //PanelID转换为DPC TGI_Device m_cGigeDevice; //Dalsa的SDK句柄 ResDataObject m_ModeConfig; //保存DPC模块下发的配置 ResDataObject m_ModeMatch; //记录应用模式和采集模式的对应关系 CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式 CRITICAL_SECTION m_cs; eDetStatus m_eStatus; // 探测器状态 int m_nPanelCount; //探测器数量 int m_nCurrentPanelID; //模块中探测器的ID int m_nLastLogicMode; //上一次选中的LogicMode,避免重复设置 int m_nCurrentLogicMode; //当前选中的LogicMode 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_nImgIndex; //回调返回的图像序号,Dalsa的序号无法直接使用,所以每次采集时进行重置 int m_nExiThreshold;//探测器上传的图像的阈值,只有大于这个阈值才认为是有射线照射后的图 int m_nAcqReadyTimeout; //SDK Rad模式进入采集ready的超时时间,单位:秒 int m_nGainReadyTimeout; //SDK Rad模式进入增益ready的超时时间,单位:秒 int m_nOftRefreshTimer; //非检查界面刷新offset的超时时间,单位:分钟 int m_nDropImgNum; //曝光已经丢图张数 int m_nDropImgCount; //曝光总丢图张数 int m_nExamMode; //记录当前的工作界面 int m_nValidImgNum; //曝光图像 int m_nDelayTime; //从收到曝光信号到取图的延时时间 int m_nExposureCount; //曝光总数,用于TOMO模式,-1表示不设置 int m_nblackOffset; //Teledyne用来进行校正的参数 float m_fFrameRate; //采集帧率 double m_dgainAverage; //Teledyne用来进行校正的参数 std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置 std::string m_strSerialNum; std::string m_strCurrentExamType; //当前选中的曝光模式 bool m_bSaveRaw; //用于保存原图的配置项 bool m_bIsRadMode; //true: 单帧点片模式 bool m_bSendImgToUpper; //true: 向共享内存存图 bool m_bAbortRefreshOft; //true:终止offset,一般是在退出软件时 bool m_bValidImage; //true: 曝光图像,写入共享内存 bool m_bStartGrab; //true: 开始采集 bool m_bFirstImage;//是否是开始采集后探测器推的第一张图 WORD* m_pImageBuffer; //SDK所需的一个大的图像buffer WORD* m_pRawImgBuffer; //单张图像的buffer WORD* m_pFullImgBuffer; //存储裁剪后的图像 ULONGLONG m_dwBeginTime; ULONGLONG m_dwEndTime; //辅助线程事件 HANDLE m_hAcqEvent; //开始Rad采集事件 HANDLE m_hGainEvent; //开始Rad Gain事件 HANDLE m_hDarkEvent; //开始dark校正 HANDLE m_hStopScanEvent; //退出辅助线程事件 HANDLE m_hProcessImgEvent; //处理图像 HANDLE m_hArrayEvent[SCAN_EVENT_COUNT]; HANDLE m_hAcqReadyEvent; //Rad采集ready事件 HANDLE m_hGainReadyEvent; //Rad Gain ready事件 HANDLE m_hOftEndEvent; //停止offset刷新 HANDLE m_hImageEvent; //拿到曝光图像 HANDLE m_hFPDScanThread; //辅助线程 HANDLE m_hRefreshOftThread; HMODULE m_hTeledyneDalsaModule; //加载SDK的句柄 bool OpenDetector(); void OnProcessImage(int nIndex = -1); bool StartDarkCalibration(int nLogicMode);//暂时先不做处理,在测试完正常上图流程后再进行修改 bool StartGainCalibration();//暂时先不做处理,在测试完正常上图流程后再进行修改 static unsigned __stdcall onFPDScanThread(PVOID pvoid); void OnAcquireImage(); void OnAcquireGainImage(); void OnStartDarkCalibration(); eDetStatus GetTeledyneDalsaDPCStatus(); bool SetTeledyneDalsaDPCStatus(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); static DWORD __stdcall RefreshOffsetThread(PVOID pvoid); bool RefreshAllOffset(); void OnRefreshOffset(); bool CheckTimeLimit(ULONGLONG dwBeginTime, ULONGLONG dwEndTime); //void SendZskkFPDState(ZSKK_FPD_STATE state); bool GetModeMatchInfo(); 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 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); };