#pragma once #include "ResDataObject.h" #include "CCOS.Dev.FPD.AxsDM.h" #include "AxsFunc.h" #include "ZSKKCalibration.h" #define CALIBRATION_EVENT_COUNT 6 #define ASSIST_EVENT_COUNT 8 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 }; enum HW_EXPOSURE_MDOE { EM_ERROR = 0, EM_NORMAL, //normal exposure mode EM_AEC, //AEC exposure mode EM_AEC_TIME = 2, EM_DE, //Dual Energy exposure mode EM_HDR, //HDR exposure mode EM_STITCHING, //Stitching mode EM_WARMUP, EM_AEC_FILTER, EM_AEC_KV, EM_QC, EM_VET_QUICK, EM_TOMO, EM_DDR }; enum eAcqMode { ACQ_UNKNOWN = 0, RAD, AEC,//AEC FLU }; class CAXSCtrl { public: CAXSCtrl(); ~CAXSCtrl(); bool DriverEntry(CFPDDeviceAXS* pDrvDPC, ResDataObject& Configuration); bool Connect(CFPDDeviceAXS* pDrvDPC, const char* szWorkPath); bool Disconnect(); void EnterExamMode(int nExamMode); bool SetAcqMode(int nLogicMode, CFPDDeviceAXS* pDrvDPC); void SetSynMode(int nMode); bool PrepareAcquisition(CFPDDeviceAXS* pDrvDPC); bool SelectExamMode(int nLogicMode, CFPDDeviceAXS* pDrvDPC); bool StartAcquisition(CFPDDeviceAXS* pDrvDPC); bool StopAcquisition(CFPDDeviceAXS* pDrvDPC); bool ActiveCalibration(CFPDDeviceAXS* pDrvDPC, CCOS_CALIBRATION_TYPE eType); bool PrepareCalibration(CFPDDeviceAXS* pDrvDPC); bool StartCalibration(CFPDDeviceAXS* pDrvDPC); bool StopCalibration(CFPDDeviceAXS* pDrvDPC); bool ResetDetector(CFPDDeviceAXS* pDrvDPC); bool SetReferenceNum(int nReferenceNum); bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound); bool AcceptCalibration(); bool RejectCalibration(); bool AbortCalibration(); bool SaveCalibrationFile(); bool CompleteCalibration(CFPDDeviceAXS* pDrvDPC); bool NotifyCalibrationTime(int nDetectorID = -1); void SetCalibMode(CCOS_CALIBRATION_MODE eCalibMode); CCOS_CALIBRATION_TYPE GetCAXSCtrlCalibType(); PZDPC_State GetPZDPCState(); int GetCalImagesLeftCount();//厂商校正时获取剩余需要曝光的次数 void eventCallback(PEGASUS_EventType myEvent, PEGASUS_ErrorCode err, void* pContext); void multiEventCallback(PEGASUS_MultiEventType myEvent, PEGASUS_ErrorCode err, int sequenceId, int imageIndex); private: //探测器信息 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; } }; map* m_pDPC2PanelID; map* m_pPanelID2DPC; CPanelStatus* m_pStPanelStatus[3];//探测器信息 内部还有自己的FPDConfig 注意赋值(为了以后连接多个板子用) int m_nPanelCount; //探测器数量 std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置 int m_nCurrentPanelID; ResDataObject m_objFPDConfig; //保存DPC模块下发的配置 std::string m_strTplDarkPath; // references\serialnumber\dark std::string m_strTplFloodPath; // references\serialnumber\flood PZDPC_State m_ePZDPCstate; //DPC或ctrl模块当前处于什么状态 bool m_bHavePreview;//是否有预览图 int m_nImageMode;//图像类型 int m_nAecImageWidth;//预览图宽 int m_nAecImageHeight;//预览图高 int m_nAecImageSize;//宽(22)*高(28)*像素大小(4)=2464 int m_nAecImageBits;//AEC图像位数-------------- int m_nAecPixelSize;//像素大小(用来计算图像占用多少字节)默认4 int m_nRawImgWidth; //原始图像宽 int m_nRawImgHeight; //原始图像高 int m_nRawImageSize;//宽(2816)*高(3650)*像素大小(2)= 20556800 int m_nRawImageBits;//原始图图像位数----------------- int m_nRawPixelSize;//像素大小(用来计算图像占用多少字节)默认2 int m_nLeftOffset;//左侧裁剪长度 int m_nTopOffset;//上边裁剪长度 int m_nRightOffset;//右侧裁剪长度 int m_nBottomOffset;//下边裁剪长度----------------- int m_nImageWidth;//有效图像宽 int m_nImageHeight;//有效图像高 int m_nImageSize;//宽(2816)*高(3584)*像素大小(2)= 20185088 int m_nImageBits;//有效图图像位数---------------- int m_nImagePixelSize;//像素大小(用来计算图像占用多少字节)默认2 WORD* m_pAecImgBuffer;//预览图buffer WORD* m_pRawImgBuffer; //原始图buffer WORD* m_pImgBuffer; //有效图像buffer int m_nPixelPitch; int m_nSequenceId;//图像序列ID int m_nImageIndex;//有几张图像需要恢复 int m_nSaveRaw; //0:不存; 1:预览图; 2:raw图; 4:实际尺寸图像; int m_nExamMode; //记录工作界面 CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 0-ZSKK 1-OTHER CCOS_CALIBRATION_TYPE m_eType; // 记录当前校正类型 PZ_CALIBRATION_State m_eCalState;//探测器校正状态 bool m_bCalibrationOver; // true 正常结束校正(校正路程走完) false 异常结束校正(流程没走完就结束) //切换平板需要重置初始值 PEGASUS_State m_detectorState;//探测器状态 CZSKKCalibrationCtrl* m_pZSKKCalib; string m_strPanelType; //探测器类型。命名方式截取自config_Pixrad路径下的ini文件,以Detector3543EZe.ini为例,m_strPanelType=3543EZe string m_strSerialNumber;//探测器SN bool m_bLoadedSDK; //true 已经加载了SDK,避免重复调用,主要用于ReInit流程 bool m_bInitializedSDK; //true 已经init了SDK,避免重复调用,主要用于ReInit流程 ResDataObject m_ModeConfig; int m_nCalibrationRounds;//总的校正轮数 int m_nCalibCurrentCalibrationRound;//当前处于的校正轮数 int m_nExposureNumCurrentRound;//当前校正轮数需要曝光的总次数 int m_nCalibCurrentExposureIndex;//当前校正轮数第几次曝光 bool m_bOnlyHaveFpd;//当前环境是否只有探测器一个真实设备并且处于AED同步模式,其他设备是demo的 1-是 0-否 默认否 PEGASUS_Context m_context; eAcqMode m_nCurrentAcqMode; //记录探测器当前采集模式 PEGASUS_TargetFilter m_targetFilter; PEGASUS_Image m_ResultImage; bool m_bReadyForExp;//探测器是否ready bool m_bChangeAcqProperties;//探测器切换采集模式是否成功 UINT_PTR m_nTimerHardWare;//定时获取平板参数 bool m_bShutDownFlag;//是否调用了shutdown接口 bool m_bTimeOutFlag;//是否曝光超时 LogicClient* m_pAcqUnitCient; // CCOS/DEVICE/Detector/+/+/+/Notify/# //end HMODULE m_hPZSDKModule; //SDK module HANDLE m_hRespond;//等待探测器响应时使用 bool m_bExitGetInfoThread;//退出获取探测器信息线程的标志 HANDLE m_hDetectorInfoThread;//探测器信息获取线程,例如温度 bool m_bExitFpdScanThread;//退出辅助线程的标志 //辅助线程相关 HANDLE m_hFPDScanThread; HANDLE m_hStopScanEvent; HANDLE m_hAecImgEvent; HANDLE m_hCorrectedImgEvent; HANDLE m_hXWinOnEvent; HANDLE m_hInitFPDEvent; HANDLE m_hReInitEvent; HANDLE m_hRecoverImage; HANDLE m_hArrayEvent[ASSIST_EVENT_COUNT]; //end bool m_bExitCalibrationThread;//退出校正线程的标志 //校正线程以及相应事件 HANDLE m_hCalibrationThread; HANDLE m_hStopCalibEvent; //退出校正线程 HANDLE m_hPZMStartOffset; //调用api,开始采集暗场图 HANDLE m_hPZMInOffset; //调用api 停止采集暗场图 HANDLE m_hPZMStartGain; //调用api,开始采集亮场图 HANDLE m_hPZMInGain; //调用api,停止采集亮场图 HANDLE m_hEndCalibEvent;//结束校正 可能是正常结束,可能是异常结束,正常结束就重新生成校正文件,异常结束就重新加载之前的校正文件 HANDLE m_hPZMCalibration[CALIBRATION_EVENT_COUNT]; //end bool LoadSdkDll(); PEGASUS_ErrorCode InitSDK(); bool LoadZskkMap(); PEGASUS_ErrorCode GetDetectorInfo(); static DWORD __stdcall onFPDScanThread(PVOID pvoid); void OnProcessAecImg(); void OnProcessCorrectedImg(); void OnProcessInitFPD(); void OnReInitFPD(); void OnRecoverImage(); void OnProcessGenNotify(); static DWORD __stdcall onCalibrationThread(PVOID pvoid); bool OnProcessCalibration(); void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight); bool SaveRawImage(const char* pImgName, const WORD* pRawImg, int nWidth, int nHeight); 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 TestError(PEGASUS_ErrorCode nRet, const char* szFuncName = "Func"); bool WaitRespond(int nTimeOut = 65000, const char* szPosition = ""); void StopWaiting(const char* szPosition = ""); bool SetFPDTplPath(); void SetPZDPCState(PZDPC_State ePZDPCstate); void GetConfigParam(); bool StartContinuousAcquisition(); void ShowExposureParam(PEGASUS_ExposureData& expData); bool ChangeAcqProperties(int nAcqMode); static DWORD __stdcall OnGetFpdInfo(PVOID pvoid); //回调 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); AXS_PEGASUS_RegisterProgressionCallback API_PEGASUS_RegisterProgressionCallback; AXS_PEGASUS_Initialize API_PEGASUS_Initialize; AXS_PEGASUS_QuickInitialize API_PEGASUS_QuickInitialize; AXS_PEGASUS_Shutdown API_PEGASUS_Shutdown;//并没有断开连接,只是进入了低功耗模式 AXS_PEGASUS_LoadContext API_PEGASUS_LoadContext; AXS_PEGASUS_DetailedInformation API_PEGASUS_DetailedInformation; AXS_PEGASUS_SystemDetailedInformation API_PEGASUS_SystemDetailedInformation; AXS_PEGASUS_Information API_PEGASUS_Information; AXS_PEGASUS_CalibrationInformation API_PEGASUS_CalibrationInformation; AXS_PEGASUS_GetCalibrationInformation API_PEGASUS_GetCalibrationInformation; AXS_PEGASUS_GetCalibrationInformationUsingType API_PEGASUS_GetCalibrationInformationUsingType; AXS_PEGASUS_IsReadyForExposure API_PEGASUS_IsReadyForExposure; AXS_PEGASUS_Acquire API_PEGASUS_Acquire; AXS_PEGASUS_AbortAcquire API_PEGASUS_AbortAcquire; AXS_PEGASUS_StartContinuousAcquisition API_PEGASUS_StartContinuousAcquisition; //AXS_PEGASUS_StartContinuousAcquisitionEx API_PEGASUS_StartContinuousAcquisitionEx;//EX是厂商为了向后兼容加的,我们用不带EX的函数就行 AXS_PEGASUS_ChangeContinuousAcquisitionProperties API_PEGASUS_ChangeContinuousAcquisitionProperties; //AXS_PEGASUS_ChangeContinuousAcquisitionPropertiesEx API_PEGASUS_ChangeContinuousAcquisitionPropertiesEx; AXS_PEGASUS_GetContinuousAcquisitionProperties API_PEGASUS_GetContinuousAcquisitionProperties; //AXS_PEGASUS_GetContinuousAcquisitionPropertiesEx API_PEGASUS_GetContinuousAcquisitionPropertiesEx; AXS_PEGASUS_OverrideTargetFilter API_PEGASUS_OverrideTargetFilter; AXS_PEGASUS_GetAecImage API_PEGASUS_GetAecImage; AXS_PEGASUS_GetCorrectedImage API_PEGASUS_GetCorrectedImage; AXS_PEGASUS_GetInformationOfFirstAvailableImage API_PEGASUS_GetInformationOfFirstAvailableImage; AXS_PEGASUS_StartSingleAcquisition API_PEGASUS_StartSingleAcquisition; AXS_PEGASUS_PrepareForExposure API_PEGASUS_PrepareForExposure; AXS_PEGASUS_TriggerAcquisition API_PEGASUS_TriggerAcquisition; AXS_PEGASUS_RecoverImage API_PEGASUS_RecoverImage; //AXS_PEGASUS_RecoverImageEx API_PEGASUS_RecoverImageEx; AXS_PEGASUS_CancelImageRecovery API_PEGASUS_CancelImageRecovery; AXS_PEGASUS_RecoverLastSequenceID API_PEGASUS_RecoverLastSequenceID; AXS_PEGASUS_Calibrate API_PEGASUS_Calibrate;//开始GAIN校正,会回调ready事件 //AXS_PEGASUS_CalibrateEx API_PEGASUS_CalibrateEx; AXS_PEGASUS_GetNbrCalImagesLeft API_PEGASUS_GetNbrCalImagesLeft;//厂商校正时获取剩余需要曝光的次数(有效曝光次数) AXS_PEGASUS_AbortCalibration API_PEGASUS_AbortCalibration; AXS_PEGASUS_AddImageToCalibration API_PEGASUS_AddImageToCalibration;//接受当前曝光 AXS_PEGASUS_RejectCalibrationImage API_PEGASUS_RejectCalibrationImage;//拒绝当前曝光 AXS_PEGASUS_AutoCalibrate API_PEGASUS_AutoCalibrate; AXS_PEGASUS_CalibrateUsingType API_PEGASUS_CalibrateUsingType; AXS_PEGASUS_StopComServer API_PEGASUS_StopComServer; AXS_PEGASUS_GetLogLevel API_PEGASUS_GetLogLevel; AXS_PEGASUS_SetLogLevel API_PEGASUS_SetLogLevel; AXS_PEGASUS_SelfTest API_PEGASUS_SelfTest; AXS_PEGASUS_Sleep API_PEGASUS_Sleep; AXS_PEGASUS_ServiceImageInformation API_PEGASUS_ServiceImageInformation; AXS_PEGASUS_GetServiceImage API_PEGASUS_GetServiceImage; AXS_PEGASUS_UpdateDefectMap API_PEGASUS_UpdateDefectMap; AXS_PEGASUS_GetWeakDefect API_PEGASUS_GetWeakDefect; AXS_PEGASUS_UpdateWeakDefect API_PEGASUS_UpdateWeakDefect; AXS_PEGASUS_GetErrorDescription API_PEGASUS_GetErrorDescription; AXS_PEGASUS_GetEventDescription API_PEGASUS_GetEventDescription; AXS_PEGASUS_GetMultiEventDescription API_PEGASUS_GetMultiEventDescription; AXS_PEGASUS_GetDebugDump API_PEGASUS_GetDebugDump; AXS_PEGASUS_GetDetectorTypeDescription API_PEGASUS_GetDetectorTypeDescription; AXS_PEGASUS_GetProductTypeDescription API_PEGASUS_GetProductTypeDescription; AXS_PEGASUS_GetContextCodeDescription API_PEGASUS_GetContextCodeDescription; AXS_PEGASUS_GetDetectorStateDescription API_PEGASUS_GetDetectorStateDescription; AXS_PEGASUS_GetPegasusStateDescription API_PEGASUS_GetPegasusStateDescription; AXS_PEGASUS_GetLogLevelCodeDescription API_PEGASUS_GetLogLevelCodeDescription; AXS_PEGASUS_GetSelfTestTypeDescription API_PEGASUS_GetSelfTestTypeDescription; AXS_PEGASUS_GetTargetFilterTypeDescription API_PEGASUS_GetTargetFilterTypeDescription; AXS_PEGASUS_GetFocusTypeDescription API_PEGASUS_GetFocusTypeDescription; AXS_PEGASUS_GetServiceImageTypeDescription API_PEGASUS_GetServiceImageTypeDescription; AXS_PEGASUS_GetPixelFormatDescription API_PEGASUS_GetPixelFormatDescription; AXS_PEGASUS_GetDefectTypeDescription API_PEGASUS_GetDefectTypeDescription; AXS_PEGASUS_GetCalibrationTypeDescription API_PEGASUS_GetCalibrationTypeDescription; AXS_PEGASUS_GetAvailableContext API_PEGASUS_GetAvailableContext; AXS_PEGASUS_Entry API_PEGASUS_Entry; AXS_PEGASUS_Exit API_PEGASUS_Exit; AXS_PEGASUS_TerminateAcquisition API_PEGASUS_TerminateAcquisition; };