Detector_CareRayDR.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #pragma once
  2. #include "ResDataObject.h"
  3. #include "CCOS.Dev.FPD.CareRayDR.h"
  4. #include "CareRayInterface.h"
  5. #include "include/errors.h"
  6. #include "include/structures.h"
  7. #include "ZSKKCalibration.h"
  8. constexpr auto SCAN_EVENT_COUNT = 7;
  9. class Detector_CareRayDR
  10. {
  11. enum class eDetStatus
  12. {
  13. DetStatus_NotIni,
  14. DetStatus_NotConn,
  15. DetStatus_Sleep,
  16. DetStatus_Standby,
  17. DetStatus_Work,
  18. DetStatus_Acquire,
  19. DetStatus_Offset,
  20. DetStatus_XrayCalibration,
  21. };
  22. //探测器信息
  23. struct CPanelStatus
  24. {
  25. bool bInitOver; //是否初始化完成
  26. bool bConnectState; //是否连接
  27. SYNC_MODE eSyncMode; //同步模式
  28. int nSoftAcqState;
  29. eDetStatus eFPDStatus; //探测器状态
  30. CPanelStatus()
  31. {
  32. bInitOver = false;
  33. bConnectState = false;
  34. eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值
  35. nSoftAcqState = 0;
  36. eFPDStatus = eDetStatus::DetStatus_NotIni;
  37. }
  38. };
  39. public:
  40. Detector_CareRayDR();
  41. ~Detector_CareRayDR();
  42. bool DriverEntry(FPDDeviceCareRay* pDrvDPC, ResDataObject& Configuration);
  43. bool Connect(FPDDeviceCareRay* pDrvDPC, const char* szWorkPath);
  44. void EnterExamMode(int nExamMode);
  45. bool SetAcqMode(int nMode);
  46. bool SetSyncMode(int nSyncMode);
  47. bool PrepareAcquisition(FPDDeviceCareRay* pDrvDPC);
  48. bool StartAcquisition(FPDDeviceCareRay* pDrvDPC);
  49. bool StopAcquisition(FPDDeviceCareRay* pDrvDPC);
  50. bool ActiveCalibration(FPDDeviceCareRay* pDrvDPC, CCOS_CALIBRATION_TYPE eType);
  51. bool PrepareCalibration(FPDDeviceCareRay* pDrvDPC);
  52. bool StartCalibration(FPDDeviceCareRay* pDrvDPC);
  53. bool StopCalibration(FPDDeviceCareRay* pDrvDPC);
  54. bool AbortCalibration(FPDDeviceCareRay* pDrvDPC);
  55. bool CompleteCalibration(FPDDeviceCareRay* pDrvDPC);
  56. bool SaveCalibrationFile();
  57. void SetCalibRounds(int nCalibRounds);
  58. bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound);
  59. bool AcceptCalibration();
  60. bool RejectCalibration();
  61. CCOS_CALIBRATION_TYPE GetCalibType();
  62. bool GetCalibrationTime(int nDetectorID = -1);
  63. bool ActiveDetector(FPDDeviceCareRay* pDrvDPC, bool bActive);
  64. bool UpdateCalibMode(CCOS_CALIBRATION_MODE eCalibMode);
  65. void CallBackEvent(int eventID, Event* eventData);
  66. void SetNotifyStatusTimePeriod(int nTime);
  67. void SetReconnectTimePeriod(int nTime);
  68. private:
  69. map<FPDDeviceCareRay*, int>* m_pDPC2PanelID;
  70. map<int, FPDDeviceCareRay*>* m_pPanelID2DPC;
  71. int m_nPanelCount; //探测器数量
  72. ResDataObject m_ModeConfig; //保存DPC模块下发的配置
  73. std::string m_strCtrlWorkPath; //保存工作路径,用于加载SDK和配置
  74. int m_nCurrentPanelID;
  75. int m_nCurrentDetectorType;//枚举值
  76. string m_strDetectorType; //探测器类型
  77. HMODULE m_hCareRayDRModule; //加载SDK的句柄
  78. CPanelStatus *m_pStPanelStatus[2]; //康众SDK应该只支持双板
  79. int m_nSyncMode; //存储从配置文件读取到的同步模式
  80. int m_nCheckMode;//sdk的CheckMode
  81. int m_nCurrentLogicMode;//当前工作在配置文件的哪个工作模式下
  82. int m_nLastCheckMode;//上次采集时使用的采集模式
  83. bool m_bFetchable;//是否有图像可以获取
  84. //软同步是通过回调函数通知状态的 硬同步和AED都要主动查询状态,虽然都是query prog info 但是他俩使用的标志位也是不同的
  85. int m_nSdkSyncMode;//给SDK设置的同步模式
  86. int m_nImageWidth;
  87. int m_nImageHeight;
  88. int m_nWidthOffset;
  89. int m_nHeightOffset;
  90. int m_nRawImgWidth; //原始图像宽
  91. int m_nRawImgHeight; //原始图像高
  92. int m_nPreviewEnable;
  93. int m_nPreImgWidth;
  94. int m_nPreImgHeight;
  95. WORD* m_pRawImgBuffer; //原始图buffer
  96. WORD* m_pPreImgBuffer; //预览图buffer
  97. WORD* m_pImgBuffer; //裁剪后图像
  98. WORD* m_pDarkImage; //调用SDK获取暗场图像
  99. int m_nXwindow; //窗口积分时间
  100. int m_nDelayTime;
  101. int m_nWaitTime;
  102. AppStatus m_nAppStatus; //记录软件状态
  103. int m_nSaveRaw;
  104. bool m_bCancelFlag; //true: 取消曝光
  105. CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 ecom校正/厂商校正
  106. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正类型
  107. CZSKKCalibrationCtrl* m_pZSKKCalib;
  108. int m_nImageSize; //通过SDK返回值算出的图像尺寸
  109. WORD* m_pFluFrameData;
  110. int m_nFluLastExpStatus;//DDR时上一次的曝光状态
  111. int m_nFluCurrentExpStatus;//DDR时当前的曝光状态
  112. int m_nMaxFrameId;//DDR出图的最大张数
  113. int m_nReceivedFrameId;//DDR时收到了多少张图
  114. int m_nCalibrationRounds;//校正总轮数
  115. int m_nCalibCurrentCalibrationRound;//当前校正轮数
  116. int m_nCalibCurrentExposureIndex;//当前轮次曝光第几次
  117. int m_nExposureNumCurrentRound;//当前轮次需要曝光的总次数
  118. bool m_bGetImageByCallBack;//当前模式是否是用回调取图
  119. int m_nNotifyStatusTimePeriod;//通知温度等状态信息的时间间隔
  120. int m_nReconnectTimePeriod;//重连的时间间隔
  121. HANDLE m_hRespond;//用于等待某个状态的到来或者某个动作的完成
  122. //辅助线程事件
  123. HANDLE m_hStopScanEvent; //退出辅助线程事件
  124. HANDLE m_hAcqEvent; //开始采集事件
  125. HANDLE m_hProcessImgEvent;//处理图像事件
  126. HANDLE m_hXWinOnEvent;
  127. HANDLE m_hDarkEvent; //开始dark校正
  128. HANDLE m_hGainEvent; //开始Rad Gain事件
  129. HANDLE m_hInitEvent;
  130. HANDLE m_hArrayEvent[SCAN_EVENT_COUNT];
  131. HANDLE m_hToggleEvent; //辅助线程退出通知事件
  132. HANDLE m_hFPDScanThread; //辅助线程
  133. HANDLE m_hFPDStatusThread;//扫描探测器温度、电量、wifi
  134. bool m_bExit;//退出辅助线程和查询探测器状态线程
  135. HANDLE m_hReconnectThread; //重连线程
  136. //辅助线程
  137. static unsigned __stdcall onFPDScanThread(PVOID pvoid);
  138. //查询温度、电量、wifi线程
  139. static unsigned __stdcall onFPDStatusThread(PVOID pvoid);
  140. //重连线程断线后开启
  141. static unsigned __stdcall onReconnectThread(PVOID pvoid);
  142. void InitSdkInterface();
  143. bool LoadDll(string strWorkPath);
  144. bool ConnectDetector();
  145. bool InitDetector();
  146. int ShowDetectorInfo();
  147. int ShowModeInfo();
  148. bool SetSdkSyncModeAndTime(int nSyncMode);
  149. bool WaitRespond(int nTimeOut = 65000, const char* szAction = "");
  150. void StopWaiting(const char* szAction = "");
  151. bool TestError(int nRet, const char* szFuncName = "Func", bool bShowTrue = true);
  152. void GetDetectorType(DetectorType eType, string& szType);
  153. //是否是移动探测器 linear-固定 portable-移动
  154. bool IsPortableFPD();
  155. void OnStartAcquisition();
  156. void OnProcessImg();
  157. void StartDarkCalibration();
  158. void StartGainCalibration();
  159. void InitFPD();
  160. int PerformSoftSyncAcq();
  161. int RadAcquisition();
  162. int DarkAcquisition();
  163. int QueryAutoProgInfo(bool bIsAED = true);
  164. int QueryRadProgInfo();
  165. void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight, string strFrameID = "");
  166. bool SaveRawWithName(const char* pRawName, const WORD* pRawImg, int nWidth, int nHeight);
  167. bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth);
  168. bool SetUserCorrection(bool bLoad);
  169. double GetMean(WORD* imgNoHeader, int pixelNum);
  170. eDetStatus GetCareRayDPCStatus(int nDetectorIndex = -1);
  171. bool SetCareRayDPCStatus(eDetStatus status, int nDetectorIndex = -1);
  172. bool IsConnected(string strIP);
  173. int FluAcquisitionByCallBack();
  174. int FluAcquisitionByGetImage();
  175. void PerformDualEnergyAcquisition();
  176. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  177. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  178. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  179. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  180. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  181. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  182. CB_CR_connect_detector API_CR_connect_detector;
  183. CB_CR_disconnect_detector API_CR_disconnect_detector;
  184. CB_CR_reset_detector API_CR_reset_detector;
  185. CB_CR_set_check_mode API_CR_set_check_mode;
  186. CB_CR_set_sync_mode API_CR_set_sync_mode;
  187. CB_CR_set_cycle_time API_CR_set_cycle_time;
  188. CB_CR_set_normal_power API_CR_set_normal_power;
  189. CB_CR_set_save_power API_CR_set_save_power;
  190. CB_CR_permit_exposure API_CR_permit_exposure;
  191. CB_CR_start_acq_full_image API_CR_start_acq_full_image;
  192. CB_CR_start_acq_dark_full_image API_CR_start_acq_dark_full_image;
  193. CB_CR_start_acq_prev_image API_CR_start_acq_prev_image;
  194. CB_CR_start_acq_dark_prev API_CR_start_acq_dark_prev;
  195. CB_CR_start_acq_def_image API_CR_start_acq_def_image;
  196. CB_CR_start_acq_fluoro_image API_CR_start_acq_fluoro_image;
  197. CB_CR_start_acq_fluoro_dark_image API_CR_start_acq_fluoro_dark_image;
  198. CB_CR_stop_acq_frame API_CR_stop_acq_frame;
  199. CB_CR_stop_acq_frame_cleanup API_CR_stop_acq_frame_cleanup;
  200. CB_CR_set_user_correction API_CR_set_user_correction;
  201. CB_CR_get_user_correction API_CR_get_user_correction;
  202. CB_CR_set_dose API_CR_set_dose;
  203. CB_CR_get_active_detector_ID API_CR_get_active_detector_ID;
  204. CB_CR_set_active_detector API_CR_set_active_detector;
  205. CB_CR_get_dual_detector_state API_CR_get_dual_detector_state;
  206. CB_CR_set_smart_hand_switch API_CR_set_smart_hand_switch;
  207. CB_CR_get_SHS_status API_CR_get_SHS_status;
  208. CB_CR_get_wireless_ip API_CR_get_wireless_ip;
  209. CB_CR_set_wireless_ip API_CR_set_wireless_ip;
  210. CB_CR_get_station_mode_conf API_CR_get_station_mode_conf;
  211. CB_CR_set_station_mode_conf API_CR_set_station_mode_conf;
  212. CB_CR_get_temperature_cal_data API_CR_get_temperature_cal_data;
  213. CB_CR_check_temperature_slot API_CR_check_temperature_slot;
  214. CB_CR_get_API_Version API_CR_get_API_Version;
  215. CB_CR_get_conn_state API_CR_get_conn_state;
  216. CB_CR_get_detector_type API_CR_get_detector_type;
  217. CB_CR_get_detector_info API_CR_get_detector_info;
  218. CB_CR_get_mode_info API_CR_get_mode_info;
  219. CB_CR_get_status_info API_CR_get_status_info;
  220. CB_CR_get_status_info_Ex API_CR_get_status_info_Ex;
  221. CB_CR_get_image_attr API_CR_get_image_attr;
  222. CB_CR_get_image API_CR_get_image;
  223. CB_CR_get_preview_image API_CR_get_preview_image;
  224. CB_CR_get_unuploaded_img_info API_CR_get_unuploaded_img_info;
  225. CB_CR_query_prog_info API_CR_query_prog_info;
  226. CB_CR_inpaint_bad_pixels API_CR_inpaint_bad_pixels;
  227. CB_CR_select_cal_type API_CR_select_cal_type;
  228. CB_CR_get_cal_params API_CR_get_cal_params;
  229. CB_CR_set_offset_correction API_CR_set_offset_correction;
  230. CB_CR_cal_offset API_CR_cal_offset;
  231. CB_CR_linear_calibration API_CR_linear_calibration;
  232. CB_CR_portable_calibration API_CR_portable_calibration;
  233. CB_CR_execute_linear_cal API_CR_execute_linear_cal;
  234. CB_CR_execute_portable_cal API_CR_execute_portable_cal;
  235. CB_CR_stop_cal_procedure API_CR_stop_cal_procedure;
  236. CB_CR_start_fluoro_calibration API_CR_start_fluoro_calibration;
  237. CB_CR_query_calibration_status API_CR_query_calibration_status;
  238. CB_CR_do_gridpattern_filtration API_CR_do_gridpattern_filtration;
  239. CB_CR_register_callback API_CR_register_callback;
  240. CB_CR_send_exp_request API_CR_send_exp_request;
  241. CB_CR_ready_state_request API_CR_ready_state_request;
  242. CB_CR_start_soft_acquisition API_CR_start_soft_acquisition;
  243. CB_CR_set_AEC_integ_time API_CR_set_AEC_integ_time;
  244. CB_CR_register_AEC_callback API_CR_register_AEC_callback;
  245. CB_CR_start_AEC_acquire_process API_CR_start_AEC_acquire_process;
  246. CB_CR_get_one_key_cal API_CR_get_one_key_cal;
  247. CB_CR_check_img_for_factory_cal API_CR_check_img_for_factory_cal;
  248. CB_CR_download_factory_cal_files API_CR_download_factory_cal_files;
  249. CB_CR_execute_one_key_cal API_CR_execute_one_key_cal;
  250. CB_CR_start_acq_NDT_dark_image API_CR_start_acq_NDT_dark_image;
  251. CB_CR_execute_NDT_CAL API_CR_execute_NDT_CAL;
  252. CB_CR_correct_NDT_image API_CR_correct_NDT_image;
  253. CB_CR_set_NDT_frame_num API_CR_set_NDT_frame_num;
  254. CB_CR_finish_NDT_acquisition API_CR_finish_NDT_acquisition;
  255. CB_CR_check_NDT_CAL_Files API_CR_check_NDT_CAL_Files;
  256. };