#pragma once #include "ResDataObject.h" #include "CCOS.Dev.FPD.CareRayDR.h" #include "CareRayInterface.h" #include "include/errors.h" #include "include/structures.h" #include "ZSKKCalibration.h" constexpr auto SCAN_EVENT_COUNT = 7; class Detector_CareRayDR { enum class eDetStatus { DetStatus_NotIni, DetStatus_NotConn, DetStatus_Sleep, DetStatus_Standby, DetStatus_Work, DetStatus_Acquire, DetStatus_Offset, DetStatus_XrayCalibration, }; //探测器信息 struct CPanelStatus { bool bInitOver; //是否初始化完成 bool bConnectState; //是否连接 SYNC_MODE eSyncMode; //同步模式 int nSoftAcqState; eDetStatus eFPDStatus; //探测器状态 CPanelStatus() { bInitOver = false; bConnectState = false; eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值 nSoftAcqState = 0; eFPDStatus = eDetStatus::DetStatus_NotIni; } }; public: Detector_CareRayDR(); ~Detector_CareRayDR(); bool DriverEntry(FPDDeviceCareRay* pDrvDPC, ResDataObject& Configuration); bool Connect(FPDDeviceCareRay* pDrvDPC, const char* szWorkPath); void EnterExamMode(int nExamMode); bool SetAcqMode(int nMode); bool SetSyncMode(int nSyncMode); bool PrepareAcquisition(FPDDeviceCareRay* pDrvDPC); bool StartAcquisition(FPDDeviceCareRay* pDrvDPC); bool StopAcquisition(FPDDeviceCareRay* pDrvDPC); bool ActiveCalibration(FPDDeviceCareRay* pDrvDPC, CCOS_CALIBRATION_TYPE eType); bool PrepareCalibration(FPDDeviceCareRay* pDrvDPC); bool StartCalibration(FPDDeviceCareRay* pDrvDPC); bool StopCalibration(FPDDeviceCareRay* pDrvDPC); bool AbortCalibration(FPDDeviceCareRay* pDrvDPC); bool CompleteCalibration(FPDDeviceCareRay* pDrvDPC); bool SaveCalibrationFile(); void SetCalibRounds(int nCalibRounds); bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound); bool AcceptCalibration(); bool RejectCalibration(); CCOS_CALIBRATION_TYPE GetCalibType(); bool GetCalibrationTime(int nDetectorID = -1); bool ActiveDetector(FPDDeviceCareRay* pDrvDPC, bool bActive); bool UpdateCalibMode(CCOS_CALIBRATION_MODE eCalibMode); void CallBackEvent(int eventID, Event* eventData); void SetNotifyStatusTimePeriod(int nTime); void SetReconnectTimePeriod(int nTime); private: map* m_pDPC2PanelID; map* m_pPanelID2DPC; int m_nPanelCount; //探测器数量 ResDataObject m_ModeConfig; //保存DPC模块下发的配置 std::string m_strCtrlWorkPath; //保存工作路径,用于加载SDK和配置 int m_nCurrentPanelID; int m_nCurrentDetectorType;//枚举值 string m_strDetectorType; //探测器类型 HMODULE m_hCareRayDRModule; //加载SDK的句柄 CPanelStatus *m_pStPanelStatus[2]; //康众SDK应该只支持双板 int m_nSyncMode; //存储从配置文件读取到的同步模式 int m_nCheckMode;//sdk的CheckMode int m_nCurrentLogicMode;//当前工作在配置文件的哪个工作模式下 int m_nLastCheckMode;//上次采集时使用的采集模式 bool m_bFetchable;//是否有图像可以获取 //软同步是通过回调函数通知状态的 硬同步和AED都要主动查询状态,虽然都是query prog info 但是他俩使用的标志位也是不同的 int m_nSdkSyncMode;//给SDK设置的同步模式 int m_nImageWidth; int m_nImageHeight; int m_nWidthOffset; int m_nHeightOffset; int m_nRawImgWidth; //原始图像宽 int m_nRawImgHeight; //原始图像高 int m_nPreviewEnable; int m_nPreImgWidth; int m_nPreImgHeight; WORD* m_pRawImgBuffer; //原始图buffer WORD* m_pPreImgBuffer; //预览图buffer WORD* m_pImgBuffer; //裁剪后图像 WORD* m_pDarkImage; //调用SDK获取暗场图像 int m_nXwindow; //窗口积分时间 int m_nDelayTime; int m_nWaitTime; AppStatus m_nAppStatus; //记录软件状态 int m_nSaveRaw; bool m_bCancelFlag; //true: 取消曝光 CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 ecom校正/厂商校正 CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正类型 CZSKKCalibrationCtrl* m_pZSKKCalib; int m_nImageSize; //通过SDK返回值算出的图像尺寸 WORD* m_pFluFrameData; int m_nFluLastExpStatus;//DDR时上一次的曝光状态 int m_nFluCurrentExpStatus;//DDR时当前的曝光状态 int m_nMaxFrameId;//DDR出图的最大张数 int m_nReceivedFrameId;//DDR时收到了多少张图 int m_nCalibrationRounds;//校正总轮数 int m_nCalibCurrentCalibrationRound;//当前校正轮数 int m_nCalibCurrentExposureIndex;//当前轮次曝光第几次 int m_nExposureNumCurrentRound;//当前轮次需要曝光的总次数 bool m_bGetImageByCallBack;//当前模式是否是用回调取图 int m_nNotifyStatusTimePeriod;//通知温度等状态信息的时间间隔 int m_nReconnectTimePeriod;//重连的时间间隔 HANDLE m_hRespond;//用于等待某个状态的到来或者某个动作的完成 //辅助线程事件 HANDLE m_hStopScanEvent; //退出辅助线程事件 HANDLE m_hAcqEvent; //开始采集事件 HANDLE m_hProcessImgEvent;//处理图像事件 HANDLE m_hXWinOnEvent; HANDLE m_hDarkEvent; //开始dark校正 HANDLE m_hGainEvent; //开始Rad Gain事件 HANDLE m_hInitEvent; HANDLE m_hArrayEvent[SCAN_EVENT_COUNT]; HANDLE m_hToggleEvent; //辅助线程退出通知事件 HANDLE m_hFPDScanThread; //辅助线程 HANDLE m_hFPDStatusThread;//扫描探测器温度、电量、wifi bool m_bExit;//退出辅助线程和查询探测器状态线程 HANDLE m_hReconnectThread; //重连线程 //辅助线程 static unsigned __stdcall onFPDScanThread(PVOID pvoid); //查询温度、电量、wifi线程 static unsigned __stdcall onFPDStatusThread(PVOID pvoid); //重连线程断线后开启 static unsigned __stdcall onReconnectThread(PVOID pvoid); void InitSdkInterface(); bool LoadDll(string strWorkPath); bool ConnectDetector(); bool InitDetector(); int ShowDetectorInfo(); int ShowModeInfo(); bool SetSdkSyncModeAndTime(int nSyncMode); bool WaitRespond(int nTimeOut = 65000, const char* szAction = ""); void StopWaiting(const char* szAction = ""); bool TestError(int nRet, const char* szFuncName = "Func", bool bShowTrue = true); void GetDetectorType(DetectorType eType, string& szType); //是否是移动探测器 linear-固定 portable-移动 bool IsPortableFPD(); void OnStartAcquisition(); void OnProcessImg(); void StartDarkCalibration(); void StartGainCalibration(); void InitFPD(); int PerformSoftSyncAcq(); int RadAcquisition(); int DarkAcquisition(); int QueryAutoProgInfo(bool bIsAED = true); int QueryRadProgInfo(); void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight, string strFrameID = ""); bool SaveRawWithName(const char* pRawName, const WORD* pRawImg, int nWidth, int nHeight); bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth); bool SetUserCorrection(bool bLoad); double GetMean(WORD* imgNoHeader, int pixelNum); eDetStatus GetCareRayDPCStatus(int nDetectorIndex = -1); bool SetCareRayDPCStatus(eDetStatus status, int nDetectorIndex = -1); bool IsConnected(string strIP); int FluAcquisitionByCallBack(); int FluAcquisitionByGetImage(); void PerformDualEnergyAcquisition(); 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); CB_CR_connect_detector API_CR_connect_detector; CB_CR_disconnect_detector API_CR_disconnect_detector; CB_CR_reset_detector API_CR_reset_detector; CB_CR_set_check_mode API_CR_set_check_mode; CB_CR_set_sync_mode API_CR_set_sync_mode; CB_CR_set_cycle_time API_CR_set_cycle_time; CB_CR_set_normal_power API_CR_set_normal_power; CB_CR_set_save_power API_CR_set_save_power; CB_CR_permit_exposure API_CR_permit_exposure; CB_CR_start_acq_full_image API_CR_start_acq_full_image; CB_CR_start_acq_dark_full_image API_CR_start_acq_dark_full_image; CB_CR_start_acq_prev_image API_CR_start_acq_prev_image; CB_CR_start_acq_dark_prev API_CR_start_acq_dark_prev; CB_CR_start_acq_def_image API_CR_start_acq_def_image; CB_CR_start_acq_fluoro_image API_CR_start_acq_fluoro_image; CB_CR_start_acq_fluoro_dark_image API_CR_start_acq_fluoro_dark_image; CB_CR_stop_acq_frame API_CR_stop_acq_frame; CB_CR_stop_acq_frame_cleanup API_CR_stop_acq_frame_cleanup; CB_CR_set_user_correction API_CR_set_user_correction; CB_CR_get_user_correction API_CR_get_user_correction; CB_CR_set_dose API_CR_set_dose; CB_CR_get_active_detector_ID API_CR_get_active_detector_ID; CB_CR_set_active_detector API_CR_set_active_detector; CB_CR_get_dual_detector_state API_CR_get_dual_detector_state; CB_CR_set_smart_hand_switch API_CR_set_smart_hand_switch; CB_CR_get_SHS_status API_CR_get_SHS_status; CB_CR_get_wireless_ip API_CR_get_wireless_ip; CB_CR_set_wireless_ip API_CR_set_wireless_ip; CB_CR_get_station_mode_conf API_CR_get_station_mode_conf; CB_CR_set_station_mode_conf API_CR_set_station_mode_conf; CB_CR_get_temperature_cal_data API_CR_get_temperature_cal_data; CB_CR_check_temperature_slot API_CR_check_temperature_slot; CB_CR_get_API_Version API_CR_get_API_Version; CB_CR_get_conn_state API_CR_get_conn_state; CB_CR_get_detector_type API_CR_get_detector_type; CB_CR_get_detector_info API_CR_get_detector_info; CB_CR_get_mode_info API_CR_get_mode_info; CB_CR_get_status_info API_CR_get_status_info; CB_CR_get_status_info_Ex API_CR_get_status_info_Ex; CB_CR_get_image_attr API_CR_get_image_attr; CB_CR_get_image API_CR_get_image; CB_CR_get_preview_image API_CR_get_preview_image; CB_CR_get_unuploaded_img_info API_CR_get_unuploaded_img_info; CB_CR_query_prog_info API_CR_query_prog_info; CB_CR_inpaint_bad_pixels API_CR_inpaint_bad_pixels; CB_CR_select_cal_type API_CR_select_cal_type; CB_CR_get_cal_params API_CR_get_cal_params; CB_CR_set_offset_correction API_CR_set_offset_correction; CB_CR_cal_offset API_CR_cal_offset; CB_CR_linear_calibration API_CR_linear_calibration; CB_CR_portable_calibration API_CR_portable_calibration; CB_CR_execute_linear_cal API_CR_execute_linear_cal; CB_CR_execute_portable_cal API_CR_execute_portable_cal; CB_CR_stop_cal_procedure API_CR_stop_cal_procedure; CB_CR_start_fluoro_calibration API_CR_start_fluoro_calibration; CB_CR_query_calibration_status API_CR_query_calibration_status; CB_CR_do_gridpattern_filtration API_CR_do_gridpattern_filtration; CB_CR_register_callback API_CR_register_callback; CB_CR_send_exp_request API_CR_send_exp_request; CB_CR_ready_state_request API_CR_ready_state_request; CB_CR_start_soft_acquisition API_CR_start_soft_acquisition; CB_CR_set_AEC_integ_time API_CR_set_AEC_integ_time; CB_CR_register_AEC_callback API_CR_register_AEC_callback; CB_CR_start_AEC_acquire_process API_CR_start_AEC_acquire_process; CB_CR_get_one_key_cal API_CR_get_one_key_cal; CB_CR_check_img_for_factory_cal API_CR_check_img_for_factory_cal; CB_CR_download_factory_cal_files API_CR_download_factory_cal_files; CB_CR_execute_one_key_cal API_CR_execute_one_key_cal; CB_CR_start_acq_NDT_dark_image API_CR_start_acq_NDT_dark_image; CB_CR_execute_NDT_CAL API_CR_execute_NDT_CAL; CB_CR_correct_NDT_image API_CR_correct_NDT_image; CB_CR_set_NDT_frame_num API_CR_set_NDT_frame_num; CB_CR_finish_NDT_acquisition API_CR_finish_NDT_acquisition; CB_CR_check_NDT_CAL_Files API_CR_check_NDT_CAL_Files; };