#pragma once #include "ResDataObject.h" #include "CCOS.Dev.FPD.UltrasonicProbeDR.h" #include "UltrasonicInterface.h" //#include "CaptureWriterInterface.h" //#include "DataElementInterface.h" #include "ramzed_sdk.h" enum eDetectorStatus { DetectorStatus_NotIni, DetectorStatus_NotConn, DetectorStatus_Sleep, DetectorStatus_Standby, DetectorStatus_Work, DetectorStatus_Acquire, DetectorStatus_Offset, DetectorStatus_XrayCalibration, }; class UltrasonicProbe { //探测器信息 struct CPanelStatus { bool bLostTemplate; //是否缺少校正文件 bool bPanelInReady; //探测器在ready状态 bool bConnectStatus; //是否连接 SYNC_MODE eSyncMode; //同步模式 bool bConnErrorInInit; //初始化阶段的断线错误 bool bInitError; //初始化错误,一般不可恢复 string strPanelType; //探测器类型,AddDPC时赋值 string strPanelSN; //探测器序列号,连接成功后获取信息时被赋值 bool bIsPortable; bool bCharging; bool bStatusPolling; bool bDC_AED; bool bDarkCalibDone; //offset刷新结束 bool bAEDDarkCalibDone; bool bLTEDarkCalibDone; //长曝光offset刷新结束 string strModuleIP; //探测器IP地址,attach或收到init回调时赋值 bool bBatteryTooLow; bool bImagePending; bool bIsLoadRef; //是否加载了校正文件,加载过了不用再次加载 int nBattery; //电池电量 bool bInitOK; //初始化过程探测器连接完毕,用于重连判断 bool bNeedUpdateFW; //是否需要固件升级的标记位 bool bSelftested; //Selftest执行完毕 int nTotalShockNumber; //探测器的shocksenseor总数 int nFWStatus; //探测器固件状态 string strPartNumber; //产品编号,连接成功后获取信息时被赋值 ResDataObject objPanelConfig; bool bHaveAutonumousMode; //是否支持离线采集 bool bAutonumousMode; //true: 离线模式;false:在线模式 CPanelStatus() { bLostTemplate = false; bPanelInReady = false; bConnectStatus = false; eSyncMode = SYNC_SOFTWARE; //默认使用软同步作为缺省值 bConnErrorInInit = false; bInitError = false; strPanelType = ""; strPanelSN = ""; bIsPortable = false; bCharging = false; bStatusPolling = false; bDC_AED = false; bDarkCalibDone = false; bAEDDarkCalibDone = false; bLTEDarkCalibDone = false; strModuleIP = ""; bBatteryTooLow = false; bImagePending = false; bIsLoadRef = false; nBattery = 0; bInitOK = false; bNeedUpdateFW = false; bSelftested = false; nTotalShockNumber = -1; nFWStatus = -1; strPartNumber = ""; bHaveAutonumousMode = false; bAutonumousMode = false; } }; public: UltrasonicProbe(); ~UltrasonicProbe(); bool DriverEntry(FPDDeviceUltrasonicProbe* pDrvDPC, ResDataObject& Configuration); bool Connect(FPDDeviceUltrasonicProbe* pDrvDPC, const char* szWorkPath); bool Disconnect(); bool PrepareAcquisition(FPDDeviceUltrasonicProbe* pDrvDPC); bool StartAcquisition(FPDDeviceUltrasonicProbe* pDrvDPC); bool StopAcquisition(FPDDeviceUltrasonicProbe* pDrvDPC); bool ResetDetector(FPDDeviceUltrasonicProbe* pDrvDPC); bool SelectExamMode(int nLogicMode, FPDDeviceUltrasonicProbe* pDrvDPC); //bool ActiveCalibration(FPDDeviceUltrasonicProbe* pDrvDPC, CCOS_CALIBRATION_TYPE eType); //bool PrepareCalibration(FPDDeviceUltrasonicProbe* pDrvDPC); //bool StartCalibration(FPDDeviceUltrasonicProbe* pDrvDPC); //bool StopCalibration(FPDDeviceUltrasonicProbe* pDrvDPC); //bool SetReferenceNum(int nReferenceNum); //bool AcceptCalibration(); //bool RejectCalibration(); //bool SaveCalibrationFile(); //bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound); //bool CompleteCalibration(FPDDeviceUltrasonicProbe* pDrvDPC); //bool GetCalibrationTime(int nDetectorID = -1); //RET_STATUS AbortCalibration(FPDDeviceUltrasonicProbe* pDrvDPC); //CCOS_CALIBRATION_TYPE GetUltrasonicProbeCtrlCalibType(); DPC_State GetPZDPCState(); //超声相关 RET_STATUS SetFreeze(int nFreeze); RET_STATUS SwitchProbe(int nProbeType);//切换探头 RET_STATUS SwitchProbeMode(int nProbeMode);//切换模式 RET_STATUS SetBGain(int nGain); RET_STATUS SetBDepth(int nDepth); RET_STATUS SetBFrequency(float fFrequency); RET_STATUS SetBFocus(int nFocus); RET_STATUS SetBHarmonic(int nHarmonic); RET_STATUS SetBPower(int nPower); RET_STATUS SetBDynamicRange(int nRange); RET_STATUS GetBDepth(int& nDepth, float& fDepthCm); RET_STATUS GetBFrequency(float& fFrequency); RET_STATUS GetBGain(int& nGain); RET_STATUS GetBFocus(int& nFocus, float& fFocusCm); RET_STATUS GetBDynamicRange(int& nRange); RET_STATUS SetCRoi(int x1, int x2, int y1, int y2); RET_STATUS SetCGain(int nGain); RET_STATUS SetPostLevel(int nLevel); RET_STATUS SetMirror(int nMirror); RET_STATUS SetCFrequency(float fFrequency); RET_STATUS SetCSpeedWallFilter(int nSpeedWallFilter); RET_STATUS SetCRangeWallFilter(int nRangeWallFilter); RET_STATUS SetCPersistence(int nPersistence); RET_STATUS SetCLinearAngle(int nAngle); RET_STATUS SetCPrf(int nPrf); RET_STATUS GetCFrequency(float& fFrequency); RET_STATUS GetCGain(int& nGain); RET_STATUS GetCPrf(int& nPrf); RET_STATUS GetCLinearAngle(int& nAngle); //调节图像亮暗的 RET_STATUS SetTgc1(int nTgc); RET_STATUS SetTgc2(int nTgc); RET_STATUS SetTgc3(int nTgc); RET_STATUS SetTgc4(int nTgc); RET_STATUS SetTgc5(int nTgc); RET_STATUS SetTgc6(int nTgc); RET_STATUS SetTgc7(int nTgc); RET_STATUS SetTgc8(int nTgc); private: map* m_pDPC2PanelID; map* m_pPanelID2DPC; int m_nPanelCount; //探测器数量 std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置 int m_nCurrentPanelID; ResDataObject m_objFPDConfig; //保存DPC模块下发的配置 CPanelStatus* m_pStPanelStatus[3];//探测器信息 内部还有自己的FPDConfig 注意赋值(为了以后连接多个板子用) DPC_State m_ePZDPCstate; //ctrl模块当前处于什么状态 int m_nRawImgWidth; //SDK反馈的图像宽 int m_nRawImgHeight; //SDK反馈的图像高 int m_nLeftOffset;//左侧裁剪长度 int m_nTopOffset;//上边裁剪长度 int m_nRightOffset;//右侧裁剪长度 int m_nBottomOffset;//下边裁剪长度 int m_nImageWidth;//裁剪后的图像宽 int m_nImageHeight;//裁剪后的图像高 unsigned char* m_pRawImgBuffer24;//24位图buffer unsigned char* m_pRawImgBuffer32; //32位图buffer unsigned char* m_pImgBuffer; //处理后的图像buffer int m_nImgBits; int m_nPixelPitch; int m_nSaveRaw; int m_nFrameID; //bool m_bFirstInIDLE; //true 第一次收到探测器IDLE状态,主要用于校正流程 //CCOS_CALIBRATION_TYPE m_eType; // 记录当前校正类型 //int m_nOffsetImg; // 校正时暗场图数量 //int m_nGainImg; // 校正时亮场图数量 //bool m_bCalibrationOver; // true 当前阶段校正完成;false 当前阶段校正未完成 //int m_nCalibrationRounds;//校正轮数 bool m_bWired; //是否为有线连接 eDetectorStatus m_eStatus; // 探测器状态 //CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 //int m_nCaliFailedCount; //记录增益校正失败次数,超过一定次数自动停止校正 string m_strPanelType; //探测器类型。命名方式截取自config_Pixrad路径下的ini文件,以Detector3543EZe.ini为例,m_strPanelType=3543EZe bool m_bLoadedSDK; //true 已经加载了SDK,避免重复调用,主要用于ReInit流程 bool m_bInitializedSDK; //true 已经init了SDK,避免重复调用,主要用于ReInit流程 bool m_bConnectWaiting;//正在连接中 int m_nCurrentMode; //记录探测器当前application mode ResDataObject m_ModeConfig; //int m_nCalibCurrentCalibrationRound; //int m_nCalibCurrentExposureIndex; //int m_nExposureNumCurrentRound; //bool m_bConfirmCaliRst; //true: 接受当前增益校正曝光结果 //bool m_bAutoContinueCal; //true: SDK自动进行下一次增益开窗流程(一般是在当前增益合格);false: 手动触发SDK进行下一次增益 //bool m_bAutonumousMode; //int m_nGainExposureNum;//gain校正曝光的总次数 bool m_bOnlyHaveFpd;//当前环境是否只有探测器一个真实设备并且处于AED同步模式,其他设备是demo的 1-是 0-否 默认否 ramzed_sdk* m_pRzsdk;//通过SDK的instance获取的类指针 //test /*CCOS_Kernel::CCaptureWriter* m_pCaptureWriter; CCOS_DataElement::CDataElement* m_pMatrix; CCOS_DataElement::CDataElementGroup* m_pSenderGroup; CCOS_DataElement::CDataMgr* m_pDataMgr;*/ bool m_bFirstImage; HMODULE m_hSdkModule; //SDK module HANDLE m_hRespond; HANDLE m_hFPDScanThread; HANDLE m_hStopScanEvent; HANDLE m_hProcessImgEvent; HANDLE m_hXWinOnEvent; HANDLE m_hInitFPDEvent; HANDLE m_hReInitEvent; HANDLE m_hArrayEvent[5]; bool LoadSDK(); bool InitSDK(); int ConnectDetector(); BOOL OnProcessLink(unsigned char probe_type); BOOL OnProcessDown(); static DWORD __stdcall onFPDScanThread(PVOID pvoid); void OnProcessImg(unsigned char* frame_msg); void OnProcessInitFPD(); void OnReInitFPD(); void StopThread(); void SaveRawFunc(unsigned char* pInImg, DWORD nFrameSize); bool SaveRawImage(const char* pImgName, const WORD* pRawImg, int nWidth, int nHeight); bool TestError(int nRet, const char* szFuncName = "Func"); bool WaitRespond(int nTimeOut = 65000, const char* szPosition = ""); void StopWaiting(const char* szPosition = ""); bool SetFPDTplPath(); void NotifyXWindowOn(); void NotifyXWindowOff(); void GetConnectionMode(); void SetPZDPCState(DPC_State ePZDPCstate); void NotifyDetectorInfo(); int CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight, LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits, int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin); static void FuncLinkUpCallBack(unsigned char probe_type); static void FuncLinkDownCallBack(unsigned char probe_type); static void FuncImageCallBack(unsigned char* frame_msg); 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); };