/* ------------------------------------------------------------------------- // 文件名 : PZMedical2121ZCtrl.h // 创建者 : Wangyuedong // 创建时间 : 2022-08-08 // 功能描述 : PZMedical2121Z动态探测器功能实现 // -----------------------------------------------------------------------*/ #pragma once #include #include "acqctrl.h" #include "rfmodeconfigures.h" #include "PZModeConfigures.h" #include "AppSettings.h" #include "include\\NetCom.h" using namespace std; class CShareMem; //4.1.16版本SDK的API接口 #define _PZMEDICALAPI typedef __declspec(dllimport) _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Init)(); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_List)(TComFpList*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Open)(CHAR*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Close)(); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_SetCfgFilePath)(CHAR*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_LogPathGet)(CHAR*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_LogPathSet)(CHAR*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_HstAcq)(); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Trigger)(); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Stop)(); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Dacq)(); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Cbct)(); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GetImage)(CHAR*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GetImageMode)(TImageMode*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GetFPConf)(TFPUserCfg*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_SetFPConf)(TFPUserCfg*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GetFPsn)(CHAR*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GetFPsnEx)(CHAR, CHAR*); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GetDllVer)(CHAR*); //获取SDK版本 _PZMEDICALAPI CHAR(__stdcall * PZ_COM_GetFPCompatibleVer)(); //获取平板版本 _PZMEDICALAPI CHAR(__stdcall * PZ_COM_GetBinningMode)(CHAR*); //获取Binning模式 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_SetBinningMode)(CHAR); //设置Binning模式 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GetPreCalibMode)(); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_SetPreCalibMode)(CHAR); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GetCalibMode)(); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_SetCalibMode)(CHAR); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GenOffsetTpl)(); //生成偏移模板 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GenGainTpl)(); //生成增益模板 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GenDefectTpl)(); //生成坏点模板 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_RegisterEvCallBack)(CHAR, FP_EVENT_CALLBACK); _PZMEDICALAPI BOOL(__stdcall * PZ_COM_UploadFPZMTpl)(CHAR, CHAR*); //上传模板到探测器 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Dst)(); //设置探测器为DST模式 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Prep)(); //刷新模板 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_SetDynamicPara)(UINT32, UINT16, CHAR); //设置采集参数 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_Dexit)(); //退出图像采集 _PZMEDICALAPI CHAR(__stdcall * PZ_COM_GetFPCurStatus)(); //获取探测器当前的状态 _PZMEDICALAPI BOOL(__stdcall * PZ_COM_GetFPStatus)(TFPStat*); //获取探测器wifi信号、温度、电池状态 _PZMEDICALAPI CHAR(__stdcall * PZ_COM_GetFPType)(); _PZMEDICALAPI BOOL(_stdcall * PZ_COM_SetFPType)(CHAR); #define PZ_EVENT_COUNT 4 //辅助线程中事件个数 #define INIT_TIMEOUT 6000 //从调用COM_Init()到SDK给回回调的超时 #define IMG_COUNT 20 //存到磁盘上的图像张数 #define PZ_OFFSET_COUNT 16 //根据校正流程手册,取16张offset #define PZ_GAIN_COUNT 8 //根据校正流程手册,取8张gain enum PZ_CALMODE //校正模式 { PZ_RAW = 0, PZ_OFFSET, PZ_GAIN, PZ_OFFSET_GAIN, PZ_DEFECT, PZ_OFFSET_GAIN_DEFECT = 7 }; enum PZ_BINNINGMODE //SDK支持的Binning模式 { PZ_ONExONE, PZ_TWOxTWO, PZ_THRxTHR, PZ_FOURxFOUR, PZ_SIXxSIX }; //enum PZ_LOGICMODE //4343D支持的几种曝光模式 //{ // PZ_MODE_RAD4343H, // PZ_MODE_RAD4343M, // //PZ_MODE_RAD4343HTOMO, // PZ_MODE_PF4343M, // PZ_MODE_CF4343M, // PZ_MODE_CF4343MCAL //}; //缺少灵活、可扩充性,不用了 class PZMedical2121ZCtrl : public CAcqCtrl { public: PZMedical2121ZCtrl(void); ~PZMedical2121ZCtrl(void); enum eStatus { NotInit = -1, Init, Standby, Acquire, Offset, XrayCalibration }; enum eSubStatus { SubStatus_Unknown = -1, SubStatus_IDLE, SubStatus_HST, SubStatus_DST, SubStatus_AED, SubStatus_Recover }; bool m_bCalStart; //探测器校正是否开始的标志位:true-开始,false-未开始 bool m_bFPDConnected; //探测器是否连接的标志位。true-连接,false-未连接 ZSKK_CAL_SYN_PARAM m_CalSynParam; CString m_strConXMLName; typedef struct tagXmode { int nLogicMode; int nOffIndex; bool bOffsetAuto; } XMODE; typedef struct tagABCmode { int nLogicMode; int nABCIndex; } XROI; typedef struct tagABCParam { int nVmin; int nVmax; int nTargetDV; int nStep; } XABCParam; //! structure of reference status typedef struct { int state; unsigned int expiration_duration; } ReferenceInfos; typedef struct tagCalStatus { ReferenceInfos OffsetreferenceInfos; ReferenceInfos GainreferenceInfos; ReferenceInfos DMreferenceInfos; } CalStatus; static PZMedical2121ZCtrl* g_pPZMedicalInstance; private: 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_SetCfgFilePath API_COM_SetCfgFilePath; PZ_COM_LogPathGet API_COM_LogPathGet; PZ_COM_LogPathSet API_COM_LogPathSet; PZ_COM_HstAcq API_COM_HstAcq; PZ_COM_Trigger API_COM_Trigger; PZ_COM_Dacq API_COM_Dacq; PZ_COM_Cbct API_COM_Cbct; PZ_COM_Stop API_COM_Stop; PZ_COM_GetImage API_COM_GetImage; PZ_COM_GetImageMode API_COM_GetImageMode; PZ_COM_SetFPConf API_COM_SetFPConf; PZ_COM_GetFPConf API_COM_GetFPConf; PZ_COM_GetFPsn API_COM_GetFPsn; PZ_COM_GetFPsnEx API_COM_GetFPsnEx; PZ_COM_GetFPCompatibleVer API_COM_GetFPCompatibleVer; PZ_COM_GetDllVer API_COM_GetDllVer; PZ_COM_GetBinningMode API_COM_GetBinningMode; PZ_COM_SetBinningMode API_COM_SetBinningMode; PZ_COM_GetPreCalibMode API_COM_GetPreCalibMode; PZ_COM_SetPreCalibMode API_COM_SetPreCalibMode; PZ_COM_GetCalibMode API_COM_GetCalibMode; PZ_COM_SetCalibMode API_COM_SetCalibMode; PZ_COM_GenOffsetTpl API_COM_GenOffsetTpl; PZ_COM_GenGainTpl API_COM_GenGainTpl; PZ_COM_GenDefectTpl API_COM_GenDefectTpl; PZ_COM_RegisterEvCallBack API_COM_RegisterEvCallBack; PZ_COM_UploadFPZMTpl API_COM_UploadFPZMTpl; PZ_COM_Dst API_COM_Dst; PZ_COM_Prep API_COM_Prep; PZ_COM_SetDynamicPara API_COM_SetDynamicPara; PZ_COM_Dexit API_COM_Dexit; PZ_COM_GetFPCurStatus API_COM_GetFPCurStatus; PZ_COM_GetFPStatus API_COM_GetFPStatus; PZ_COM_GetFPType API_COM_GetFPType; PZ_COM_SetFPType API_COM_SetFPType; HANDLE m_hInitEvent; HANDLE m_hExitEvent; HANDLE m_hGenTplEvent; //生成校正文件并上传 HANDLE m_hImgEvent; //处理图像 HANDLE m_hEventArray[PZ_EVENT_COUNT]; HANDLE m_hCallbackEvent; CWinThread* m_pScanThreadProc; CString m_SubConfigPath; eStatus m_eStatus; eSubStatus m_eSubStatus; HWND m_hWnd; CString m_strFPSN; //探测器序列号 int m_nImgID; //存图时的序号,避免存储太多图像导致磁盘空间不足 int m_nOffsetImgID; //存offset图时的序号 int m_nGainImgID; //存gain图时的序号 CHAR m_cEventNum; //记录探测器的事件号,避免在日志中重复记录同一事件 UCHAR m_ucState; //记录探测器的校正文件上传状态,避免在日志中重复记录同一状态 UCHAR m_ucPerCent; //记录探测器的校正文件上传百分比,避免在日志中重复记录同一百分比 CHAR* m_cImgBuff; //用于从SDK拿图的buffer bool m_bGetImage; //在校正过程中是否存储图像;true-存 false-不存 bool m_bSendRadImage; //在点片模式下,是否已经发送图像到共享内存中; bool m_bExiChecked; //true-EXI已经检查通过,不再检查 bool m_bTimeChecked; //true-时间间隔检查通过,不再检查 int m_nExiStdWork; //检查模式下的EXI标准,小于这个值的图像被丢弃 int m_nExiStdCali; //校正模式下的EXI标准,小于这个值的图像被丢弃 CString strCalMode; //从配置工具读到的校正模式 0:None;1:Offset;2:All bool m_bSaveRaw; //从配置工具读到的是否存图到本地磁盘 true:存;false:不存 //SDK相关参数 CHAR m_nFPCurStatus; //FP当前的状态,0:STATUS_NULL, 1: STATUS_IDLE, 2: STATUS_HST, 9: STATUS_DST, CHAR m_nTriggerMode; //触发模式,0: 内部触发, 1: 外部触发 bool m_bOffsetDone; //offset模板刷新完成标志位,true表示刷新完成,false表示未刷新完成 CHAR m_cFPDCalibMode; //记录探测器的校正模式,用于判重。 CHAR m_cCalibMode; //探测器检查界面的校正模式,与CalibrationType配置项相关。 bool m_bTriggered; //true-已经调用了trigger请求图像,即采集状态 int m_nBinningMode; //记录探测器的binning模式 int m_nWinTime; //记录SDK的采图周期 int m_nStartLine; //开窗模式起始行 int m_nEndLine; //开窗模式终止行 int m_nStartColumn; //开窗模式起始列 int m_nEndColumn; //开窗模式终止列 int m_nRawWidth; int m_nRawHeight; DWORD m_dwBeginT; //点片模式下,上层调用startgrab的时机 DWORD m_dwEndT; //点片模式下,收到图像的时机,用来判断是否是合适的图像 DWORD m_nDelayT; //点片模式下,收到startgrab之后多久才应该取图,单位:毫秒 bool m_bTimerSwitch; //两次图像回调的间隔计时功能开关;true-开 DWORD m_dwLastT; //上一次得到图像回调的时间 DWORD m_dwGetImageT; //得到图像回调的时间 int m_nSaturation; //图像的饱和值 int m_nRADSpeed; //上层传下来的点片帧频 int m_nFLUSpeed; //上层传下来的透视帧频 int m_nCINSpeed; int m_nStandbyRate; //停止采集后的帧率。停止采集后探测器需要设置到这个帧率刷offset int m_nRadImgCount; //单帧点片时不合格图像张数,超过这个张数就停止采集,避免不能停止当前状态;默认为3 vector m_vecCycleTime; vector m_vecDelayTime; /**Workflow**/ public: bool InitDETECTOR(HWND hWnd, bool bState) override; bool ExitDETECTOR(); bool BeginWorkMode(void); // 进入检查模式 bool EndWorkMode(void); // 退出检查模式 static UINT ACQThread(LPVOID pParam); bool StartGrab(); // 开始采集 bool StopGrab(int nXRayOnNum); // 停止采集 bool SetGrabMode(int nMode); //nMode: SINGLE_SHOT_RAD_MODE 1 / SEQUENCE_RAD_MODE 2 / PULSE_FLU_MODE 3 / CONTINUE_FLU_MODE 4 bool ExpEnable(); bool ExpDisable(); bool FluEnable(); bool FluDisable(); bool CheckImageExi(WORD dwExiThrethold); bool CalculateEXI(WORD* pImgData, int nImgWidth, int nImgHeight, int nImageBit, int nThreshold); int AEDCalcu(WORD* pImage, int nWidth, int nHeight, int nImageBit, int nThreshold, float fArea); private: vector m_vecCALMode; XMODE m_RadMode; XMODE m_FluMode; XMODE m_CINEMode; XMODE m_ActiveMode; XROI m_CurROI; bool InitHW(HWND hWnd); // 初始化设备 bool LoadPZMedicalDLL(); void FreePZMedicalDLL(); static UINT ScanThread(LPVOID pParam); bool StartScanThread(); bool StopScanThread(); bool WaitRespond(int nTimeOut); void LoadROIParams(); //加载ROI参数 bool ActiveROI(int nLogicMode, int nROIIndex); //激活ROI(未使用) bool StopDetector(); //结束工作流 bool CloseDetector(); //关闭探测器 /**Calibration**/ public: bool BeginCalibration(int nLogicMode, int nOffsetIndex, int nCalMode); bool EnterCalibration(); bool CalibrateAllModes(); bool ExitCalibration(); bool AbortCalibration(); bool GetCalibrationStatus(int nLogicMode, int nOffsetIndex, ZSKK_CAL_STATUS& modeStatus); //获取设置模式的状态 bool StartOffsetCalibration(int nMode); bool OffsetByUser(int nOffsetType = 2); private: bool RefreshOffset(); int GetOffsetMode(int nLogicMode, int nOffsetIndex, int nSpeed); //获取与采集速度匹配的Offset模式,nSpeed为真实速度乘100 bool StartGainCalibration(int nLogicmode, int nRefNum, int CalMode); bool CalibNextStep(); bool GenTpl(); bool SetAcquisitionParam(int nFrameRate, int nRepeatNum, char cBinningMode); //设置采集参数 bool SetBinningMode(int nMode); //调用SDK接口,设置binning模式 bool GetSetCalibMode(CHAR cCalibMode, int nMode = 1); //先获取再设置校正模式 bool SetROIMode(int nStartLine, int nEndLine, int nStartColumn, int nEndColumn); //调用SDK接口,设置开窗(ROI) /**Command**/ public: bool SelectRADMode(int nLogicMode, int nOffsetIndex); //选择点片模式 bool SelectFLUMode(int nLogicMode, int nOffsetIndex); //选择透视模式 bool SelectCINEMode(int nLogicMode, int nOffsetIndex); //选择CINE模式 bool SetRadOffsetMode(int nLogicMode, int nOffsetIndex, int nSpeed); bool SetFluOffsetMode(int nLogicMode, int nOffsetIndex, float fSpeed); bool SetCinOffsetMode(int nLogicMode, int nOffsetIndex, float fSpeed); void setNextStepEvent(); bool DownloadCorrectionFile2Device(); bool ActiveRADMode(); //激活点片模式 bool ActiveFLUMode(); //激活透视模式 bool ActiveCINEMode(); //激活CINE模式 bool SetSpotFrameRate(float fps); //设置点片模式速度 bool SetFLUFrameRate(float fps); //设置透视模式速度 bool SetCINEFrameRate(float fps); //设置CINE模式速度 bool GetActiveMode(int &nLogicMode, int &nOffsetIndex); //获取当前模式 bool GetOffsetInfo(int nLogicMode, vector &vecOffsetInfo); // 获取设置模式的offset状态 bool GetLogicModeList(vector &vecDetectorMode); // 获取模式配置表信息 bool ActiveHSTMode(); //激活HST模式 bool ActiveDSTMode(); //激活DST模式 private: bool StartAcquisition(int nMode); bool StopAcquisition(int nMode = 0); bool ActiveLogicMode(int nmode, int nOffRef); //激活逻辑模式 void OnImageEvt(/*UINT32 uiImageNo, VOID* uiImgBuffAddr, UINT32 uiImgValidSize*/); int CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight, LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits, int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin); bool WriteFrame(WORD* pImgData, int nWidth, int nHeight); bool SaveImage(WORD* pImage, int nImgSize); bool SaveImage(const char* szFileName, WORD* pImage, int nImgSize); bool ApplyImgSaturation(WORD* pImgData, int nWidth, int nHeight, int nSaturation); /**Message processing**/ public: bool OnCOPYDATA_MSG_Process(WPARAM wParam, LPARAM lParam); bool OnMSGWORKFLOW_Process(WPARAM wParam, LPARAM lParam); bool OnMSGCALIBRATION_Process(WPARAM wParam, LPARAM lParam); bool OnMSGPARAMETER_Process(WPARAM wParam, LPARAM lParam); bool ResetConnection(); protected: virtual bool OnXrayGenStart(); virtual bool OnXrayGenStop(); virtual bool OnXrayGenSetDose(); virtual bool OnXrayCalSuccess(); virtual bool OnXrayCalFail(); virtual bool OnSYNC(); virtual bool OnTimeOut(); virtual bool OnWarning(); virtual bool OnStatus(); virtual bool OnModeActive(); DECLARE_MESSAGE_MAP() private: static BOOL WINAPI FuncLinkEXCallBack(CHAR cEvent); static BOOL WINAPI FuncLinkCallBack(CHAR cEvent); static BOOL WINAPI FuncBreakCallBack(CHAR cEvent); static BOOL WINAPI FuncImageCallBack(CHAR cEvent); static BOOL WINAPI FuncHeartBeatCallBack(CHAR cEvent); static BOOL WINAPI FuncOffsetDoneCallBack(CHAR cEvent); static BOOL WINAPI FuncReadyCallBack(CHAR cEvent); static BOOL WINAPI FuncExposeCallBack(CHAR cEvent); static BOOL WINAPI FuncImageStartCallBack(CHAR cEvent); static BOOL WINAPI FuncImageEndCallBack(CHAR cEvent); bool LogInfo(LPCSTR strLog); bool LogError(LPCSTR strLog); bool LogWarn(LPCSTR strLog); bool TestError(int nErrorStatus); bool GetFPInfo(); bool GetFPCurStatus(); bool GetFPWifiTempBat(); bool GetImageInfo(); bool ChangeActiveMode(CString ExamType, int nPUMode, int nSizeX, int nSizeY, int nCropLeft, int nCropTop, int nCropRight, int nCropBottom); public: CString m_strCalWarning; bool m_bGainDefectFlag; bool m_bDownloadFileFlag; private: map m_ProcessChainMap; map m_ROImap; bool m_EnableProcessChain; bool m_EnableDrvLog; CWnd *m_pWnd; bool m_bIsWorkingMode; ZSKK_CAL_SYN_PARAM m_CurSynParam; ZSKK_CAL_SYN_PARAM m_PreSynParam; bool m_bAbortOffset; bool m_bOffsetAll; //用于标记在是否发送过offset提示,true则发过 //m_bIsWorkingMode为true时,m_bOffsetPromptSended置为false bool m_bOffsetPromptSended; CAppSettings m_appRealModeConf; //RealModeMatch.xml int m_nTOMOMode; bool m_bExit; private: HMODULE m_hModule; int m_nGrabMode; int m_nCurGainGroupIndex; int m_nOffsetTotalFrames; int m_nDefectTotalFrames; int m_nTotalGainGroup; int m_nDetectorID; int m_nEachGroupFrames; int m_nGainStartFrames; HANDLE m_hScanThreadEnd; int m_nOffsetCheckCounts; int m_nOffsetInterval; bool m_bInitOffset; int m_nOffsetConf; int m_nGainConf; int m_nDefectConf; public: CFile* g_TestSavingImage; bool g_bTestTrue; protected: ZSKK_IMAGE_INFO m_ImgInfo; //save image data ZSKK_ACQ_INFO m_ACQInfo; //Save image information DWORD m_pImgBufferSize; int m_nCropLeft, m_nCropTop, m_nCropRight, m_nCropBottom; int m_nPixelSpacing; CShareMem* m_pDataBuffer; int m_nCurrentFrame; int m_nTotalFrameGrab; //序列点片一共获得的图像帧数 int m_nXrayOnNum; //HW传下来的序列点片曝光次数 bool m_bWaitLastImg; //序列点片下,需要等最后一张图的标志位;true-需要等 PZModeConfigures PZModeConf; };