CareRayCtrl.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #pragma once
  2. #include "ResDataObject.h"
  3. #include "CCOS.Dev.FPD.CareRay.h"
  4. #include "include/Errors.h"
  5. #include "include/Structures.h"
  6. #include "include/CrapiDll.h"
  7. #include <atomic>
  8. constexpr auto SCAN_EVENT_COUNT = 6;
  9. #ifndef __CAREVIEWAPI__
  10. #define __CAREVIEWAPI__ typedef __declspec(dllimport)
  11. #endif
  12. __CAREVIEWAPI__ int(__cdecl* Func_CR_connect_detector)(char*);
  13. __CAREVIEWAPI__ int(__cdecl* Func_CR_disconnect_detector)();
  14. __CAREVIEWAPI__ int(__cdecl* Func_CR_reset_detector)(int);
  15. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_check_mode)(int);
  16. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_sync_mode)(int);
  17. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_cycle_time)(int, int, int);
  18. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_normal_power)(void);
  19. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_save_power)(void);
  20. __CAREVIEWAPI__ int(__cdecl* Func_CR_permit_exposure)();
  21. __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_full_image)();
  22. __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_dark_full_image)();
  23. __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_prev_image)();
  24. __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_dark_prev)();
  25. __CAREVIEWAPI__ int(__cdecl* Func_CR_start_acq_def_image)();
  26. __CAREVIEWAPI__ int(__cdecl* Func_CR_stop_acq_frame)();
  27. __CAREVIEWAPI__ int(__cdecl* Func_CR_stop_acq_frame_cleanup)();
  28. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_user_correction)(UserCorrection*);
  29. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_user_correction)(UserCorrection*);
  30. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_dose)(int);
  31. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_active_detector_ID)();
  32. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_active_detector)(int);
  33. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_dual_detector_state)(DetectorActiveState*);
  34. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_smart_hand_switch)(SHSParam*);
  35. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_SHS_status)(SHSStatus*);
  36. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_API_Version)(char*);
  37. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_conn_state)();
  38. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_detector_type)();
  39. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_detector_info)(DetectorInfo*);
  40. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_mode_info)(int, ModeInfo*);
  41. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_status_info)(StatusInfo*);
  42. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_image_attr)(FrameAttr*);
  43. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_image)(int, BOOL, void*);
  44. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_unuploaded_img_info)(UnuploadedImgInfo*);
  45. __CAREVIEWAPI__ int(__cdecl* Func_CR_query_prog_info)(int, ExpProgress*);
  46. __CAREVIEWAPI__ int(__cdecl* Func_CR_inpaint_bad_pixels)(WORD*);
  47. __CAREVIEWAPI__ int(__cdecl* Func_CR_select_cal_type)(char*);
  48. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_cal_params)(CalParams*);
  49. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_offset_correction)(BOOL);
  50. __CAREVIEWAPI__ int(__cdecl* Func_CR_cal_offset)(int);
  51. __CAREVIEWAPI__ int(__cdecl* Func_CR_linear_calibration)(void);
  52. __CAREVIEWAPI__ int(__cdecl* Func_CR_portable_calibration)(void);
  53. __CAREVIEWAPI__ int(__cdecl* Func_CR_execute_linear_cal)();
  54. __CAREVIEWAPI__ int(__cdecl* Func_CR_execute_portable_cal)();
  55. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_cal_thread)(int);//新加
  56. __CAREVIEWAPI__ int(__cdecl* Func_CR_stop_cal_procedure)(BOOL);
  57. __CAREVIEWAPI__ int(__cdecl* Func_CR_do_gridpattern_filtration)(WORD*, int, int, int);
  58. __CAREVIEWAPI__ int(__cdecl* Func_CR_register_callback)(eventCallback);
  59. __CAREVIEWAPI__ int(__cdecl* Func_CR_send_exp_request)(void);
  60. __CAREVIEWAPI__ int(__cdecl* Func_CR_ready_state_request)(void);
  61. __CAREVIEWAPI__ int(__cdecl* Func_CR_start_soft_acquisition)(void);
  62. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_AEC_integ_time)(int, int);
  63. __CAREVIEWAPI__ int(__cdecl* Func_CR_register_AEC_callback)(eventCallback);
  64. __CAREVIEWAPI__ int(__cdecl* Func_CR_start_AEC_acquire_process)();
  65. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_one_key_cal)();
  66. __CAREVIEWAPI__ int(__cdecl* Func_CR_check_img_for_factory_cal)(WORD*);
  67. __CAREVIEWAPI__ int(__cdecl* Func_CR_download_factory_cal_files)();
  68. __CAREVIEWAPI__ int(__cdecl* Func_CR_execute_one_key_cal)(WORD*, WORD*, SurfaceFitResult*);
  69. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_wireless_ip)(char*);
  70. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_wireless_ip)(char*);
  71. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_station_mode_conf)(WirelessStationConf*);
  72. __CAREVIEWAPI__ int(__cdecl* Func_CR_set_station_mode_conf)(WirelessStationConf*);
  73. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_temperature_cal_data)(TrainHead*, int*);
  74. __CAREVIEWAPI__ int(__cdecl* Func_CR_check_temperature_slot)(int, float);
  75. __CAREVIEWAPI__ int(__cdecl* Func_CR_get_status_info_Ex)(StatusInfo*, int);
  76. //以上共64个接口
  77. //NDT相关 咱们用不到
  78. //__CAREVIEWAPI__ int CR_start_acq_NDT_dark_image(int);
  79. //__CAREVIEWAPI__ int CR_check_NDT_CAL_Files();
  80. //__CAREVIEWAPI__ int CR_execute_NDT_CAL(UINT*, UINT*, int);
  81. //__CAREVIEWAPI__ int CR_correct_NDT_image(UINT*, UINT*, int);
  82. //__CAREVIEWAPI__ int CR_set_NDT_frame_num(int);
  83. //__CAREVIEWAPI__ int CR_finish_NDT_acquisition();
  84. class CareRayCtrl
  85. {
  86. //探测器信息
  87. struct CPanelStatus
  88. {
  89. bool bConnectState; //是否连接
  90. SYNC_MODE eSyncMode; //同步模式
  91. int nSoftAcqState;
  92. CPanelStatus()
  93. {
  94. bConnectState = false;
  95. eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值
  96. nSoftAcqState = 0;
  97. }
  98. };
  99. public:
  100. CareRayCtrl();
  101. ~CareRayCtrl();
  102. bool DriverEntry(FPDDeviceCareRay* pDrvDPC, ResDataObject& Configuration);
  103. bool Connect(FPDDeviceCareRay* pDrvDPC, const char* szWorkPath);
  104. bool Disconnect();
  105. void EnterExamMode(int nExamMode);
  106. bool ActiveDetector(int nDetectorID);
  107. bool SetAcqMode(DetModeInfoStruct DetModeInfo, DetCalibInfo DetCalibInfo, int nMode);
  108. bool PrepareAcquisition(FPDDeviceCareRay* pDrvDPC);
  109. bool StartAcquisition(FPDDeviceCareRay* pDrvDPC);
  110. bool StopAcquisition(FPDDeviceCareRay* pDrvDPC);
  111. bool ActiveCalibration(FPDDeviceCareRay* pDrvDPC, CCOS_CALIBRATION_TYPE eType);
  112. bool PrepareCalibration(FPDDeviceCareRay* pDrvDPC);
  113. bool StartCalibration(FPDDeviceCareRay* pDrvDPC);
  114. bool StopCalibration(FPDDeviceCareRay* pDrvDPC);
  115. bool ConfirmCalExposure();
  116. void RejectCalExposure();
  117. void ProcessCREvent(int eventID, Event* eventData);
  118. void Reconnect();
  119. //获取探测器的采集状态
  120. bool GetDetectorAcqStatus();
  121. void SetAcqStatus(bool bAcqStatus);
  122. void SetCanelFlag(bool bCancelFlag);
  123. private:
  124. int m_nExposureMode; //探测器曝光模式。1:RAD;2:AEC;default:0;
  125. int m_nXWindowTime; //探测器曝光窗口时间(ms)。default:500ms
  126. bool m_bDetectorReady;
  127. bool m_bIsAcqStatus;//是否是采集状态
  128. map<FPDDeviceCareRay*, int>* m_pDPC2PanelID;
  129. map<int, FPDDeviceCareRay*>* m_pPanelID2DPC;
  130. int m_nPanelCount; //探测器数量
  131. ResDataObject m_ModeConfig; //保存DPC模块下发的配置
  132. std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置
  133. int m_nCurrentPanelID;
  134. int m_nCurrentDetectorType;
  135. CPanelStatus* m_pStPanelStatus[2]; //康众SDK应该只支持双板
  136. int m_nSyncMode; //记录选择模式时使用的同步模式
  137. int m_nCurSyncMode; //记录当前的同步模式
  138. int m_nRawImgWidth; //SDK反馈的图像宽
  139. int m_nRawImgHeight; //SDK反馈的图像高
  140. WORD* m_pRawImgBuffer; //原始图
  141. WORD* m_pImgBuffer; //裁剪后图像
  142. WORD* m_pDarkImage; //一键校正时获取的暗场图像
  143. int m_nExamMode; //记录工作界面
  144. int m_nSaveRaw;//保存图片的类型都有哪些 0-不保存 1-保存加载校正前的图 2-保存加载校正后的图 3-保存加载校正前和加载校正后的图
  145. bool m_bGetImage; //true: 需要调用getimage接口
  146. bool m_bCancelFlag; //true: 取消曝光
  147. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式
  148. bool m_bAbortOffset; //true: 终止校正
  149. int m_bOneKeyConf; //记录是否开启一键校正配置
  150. bool m_bOneKeyCalibration; //true: 一键校正模式
  151. CalParams m_calparams; //记录校正过程的参数
  152. int m_nGainNodeCount; //校正曝光的总节点个数
  153. int m_nGainNodeIndex; //校正曝光的节点Index
  154. int m_nGainExpCount; //校正曝光节点需要曝光的次数
  155. int m_nGainExpIndex; //校正曝光节点已曝光的次数
  156. int m_nImageSize; //通过SDK返回值算出的图像尺寸
  157. int m_nCurrentMode;
  158. DetModeInfoStruct m_stModeInfo;
  159. DetCalibInfo m_stCalibInfo;
  160. HANDLE m_hRespond;
  161. //辅助线程事件
  162. HANDLE m_hFPDScanThread; //辅助线程
  163. HANDLE m_hArrayEvent[SCAN_EVENT_COUNT];
  164. HANDLE m_hStopScanEvent; //退出辅助线程事件
  165. HANDLE m_hAcqEvent; //开始Rad采集事件
  166. HANDLE m_hProcessImgEvent;
  167. HANDLE m_hXWinOnEvent;
  168. HANDLE m_hDarkEvent; //开始dark校正
  169. HANDLE m_hGainEvent; //开始Rad Gain事件
  170. HANDLE m_hNotifyDetectorInfoThread;//通知探测器温度、电量、wifi信息线程
  171. bool m_bExitNotify;//是否退出通知探测器信息线程
  172. bool LoadDll(string strWorkPath);
  173. bool OpenDetector();
  174. bool InitDetector();
  175. int ShowDetectorInfo();
  176. int ShowStatusInfo();
  177. int ShowModeInfo();
  178. bool SetSyncMode(int nSyncMode,int nXWindowTime = 2500);
  179. bool WaitRespond(int nTimeOut = 65000, const char* szPosition = "");
  180. void StopWaiting(const char* szPosition = "");
  181. bool TestError(int nRet, const char* szFuncName = "Func");
  182. void GetDetectorType(DetectorType eType, string& szType);
  183. //辅助线程
  184. static unsigned __stdcall onFPDScanThread(PVOID pvoid);
  185. //通知探测器信息线程
  186. static unsigned __stdcall onNotifyDetectorInfoThread(PVOID pvoid);
  187. void OnAcquireImage();
  188. void OnProcessImg();
  189. void OnStartDarkCalibration();
  190. void OnAcquireGainImage();
  191. void OnNotifyDetectorInfo();
  192. int PerformSoftSyncAcq();
  193. int PerformRadAcquisition();
  194. int PerformDarkAcquisition();
  195. int QueryAutoProgInfo(bool bIsAED = true);
  196. int QueryRadProgInfo();
  197. void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight);
  198. bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth);
  199. int CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight,
  200. LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits,
  201. int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin);
  202. bool LoadCareCalibration(bool bLoad);
  203. double GetMean(WORD* imgNoHeader, int pixelNum);
  204. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  205. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  206. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  207. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  208. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  209. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  210. HMODULE m_hCareRayModule; //加载SDK的句柄
  211. Func_CR_connect_detector API_CR_connect_detector;
  212. Func_CR_disconnect_detector API_CR_disconnect_detector;
  213. Func_CR_reset_detector API_CR_reset_detector;
  214. Func_CR_set_check_mode API_CR_set_check_mode;
  215. Func_CR_set_sync_mode API_CR_set_sync_mode;
  216. Func_CR_set_cycle_time API_CR_set_cycle_time;
  217. Func_CR_set_normal_power API_CR_set_normal_power;
  218. Func_CR_set_save_power API_CR_set_save_power;
  219. Func_CR_permit_exposure API_CR_permit_exposure;
  220. Func_CR_start_acq_full_image API_CR_start_acq_full_image;
  221. Func_CR_start_acq_prev_image API_CR_start_acq_prev_image;
  222. Func_CR_start_acq_def_image API_CR_start_acq_def_image;
  223. Func_CR_stop_acq_frame API_CR_stop_acq_frame;
  224. Func_CR_stop_acq_frame_cleanup API_CR_stop_acq_frame_cleanup;
  225. Func_CR_set_user_correction API_CR_set_user_correction;
  226. Func_CR_get_user_correction API_CR_get_user_correction;
  227. Func_CR_set_dose API_CR_set_dose; //加载指定KV下的校准图像
  228. Func_CR_get_API_Version API_CR_get_API_Version;
  229. Func_CR_get_conn_state API_CR_get_conn_state;
  230. Func_CR_get_detector_type API_CR_get_detector_type;
  231. Func_CR_get_detector_info API_CR_get_detector_info;
  232. Func_CR_get_mode_info API_CR_get_mode_info;
  233. Func_CR_get_status_info API_CR_get_status_info;
  234. Func_CR_get_image_attr API_CR_get_image_attr;
  235. Func_CR_get_image API_CR_get_image;
  236. Func_CR_get_unuploaded_img_info API_CR_get_unuploaded_img_info;
  237. Func_CR_query_prog_info API_CR_query_prog_info;
  238. Func_CR_inpaint_bad_pixels API_CR_inpaint_bad_pixels;
  239. Func_CR_get_cal_params API_CR_get_cal_params;
  240. Func_CR_set_offset_correction API_CR_set_offset_correction;
  241. Func_CR_cal_offset API_CR_cal_offset;
  242. Func_CR_linear_calibration API_CR_linear_calibration;
  243. Func_CR_portable_calibration API_CR_portable_calibration;
  244. Func_CR_get_active_detector_ID API_CR_get_active_detector_ID;
  245. Func_CR_execute_linear_cal API_CR_execute_linear_cal;
  246. Func_CR_execute_portable_cal API_CR_execute_portable_cal;
  247. Func_CR_stop_cal_procedure API_CR_stop_cal_procedure;
  248. Func_CR_set_active_detector API_CR_set_active_detector;
  249. Func_CR_get_dual_detector_state API_CR_get_dual_detector_state;
  250. Func_CR_register_callback API_CR_register_callback;
  251. Func_CR_send_exp_request API_CR_send_exp_request;
  252. Func_CR_ready_state_request API_CR_ready_state_request;
  253. Func_CR_start_soft_acquisition API_CR_start_soft_acquisition;
  254. Func_CR_get_one_key_cal API_CR_get_one_key_cal;
  255. Func_CR_download_factory_cal_files API_CR_download_factory_cal_files;
  256. Func_CR_start_acq_dark_full_image API_CR_start_acq_dark_full_image;
  257. Func_CR_check_img_for_factory_cal API_CR_check_img_for_factory_cal;
  258. Func_CR_execute_one_key_cal API_CR_execute_one_key_cal;
  259. //共48个
  260. };