Detector_CareRayDR.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. #pragma once
  2. #include <filesystem>
  3. #include <iostream>
  4. #include <fstream>
  5. #include "ResDataObject.h"
  6. #include "CCOS.Dev.FPD.CareRayDR.h"
  7. #include "CareRayAPI.h"
  8. #include "errors.h"
  9. #include "CrStructure.h"
  10. #include "ZSKKCalibration.h"
  11. constexpr auto SCAN_EVENT_COUNT = 9;
  12. #ifndef __CARERAYAPI__
  13. #define __CARERAYAPI__ typedef __declspec(dllimport)
  14. #endif
  15. __CARERAYAPI__ int(__cdecl* Func_CrInitializeLibrary)();
  16. __CARERAYAPI__ int(__cdecl* Func_CrDeinitializeLibrary)();
  17. __CARERAYAPI__ void(__cdecl* Func_CrGetLastIntlMsg)(char*, int);
  18. __CARERAYAPI__ int(__cdecl* Func_CrGetConfigItemValue)(const char*, char*);
  19. __CARERAYAPI__ int(__cdecl* Func_CrSetConfigItemValue)(const char*, const char*);
  20. __CARERAYAPI__ int(__cdecl* Func_CrRegisterEventCallbackFun)(CrCallbackFunPtr);
  21. __CARERAYAPI__ int(__cdecl* Func_CrGetDetectorIndexAndIPAddress)(CrDetrIdxAndIPAddr*, int*);
  22. __CARERAYAPI__ int(__cdecl* Func_CrConnect)(int);
  23. __CARERAYAPI__ int(__cdecl* Func_CrResetDetector)(int, int);
  24. __CARERAYAPI__ int(__cdecl* Func_CrDisconnect)(int);
  25. __CARERAYAPI__ int(__cdecl* Func_CrGetSystemInformation)(int, CrSystemInfo*);
  26. __CARERAYAPI__ int(__cdecl* Func_CrGetApplicationMode)(int, CrModeInfo*, int*);
  27. __CARERAYAPI__ int(__cdecl* Func_CrRegisterApplicationMode)(int, int, int, float*, float*, int, int, int, int);
  28. __CARERAYAPI__ int(__cdecl* Func_CrSetFrameFilter)(int, int, const char*);
  29. __CARERAYAPI__ int(__cdecl* Func_CrGetModeInfoByAppModeKey)(int, int, CrModeInfo*);
  30. __CARERAYAPI__ int(__cdecl* Func_CrGetRegedInfoByAppModeKey)(int, int, CrRegModeInfo*);
  31. __CARERAYAPI__ int(__cdecl* Func_CrGetModeInfoByModeId)(int, int, CrModeInfo*);
  32. __CARERAYAPI__ int(__cdecl* Func_CrLoadReference)(int, int);
  33. __CARERAYAPI__ int(__cdecl* Func_CrUnloadReference)(int, int);
  34. __CARERAYAPI__ int(__cdecl* Func_CrStartAcquisition)(int, int, int);
  35. __CARERAYAPI__ int(__cdecl* Func_CrStartDarkAcquisition)(int, int, bool, bool);
  36. __CARERAYAPI__ int(__cdecl* Func_CrStartDarkAcquisitionWithCorrOpt)(int, int, unsigned int);
  37. __CARERAYAPI__ int(__cdecl* Func_CrStopAcquisition)(int);
  38. __CARERAYAPI__ int(__cdecl* Func_CrStartDarkCalibration)(int, int, int, int);
  39. __CARERAYAPI__ int(__cdecl* Func_CrStartGainCalibration)(int, int);
  40. __CARERAYAPI__ int(__cdecl* Func_CrStopCalibration)(int);
  41. __CARERAYAPI__ int(__cdecl* Func_CrGetAcquisitionStatInfo)(int, CrAcquisitionStatInfo*);
  42. __CARERAYAPI__ int(__cdecl* Func_CrQueryCalibrationStatus)(int, CrCalibrationInfo*);
  43. __CARERAYAPI__ int(__cdecl* Func_CrQueryReferenceStatus)(int, int, CrRefStatusInfo*);
  44. __CARERAYAPI__ int(__cdecl* Func_CrGetDefectInfo)(int, const int, CrDefectInfo*);
  45. __CARERAYAPI__ int(__cdecl* Func_CrGetPositionDefectInfo)(int, const int, CrDefectInfo*, int);
  46. __CARERAYAPI__ int(__cdecl* Func_CrQueryAcquisitionStatus)(int, CrExpProgress*);
  47. __CARERAYAPI__ int(__cdecl* Func_CrQueryAedExposureProgress)(int, CrAedExpProgress*);
  48. __CARERAYAPI__ int(__cdecl* Func_CrPermitExposure)(int);
  49. __CARERAYAPI__ int(__cdecl* Func_CrRequestExposure)(int);
  50. __CARERAYAPI__ int(__cdecl* Func_CrGetImage)(int, char*, int, int);
  51. __CARERAYAPI__ int(__cdecl* Func_CrGetNoHeaderImage)(int, char*, int, int);
  52. __CARERAYAPI__ int(__cdecl* Func_CrGetDetrStatus)(int, CrDetrStatus*);
  53. __CARERAYAPI__ int(__cdecl* Func_CrGetConnectionStatus)(int, CrConnectionStatus*);
  54. __CARERAYAPI__ int(__cdecl* Func_CrStartAcquisitionWithCorrOpt)(int, int, unsigned int, int);
  55. __CARERAYAPI__ int(__cdecl* Func_CrGetDaecActiveAreas)(int, CrDaecAreaInfo*, int*, int*);
  56. __CARERAYAPI__ int(__cdecl* Func_CrSetDaecActiveAreas)(int, CrDaecAreaInfo*, int, int);
  57. __CARERAYAPI__ int(__cdecl* Func_CrGetBatteryInfos)(int, CrBatteryInfo*, int*);
  58. __CARERAYAPI__ int(__cdecl* Func_CrGetWirelessStatus)(int, CrWirelessStatus*);
  59. class Detector_CareRayDR
  60. {
  61. enum class eDetStatus
  62. {
  63. DetStatus_NotIni,
  64. DetStatus_NotConn,
  65. DetStatus_Sleep,
  66. DetStatus_Standby,
  67. DetStatus_Work,
  68. DetStatus_Acquire,
  69. DetStatus_Offset,
  70. DetStatus_XrayCalibration,
  71. };
  72. //探测器信息
  73. struct CPanelStatus
  74. {
  75. bool bInitOver; //是否初始化完成
  76. bool bConnectState; //是否连接
  77. SYNC_MODE eSyncMode; //同步模式
  78. int nSoftAcqState;
  79. eDetStatus eFPDStatus; //探测器状态
  80. CPanelStatus()
  81. {
  82. bInitOver = false;
  83. bConnectState = false;
  84. eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值
  85. nSoftAcqState = 0;
  86. eFPDStatus = eDetStatus::DetStatus_NotIni;
  87. }
  88. };
  89. public:
  90. Detector_CareRayDR();
  91. ~Detector_CareRayDR();
  92. bool DriverEntry(FPDDeviceCareRay* pDrvDPC, ResDataObject& Configuration);
  93. bool Connect(FPDDeviceCareRay* pDrvDPC, const char* szWorkPath);
  94. bool Disconnect();
  95. void EnterExamMode(int nExamMode);
  96. bool SetAcqMode(int nMode);
  97. bool PrepareAcquisition(FPDDeviceCareRay* pDrvDPC);
  98. bool StartAcquisition(FPDDeviceCareRay* pDrvDPC);
  99. bool StopAcquisition(FPDDeviceCareRay* pDrvDPC);
  100. bool RequestXray(FPDDeviceCareRay* pDrvDPC);
  101. bool ActiveCalibration(FPDDeviceCareRay* pDrvDPC, CCOS_CALIBRATION_TYPE eType);
  102. bool PrepareCalibration(FPDDeviceCareRay* pDrvDPC);
  103. bool StartCalibration(FPDDeviceCareRay* pDrvDPC);
  104. bool StopCalibration(FPDDeviceCareRay* pDrvDPC);
  105. bool ConfirmCalExposure();
  106. void RejectCalExposure();
  107. RET_STATUS AbortCalibration(FPDDeviceCareRay* pDrvDPC);
  108. bool CompleteCalibration(FPDDeviceCareRay* pDrvDPC);
  109. bool SaveCalibrationFile();
  110. bool SetCalibRounds(int nCalibRounds);
  111. bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound);
  112. void OnProcessDarkEnd();
  113. bool AcceptCalibration();
  114. bool RejectCalibration();
  115. CCOS_CALIBRATION_TYPE GetCalibType();
  116. bool GetCalibrationTime(int nDetectorID = -1);
  117. void ProcessCREvent(int eventID, CrEvent* eventData);
  118. private:
  119. map<FPDDeviceCareRay*, int>* m_pDPC2PanelID;
  120. map<int, FPDDeviceCareRay*>* m_pPanelID2DPC;
  121. ResDataObject m_ModeConfig; //保存DPC模块下发的配置
  122. CPanelStatus* m_pStPanelStatus[2]; //
  123. int m_nPanelCount; //探测器数量
  124. int m_nCurrentPanelID;
  125. int m_nSyncMode; //记录选择模式时使用的同步模式
  126. int m_nImageWidth;
  127. int m_nImageHeight;
  128. int m_nWidthOffset;
  129. int m_nHeightOffset;
  130. std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置
  131. HMODULE m_hCareRayDRModule; //加载SDK的句柄
  132. //软同步是通过回调函数通知状态的 硬同步和AED都要主动查询状态,虽然都是query prog info 但是他俩使用的标志位也是不同的
  133. int m_nRawImgWidth; //SDK反馈的图像宽
  134. int m_nRawImgHeight; //SDK反馈的图像高
  135. int m_nDetectorNum;
  136. WORD* m_pRawImgBuffer; //原始图
  137. WORD* m_pImgBuffer; //裁剪后图像
  138. WORD* m_pDarkImage; //一键校正时获取的暗场图像
  139. bool m_bSaveRaw;
  140. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正类型
  141. int m_nCheckMode;//sdk的CheckMode
  142. int m_nCurrentLogicMode;
  143. CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 ecom校正/厂商校正
  144. WORD* m_pFluFrameData;
  145. int m_nCalibrationRounds;//校正轮数
  146. int m_nCalibCurrentCalibrationRound;//当前校正轮数
  147. int m_nCalibCurrentExposureIndex;//当前轮次曝光第几次
  148. int m_nExposureNumCurrentRound;//当前轮次需要曝光的总次数
  149. CZSKKCalibrationCtrl* m_pZSKKCalib;
  150. string m_strDetectorType; //探测器类型
  151. bool m_bOnlyHaveFpd;//当前环境是否只有探测器一个真实设备并且处于AED同步模式,其他设备是demo的 1-是 0-否 默认否
  152. int m_nGainImg; // 校正时接受的亮场图数量
  153. int m_nGainExposureNum;//gain校正曝光的总次数
  154. int m_nDetectorID;
  155. int m_nAppModeKey;
  156. int m_nModeID;
  157. int m_nFrameRate;
  158. int m_nTriggerType;
  159. int m_nExtIntegrationTime;
  160. int m_nGainLevel;
  161. int m_nDualEnergyFrameNum;
  162. bool m_bExitRadAcqStatus;
  163. bool m_bExitDualAcqStatus;
  164. bool m_bDualEnergyFirstExpEnableDone;
  165. bool m_bDualEnergySecondExpEnable;
  166. HANDLE m_hRespond;//用于等待某个状态的到来或者某个动作的完成
  167. //辅助线程事件
  168. HANDLE m_hInitEvent;
  169. HANDLE m_hExitEvent; //退出辅助线程事件
  170. HANDLE m_hReConnectEvent;
  171. HANDLE m_hSwitchEvent;
  172. HANDLE m_hLoadCalibrationEvent;
  173. HANDLE m_hRadEvent;
  174. HANDLE m_hDualEnergyEvent;
  175. HANDLE m_hOffsetEvent;
  176. HANDLE m_hGainEvent; //开始Rad Gain事件
  177. HANDLE m_hDetectorScanToggleEvnet;
  178. HANDLE m_hArrayEvent[8];
  179. HANDLE m_hToggleEvent; //辅助线程退出通知事件
  180. HANDLE m_hFPDScanThread; //辅助线程
  181. HANDLE m_hRadAcquisitionThread;
  182. HANDLE m_hDualEnergyAcquisitionThread;
  183. HANDLE m_hStatusMonitorThread;
  184. HANDLE m_hExitStatusMonitorEvent;
  185. HANDLE m_hStatusMonitorToggleEvent;
  186. HANDLE m_hExitRadAcqStatus;
  187. HANDLE m_hExitDualAcqStatus;
  188. void InitSdkInterface();
  189. bool LoadDll(string strWorkPath);
  190. bool ReleaseDll();
  191. bool OpenDetector();
  192. bool InitDetector();
  193. bool OpenStatusMonitor();
  194. static unsigned __stdcall CareRayStatusMonitorThread(PVOID pvoid);
  195. bool StatusMonitor();
  196. bool CloseStatusMonitor();
  197. bool CloseDetectorScan();
  198. int ShowModeInfo();
  199. bool SetApplicationMode();
  200. bool LoadCalibrationFiles();
  201. bool WaitRespond(int nTimeOut = 65000, const char* szAction = "");
  202. void StopWaiting(const char* szAction = "");
  203. bool TestError(int nErrorCode);
  204. //辅助线程
  205. static unsigned __stdcall onFPDScanThread(PVOID pvoid);
  206. void OnStartDarkCalibration();
  207. void OnAcquireGainImage();
  208. void OnReconnectFPD();
  209. void OnProcessInitFPD();
  210. int DarkAcquisition();
  211. int QueryAutoProgInfo(bool bIsAED = true);
  212. int QueryRadProgInfo();
  213. void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight, string strFrameID = "");
  214. bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth);
  215. bool SetUserCorrection(bool bLoad);
  216. double GetMean(WORD* imgNoHeader, int pixelNum);
  217. eDetStatus GetCareRayDPCStatus(int nDetectorIndex = -1);
  218. bool SetCareRayDPCStatus(eDetStatus status, int nDetectorIndex = -1);
  219. bool IsConnected(string strIP);
  220. bool GetTriggerType(int nTriggerModeID);
  221. bool CheckConnection();
  222. bool ReConnectFPD();
  223. bool OpenRadAcquisition();
  224. static UINT RadAcquisitionThread(LPVOID pParam);
  225. bool PerformRadAcquisition();
  226. bool CloseRadAcquisition();
  227. bool OpenDualEnergyAcquisition();
  228. static UINT DualEnergyAcquisitionThread(LPVOID pParam);
  229. bool PerformDualEnergyAcquisition();
  230. bool CloseDualEnergyAcquisition();
  231. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  232. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  233. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  234. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  235. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  236. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  237. Func_CrInitializeLibrary API_CrInitializeLibrary;
  238. Func_CrDeinitializeLibrary API_CrDeinitializeLibrary;
  239. Func_CrGetLastIntlMsg API_CrGetLastIntlMsg;
  240. Func_CrGetConfigItemValue API_CrGetConfigItemValue;
  241. Func_CrSetConfigItemValue API_CrSetConfigItemValue;
  242. Func_CrRegisterEventCallbackFun API_CrRegisterEventCallbackFun;
  243. Func_CrGetDetectorIndexAndIPAddress API_CrGetDetectorIndexAndIPAddress;
  244. Func_CrConnect API_CrConnect;
  245. Func_CrResetDetector API_CrResetDetector;
  246. Func_CrDisconnect API_CrDisconnect;
  247. Func_CrGetSystemInformation API_CrGetSystemInformation;
  248. Func_CrGetApplicationMode API_CrGetApplicationMode;
  249. Func_CrRegisterApplicationMode API_CrRegisterApplicationMode;
  250. Func_CrSetFrameFilter API_CrSetFrameFilter;
  251. Func_CrGetModeInfoByAppModeKey API_CrGetModeInfoByAppModeKey;
  252. Func_CrGetRegedInfoByAppModeKey API_CrGetRegedInfoByAppModeKey;
  253. Func_CrGetModeInfoByModeId API_CrGetModeInfoByModeId;
  254. Func_CrLoadReference API_CrLoadReference;
  255. Func_CrUnloadReference API_CrUnloadReference;
  256. Func_CrStartAcquisition API_CrStartAcquisition;
  257. Func_CrStartDarkAcquisition API_CrStartDarkAcquisition;
  258. Func_CrStartDarkAcquisitionWithCorrOpt API_CrStartDarkAcquisitionWithCorrOpt;
  259. Func_CrStopAcquisition API_CrStopAcquisition;
  260. Func_CrStartDarkCalibration API_CrStartDarkCalibration;
  261. Func_CrStartGainCalibration API_CrStartGainCalibration;
  262. Func_CrStopCalibration API_CrStopCalibration;
  263. Func_CrGetAcquisitionStatInfo API_CrGetAcquisitionStatInfo;
  264. Func_CrQueryCalibrationStatus API_CrQueryCalibrationStatus;
  265. Func_CrQueryReferenceStatus API_CrQueryReferenceStatus;
  266. Func_CrGetDefectInfo API_CrGetDefectInfo;
  267. Func_CrGetPositionDefectInfo API_CrGetPositionDefectInfo;
  268. Func_CrQueryAcquisitionStatus API_CrQueryAcquisitionStatus;
  269. Func_CrQueryAedExposureProgress API_CrQueryAedExposureProgress;
  270. Func_CrPermitExposure API_CrPermitExposure;
  271. Func_CrRequestExposure API_CrRequestExposure;
  272. Func_CrGetImage API_CrGetImage;
  273. Func_CrGetNoHeaderImage API_CrGetNoHeaderImage;
  274. Func_CrGetDetrStatus API_CrGetDetrStatus;
  275. Func_CrGetConnectionStatus API_CrGetConnectionStatus;
  276. Func_CrStartAcquisitionWithCorrOpt API_CrStartAcquisitionWithCorrOpt;
  277. Func_CrGetDaecActiveAreas API_CrGetDaecActiveAreas;
  278. Func_CrSetDaecActiveAreas API_CrSetDaecActiveAreas;
  279. Func_CrGetBatteryInfos API_CrGetBatteryInfos;
  280. Func_CrGetWirelessStatus API_CrGetWirelessStatus;
  281. };