#pragma once #include "ResDataObject.h" #include "CCOS.Dev.FPD.PZMedicalDR.h" #include "PZMedicalLib.h" #include "ZSKKCalibration.h" enum eDetStatus { DetStatus_NotIni, DetStatus_NotConn, DetStatus_Sleep, DetStatus_Standby, DetStatus_Work, DetStatus_Acquire, DetStatus_Offset, DetStatus_XrayCalibration, }; enum eDetOperationMode { PIX_OM_RAD = 1, PIX_OM_TOMO, PIX_OM_AED = 4 }; enum eDetPixImgType { PIX_IMG_NONE, PIX_IMG_PRE, PIX_IMG_RAW, PIX_IMG_FULL = 4 }; class PZMedicalCtrl { //探测器信息 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; //产品编号,连接成功后获取信息时被赋值 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: PZMedicalCtrl(); ~PZMedicalCtrl(); bool DriverEntry(FPDDevicePZMedical* pDrvDPC, ResDataObject& Configuration); bool Connect(FPDDevicePZMedical* pDrvDPC, const char* szWorkPath); void EnterExamMode(int nExamMode); bool PrepareAcquisition(FPDDevicePZMedical* pDrvDPC); bool StartAcquisition(FPDDevicePZMedical* pDrvDPC); bool StopAcquisition(FPDDevicePZMedical* pDrvDPC); bool ActiveCalibration(FPDDevicePZMedical* pDrvDPC, CCOS_CALIBRATION_TYPE eType); bool PrepareCalibration(FPDDevicePZMedical* pDrvDPC); bool StartCalibration(FPDDevicePZMedical* pDrvDPC); bool StopCalibration(FPDDevicePZMedical* pDrvDPC); bool ResetDetector(FPDDevicePZMedical* pDrvDPC); bool SetReferenceNum(int nReferenceNum); bool SetAcqMode(int nLogicMode, FPDDevicePZMedical* pDrvDPC); bool AcceptCalibration(); bool RejectCalibration(); bool SaveCalibrationFile(); bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound); bool CompleteCalibration(FPDDevicePZMedical* pDrvDPC); bool GetCalibrationTime(int nDetectorID = -1); RET_STATUS AbortCalibration(FPDDevicePZMedical* pDrvDPC); CCOS_CALIBRATION_TYPE GetPZMedicalCtrlCalibType(); PZDPC_State GetPZDPCState(); bool ActiveSyncMode(int nSyncMode); bool UpdateCalibMode(CCOS_CALIBRATION_MODE eCalibMode); void SetNotifyStatusTimePeriod(int nTime); void SetReconnectTimePeriod(int nTime); bool SetDetectorWiredIP(string strWiredIP); bool SetDetectorWirelessIP(string strWirelessIP); private: map* m_pDPC2PanelID; map* m_pPanelID2DPC; int m_nPanelCount; //探测器数量 int m_nCurrentPanelID; std::string m_strCtrlWorkPath; //保存工作路径,用于加载SDK和配置 ResDataObject m_objFPDConfig; //保存DPC模块下发的配置 CPanelStatus* m_pStPanelStatus[3];//探测器信息 内部还有自己的FPDConfig 注意赋值(为了以后连接多个板子用) std::string m_strTplDarkPath; // references\serialnumber\dark std::string m_strTplFloodPath; // references\serialnumber\flood PZDPC_State m_ePZDPCstate; //DPC或ctrl模块当前处于什么状态 int m_nImageWidth; int m_nImageHeight; int m_nWidthOffset; int m_nHeightOffset; int m_nRawImgWidth; //SDK反馈的图像宽 int m_nRawImgHeight; //SDK反馈的图像高 WORD* m_pRawImgBuffer; //原始图buffer WORD* m_pImgBuffer; //处理后的图像buffer int m_nSaveRaw; APP_STATUS m_nAppStatus; //记录工作界面 CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 CCOS_CALIBRATION_TYPE m_eType; // 记录当前校正类型 PZ_CALIBRATION_State m_eCalState;//探测器校正状态 CZSKKCalibrationCtrl* m_pZSKKCalib; int m_nOffsetImg; // 校正时暗场图数量 int m_nGainImg; // 校正时亮场图数量 bool m_bCalibrationOver; // true 当前阶段校正完成;false 当前阶段校正未完成 bool m_bWired; //是否为有线连接 CHAR m_cFpCurStat; //探测器当前的工作模式SDK eDetStatus m_eStatus; // 探测器状态 string m_strPanelType; //探测器类型例如: PZMedical_A843B 模型文件中的Description bool m_bLoadedSDK; //true 已经加载了SDK,避免重复调用,主要用于ReInit流程 bool m_bInitializedSDK; //true 已经init了SDK,避免重复调用,主要用于ReInit流程 int m_nCalibrationRounds;//校正总轮数 int m_nCalibCurrentCalibrationRound;//当前是第几轮 int m_nCalibCurrentExposureIndex;//当前轮是第几次Accept int m_nExposureNumCurrentRound;//当前轮需要Accept几次 int m_nGainExposureNum;//校正曝光需要Accept的总次数 bool m_bAutoContinueCal; //true: SDK自动进行下一次增益开窗流程(一般是在当前增益合格);false: 手动触发SDK进行下一次增益 int m_nNotifyStatusTimePeriod;//通知温度等状态信息的时间间隔 int m_nReconnectTimePeriod;//重连的时间间隔 HMODULE m_hPZSDKModule; //SDK Handle 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]; //厂商校正使用线程 HANDLE m_hCalibrationThread; HANDLE m_hPZMPrepare; //准备校正 HANDLE m_hPZMStartOffset; //开始暗场校正 HANDLE m_hPZMInOffset; //继续采集暗场图 或 停止采集 HANDLE m_hPZMStartGain; //开始亮场校正 HANDLE m_hPZMInGain; //继续采集亮场图 或者 停止采集 HANDLE m_hEndCalibEvent;//正常结束校正 生成校正文件 HANDLE m_hPZMEndEvent; //退出校正,可能是异常退出 HANDLE m_hPZMCalibration[7]; HANDLE m_hNotifyStatusThread;//通知探测器温度、电量、wifi信息线程 HANDLE m_hReconnectDetectorThread;//重连探测器线程 static DWORD __stdcall onFPDScanThread(PVOID pvoid); static DWORD __stdcall onCalibrationThread(PVOID pvoid); static DWORD __stdcall onNotifyStatusThread(PVOID pvoid); static DWORD __stdcall onReconnectDetectorThread(PVOID pvoid); bool LoadSDK(); bool InitSDK(); bool ConnectDetector(); bool GetPanelInfo(); BOOL OnProcessLink(char cEvent); BOOL OnProcessBreak(char cEvent); BOOL OnProcessImage(char cEvent); BOOL OnProcessHeartBeat(char cEvent); void OnProcessImg(); void OnProcessInitFPD(); void OnReInitFPD(); bool OnProcessCalibration(); void SaveRaw(WORD* pInImg, int nImgWidth, int nImgHeight); bool SaveRaw(const char* pRawName, const WORD* pRawImg, int nWidth, int nHeight); bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth); bool TestError(BOOL bRet, const char* szFuncName = "Func"); bool WaitRespond(int nTimeOut = 65000, const char* szPosition = ""); void StopWaiting(const char* szPosition = ""); bool SetFPDTplPath(); bool SetFPDCalibrationMode(); void GetConnectionMode(); void SetPZDPCState(PZDPC_State ePZDPCstate); void NotifyDetectorInfo(); 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); static BOOL __stdcall FuncLinkUpCallBack(char cEvent); static BOOL __stdcall FuncLinkDownCallBack(char cEvent); static BOOL __stdcall FuncImageCallBack(char cEvent); static BOOL __stdcall FuncHeartBeatCallBack(char cEvent); static BOOL __stdcall FuncReadyCallBack(char cEvent); static BOOL __stdcall FuncExposeCallBack(char cEvent); static BOOL __stdcall FuncExposeEndCallBack(char cEvent); static BOOL __stdcall FuncOffsetDoneCallBack(char cEvent); static BOOL __stdcall FuncAedA1CallBack(char cEvent); static BOOL __stdcall FuncAedA2CallBack(char cEvent); static BOOL __stdcall FuncImageStartCallBack(char cEvent); static BOOL __stdcall FuncImageEndCallBack(char cEvent); static BOOL __stdcall FuncBattLow1CallBack(char cEvent); static BOOL __stdcall FuncBattLow2CallBack(char cEvent); PZ_COM_Init API_COM_Init; PZ_COM_List API_COM_List; PZ_COM_Open API_COM_Open; PZ_COM_Close API_COM_Close; PZ_COM_RegisterEvCallBack API_COM_RegisterEvCallBack; PZ_COM_SetCalibMode API_COM_SetCalibMode; PZ_COM_GetCalibMode API_COM_GetCalibMode; PZ_COM_Trigger API_COM_Trigger; PZ_COM_AedAcq API_COM_AedAcq; PZ_COM_HstAcq API_COM_HstAcq; PZ_COM_Prep API_COM_Prep; PZ_COM_ExposeReq API_COM_ExposeReq; PZ_COM_Stop API_COM_Stop; PZ_COM_GetImageMode API_COM_GetImageMode; PZ_COM_GetImageShiftMode API_COM_GetImageShiftMode; PZ_COM_GetImage API_COM_GetImage; PZ_COM_SetAllTpl API_COM_SetAllTpl;//Load all templates,including offset,defect and gain template. PZ_COM_GenOffsetTpl API_COM_GenOffsetTpl; PZ_COM_GenGainTpl API_COM_GenGainTpl; PZ_COM_GenDefectTpl API_COM_GenDefectTpl; PZ_COM_TplPathSet API_COM_TplPathSet; PZ_COM_TplPathGet API_COM_TplPathGet; PZ_COM_LogPathSet API_COM_LogPathSet; PZ_COM_GetFPType API_COM_GetFPType; PZ_COM_SetAedCorrKB API_COM_SetAedCorrKB; PZ_COM_GetDllVer API_COM_GetDllVer; PZ_COM_GetFPInfo API_COM_GetFPInfo; PZ_COM_GetFPConf API_COM_GetFPConf; PZ_COM_SetFPConf API_COM_SetFPConf; PZ_COM_GetWifiMode API_COM_GetWifiMode; PZ_COM_GetFPStatus API_COM_GetFPStatus; PZ_COM_GetFPCurStatus API_COM_GetFPCurStatus; PZ_COM_GetFPsn API_COM_GetFPsn; PZ_COM_GetFPWireState API_COM_GetFPWireState; PZ_COM_GetFPLicense API_COM_GetFPLicense; PZ_COM_AedTrigger API_COM_AedTrigger; PZ_COM_ResetFP API_COM_ResetFP; PZ_COM_GetErrNo API_COM_GetErrNo; PZ_COM_GetXwin API_COM_GetXwin; PZ_COM_SetXwin API_COM_SetXwin; PZ_COM_GetRBConf API_COM_GetRBConf; PZ_COM_SetRBConf API_COM_SetRBConf; PZ_COM_SetFpIpNetmask API_COM_SetFpIpNetmask; };