/*************************************************************** * File Name: CCOS.Dev.FPD.iRayDM.h * Detail: iRay detector module for DMOC * Author: Wangyuedong * Date: 2023-06-06 ***************************************************************/ #pragma once #pragma warning(disable:26812) //更倾向于 enum class 防止 enum 全局命名空间中的污染。 #pragma warning(disable:28159) //使用GetTickCount足够了,无需使用GetTickCount64。 #pragma warning(disable:26451) //忽略乘法溢出 #pragma warning(disable:6258) //允许强制终止线程 #include "CCOS.Dev.FPDDeviceMould.hpp" #include "TemperatureMould.hpp" #include "OEM.Acq.h" #include "OEM.Sync.h" #include "OEM.Calib.h" #include "OEM.DetectorCtrl.h" #include "DetectorConfiguration.h" #include "FPDErrorWarningProcess.h" #include "CalibrationProcess.h" #include "common_api.h" #include "IRayDMCtrl.h" #define CCOSDEVFPDIRAYDM_EXPORTS #ifdef CCOSDEVFPDIRAYDM_EXPORTS #define CCOSDEVFPDIRAYDM_API __declspec(dllexport) #else #define CCOSDEVFPDIRAYDM_API __declspec(dllimport) #endif namespace CCOS::Dev::Detail::Detector { //----------------------------------------------------------------------------- // IRay Driver manager handle //----------------------------------------------------------------------------- class CCOSDEVFPDIRAYDM_API IRayDriver : public FPDDriverMould { using super = FPDDriverMould; FPDDeviceIRay* dev; bool m_bConnect; ResDataObject m_ConfigAll; ResDataObject m_Configurations; ResDataObject m_DeviceConfig; std::unique_ptr m_pAttribute; std::unique_ptr m_pDescription; public: IRayDriver(); virtual ~IRayDriver(); virtual void Prepare() override; virtual bool Connect() override; virtual void Disconnect() override; virtual bool isConnected() const override; virtual auto CreateDevice(int index)->std::unique_ptr override; virtual std::string DriverProbe() override; virtual std::string GetResource() override; virtual std::string DeviceProbe() override; virtual bool GetDeviceConfig(std::string& Cfg) override; virtual bool SetDeviceConfig(std::string Cfg) override; bool GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue); bool SetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, const char* szValue); }; //----------------------------------------------------------------------------- // FPDDeviceIRay //----------------------------------------------------------------------------- namespace nDetail = CCOS::Dev::Detail; class IRayCtrl; class CCOSDEVFPDIRAYDM_API FPDDeviceIRay : public FPDDeviceMould { private: using super = IODeviceDetail; ResDataObject* m_pPreviewImageHead; ResDataObject* m_pFullImageHead; IRayCtrl* m_pDetectors; std::unique_ptr m_AcqUnit; std::unique_ptr m_SyncUnit; std::unique_ptr m_CalibUnit; std::unique_ptr m_DetectorCtrlUnit; std::unique_ptr m_Temperature; std::unique_ptr m_Battery; std::unique_ptr m_Wifi; std::unique_ptr m_DetectorConfiguration; std::unique_ptr m_WarnAndError; std::unique_ptr m_CalibProcess; int m_nDeviceIndex; //当前探测器的ID string g_strAppPath; string m_strWorkPath; HANDLE m_ExitEvt; bool m_bConnect2XCU; HANDLE m_hXCUresult; bool m_bXCUresult; string m_strXCUresult; ResDataObject m_ACQMODElist; DeviceIndexStruct m_stDeviceConfig; APP_STATUS m_eAppStatus; //DROC的当前状态,检查/校正/ATTACH界面 WORD* m_pwFullImageData; //裁剪后的有效图像内存 WORD* m_pwRawImageData; //原始图像内存 WORD* m_pwPreviewImg; //preview内存 SYSTEMTIME m_stImgCreateTime; float m_fBaseCalibTempGap; unsigned int m_nWorkStation; unsigned int m_nHWcrop; unsigned int m_nPanelRotate; unsigned int m_nCollimatorAlign; float m_fCollimatorWidth; float m_fCollimatorLen; float m_fAPRms; bool m_bHasGrid; // XCU通知有栅/无栅的状态 int m_nGridLicense; bool m_bForceGridSuppress; //float m_fCalibTemperature1; //float m_fCalibTemperature2; //float m_fCalibTemperature; string m_strVoltage; string m_strLastError; //DLL反馈的错误内容 string m_strCalibTime; string m_strLogFilePath; bool m_bDisConnected; bool m_bAttached; bool m_bCallFDConnectOver; bool m_bOpened; //初始化开始与否;初始化未开始,屏蔽DLL反馈的各种状态信息; bool m_bBatteryCharging; //电池充电与否的状态 bool m_bRecoveringImage;//是否在恢复图像的流程中;若是,屏蔽其他错误,以防止干扰恢复图像的界面流程 bool m_bAbortRecover; //放弃恢复图像(状态),恢复图像过程中中止,恢复图像失败的提示不再往上发送;目前不起作用 int m_nRecoverImageTimes; // 恢复图像失败的次数,每2次提示用户一次 bool m_bSendRecoverMessage; bool m_bUIConfirmRecover; bool m_bRecoverImageStatusInit; ResDataObject m_RecoverImageStatus; bool m_bSNListExisted; bool m_bUIReady; bool m_bImagePendingOrNot; //是否有未获取成功的图像 bool m_bResetDetector; //是否reset探测器,暂时不用 int m_nTemperCheckResult; int m_nXCUStatus; float m_fLTEthreshold; int m_nBatteryCapacity; int m_nBatteryCharges; float m_fBatteryTemperature; int m_nShockCounts; CCOS_CALIBRATION_TYPE m_nCalibrationType; int m_fDoseParam;// 校正用的曝光计量,发送到UI 且本地记录 int m_nFullImgWidth; //有效图像的宽 int m_nFullImgHeight; //有效图像的高 int m_nTopOffset; //图像上边裁剪像素值 int m_nBottomOffset; //图像下边裁剪像素值 int m_nLeftOffset; //图像左侧裁剪像素值 int m_nRightOffset; //图像右侧裁剪像素值 int m_nImageBits; //图像位数 float m_fFactorEXI2UGY; //探测器EXI -> UGY 转换系数 bool m_bPreviewEnable; //是否显示preview image bool m_bTestSensitivity; bool m_bSaveRaw; int m_nXrayCalibNum; HANDLE m_OffsetCalibrationEvt; HANDLE m_PauseCalibrationEvt; HANDLE m_CompleteCalibrationEvt; HANDLE m_CrateCalibReportEvt; HANDLE m_WaitCalibDoseEvt; HANDLE m_WriteCumstomFileEvt; HANDLE m_hNotifyThread; DWORD m_NotifyThreadID; static DWORD WINAPI OnNotify(LPVOID pParam); HANDLE m_UploadCalibMapOver; HANDLE m_CalibGapEvt; int m_nGenWaitGap; int m_nConfXrayOnGap; bool m_bCalibReportFailed; int m_nActiveState; int m_nCurrentXCSStatus; //XCU定义的FD Status ; bool m_bDueDateWarnSend; float m_CalTemperlowWarn; float m_CalTemperupWarn; float m_LETCalTemperlowWarn; float m_LETCalTemperupWarn; bool m_CalTemperWarnInitialed; int m_lowBatteryBuda; bool m_pmsLoginStatus; ResDataObject m_CalibDoseList; // bool IsPanelSerialBeReset(string strPanelType, string strPanelSerial); // void SendInfoLog(string strLogKey, float bRealSN); // void SendInfoLog(string strLogKey, int bRealSN); // void SendInfoLog(string strLogKey, bool bRealSN); // void SendInfoLog(string strLogKey, string strValue = ""); // void SendLog(string strLogKey, string strLogLevel, bool bRealSN, string strValue = ""); // void InitializeCalibrationWarnTemperature(bool isLET); // void DoInitializeCalibrationWarnTemperature(); // void DoInitializeLETCalibrationWarnTemperature(); // bool OnInitResult(bool bSuccess); // bool LoadSensitivity(); // int NewGridSuppressed(int nHeight, int nWidth, int nImageBits, unsigned short* puImageData); // void OnProcessTemperature(int nID, float fTemperature); // void InitializeTemperatureConfigs(); // //bool SendModuleFPDInfo(bool bExist); // bool GetCalibrationTemper(bool ExpMode); // bool CompleteCalibration(); // bool SaveConfigFile(bool bSendNotify); // bool SetAttachConfig(); // void SendConnectStatusToUI(bool bConnectStatus); // string GetFileVersion(string strFilePathName); // void SendTemperatureValue(float fTemp); // void SendWifiValue(int nWifi); // void SendBatteryValue(int nBattery); // RET_STATUS PauseCalibration(); // bool CheckCalibartionDue(); // void AbortCalibration(); // void StopCalibrationInside(); // //向HW(转到发生器模块)发送当前探测器的状态 // bool SendStatus2XCS(int nIndex, int nStatus); // void OnError(string strErrCode, string strErr = ""); // void OnErrorX(string strErrCode); // //响应警告事件 nIndex:探测器ID strWarnCode:警告事件ID,strWarn:警告内容 // void OnWarn(int nIndex, string strWarnCode, string strWarn = ""); // void OnWarnX(string strWarnCode); // void SendAllError(); // void ProcessTempreatureOnLostCommunicate(); // void ResetAllError(); public: FPDDeviceIRay(std::shared_ptr center, string ConfigPath); ~FPDDeviceIRay(); void Register(); virtual std::string GetGUID() const override; virtual bool Prepare() override; // bool OpenXCU(); // void SendMsg2XCU(string keyType, int Context); // void SendError2XCU(string strErrCode); // void ClearError2XCU(string strErrorCode); // void SendWarn2XCU(string strWarnCode); // bool GetMsgFromXCU(string keyType); // void SyncErrorList(); void RegisterCtrl(nDetail::Dispatch* Dispatch); void RegisterAcq(nDetail::Dispatch* Dispatch); void RegisterSync(nDetail::Dispatch* Dispatch); void RegisterCalib(nDetail::Dispatch* Dispatch); void RegisterOthers(nDetail::Dispatch* Dispatch); bool CreateDevice(); RET_STATUS Connect(); RET_STATUS GetDeviceDictionary(std::string& out); RET_STATUS ActiveDetector(bool bActive); RET_STATUS SetAcqMode(int mode); RET_STATUS SetSyncMode(SYNC_MODE nSyncMode, HARDWARE_TRIGGER_MODE TriggerMode); RET_STATUS SetXwindow(float XwindowSize); RET_STATUS PrepareAcquisition(); RET_STATUS StartAcquisition(string in = ""); RET_STATUS StopAcquisition(); RET_STATUS SetSID(int nSID); RET_STATUS ActiveCalibration(CCOS_CALIBRATION_TYPE in); RET_STATUS PrepareCalibration(); RET_STATUS GetRequestedDose(string& strDose); RET_STATUS StartCalibration(); RET_STATUS StopCalibration(); RET_STATUS SetCorrectionType(CCOS_CORRECTION_TYPE in); RET_STATUS EnterExam(int nExamStatus); RET_STATUS ResetConnect(); RET_STATUS DisConnectFPD(); RET_STATUS RecoverImage(bool bRecoverIt); RET_STATUS GetRecoverImageState(string& strREI); RET_STATUS GetDetectorInfo(string& strFDI); RET_STATUS UploadCalibrationFiles(string strFileName); RET_STATUS ResetError(); void OnFPDCallback(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam); void UnactiveBySDK(void* pActviedDPC); bool UpdateFDCalibList(bool bLTEenable, std::string strPanelSerial, std::string strPanelType); void SaveFailedCalibFile(); bool GetCalibrationTime(bool ExpMode); private: bool LoadConfig(); void SaveRaw(string RawName); void OnEventProcessConf(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam); void OnEventProcessInfo(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam); void OnEventProcessStatus(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam); void OnEventProcessData(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam); void OnEventProcessError(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam); void OnEventProcessWarning(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam); bool OnProcessImage(WORD* pImage, int nWidth, int nHeight, float fImageReferUGY = 2.5); bool OnProcessPreviewImage(WORD* pRawImage, int nWidth, int nHeight); bool OnProcessPreExpImage(WORD* pwRawImage, int nWidth, int nHeight); RET_STATUS XWindowOnNotify(); RET_STATUS XWindowOffNotify(); void PrevImageDateArrived(WORD* pImg); void FullImageDateArrived(WORD* pImg); void PreExpImageDateArrived(WORD* pImg); RET_STATUS AddFrameWithRawHead(IMAGE_VIEW_TYPE Type, WORD* pFrameBuff, DWORD FrameSize); string MakeImageHead(IMAGE_VIEW_TYPE Type); bool SaveRawImage(string strImageName, WORD* pwRawImage, int nHeight, int nWidth); public: bool m_bStatusInAEC; private: int m_nClinicalApplicationMode; int m_nFilterMode; }; }