#pragma once #include //转存文件内容使用 #include #include "CcosLock.h" #include "ResDataObject.h" #include "DetectorDefinition.h" #include "CCOS.Dev.FPD.Yuying.h" #define Yuying_SCAN_NUM 4 namespace nsDPC = CCOS::Dev::Detail::Detector; namespace CCOS::Dev::Detail::Detector { class YuyingCtrl : 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: YuyingCtrl(); ~YuyingCtrl(); bool Init(string strAppPath); bool DriverEntry(FPDDeviceYuying* pDrvDPC, ResDataObject& Configuration); bool ActivePanel(nsDPC::FPDDeviceYuying* pDrvDPC, bool bActive); bool EnterExam(APP_STATUS eStatus); bool Connect(FPDDeviceYuying* pDrvDPC, string strWorkPath); bool DisConnect(nsDPC::FPDDeviceYuying* pDrvDPC); bool ResetFPD(nsDPC::FPDDeviceYuying* pDrvDPC); bool SelectExamMode(int nLogicMode, nsDPC::FPDDeviceYuying* pDrvDPC); RET_STATUS StartAcquisition(nsDPC::FPDDeviceYuying* pDrvDPC); RET_STATUS StopAcquisition(nsDPC::FPDDeviceYuying* pDrvDPC); RET_STATUS PrepareAcquisition(nsDPC::FPDDeviceYuying* pDrvDPC); bool InitCalibration(); bool GetYuyingPanelCalibItem(); RET_STATUS ActiveCalibration(CCOS_CALIBRATION_TYPE Type, nsDPC::FPDDeviceYuying* pDrvDPC); RET_STATUS PrepareCalibration(nsDPC::FPDDeviceYuying* pDrvDPC); RET_STATUS StartCalibration(nsDPC::FPDDeviceYuying* pDrvDPC); RET_STATUS CompleteCalibration(nsDPC::FPDDeviceYuying* pDrvDPC); RET_STATUS AbortCalibration(nsDPC::FPDDeviceYuying* pDrvDPC); bool ConfirmCalibration(); bool AcceptCalibration(); bool RejectCalibration(); bool CreateCalibrationFile(); void OnEndCalibraion(); bool ActiveSyncMode(nsDPC::FPDDeviceYuying* pDrvDPC, int nSyncMode); bool RecoverLastImage(); bool RecoverLastImageAuto(); bool CopyFile2Folder(string strSrcPath, string strDstPath); public: ResDataObject m_ModeConfig; APP_STATUS m_eAppStatus; //记录当前软件的工作状态(界面) int m_nCurrentMode; //记录探测器当前的采集模式 int m_nImageWidth; int m_nImageHeight; int m_nLeftOffset; //图像左侧裁剪像素值 int m_nTopOffset; //图像上边裁剪像素值 int m_nRightOffset; //图像右侧裁剪像素值 int m_nBottomOffset; //图像下边裁剪像素值 int m_nRawImgWidth; //图像原始宽 int m_nRawImgHeight; //图像原始高 int m_nImgBits; int m_nPixelPitch; bool m_bPreviewEnable; float m_fFactorEXI2UGY; //探测器EXI -> UGY 转换系数 int m_nPreviewWidth; int m_nPreviewHeight; CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式 float m_fCurrentDose; // 记录当前的Dose要求 int m_nSaveRaw; //0:不存; 1:预览图; 2:raw图; 4:实际尺寸图像; //int m_nGainNodeCount; //校正曝光的总节点个数 //int m_nGainNodeIndex; //校正曝光的节点Index //int m_nGainExpCount; //校正曝光节点需要曝光的次数 //int m_nGainExpIndex; //校正曝光节点已曝光的次数 int m_nUpdateFPDID; //记录要固件升级的探测器ID private: bool LoadYuyingDLL(string strWorkPath); void FreeYuyingDLL(); void StartInitFPDThread(); static DWORD __stdcall onInitPanel(void* pParam); //初始化线程 void Action_Init(); bool DetectorInitProcess(int nPanelIndex, bool bFDAttach = false); void YuyingScanEventThread(); //监控线程 static DWORD __stdcall onScanEvent(void* pParam); //初始化线程 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 SetMarsCorrection(int nPanelIndex); bool TestError(int nDetectorID, int nErrorStatus, std::string strAPI = ""); bool CheckBattery(int nPanelIndex); bool ReadWifiStatus(int nPanelIndex); bool CheckWiFi(int nPanelIndex); bool CheckTemperature(int nPanelIndex); bool WaitRespond(int nTimeOut, const char* szPosition = ""); void SendNotify(const char* szPosition = ""); void ResetLock(); bool StartOffsetThread(); static DWORD OffsetThread(LPVOID pParam); bool StartXWindowOffThread(); static DWORD XWindowOffThread(LPVOID pParam); bool DeleteOneFolder(string strSourceFolder); bool RecoverImage(); bool OnEXIT(); void DeleteHandle(); bool FlipX(WORD* pData, int nWidth, int nHeight); bool FlipXRotate90(WORD* pData, int nWidth, int nHeight); bool IsConnected(string strIP); void OnProcessPreImg(); 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, int 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, int nWorkMode); bool FPDLoadCorrectFiles(int nDetectorID, const char* szDetectorID); private: //句柄 HMODULE m_hYuyingModule; Func_YI_Initialize_FPD_V4 API_YI_Initialize_FPD_V4; 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_FPD_Subtract_Offset API_YI_FPD_Subtract_Offset; Func_YI_ImageReady_Callback_Register API_YI_ImageReady_Callback_Register; Func_YI_ImageReady_Callback_Register_Ex API_YI_ImageReady_Callback_Register_Ex; Func_YI_SystemInfo_Callback_Register API_YI_SystemInfo_Callback_Register; Func_YI_SystemInfo_Callback_Register_Ex API_YI_SystemInfo_Callback_Register_Ex; 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_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_Get_Invalid_Region API_YI_FPD_Get_Invalid_Region; 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_FPD_DO_Correction API_YI_FPD_DO_Correction; Func_YI_FPD_Wifi_Re_Connect API_YI_FPD_Wifi_Re_Connect; Func_YI_FPD_Wifi_Set_Work_Mode API_YI_FPD_Wifi_Set_Work_Mode; Func_YI_FPD_Wifi_Get_Work_Mode API_YI_FPD_Wifi_Get_Work_Mode; Func_YI_FPD_Wifi_Set_Name API_YI_FPD_Wifi_Set_Name; Func_YI_FPD_Wifi_Set_Power_Down API_YI_FPD_Wifi_Set_Power_Down; Func_YI_FPD_Wifi_Set_IP_Address API_YI_FPD_Wifi_Set_IP_Address; Func_YI_FPD_Wifi_Set_Route_Info API_YI_FPD_Wifi_Set_Route_Info; HANDLE m_hArrayEvent[Yuying_SCAN_NUM]; HANDLE m_hExitEvent; HANDLE m_hRecoverImage; HANDLE m_hCofirmCalib; HANDLE m_hEndCalibEvent; HANDLE m_hYuyingScanEnd; HANDLE m_hSharedEvent; //等待SDK回调句柄 HANDLE m_hWindowOffEvent; HANDLE m_pOffsetThread; HANDLE m_pXWindowoffThread; HANDLE m_hScanEventThread; HANDLE m_hInitThread; string m_strAppPath; //模块工作目录 string m_strWorkPath; //SDK工作路径 int m_nPanelCount; int m_nDetectorID; //SDK探测器ID(1,2,3) int m_nDetectorIndex; //当前激活探测器的index(0,1,2) void* m_pCurrentDPC; map* m_pDPC2PanelID; map* m_pPanelID2DPC; DeviceIndexStruct m_stDeviceIndex[3]; //配置的探测器列表//不超过三块板 ResDataObject m_ObjFPDsInfo[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_pwRawImageData; //原始图像内存 WORD* m_pwPreviewImg; //预览图内存 bool m_bInitialing; //是否在初始化过程中 bool m_bInCalibrating; bool m_bInExposure; bool m_bAEDWorkFlag; int m_nDoseParam;// 校正用的曝光计量,发送到UI 且本地记录 int m_nCalibDueSetting; // 校正文件的保质期天数 int m_nCalibStatus; int m_nSID; //SID值 //校正相关变量 list m_listCalibItem; list::iterator m_iterCalibDose; int m_nCalibrationMode; //校正模式,ZSKK or Factory int m_nDefectExpTimes; int m_nDefectTotalTimes; int m_nGainExpTimes; int m_nGainTotalFrames; int m_nDefectTotalFrames; }; }