XiuYuanCtrl.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #pragma once
  2. #include <map>
  3. #include <filesystem>
  4. #include <iostream>
  5. //转存文件内容使用
  6. #include <shellapi.h>
  7. #include "CcosLock.h"
  8. #include "ResDataObject.h"
  9. #include "DetectorDefinition.h"
  10. #include "CCOS.Dev.FPD.XiuYuan.h"
  11. #include "ZSKKCalibration.h"
  12. #define XiuYuan_SCAN_NUM 1
  13. namespace nsDPC = CCOS::Dev::Detail::Detector;
  14. namespace CCOS::Dev::Detail::Detector
  15. {
  16. class XiuYuanCtrl : public CcosLock
  17. {
  18. class _AutoLocker
  19. {
  20. CcosLock* m_lockObj;
  21. public:
  22. _AutoLocker(CcosLock *lockObj,DWORD timeout = INFINITE)
  23. :m_lockObj(lockObj)
  24. {
  25. m_lockObj->Thread_Lock(timeout);
  26. }
  27. ~_AutoLocker()
  28. {
  29. if (m_lockObj)
  30. {
  31. m_lockObj->Thread_UnLock();
  32. }
  33. }
  34. };
  35. enum class eDetStatus
  36. {
  37. DetStatus_NotIni,
  38. DetStatus_NotConn,
  39. DetStatus_Sleep,
  40. DetStatus_Standby,
  41. DetStatus_Work,
  42. DetStatus_Acquire,
  43. DetStatus_Offset,
  44. DetStatus_XrayCalibration,
  45. };
  46. //探测器信息
  47. struct CPanelStatus
  48. {
  49. bool bInitOver; //是否初始化完成
  50. bool bConnectState; //是否连接
  51. SYNC_MODE eSyncMode; //同步模式
  52. int nSoftAcqState;
  53. eDetStatus eFPDStatus; //探测器状态
  54. CPanelStatus()
  55. {
  56. bInitOver = false;
  57. bConnectState = false;
  58. eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值
  59. nSoftAcqState = 0;
  60. eFPDStatus = eDetStatus::DetStatus_NotIni;
  61. }
  62. };
  63. public:
  64. XiuYuanCtrl();
  65. ~XiuYuanCtrl();
  66. bool Init(string strAppPath);
  67. bool DriverEntry(FPDDeviceXiuYuan* pDrvDPC, ResDataObject& Configuration);
  68. bool ActiveDetector(nsDPC::FPDDeviceXiuYuan* pDrvDPC, bool bActive);
  69. bool EnterExam(APP_STATUS eStatus);
  70. bool Connect(FPDDeviceXiuYuan* pDrvDPC, string strWorkPath);
  71. bool DisConnect(nsDPC::FPDDeviceXiuYuan* pDrvDPC);
  72. bool SetAcqMode(string strLogicMode);
  73. RET_STATUS StartAcquisition(nsDPC::FPDDeviceXiuYuan* pDrvDPC);
  74. RET_STATUS StopAcquisition(nsDPC::FPDDeviceXiuYuan* pDrvDPC);
  75. RET_STATUS PrepareAcquisition(nsDPC::FPDDeviceXiuYuan* pDrvDPC);
  76. bool ActiveCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC, CCOS_CALIBRATION_TYPE Type);
  77. bool PrepareCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC);
  78. bool StartCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC);
  79. bool StopCalibration(FPDDeviceXiuYuan* pDrvDPC);
  80. bool CompleteCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC);
  81. bool AbortCalibration(nsDPC::FPDDeviceXiuYuan* pDrvDPC);
  82. void SetCalibRounds(int nCalibRounds);
  83. bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound);
  84. bool AcceptCalibration();
  85. bool RejectCalibration();
  86. CCOS_CALIBRATION_TYPE GetCalibType();
  87. bool UpdateCalibMode(CCOS_CALIBRATION_MODE eCalibMode);
  88. bool SaveCalibrationFile();
  89. bool SetSyncMode(int nSyncMode);
  90. void SetNotifyStatusTimePeriod(int nTime);
  91. void SetReconnectTimePeriod(int nTime);
  92. public:
  93. APP_STATUS m_eAppStatus; //记录当前软件的工作状态(界面)
  94. ResDataObject m_ModeConfig;
  95. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式
  96. CZSKKCalibrationCtrl* m_pZSKKCalib;
  97. int m_nImageWidth;
  98. int m_nImageHeight;
  99. int m_nRawImgWidth; //图像原始宽
  100. int m_nRawImgHeight; //图像原始高
  101. int m_nWidthOffset; //图像左侧裁剪像素值
  102. int m_nHeightOffset; //图像上边裁剪像素值
  103. int m_nImgBits;
  104. int m_nPixelPitch;
  105. int m_nNotifyStatusTimePeriod;//通知温度等状态信息的时间间隔
  106. int m_nReconnectTimePeriod;//重连的时间间隔
  107. int m_nSyncMode;
  108. private:
  109. bool LoadXiuYuanDLL(string strWorkPath);
  110. void FreeXiuYuanDLL();
  111. bool DetectorInitProcess(int nPanelIndex, bool bFDAttach = false);
  112. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  113. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  114. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  115. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  116. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  117. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  118. bool TestError(int nDetectorID, int nErrorStatus, std::string strAPI = "");
  119. bool StartXWindowOffThread();
  120. static DWORD XWindowOffThread(LPVOID pParam);
  121. bool OnEXIT();
  122. void DeleteHandle();
  123. bool IsConnected(string strIP);
  124. void OnProcessImg();
  125. bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth);
  126. bool SaveRawImage(const char* pImgName, const WORD* pRawImg, int nWidth, int nHeight);
  127. static bool ImageReadyCallbackProcess(const char* pImage, unsigned long iFlag);
  128. static bool SystemInfoCallbackProcess(SystemInfoCode iCodeIndex, const char* sContent);
  129. bool onImageReadyCallbackProcess(const char* pImage, int iFlag);
  130. bool onSystemInfoCallbackProcess(SystemInfoCode iCodeIndex, const char* sContent);
  131. bool SetDetectorWorkMode(int nDetectorID, const char* szFPD, FpdMode* stWorkMode);
  132. bool FPDLoadCorrectFiles(int nDetectorID, const char* szDetectorID);
  133. private:
  134. //句柄
  135. HMODULE m_hXiuYuanModule;
  136. Func_YI_Initialize_FPD_V4 API_YI_Initialize_FPD_V4;
  137. Func_YI_FPD_Close API_YI_FPD_Close;
  138. Func_YI_FPD_Set_Work_Mode API_YI_FPD_Set_Work_Mode;
  139. Func_YI_FPD_Stop_Capture_Image API_YI_FPD_Stop_Capture_Image;
  140. Func_YI_FPD_Get_Configure_Common API_YI_FPD_Get_Configure_Common;
  141. Func_YI_FPD_Set_Configure_Common API_YI_FPD_Set_Configure_Common;
  142. Func_YI_FPD_Get_Configure_SyncOut_Mode API_YI_FPD_Get_Configure_SyncOut_Mode;
  143. Func_YI_FPD_Set_Configure_SyncOut_Mode API_YI_FPD_Set_Configure_SyncOut_Mode;
  144. Func_YI_FPD_Restore_Factory_Settings API_YI_FPD_Restore_Factory_Settings;
  145. Func_YI_Subtract_Offset API_YI_Subtract_Offset;
  146. Func_YI_ImageReady_Callback_Register API_YI_ImageReady_Callback_Register;
  147. Func_YI_SystemInfo_Callback_Register API_YI_SystemInfo_Callback_Register;
  148. Func_YI_Get_Callback_Image_Size API_YI_Get_Callback_Image_Size;
  149. Func_YI_GetLastErrorCode API_YI_GetLastErrorCode;
  150. Func_YI_Set_Save_Log_Flag API_YI_Set_Save_Log_Flag;
  151. Func_YI_FPD_Get_Invalid_Region API_YI_FPD_Get_Invalid_Region;
  152. Func_YI_GetLoacalIPs_V4 API_YI_GetLoacalIPs_V4;
  153. Func_YI_Set_Image_Save_State API_YI_Set_Image_Save_State;
  154. Func_YI_Set_Image_Save_Path API_YI_Set_Image_Save_Path;
  155. Func_YI_FPD_Get_FPD_TYPE API_YI_FPD_Get_FPD_TYPE;
  156. Func_YI_FPD_Write_Configure_Common_To_File API_YI_FPD_Write_Configure_Common_To_File;
  157. Func_YI_FPD_Read_Configure_Common_From_File API_YI_FPD_Read_Configure_Common_From_File;
  158. Func_YI_FPD_Write_Configure_SyncOut_To_File API_YI_FPD_Write_Configure_SyncOut_To_File;
  159. Func_YI_FPD_Read_Configure_SyncOut_From_File API_YI_FPD_Read_Configure_SyncOut_From_File;
  160. Func_YI_FPD_Capture_Image API_YI_FPD_Capture_Image;
  161. Func_YI_FPD_Capture_Prepare API_YI_FPD_Capture_Prepare;
  162. Func_YI_Load_Gain_Tmp_File API_YI_Load_Gain_Tmp_File;
  163. Func_YI_Load_Defect_Tmp_File API_YI_Load_Defect_Tmp_File;
  164. Func_YI_Load_Offset_Tmp_File API_YI_Load_Offset_Tmp_File;
  165. Func_YI_Load_AED_Offset_Tmp_File API_YI_Load_AED_Offset_Tmp_File;
  166. Func_YI_Set_Correct_Type API_YI_Set_Correct_Type;
  167. Func_YI_GainCalibrate API_YI_GainCalibrate;
  168. Func_YI_OffsetCalibrate API_YI_OffsetCalibrate;
  169. Func_YI_DefectCalibrate API_YI_DefectCalibrate;
  170. Func_YI_AEDOffsetCalibrate API_YI_AEDOffsetCalibrate;
  171. Func_YI_SetWorkMode API_YI_SetWorkMode;
  172. Func_YI_GetWorkMode API_YI_GetWorkMode;
  173. Func_YI_SetDosage API_YI_SetDosage;
  174. Func_YI_SetROIRegion API_YI_SetROIRegion;
  175. Func_YI_ThermalSensor API_YI_ThermalSensor;
  176. Func_YI_1256Parameter API_YI_1256Parameter;
  177. Func_YI_Restart API_YI_Restart;
  178. Func_YI_Reset API_YI_Reset;
  179. Func_YI_GetStatus API_YI_GetStatus;
  180. Func_YI_GetVersion API_YI_GetVersion;
  181. Func_YI_FPD_FreeBuffer API_YI_FPD_FreeBuffer;
  182. HANDLE m_hArrayEvent[XiuYuan_SCAN_NUM];
  183. HANDLE m_hExitEvent;
  184. HANDLE m_hXiuYuanScanEnd;
  185. HANDLE m_hWindowOffEvent;
  186. HANDLE m_pOffsetThread;
  187. HANDLE m_pXWindowoffThread;
  188. HANDLE m_hScanEventThread;
  189. HANDLE m_hInitThread;
  190. string m_strAppPath; //模块工作目录
  191. string m_strWorkPath; //SDK工作路径
  192. string m_strDetectorType; //探测器类型
  193. string m_strAcqMode;
  194. int m_nPanelCount;
  195. int m_nDetectorID; //SDK探测器ID(1,2,3)
  196. int m_nDetectorIndex; //当前激活探测器的index(0,1,2)
  197. map<FPDDeviceXiuYuan*, int>* m_pDPC2PanelID;
  198. map<int, FPDDeviceXiuYuan*>* m_pPanelID2DPC;
  199. DeviceIndexStruct m_stDeviceIndex[3]; //配置的探测器列表//不超过三块板
  200. CPanelStatus* m_pStPanelStatus[2]; //
  201. std::vector<std::string> m_vecDetectorID; //SDK探测器ID
  202. HANDLE m_pHardwareStatusThread;
  203. HANDLE m_hEndHWStatusThreadEvent;
  204. HANDLE m_hHWStatusThreadEndEvent;
  205. WORD* m_pImgBuffer; //裁剪后图像内存
  206. WORD* m_pRawImgBuffer; //原始图像内存
  207. bool m_bInCalibrating;
  208. bool m_bInExposure;
  209. bool m_bAEDWorkFlag;
  210. bool m_bCancelFlag; //true: 取消曝光
  211. bool m_bSaveRaw;
  212. bool m_bTemperatureEnable;
  213. bool m_bBatteryEnable;
  214. bool m_bWifiEnable;
  215. bool m_bConnectStatus;
  216. bool m_bFreeBuffer;
  217. bool m_bStandbyFlag;
  218. int m_nDoseParam;// 校正用的曝光计量,发送到UI 且本地记录
  219. int m_nCalibStatus;
  220. int m_nCalibrationRounds;//校正总轮数
  221. int m_nCalibCurrentCalibrationRound;//当前校正轮数
  222. int m_nCalibCurrentExposureIndex;//当前轮次曝光第几次
  223. int m_nExposureNumCurrentRound;//当前轮次需要曝光的总次数
  224. int m_nExpWindowMode;
  225. int m_nXWindow;
  226. //校正相关变量
  227. list<RefrenceCal> m_listCalibItem;
  228. list<RefrenceCal>::iterator m_iterCalibDose;
  229. CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 ecom校正/厂商校正
  230. int m_nDefectExpTimes;
  231. int m_nDefectTotalTimes;
  232. int m_nGainExpTimes;
  233. int m_nGainTotalFrames;
  234. int m_nDefectTotalFrames;
  235. };
  236. }