#pragma once #include "ResDataObject.h" #include "CCOS.Dev.FPD.CareRay.h" #include "include/Errors.h" #include "include/Structures.h" #include "include/CrapiDll.h" #include constexpr auto SCAN_EVENT_COUNT = 6; #ifndef __CAREVIEWAPI__ #define __CAREVIEWAPI__ typedef __declspec(dllimport) #endif __CAREVIEWAPI__ int(__cdecl* Func_CR_connect_detector)(char*); __CAREVIEWAPI__ int(__cdecl* Func_CR_disconnect_detector)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_reset_detector)(int); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_check_mode)(int); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_sync_mode)(int); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_cycle_time)(int, int, int); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_normal_power)(void); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_save_power)(void); __CAREVIEWAPI__ int(__cdecl* Func_CR_permit_exposure)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_full_image)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_dark_full_image)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_prev_image)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_dark_prev)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_def_image)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_stop_acq_frame)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_stop_acq_frame_cleanup)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_user_correction)(UserCorrection*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_user_correction)(UserCorrection*); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_dose)(int); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_active_detector_ID)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_active_detector)(int); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_dual_detector_state)(DetectorActiveState*); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_smart_hand_switch)(SHSParam*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_SHS_status)(SHSStatus*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_API_Version)(char*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_conn_state)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_detector_type)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_detector_info)(DetectorInfo*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_mode_info)(int, ModeInfo*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_status_info)(StatusInfo*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_image_attr)(FrameAttr*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_image)(int, BOOL, void*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_unuploaded_img_info)(UnuploadedImgInfo*); __CAREVIEWAPI__ int(__cdecl* Func_CR_query_prog_info)(int, ExpProgress*); __CAREVIEWAPI__ int(__cdecl* Func_CR_inpaint_bad_pixels)(WORD*); __CAREVIEWAPI__ int(__cdecl* Func_CR_select_cal_type)(char*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_cal_params)(CalParams*); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_offset_correction)(BOOL); __CAREVIEWAPI__ int(__cdecl* Func_CR_cal_offset)(int); __CAREVIEWAPI__ int(__cdecl* Func_CR_linear_calibration)(void); __CAREVIEWAPI__ int(__cdecl* Func_CR_portable_calibration)(void); __CAREVIEWAPI__ int(__cdecl* Func_CR_execute_linear_cal)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_execute_portable_cal)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_cal_thread)(int);//新加 __CAREVIEWAPI__ int(__cdecl* Func_CR_stop_cal_procedure)(BOOL); __CAREVIEWAPI__ int(__cdecl* Func_CR_do_gridpattern_filtration)(WORD*, int, int, int); __CAREVIEWAPI__ int(__cdecl* Func_CR_register_callback)(eventCallback); __CAREVIEWAPI__ int(__cdecl* Func_CR_send_exp_request)(void); __CAREVIEWAPI__ int(__cdecl* Func_CR_ready_state_request)(void); __CAREVIEWAPI__ int(__cdecl* Func_CR_start_soft_acquisition)(void); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_AEC_integ_time)(int, int); __CAREVIEWAPI__ int(__cdecl* Func_CR_register_AEC_callback)(eventCallback); __CAREVIEWAPI__ int(__cdecl* Func_CR_start_AEC_acquire_process)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_one_key_cal)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_check_img_for_factory_cal)(WORD*); __CAREVIEWAPI__ int(__cdecl* Func_CR_download_factory_cal_files)(); __CAREVIEWAPI__ int(__cdecl* Func_CR_execute_one_key_cal)(WORD*, WORD*, SurfaceFitResult*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_wireless_ip)(char*); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_wireless_ip)(char*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_station_mode_conf)(WirelessStationConf*); __CAREVIEWAPI__ int(__cdecl* Func_CR_set_station_mode_conf)(WirelessStationConf*); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_temperature_cal_data)(TrainHead*, int*); __CAREVIEWAPI__ int(__cdecl* Func_CR_check_temperature_slot)(int, float); __CAREVIEWAPI__ int(__cdecl* Func_CR_get_status_info_Ex)(StatusInfo*, int); //以上共64个接口 //NDT相关 咱们用不到 //__CAREVIEWAPI__ int CR_start_acq_NDT_dark_image(int); //__CAREVIEWAPI__ int CR_check_NDT_CAL_Files(); //__CAREVIEWAPI__ int CR_execute_NDT_CAL(UINT*, UINT*, int); //__CAREVIEWAPI__ int CR_correct_NDT_image(UINT*, UINT*, int); //__CAREVIEWAPI__ int CR_set_NDT_frame_num(int); //__CAREVIEWAPI__ int CR_finish_NDT_acquisition(); class CareRayCtrl { //探测器信息 struct CPanelStatus { bool bConnectState; //是否连接 SYNC_MODE eSyncMode; //同步模式 int nSoftAcqState; CPanelStatus() { bConnectState = false; eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值 nSoftAcqState = 0; } }; public: CareRayCtrl(); ~CareRayCtrl(); bool DriverEntry(FPDDeviceCareRay* pDrvDPC, ResDataObject& Configuration); bool Connect(FPDDeviceCareRay* pDrvDPC, const char* szWorkPath); bool Disconnect(); void EnterExamMode(int nExamMode); bool ActiveDetector(int nDetectorID); bool SetAcqMode(DetModeInfoStruct DetModeInfo, DetCalibInfo DetCalibInfo, int nMode); 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 ConfirmCalExposure(); void RejectCalExposure(); void ProcessCREvent(int eventID, Event* eventData); void Reconnect(); //获取探测器的采集状态 bool GetDetectorAcqStatus(); void SetAcqStatus(bool bAcqStatus); void SetCanelFlag(bool bCancelFlag); private: int m_nExposureMode; //探测器曝光模式。1:RAD;2:AEC;default:0; int m_nXWindowTime; //探测器曝光窗口时间(ms)。default:500ms bool m_bDetectorReady; bool m_bIsAcqStatus;//是否是采集状态 map* m_pDPC2PanelID; map* m_pPanelID2DPC; int m_nPanelCount; //探测器数量 ResDataObject m_ModeConfig; //保存DPC模块下发的配置 std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置 int m_nCurrentPanelID; int m_nCurrentDetectorType; CPanelStatus* m_pStPanelStatus[2]; //康众SDK应该只支持双板 int m_nSyncMode; //记录选择模式时使用的同步模式 int m_nCurSyncMode; //记录当前的同步模式 int m_nRawImgWidth; //SDK反馈的图像宽 int m_nRawImgHeight; //SDK反馈的图像高 WORD* m_pRawImgBuffer; //原始图 WORD* m_pImgBuffer; //裁剪后图像 WORD* m_pDarkImage; //一键校正时获取的暗场图像 int m_nExamMode; //记录工作界面 int m_nSaveRaw;//保存图片的类型都有哪些 0-不保存 1-保存加载校正前的图 2-保存加载校正后的图 3-保存加载校正前和加载校正后的图 bool m_bGetImage; //true: 需要调用getimage接口 bool m_bCancelFlag; //true: 取消曝光 CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式 bool m_bAbortOffset; //true: 终止校正 int m_bOneKeyConf; //记录是否开启一键校正配置 bool m_bOneKeyCalibration; //true: 一键校正模式 CalParams m_calparams; //记录校正过程的参数 int m_nGainNodeCount; //校正曝光的总节点个数 int m_nGainNodeIndex; //校正曝光的节点Index int m_nGainExpCount; //校正曝光节点需要曝光的次数 int m_nGainExpIndex; //校正曝光节点已曝光的次数 int m_nImageSize; //通过SDK返回值算出的图像尺寸 int m_nCurrentMode; DetModeInfoStruct m_stModeInfo; DetCalibInfo m_stCalibInfo; HANDLE m_hRespond; //辅助线程事件 HANDLE m_hFPDScanThread; //辅助线程 HANDLE m_hArrayEvent[SCAN_EVENT_COUNT]; HANDLE m_hStopScanEvent; //退出辅助线程事件 HANDLE m_hAcqEvent; //开始Rad采集事件 HANDLE m_hProcessImgEvent; HANDLE m_hXWinOnEvent; HANDLE m_hDarkEvent; //开始dark校正 HANDLE m_hGainEvent; //开始Rad Gain事件 HANDLE m_hNotifyDetectorInfoThread;//通知探测器温度、电量、wifi信息线程 bool m_bExitNotify;//是否退出通知探测器信息线程 bool LoadDll(string strWorkPath); bool OpenDetector(); bool InitDetector(); int ShowDetectorInfo(); int ShowStatusInfo(); int ShowModeInfo(); bool SetSyncMode(int nSyncMode,int nXWindowTime = 2500); bool WaitRespond(int nTimeOut = 65000, const char* szPosition = ""); void StopWaiting(const char* szPosition = ""); bool TestError(int nRet, const char* szFuncName = "Func"); void GetDetectorType(DetectorType eType, string& szType); //辅助线程 static unsigned __stdcall onFPDScanThread(PVOID pvoid); //通知探测器信息线程 static unsigned __stdcall onNotifyDetectorInfoThread(PVOID pvoid); void OnAcquireImage(); void OnProcessImg(); void OnStartDarkCalibration(); void OnAcquireGainImage(); void OnNotifyDetectorInfo(); int PerformSoftSyncAcq(); int PerformRadAcquisition(); int PerformDarkAcquisition(); int QueryAutoProgInfo(bool bIsAED = true); int QueryRadProgInfo(); void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight); bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth); 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 LoadCareCalibration(bool bLoad); double GetMean(WORD* imgNoHeader, int pixelNum); 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); HMODULE m_hCareRayModule; //加载SDK的句柄 Func_CR_connect_detector API_CR_connect_detector; Func_CR_disconnect_detector API_CR_disconnect_detector; Func_CR_reset_detector API_CR_reset_detector; Func_CR_set_check_mode API_CR_set_check_mode; Func_CR_set_sync_mode API_CR_set_sync_mode; Func_CR_set_cycle_time API_CR_set_cycle_time; Func_CR_set_normal_power API_CR_set_normal_power; Func_CR_set_save_power API_CR_set_save_power; Func_CR_permit_exposure API_CR_permit_exposure; Func_CR_start_acq_full_image API_CR_start_acq_full_image; Func_CR_start_acq_prev_image API_CR_start_acq_prev_image; Func_CR_start_acq_def_image API_CR_start_acq_def_image; Func_CR_stop_acq_frame API_CR_stop_acq_frame; Func_CR_stop_acq_frame_cleanup API_CR_stop_acq_frame_cleanup; Func_CR_set_user_correction API_CR_set_user_correction; Func_CR_get_user_correction API_CR_get_user_correction; Func_CR_set_dose API_CR_set_dose; //加载指定KV下的校准图像 Func_CR_get_API_Version API_CR_get_API_Version; Func_CR_get_conn_state API_CR_get_conn_state; Func_CR_get_detector_type API_CR_get_detector_type; Func_CR_get_detector_info API_CR_get_detector_info; Func_CR_get_mode_info API_CR_get_mode_info; Func_CR_get_status_info API_CR_get_status_info; Func_CR_get_image_attr API_CR_get_image_attr; Func_CR_get_image API_CR_get_image; Func_CR_get_unuploaded_img_info API_CR_get_unuploaded_img_info; Func_CR_query_prog_info API_CR_query_prog_info; Func_CR_inpaint_bad_pixels API_CR_inpaint_bad_pixels; Func_CR_get_cal_params API_CR_get_cal_params; Func_CR_set_offset_correction API_CR_set_offset_correction; Func_CR_cal_offset API_CR_cal_offset; Func_CR_linear_calibration API_CR_linear_calibration; Func_CR_portable_calibration API_CR_portable_calibration; Func_CR_get_active_detector_ID API_CR_get_active_detector_ID; Func_CR_execute_linear_cal API_CR_execute_linear_cal; Func_CR_execute_portable_cal API_CR_execute_portable_cal; Func_CR_stop_cal_procedure API_CR_stop_cal_procedure; Func_CR_set_active_detector API_CR_set_active_detector; Func_CR_get_dual_detector_state API_CR_get_dual_detector_state; Func_CR_register_callback API_CR_register_callback; Func_CR_send_exp_request API_CR_send_exp_request; Func_CR_ready_state_request API_CR_ready_state_request; Func_CR_start_soft_acquisition API_CR_start_soft_acquisition; Func_CR_get_one_key_cal API_CR_get_one_key_cal; Func_CR_download_factory_cal_files API_CR_download_factory_cal_files; Func_CR_start_acq_dark_full_image API_CR_start_acq_dark_full_image; Func_CR_check_img_for_factory_cal API_CR_check_img_for_factory_cal; Func_CR_execute_one_key_cal API_CR_execute_one_key_cal; //共48个 };