#pragma once #include "CCOS.Dev.FPDDeviceMould.hpp" #include "OemAcq.h" #include "OemSync.h" #include "OemCtrl.h" #include "OemCalib.h" #include "DetectorConfiguration.h" #include "CCOS.Dev.MSGMould.hpp" #include "FPDErrorWarningProcess.h" #include "logicClient.h" #ifdef CCOSDEVFPDAXSDM_EXPORTS #define CCOSDEVFPDAXSDM_API __declspec(dllexport) #else #define CCOSDEVFPDAXSDM_API __declspec(dllimport) #endif namespace CCOS::Dev::Detail::Detector { class CCOSDEVFPDAXSDM_API CAXSDriver : public FPDDriverMould { CFPDDeviceAXS* m_pObjDev; bool m_bConnect; //driver是否连接的标记位 ResDataObject m_DeviceConfig;//GetDeviceConfig时使用 ResDataObject m_ConfigAll; //存储当前的配置,用于修改配置时写回文件 ResDataObject m_Configurations; //存储当前配置中“CONFIGURATION”节点的内容 std::unique_ptr m_pAttribute; std::unique_ptr m_pDescription; public: CAXSDriver(); virtual ~CAXSDriver(); 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 SaveConfigFile(bool bSendNotify); bool GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue); bool SetDeviceConfigValue(ResDataObject& config, const char* pInnerKey, int nPathID, const char* szValue); }; namespace nsDetail = CCOS::Dev::Detail; class CCOSDEVFPDAXSDM_API CFPDDeviceAXS : public FPDDeviceMould { using super = IODeviceDetail; //IODeviceDetail类的别名声明 std::unique_ptr m_DetectorCtrlUnit; std::unique_ptr m_AcqUnit; std::unique_ptr m_SyncUnit; std::unique_ptr m_CalibUnit; 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; PVOID m_pDetectors; ResDataObject m_ACQMODElist;//采集模式列表 DeviceIndexStruct m_stDeviceConfig;//探测器配置信息 std::string m_strWorkPath; bool m_bPreviewEnable; //是否显示preview image int m_nPreViewImgWidth; //预览图像的宽 int m_nPreViewImgHeight; //预览图像的高 //2816*3584已经是探测器裁剪过的,原图是2816*3650*2=20556800 int m_nImgWidth; //有效图像的宽 int m_nImgHeight; //有效图像的高 int m_nImgBits;//图像位数 ResDataObject* m_pPreviewImageHead; ResDataObject* m_pImageHead; WORD* m_pwPreviewImg; //preview内存 WORD* m_pwRawImageData; //原始图像内存 WORD* m_pwImageData; //裁剪后的有效图像内存 int m_nAngle; int m_nPixelSpacing; float m_fDose; float m_fDoseParam;// 校正用的曝光计量,发送到UI 且本地记录 APP_STATUS m_eAppStatus; bool m_bConnect; SYSTEMTIME m_stImgCreateTime; //记录图像生成时间(软同步使用开窗时间),用于填写dicom SYNC_MODE m_eSyncMode; ResDataObject m_CalibDoseList; //加载平板自己的校正剂量配置 CCOS_CALIBRATION_MODE m_eCalibMode;//校正方式 0-ZSKK 1-OTHER int m_nCalibTotalExposureNum; //校正时需要曝光总次数 int m_nCalibCurrentCalibrationRound; //当前处于校正曝光第几轮 int m_nCalibCurrentExposureIndex; //当前轮校正曝光第几次 int m_nCalibCurrentExposureNum; //亮场校正时实际接受曝光的总次数(有效) float m_fFactorEXI2UGY; //探测器EXI -> UGY 转换系数 bool m_bForceGridSuppress; bool m_bAttached; int m_nBatteryCapacity; int m_nBatteryCharges; float m_fBatteryTemperature; bool m_bImagePendingOrNot; //是否有未获取成功的图像 bool m_bResetDetector; //是否reset探测器,暂时不用 int m_nShockCounts; bool m_bOnlyHaveFpd;//当前系统是否只配置了一个真实的探测器并且处于AED同步模式,其他设备没有或者是demo的 1-是 0-否 默认否 bool m_bFirstGetCalibImageLeft;//是否是第一次获取厂商校正需要曝光的次数 int m_nAcqMode;//当前采集模式 public: CFPDDeviceAXS(std::shared_ptr center, std::string strConfigPath); ~CFPDDeviceAXS(); virtual std::string GetGUID() const override; virtual bool Prepare() override; bool CreateDevice(); void Register(); RET_STATUS Connect(); RET_STATUS EnterExam(int nExamMode); RET_STATUS ActiveDetector(int nDetectorIndex, bool bActive); RET_STATUS SetAcqMode(string strAcqMode); RET_STATUS PrepareAcquisition(); RET_STATUS StartAcquisition(string in = ""); RET_STATUS StopAcquisition(); RET_STATUS ActiveCalibration(CCOS_CALIBRATION_TYPE eType); RET_STATUS PrepareCalibration(); RET_STATUS GetRequestedDose(std::string& strDose); RET_STATUS SetRequestedDose(std::string strDose); RET_STATUS StartCalibration(); RET_STATUS StopCalibration(); RET_STATUS AcceptCalibration(); RET_STATUS RejectCalibration(); RET_STATUS SaveCalibrationFile(bool bSaveFlag); RET_STATUS GetCalibrationStep(int nDetectorID, string& strCalibrationStepInfo); RET_STATUS PauseCalibration(); RET_STATUS Reset();//重置探测器 RET_STATUS GetDetectorInfo(string& strFDI); RET_STATUS ResetConnect(); RET_STATUS SetExposureTimes(int nTimes); bool CompleteCalibration(); void AbortCalibration(); void OnFPDCallback(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam); void NotifyXWindowOn(); void NotifyXWindowOff(); bool GetOnlyHaveFpd();//获取环境中是否只有平板这一个真实设备的配置项 int GetGainExposureNum();//获取gain校正曝光总次数 void FullImageDateArrived(WORD* pImg); bool GetLogicMode(string& strAcqMode, int& nLogicMode); private: bool LoadConfig(); void SendTemperatureValue(float fValue); void SendWifiValue(int nValue); void SendBatteryValue(int nValue); 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 OnProcessPreviewImage(WORD* pRawImage, int nWidth, int nHeight); void PrevImageDateArrived(WORD* pImg); RET_STATUS AddFrameWithRawHead(IMAGE_VIEW_TYPE Type, WORD* pFrameBuff, DWORD FrameSize); string MakeImageHead(IMAGE_VIEW_TYPE Type); bool OnProcessImage(WORD* pImage, int nWidth, int nHeight, float fImageReferUGY = 2.5); void OnProcessTemperature(int nID, float fTemperature); protected: void RegisterCtrl(nsDetail::Dispatch* Dispatch); void RegisterAcq(nsDetail::Dispatch* Dispatch); void RegisterSync(nsDetail::Dispatch* Dispatch); void RegisterCalib(nsDetail::Dispatch* Dispatch); void RegisterOthers(nsDetail::Dispatch* Dispatch); void RegisterAutonumous(nsDetail::Dispatch* Dispatch); }; } //end namespace CCOS::Dev::Detail::Detector