#pragma once #include #include #include //转存文件内容使用 #include #include "CcosLock.h" #include "ResDataObject.h" #include "DetectorDefinition.h" #include "CCOS.Dev.FPD.XiuYuan.h" #include "ZSKKCalibration.h" #define XiuYuan_SCAN_NUM 1 namespace nsDPC = CCOS::Dev::Detail::Detector; namespace CCOS::Dev::Detail::Detector { class XiuYuanCtrl : public CcosLock { class _AutoLocker { CcosLock* m_lockObj; public: _AutoLocker(CcosLock *lockObj,DWORD timeout = INFINITE) :m_lockObj(lockObj) { m_lockObj->Thread_Lock(timeout); } ~_AutoLocker() { if (m_lockObj) { m_lockObj->Thread_UnLock(); } } }; 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: XiuYuanCtrl(); ~XiuYuanCtrl(); bool Init(string strAppPath); bool DriverEntry(FPDDeviceXiuYuan* pDrvDPC, ResDataObject& Configuration); bool ActiveDetector(nsDPC::FPDDeviceXiuYuan* pDrvDPC, bool bActive); bool EnterExam(APP_STATUS eStatus); bool Connect(FPDDeviceXiuYuan* pDrvDPC, string strWorkPath); bool DisConnect(nsDPC::FPDDeviceXiuYuan* pDrvDPC); bool SetAcqMode(string strLogicMode); RET_STATUS StartAcquisition(nsDPC::FPDDeviceXiuYuan* pDrvDPC); RET_STATUS StopAcquisition(nsDPC::FPDDeviceXiuYuan* pDrvDPC); RET_STATUS PrepareAcquisition(nsDPC::FPDDeviceXiuYuan* pDrvDPC); bool ActiveCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC, CCOS_CALIBRATION_TYPE Type); bool PrepareCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC); bool StartCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC); bool StopCalibration(FPDDeviceXiuYuan* pDrvDPC); bool CompleteCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC); bool AbortCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC); void SetCalibRounds(int nCalibRounds); bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound); bool AcceptCalibration(); bool RejectCalibration(); CCOS_CALIBRATION_TYPE GetCalibType(); bool UpdateCalibMode(CCOS_CALIBRATION_MODE eCalibMode); bool SaveCalibrationFile(); bool SetSyncMode(int nSyncMode); void SetNotifyStatusTimePeriod(int nTime); void SetReconnectTimePeriod(int nTime); public: APP_STATUS m_eAppStatus; //记录当前软件的工作状态(界面) ResDataObject m_ModeConfig; CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式 CZSKKCalibrationCtrl* m_pZSKKCalib; int m_nImageWidth; int m_nImageHeight; int m_nRawImgWidth; //图像原始宽 int m_nRawImgHeight; //图像原始高 int m_nWidthOffset; //图像左侧裁剪像素值 int m_nHeightOffset; //图像上边裁剪像素值 int m_nImgBits; int m_nPixelPitch; int m_nNotifyStatusTimePeriod;//通知温度等状态信息的时间间隔 int m_nReconnectTimePeriod;//重连的时间间隔 int m_nSyncMode; private: bool LoadXiuYuanDLL(string strWorkPath); void FreeXiuYuanDLL(); bool DetectorInitProcess(int nPanelIndex, bool bFDAttach = false); 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); bool TestError(int nDetectorID, int nErrorStatus, std::string strAPI = ""); bool StartXWindowOffThread(); static DWORD XWindowOffThread(LPVOID pParam); bool OnEXIT(); void DeleteHandle(); bool IsConnected(string strIP); void OnProcessImg(); bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth); bool SaveRawImage(const char* pImgName, const WORD* pRawImg, int nWidth, int nHeight); static bool ImageReadyCallbackProcess(const char* pImage, unsigned long iFlag); static bool SystemInfoCallbackProcess(SystemInfoCode iCodeIndex, const char* sContent); bool onImageReadyCallbackProcess(const char* pImage, int iFlag); bool onSystemInfoCallbackProcess(SystemInfoCode iCodeIndex, const char* sContent); bool SetDetectorWorkMode(int nDetectorID, const char* szFPD, FpdMode* stWorkMode); bool FPDLoadCorrectFiles(int nDetectorID, const char* szDetectorID); private: //句柄 HMODULE m_hXiuYuanModule; Func_YI_Initialize_FPD_V4 API_YI_Initialize_FPD_V4; Func_YI_FPD_Close API_YI_FPD_Close; Func_YI_FPD_Set_Work_Mode API_YI_FPD_Set_Work_Mode; Func_YI_FPD_Stop_Capture_Image API_YI_FPD_Stop_Capture_Image; Func_YI_FPD_Get_Configure_Common API_YI_FPD_Get_Configure_Common; Func_YI_FPD_Set_Configure_Common API_YI_FPD_Set_Configure_Common; Func_YI_FPD_Get_Configure_SyncOut_Mode API_YI_FPD_Get_Configure_SyncOut_Mode; Func_YI_FPD_Set_Configure_SyncOut_Mode API_YI_FPD_Set_Configure_SyncOut_Mode; Func_YI_FPD_Restore_Factory_Settings API_YI_FPD_Restore_Factory_Settings; Func_YI_Subtract_Offset API_YI_Subtract_Offset; Func_YI_ImageReady_Callback_Register API_YI_ImageReady_Callback_Register; Func_YI_SystemInfo_Callback_Register API_YI_SystemInfo_Callback_Register; Func_YI_Get_Callback_Image_Size API_YI_Get_Callback_Image_Size; Func_YI_GetLastErrorCode API_YI_GetLastErrorCode; Func_YI_Set_Save_Log_Flag API_YI_Set_Save_Log_Flag; Func_YI_FPD_Get_Invalid_Region API_YI_FPD_Get_Invalid_Region; Func_YI_GetLoacalIPs_V4 API_YI_GetLoacalIPs_V4; Func_YI_Set_Image_Save_State API_YI_Set_Image_Save_State; Func_YI_Set_Image_Save_Path API_YI_Set_Image_Save_Path; Func_YI_FPD_Get_FPD_TYPE API_YI_FPD_Get_FPD_TYPE; Func_YI_FPD_Write_Configure_Common_To_File API_YI_FPD_Write_Configure_Common_To_File; Func_YI_FPD_Read_Configure_Common_From_File API_YI_FPD_Read_Configure_Common_From_File; Func_YI_FPD_Write_Configure_SyncOut_To_File API_YI_FPD_Write_Configure_SyncOut_To_File; Func_YI_FPD_Read_Configure_SyncOut_From_File API_YI_FPD_Read_Configure_SyncOut_From_File; Func_YI_FPD_Capture_Image API_YI_FPD_Capture_Image; Func_YI_FPD_Capture_Prepare API_YI_FPD_Capture_Prepare; Func_YI_Load_Gain_Tmp_File API_YI_Load_Gain_Tmp_File; Func_YI_Load_Defect_Tmp_File API_YI_Load_Defect_Tmp_File; Func_YI_Load_Offset_Tmp_File API_YI_Load_Offset_Tmp_File; Func_YI_Load_AED_Offset_Tmp_File API_YI_Load_AED_Offset_Tmp_File; Func_YI_Set_Correct_Type API_YI_Set_Correct_Type; Func_YI_GainCalibrate API_YI_GainCalibrate; Func_YI_OffsetCalibrate API_YI_OffsetCalibrate; Func_YI_DefectCalibrate API_YI_DefectCalibrate; Func_YI_AEDOffsetCalibrate API_YI_AEDOffsetCalibrate; Func_YI_SetWorkMode API_YI_SetWorkMode; Func_YI_GetWorkMode API_YI_GetWorkMode; Func_YI_SetDosage API_YI_SetDosage; Func_YI_SetROIRegion API_YI_SetROIRegion; Func_YI_ThermalSensor API_YI_ThermalSensor; Func_YI_1256Parameter API_YI_1256Parameter; Func_YI_Restart API_YI_Restart; Func_YI_Reset API_YI_Reset; Func_YI_GetStatus API_YI_GetStatus; Func_YI_GetVersion API_YI_GetVersion; Func_YI_FPD_FreeBuffer API_YI_FPD_FreeBuffer; HANDLE m_hArrayEvent[XiuYuan_SCAN_NUM]; HANDLE m_hExitEvent; HANDLE m_hXiuYuanScanEnd; HANDLE m_hWindowOffEvent; HANDLE m_pOffsetThread; HANDLE m_pXWindowoffThread; HANDLE m_hScanEventThread; HANDLE m_hInitThread; string m_strAppPath; //模块工作目录 string m_strWorkPath; //SDK工作路径 string m_strDetectorType; //探测器类型 string m_strAcqMode; int m_nPanelCount; int m_nDetectorID; //SDK探测器ID(1,2,3) int m_nDetectorIndex; //当前激活探测器的index(0,1,2) map* m_pDPC2PanelID; map* m_pPanelID2DPC; DeviceIndexStruct m_stDeviceIndex[3]; //配置的探测器列表//不超过三块板 CPanelStatus* m_pStPanelStatus[2]; // std::vector m_vecDetectorID; //SDK探测器ID HANDLE m_pHardwareStatusThread; HANDLE m_hEndHWStatusThreadEvent; HANDLE m_hHWStatusThreadEndEvent; WORD* m_pImgBuffer; //裁剪后图像内存 WORD* m_pRawImgBuffer; //原始图像内存 bool m_bInCalibrating; bool m_bInExposure; bool m_bAEDWorkFlag; bool m_bCancelFlag; //true: 取消曝光 bool m_bSaveRaw; bool m_bTemperatureEnable; bool m_bBatteryEnable; bool m_bWifiEnable; bool m_bConnectStatus; bool m_bFreeBuffer; bool m_bStandbyFlag; int m_nDoseParam;// 校正用的曝光计量,发送到UI 且本地记录 int m_nCalibStatus; int m_nCalibrationRounds;//校正总轮数 int m_nCalibCurrentCalibrationRound;//当前校正轮数 int m_nCalibCurrentExposureIndex;//当前轮次曝光第几次 int m_nExposureNumCurrentRound;//当前轮次需要曝光的总次数 int m_nExpWindowMode; int m_nXWindow; //校正相关变量 list m_listCalibItem; list::iterator m_iterCalibDose; CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 ecom校正/厂商校正 int m_nDefectExpTimes; int m_nDefectTotalTimes; int m_nGainExpTimes; int m_nGainTotalFrames; int m_nDefectTotalFrames; }; }