#pragma once #include #include #include #include "ResDataObject.h" #include "CCOS.Dev.FPD.CareRayDR.h" #include "CareRayAPI.h" #include "errors.h" #include "CrStructure.h" #include "ZSKKCalibration.h" constexpr auto SCAN_EVENT_COUNT = 9; #ifndef __CARERAYAPI__ #define __CARERAYAPI__ typedef __declspec(dllimport) #endif __CARERAYAPI__ int(__cdecl* Func_CrInitializeLibrary)(); __CARERAYAPI__ int(__cdecl* Func_CrDeinitializeLibrary)(); __CARERAYAPI__ void(__cdecl* Func_CrGetLastIntlMsg)(char*, int); __CARERAYAPI__ int(__cdecl* Func_CrGetConfigItemValue)(const char*, char*); __CARERAYAPI__ int(__cdecl* Func_CrSetConfigItemValue)(const char*, const char*); __CARERAYAPI__ int(__cdecl* Func_CrRegisterEventCallbackFun)(CrCallbackFunPtr); __CARERAYAPI__ int(__cdecl* Func_CrGetDetectorIndexAndIPAddress)(CrDetrIdxAndIPAddr*, int*); __CARERAYAPI__ int(__cdecl* Func_CrConnect)(int); __CARERAYAPI__ int(__cdecl* Func_CrResetDetector)(int, int); __CARERAYAPI__ int(__cdecl* Func_CrDisconnect)(int); __CARERAYAPI__ int(__cdecl* Func_CrGetSystemInformation)(int, CrSystemInfo*); __CARERAYAPI__ int(__cdecl* Func_CrGetApplicationMode)(int, CrModeInfo*, int*); __CARERAYAPI__ int(__cdecl* Func_CrRegisterApplicationMode)(int, int, int, float*, float*, int, int, int, int); __CARERAYAPI__ int(__cdecl* Func_CrSetFrameFilter)(int, int, const char*); __CARERAYAPI__ int(__cdecl* Func_CrGetModeInfoByAppModeKey)(int, int, CrModeInfo*); __CARERAYAPI__ int(__cdecl* Func_CrGetRegedInfoByAppModeKey)(int, int, CrRegModeInfo*); __CARERAYAPI__ int(__cdecl* Func_CrGetModeInfoByModeId)(int, int, CrModeInfo*); __CARERAYAPI__ int(__cdecl* Func_CrLoadReference)(int, int); __CARERAYAPI__ int(__cdecl* Func_CrUnloadReference)(int, int); __CARERAYAPI__ int(__cdecl* Func_CrStartAcquisition)(int, int, int); __CARERAYAPI__ int(__cdecl* Func_CrStartDarkAcquisition)(int, int, bool, bool); __CARERAYAPI__ int(__cdecl* Func_CrStartDarkAcquisitionWithCorrOpt)(int, int, unsigned int); __CARERAYAPI__ int(__cdecl* Func_CrStopAcquisition)(int); __CARERAYAPI__ int(__cdecl* Func_CrStartDarkCalibration)(int, int, int, int); __CARERAYAPI__ int(__cdecl* Func_CrStartGainCalibration)(int, int); __CARERAYAPI__ int(__cdecl* Func_CrStopCalibration)(int); __CARERAYAPI__ int(__cdecl* Func_CrGetAcquisitionStatInfo)(int, CrAcquisitionStatInfo*); __CARERAYAPI__ int(__cdecl* Func_CrQueryCalibrationStatus)(int, CrCalibrationInfo*); __CARERAYAPI__ int(__cdecl* Func_CrQueryReferenceStatus)(int, int, CrRefStatusInfo*); __CARERAYAPI__ int(__cdecl* Func_CrGetDefectInfo)(int, const int, CrDefectInfo*); __CARERAYAPI__ int(__cdecl* Func_CrGetPositionDefectInfo)(int, const int, CrDefectInfo*, int); __CARERAYAPI__ int(__cdecl* Func_CrQueryAcquisitionStatus)(int, CrExpProgress*); __CARERAYAPI__ int(__cdecl* Func_CrQueryAedExposureProgress)(int, CrAedExpProgress*); __CARERAYAPI__ int(__cdecl* Func_CrPermitExposure)(int); __CARERAYAPI__ int(__cdecl* Func_CrRequestExposure)(int); __CARERAYAPI__ int(__cdecl* Func_CrGetImage)(int, char*, int, int); __CARERAYAPI__ int(__cdecl* Func_CrGetNoHeaderImage)(int, char*, int, int); __CARERAYAPI__ int(__cdecl* Func_CrGetDetrStatus)(int, CrDetrStatus*); __CARERAYAPI__ int(__cdecl* Func_CrGetConnectionStatus)(int, CrConnectionStatus*); __CARERAYAPI__ int(__cdecl* Func_CrStartAcquisitionWithCorrOpt)(int, int, unsigned int, int); __CARERAYAPI__ int(__cdecl* Func_CrGetDaecActiveAreas)(int, CrDaecAreaInfo*, int*, int*); __CARERAYAPI__ int(__cdecl* Func_CrSetDaecActiveAreas)(int, CrDaecAreaInfo*, int, int); __CARERAYAPI__ int(__cdecl* Func_CrGetBatteryInfos)(int, CrBatteryInfo*, int*); __CARERAYAPI__ int(__cdecl* Func_CrGetWirelessStatus)(int, CrWirelessStatus*); class Detector_CareRayDR { enum class eDetStatus { DetStatus_NotIni, DetStatus_NotConn, DetStatus_Sleep, DetStatus_Standby, DetStatus_Work, DetStatus_Acquire, DetStatus_Offset, DetStatus_XrayCalibration, }; //探测器信息 struct CPanelStatus { bool bInitOver; //是否初始化完成 bool bConnectState; //是否连接 SYNC_MODE eSyncMode; //同步模式 int nSoftAcqState; eDetStatus eFPDStatus; //探测器状态 CPanelStatus() { bInitOver = false; bConnectState = false; eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值 nSoftAcqState = 0; eFPDStatus = eDetStatus::DetStatus_NotIni; } }; public: Detector_CareRayDR(); ~Detector_CareRayDR(); bool DriverEntry(FPDDeviceCareRay* pDrvDPC, ResDataObject& Configuration); bool Connect(FPDDeviceCareRay* pDrvDPC, const char* szWorkPath); bool Disconnect(); void EnterExamMode(int nExamMode); bool SetAcqMode(int nMode); bool PrepareAcquisition(FPDDeviceCareRay* pDrvDPC); bool StartAcquisition(FPDDeviceCareRay* pDrvDPC); bool StopAcquisition(FPDDeviceCareRay* pDrvDPC); bool RequestXray(FPDDeviceCareRay* pDrvDPC); bool ActiveCalibration(FPDDeviceCareRay* pDrvDPC, CCOS_CALIBRATION_TYPE eType); bool PrepareCalibration(FPDDeviceCareRay* pDrvDPC); bool StartCalibration(FPDDeviceCareRay* pDrvDPC); bool StopCalibration(FPDDeviceCareRay* pDrvDPC); bool ConfirmCalExposure(); void RejectCalExposure(); RET_STATUS AbortCalibration(FPDDeviceCareRay* pDrvDPC); bool CompleteCalibration(FPDDeviceCareRay* pDrvDPC); bool SaveCalibrationFile(); bool SetCalibRounds(int nCalibRounds); bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound); void OnProcessDarkEnd(); bool AcceptCalibration(); bool RejectCalibration(); CCOS_CALIBRATION_TYPE GetCalibType(); bool GetCalibrationTime(int nDetectorID = -1); void ProcessCREvent(int eventID, CrEvent* eventData); private: map* m_pDPC2PanelID; map* m_pPanelID2DPC; ResDataObject m_ModeConfig; //保存DPC模块下发的配置 CPanelStatus* m_pStPanelStatus[2]; // int m_nPanelCount; //探测器数量 int m_nCurrentPanelID; int m_nSyncMode; //记录选择模式时使用的同步模式 int m_nImageWidth; int m_nImageHeight; int m_nWidthOffset; int m_nHeightOffset; std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置 HMODULE m_hCareRayDRModule; //加载SDK的句柄 //软同步是通过回调函数通知状态的 硬同步和AED都要主动查询状态,虽然都是query prog info 但是他俩使用的标志位也是不同的 int m_nRawImgWidth; //SDK反馈的图像宽 int m_nRawImgHeight; //SDK反馈的图像高 int m_nDetectorNum; WORD* m_pRawImgBuffer; //原始图 WORD* m_pImgBuffer; //裁剪后图像 WORD* m_pDarkImage; //一键校正时获取的暗场图像 bool m_bSaveRaw; CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正类型 int m_nCheckMode;//sdk的CheckMode int m_nCurrentLogicMode; CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 ecom校正/厂商校正 WORD* m_pFluFrameData; int m_nCalibrationRounds;//校正轮数 int m_nCalibCurrentCalibrationRound;//当前校正轮数 int m_nCalibCurrentExposureIndex;//当前轮次曝光第几次 int m_nExposureNumCurrentRound;//当前轮次需要曝光的总次数 CZSKKCalibrationCtrl* m_pZSKKCalib; string m_strDetectorType; //探测器类型 bool m_bOnlyHaveFpd;//当前环境是否只有探测器一个真实设备并且处于AED同步模式,其他设备是demo的 1-是 0-否 默认否 int m_nGainImg; // 校正时接受的亮场图数量 int m_nGainExposureNum;//gain校正曝光的总次数 int m_nDetectorID; int m_nAppModeKey; int m_nModeID; int m_nFrameRate; int m_nTriggerType; int m_nExtIntegrationTime; int m_nGainLevel; int m_nDualEnergyFrameNum; bool m_bExitRadAcqStatus; bool m_bExitDualAcqStatus; bool m_bDualEnergyFirstExpEnableDone; bool m_bDualEnergySecondExpEnable; HANDLE m_hRespond;//用于等待某个状态的到来或者某个动作的完成 //辅助线程事件 HANDLE m_hInitEvent; HANDLE m_hExitEvent; //退出辅助线程事件 HANDLE m_hReConnectEvent; HANDLE m_hSwitchEvent; HANDLE m_hLoadCalibrationEvent; HANDLE m_hRadEvent; HANDLE m_hDualEnergyEvent; HANDLE m_hOffsetEvent; HANDLE m_hGainEvent; //开始Rad Gain事件 HANDLE m_hDetectorScanToggleEvnet; HANDLE m_hArrayEvent[8]; HANDLE m_hToggleEvent; //辅助线程退出通知事件 HANDLE m_hFPDScanThread; //辅助线程 HANDLE m_hRadAcquisitionThread; HANDLE m_hDualEnergyAcquisitionThread; HANDLE m_hStatusMonitorThread; HANDLE m_hExitStatusMonitorEvent; HANDLE m_hStatusMonitorToggleEvent; HANDLE m_hExitRadAcqStatus; HANDLE m_hExitDualAcqStatus; void InitSdkInterface(); bool LoadDll(string strWorkPath); bool ReleaseDll(); bool OpenDetector(); bool InitDetector(); bool OpenStatusMonitor(); static unsigned __stdcall CareRayStatusMonitorThread(PVOID pvoid); bool StatusMonitor(); bool CloseStatusMonitor(); bool CloseDetectorScan(); int ShowModeInfo(); bool SetApplicationMode(); bool LoadCalibrationFiles(); bool WaitRespond(int nTimeOut = 65000, const char* szAction = ""); void StopWaiting(const char* szAction = ""); bool TestError(int nErrorCode); //辅助线程 static unsigned __stdcall onFPDScanThread(PVOID pvoid); void OnStartDarkCalibration(); void OnAcquireGainImage(); void OnReconnectFPD(); void OnProcessInitFPD(); int DarkAcquisition(); int QueryAutoProgInfo(bool bIsAED = true); int QueryRadProgInfo(); void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight, string strFrameID = ""); bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth); bool SetUserCorrection(bool bLoad); double GetMean(WORD* imgNoHeader, int pixelNum); eDetStatus GetCareRayDPCStatus(int nDetectorIndex = -1); bool SetCareRayDPCStatus(eDetStatus status, int nDetectorIndex = -1); bool IsConnected(string strIP); bool GetTriggerType(int nTriggerModeID); bool CheckConnection(); bool ReConnectFPD(); bool OpenRadAcquisition(); static UINT RadAcquisitionThread(LPVOID pParam); bool PerformRadAcquisition(); bool CloseRadAcquisition(); bool OpenDualEnergyAcquisition(); static UINT DualEnergyAcquisitionThread(LPVOID pParam); bool PerformDualEnergyAcquisition(); bool CloseDualEnergyAcquisition(); 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); Func_CrInitializeLibrary API_CrInitializeLibrary; Func_CrDeinitializeLibrary API_CrDeinitializeLibrary; Func_CrGetLastIntlMsg API_CrGetLastIntlMsg; Func_CrGetConfigItemValue API_CrGetConfigItemValue; Func_CrSetConfigItemValue API_CrSetConfigItemValue; Func_CrRegisterEventCallbackFun API_CrRegisterEventCallbackFun; Func_CrGetDetectorIndexAndIPAddress API_CrGetDetectorIndexAndIPAddress; Func_CrConnect API_CrConnect; Func_CrResetDetector API_CrResetDetector; Func_CrDisconnect API_CrDisconnect; Func_CrGetSystemInformation API_CrGetSystemInformation; Func_CrGetApplicationMode API_CrGetApplicationMode; Func_CrRegisterApplicationMode API_CrRegisterApplicationMode; Func_CrSetFrameFilter API_CrSetFrameFilter; Func_CrGetModeInfoByAppModeKey API_CrGetModeInfoByAppModeKey; Func_CrGetRegedInfoByAppModeKey API_CrGetRegedInfoByAppModeKey; Func_CrGetModeInfoByModeId API_CrGetModeInfoByModeId; Func_CrLoadReference API_CrLoadReference; Func_CrUnloadReference API_CrUnloadReference; Func_CrStartAcquisition API_CrStartAcquisition; Func_CrStartDarkAcquisition API_CrStartDarkAcquisition; Func_CrStartDarkAcquisitionWithCorrOpt API_CrStartDarkAcquisitionWithCorrOpt; Func_CrStopAcquisition API_CrStopAcquisition; Func_CrStartDarkCalibration API_CrStartDarkCalibration; Func_CrStartGainCalibration API_CrStartGainCalibration; Func_CrStopCalibration API_CrStopCalibration; Func_CrGetAcquisitionStatInfo API_CrGetAcquisitionStatInfo; Func_CrQueryCalibrationStatus API_CrQueryCalibrationStatus; Func_CrQueryReferenceStatus API_CrQueryReferenceStatus; Func_CrGetDefectInfo API_CrGetDefectInfo; Func_CrGetPositionDefectInfo API_CrGetPositionDefectInfo; Func_CrQueryAcquisitionStatus API_CrQueryAcquisitionStatus; Func_CrQueryAedExposureProgress API_CrQueryAedExposureProgress; Func_CrPermitExposure API_CrPermitExposure; Func_CrRequestExposure API_CrRequestExposure; Func_CrGetImage API_CrGetImage; Func_CrGetNoHeaderImage API_CrGetNoHeaderImage; Func_CrGetDetrStatus API_CrGetDetrStatus; Func_CrGetConnectionStatus API_CrGetConnectionStatus; Func_CrStartAcquisitionWithCorrOpt API_CrStartAcquisitionWithCorrOpt; Func_CrGetDaecActiveAreas API_CrGetDaecActiveAreas; Func_CrSetDaecActiveAreas API_CrSetDaecActiveAreas; Func_CrGetBatteryInfos API_CrGetBatteryInfos; Func_CrGetWirelessStatus API_CrGetWirelessStatus; };