YuyingCtrl.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. #pragma once
  2. #include <map>
  3. //转存文件内容使用
  4. #include <shellapi.h>
  5. #include "CcosLock.h"
  6. #include "ResDataObject.h"
  7. #include "DetectorDefinition.h"
  8. #include "CCOS.Dev.FPD.Yuying.h"
  9. #define Yuying_SCAN_NUM 4
  10. namespace nsDPC = CCOS::Dev::Detail::Detector;
  11. namespace CCOS::Dev::Detail::Detector
  12. {
  13. class YuyingCtrl : public CcosLock
  14. {
  15. class _AutoLocker
  16. {
  17. CcosLock* m_lockObj;
  18. public:
  19. _AutoLocker(CcosLock *lockObj,DWORD timeout = INFINITE)
  20. :m_lockObj(lockObj)
  21. {
  22. m_lockObj->Thread_Lock(timeout);
  23. }
  24. ~_AutoLocker()
  25. {
  26. if (m_lockObj)
  27. {
  28. m_lockObj->Thread_UnLock();
  29. }
  30. }
  31. };
  32. enum class eDetStatus
  33. {
  34. DetStatus_NotIni,
  35. DetStatus_NotConn,
  36. DetStatus_Sleep,
  37. DetStatus_Standby,
  38. DetStatus_Work,
  39. DetStatus_Acquire,
  40. DetStatus_Offset,
  41. DetStatus_XrayCalibration,
  42. };
  43. //探测器信息
  44. struct CPanelStatus
  45. {
  46. bool bInitOver; //是否初始化完成
  47. bool bConnectState; //是否连接
  48. SYNC_MODE eSyncMode; //同步模式
  49. int nSoftAcqState;
  50. eDetStatus eFPDStatus; //探测器状态
  51. CPanelStatus()
  52. {
  53. bInitOver = false;
  54. bConnectState = false;
  55. eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值
  56. nSoftAcqState = 0;
  57. eFPDStatus = eDetStatus::DetStatus_NotIni;
  58. }
  59. };
  60. public:
  61. YuyingCtrl();
  62. ~YuyingCtrl();
  63. bool Init(string strAppPath);
  64. bool DriverEntry(FPDDeviceYuying* pDrvDPC, ResDataObject& Configuration);
  65. bool ActivePanel(nsDPC::FPDDeviceYuying* pDrvDPC, bool bActive);
  66. bool EnterExam(APP_STATUS eStatus);
  67. bool Connect(FPDDeviceYuying* pDrvDPC, string strWorkPath);
  68. bool DisConnect(nsDPC::FPDDeviceYuying* pDrvDPC);
  69. bool ResetFPD(nsDPC::FPDDeviceYuying* pDrvDPC);
  70. bool SelectExamMode(int nLogicMode, nsDPC::FPDDeviceYuying* pDrvDPC);
  71. RET_STATUS StartAcquisition(nsDPC::FPDDeviceYuying* pDrvDPC);
  72. RET_STATUS StopAcquisition(nsDPC::FPDDeviceYuying* pDrvDPC);
  73. RET_STATUS PrepareAcquisition(nsDPC::FPDDeviceYuying* pDrvDPC);
  74. bool InitCalibration();
  75. bool GetYuyingPanelCalibItem();
  76. RET_STATUS ActiveCalibration(CCOS_CALIBRATION_TYPE Type, nsDPC::FPDDeviceYuying* pDrvDPC);
  77. RET_STATUS PrepareCalibration(nsDPC::FPDDeviceYuying* pDrvDPC);
  78. RET_STATUS StartCalibration(nsDPC::FPDDeviceYuying* pDrvDPC);
  79. RET_STATUS CompleteCalibration(nsDPC::FPDDeviceYuying* pDrvDPC);
  80. RET_STATUS AbortCalibration(nsDPC::FPDDeviceYuying* pDrvDPC);
  81. bool ConfirmCalibration();
  82. bool AcceptCalibration();
  83. bool RejectCalibration();
  84. bool CreateCalibrationFile();
  85. void OnEndCalibraion();
  86. bool ActiveSyncMode(nsDPC::FPDDeviceYuying* pDrvDPC, int nSyncMode);
  87. bool RecoverLastImage();
  88. bool RecoverLastImageAuto();
  89. bool CopyFile2Folder(string strSrcPath, string strDstPath);
  90. public:
  91. ResDataObject m_ModeConfig;
  92. APP_STATUS m_eAppStatus; //记录当前软件的工作状态(界面)
  93. int m_nCurrentMode; //记录探测器当前的采集模式
  94. int m_nImageWidth;
  95. int m_nImageHeight;
  96. int m_nLeftOffset; //图像左侧裁剪像素值
  97. int m_nTopOffset; //图像上边裁剪像素值
  98. int m_nRightOffset; //图像右侧裁剪像素值
  99. int m_nBottomOffset; //图像下边裁剪像素值
  100. int m_nRawImgWidth; //图像原始宽
  101. int m_nRawImgHeight; //图像原始高
  102. int m_nImgBits;
  103. int m_nPixelPitch;
  104. bool m_bPreviewEnable;
  105. float m_fFactorEXI2UGY; //探测器EXI -> UGY 转换系数
  106. int m_nPreviewWidth;
  107. int m_nPreviewHeight;
  108. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正模式
  109. float m_fCurrentDose; // 记录当前的Dose要求
  110. int m_nSaveRaw; //0:不存; 1:预览图; 2:raw图; 4:实际尺寸图像;
  111. //int m_nGainNodeCount; //校正曝光的总节点个数
  112. //int m_nGainNodeIndex; //校正曝光的节点Index
  113. //int m_nGainExpCount; //校正曝光节点需要曝光的次数
  114. //int m_nGainExpIndex; //校正曝光节点已曝光的次数
  115. int m_nUpdateFPDID; //记录要固件升级的探测器ID
  116. private:
  117. bool LoadYuyingDLL(string strWorkPath);
  118. void FreeYuyingDLL();
  119. void StartInitFPDThread();
  120. static DWORD __stdcall onInitPanel(void* pParam); //初始化线程
  121. void Action_Init();
  122. bool DetectorInitProcess(int nPanelIndex, bool bFDAttach = false);
  123. void YuyingScanEventThread(); //监控线程
  124. static DWORD __stdcall onScanEvent(void* pParam); //初始化线程
  125. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  126. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  127. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  128. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  129. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  130. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  131. bool SetMarsCorrection(int nPanelIndex);
  132. bool TestError(int nDetectorID, int nErrorStatus, std::string strAPI = "");
  133. bool CheckBattery(int nPanelIndex);
  134. bool ReadWifiStatus(int nPanelIndex);
  135. bool CheckWiFi(int nPanelIndex);
  136. bool CheckTemperature(int nPanelIndex);
  137. bool WaitRespond(int nTimeOut, const char* szPosition = "");
  138. void SendNotify(const char* szPosition = "");
  139. void ResetLock();
  140. bool StartOffsetThread();
  141. static DWORD OffsetThread(LPVOID pParam);
  142. bool StartXWindowOffThread();
  143. static DWORD XWindowOffThread(LPVOID pParam);
  144. bool DeleteOneFolder(string strSourceFolder);
  145. bool RecoverImage();
  146. bool OnEXIT();
  147. void DeleteHandle();
  148. bool FlipX(WORD* pData, int nWidth, int nHeight);
  149. bool FlipXRotate90(WORD* pData, int nWidth, int nHeight);
  150. bool IsConnected(string strIP);
  151. void OnProcessPreImg();
  152. void OnProcessImg();
  153. bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth);
  154. bool SaveRawImage(const char* pImgName, const WORD* pRawImg, int nWidth, int nHeight);
  155. static bool ImageReadyCallbackProcess(const char* pImage, int iFlag);
  156. static bool SystemInfoCallbackProcess(SystemInfoCode iCodeIndex, const char* sContent);
  157. bool onImageReadyCallbackProcess(const char* pImage, int iFlag);
  158. bool onSystemInfoCallbackProcess(SystemInfoCode iCodeIndex, const char* sContent);
  159. bool SetDetectorWorkMode(int nDetectorID, const char* szFPD, int nWorkMode);
  160. bool FPDLoadCorrectFiles(int nDetectorID, const char* szDetectorID);
  161. private:
  162. //句柄
  163. HMODULE m_hYuyingModule;
  164. Func_YI_Initialize_FPD_V4 API_YI_Initialize_FPD_V4;
  165. Func_YI_FPD_Set_Work_Mode API_YI_FPD_Set_Work_Mode;
  166. Func_YI_FPD_Stop_Capture_Image API_YI_FPD_Stop_Capture_Image;
  167. Func_YI_FPD_Get_Configure_Common API_YI_FPD_Get_Configure_Common;
  168. Func_YI_FPD_Set_Configure_Common API_YI_FPD_Set_Configure_Common;
  169. Func_YI_FPD_Get_Configure_SyncOut_Mode API_YI_FPD_Get_Configure_SyncOut_Mode;
  170. Func_YI_FPD_Set_Configure_SyncOut_Mode API_YI_FPD_Set_Configure_SyncOut_Mode;
  171. Func_YI_FPD_Restore_Factory_Settings API_YI_FPD_Restore_Factory_Settings;
  172. Func_YI_FPD_Subtract_Offset API_YI_FPD_Subtract_Offset;
  173. Func_YI_ImageReady_Callback_Register API_YI_ImageReady_Callback_Register;
  174. Func_YI_ImageReady_Callback_Register_Ex API_YI_ImageReady_Callback_Register_Ex;
  175. Func_YI_SystemInfo_Callback_Register API_YI_SystemInfo_Callback_Register;
  176. Func_YI_SystemInfo_Callback_Register_Ex API_YI_SystemInfo_Callback_Register_Ex;
  177. Func_YI_Get_Callback_Image_Size API_YI_Get_Callback_Image_Size;
  178. Func_YI_GetLastErrorCode API_YI_GetLastErrorCode;
  179. Func_YI_Set_Save_Log_Flag API_YI_Set_Save_Log_Flag;
  180. Func_YI_GetLoacalIPs_V4 API_YI_GetLoacalIPs_V4;
  181. Func_YI_Set_Image_Save_State API_YI_Set_Image_Save_State;
  182. Func_YI_Set_Image_Save_Path API_YI_Set_Image_Save_Path;
  183. Func_YI_FPD_Get_FPD_TYPE API_YI_FPD_Get_FPD_TYPE;
  184. Func_YI_FPD_Get_Invalid_Region API_YI_FPD_Get_Invalid_Region;
  185. Func_YI_FPD_Capture_Image API_YI_FPD_Capture_Image;
  186. Func_YI_FPD_Capture_Prepare API_YI_FPD_Capture_Prepare;
  187. Func_YI_Load_Gain_Tmp_File API_YI_Load_Gain_Tmp_File;
  188. Func_YI_Load_Defect_Tmp_File API_YI_Load_Defect_Tmp_File;
  189. Func_YI_Load_Offset_Tmp_File API_YI_Load_Offset_Tmp_File;
  190. Func_YI_Load_AED_Offset_Tmp_File API_YI_Load_AED_Offset_Tmp_File;
  191. Func_YI_Set_Correct_Type API_YI_Set_Correct_Type;
  192. Func_YI_FPD_DO_Correction API_YI_FPD_DO_Correction;
  193. Func_YI_FPD_Wifi_Re_Connect API_YI_FPD_Wifi_Re_Connect;
  194. Func_YI_FPD_Wifi_Set_Work_Mode API_YI_FPD_Wifi_Set_Work_Mode;
  195. Func_YI_FPD_Wifi_Get_Work_Mode API_YI_FPD_Wifi_Get_Work_Mode;
  196. Func_YI_FPD_Wifi_Set_Name API_YI_FPD_Wifi_Set_Name;
  197. Func_YI_FPD_Wifi_Set_Power_Down API_YI_FPD_Wifi_Set_Power_Down;
  198. Func_YI_FPD_Wifi_Set_IP_Address API_YI_FPD_Wifi_Set_IP_Address;
  199. Func_YI_FPD_Wifi_Set_Route_Info API_YI_FPD_Wifi_Set_Route_Info;
  200. HANDLE m_hArrayEvent[Yuying_SCAN_NUM];
  201. HANDLE m_hExitEvent;
  202. HANDLE m_hRecoverImage;
  203. HANDLE m_hCofirmCalib;
  204. HANDLE m_hEndCalibEvent;
  205. HANDLE m_hYuyingScanEnd;
  206. HANDLE m_hSharedEvent; //等待SDK回调句柄
  207. HANDLE m_hWindowOffEvent;
  208. HANDLE m_pOffsetThread;
  209. HANDLE m_pXWindowoffThread;
  210. HANDLE m_hScanEventThread;
  211. HANDLE m_hInitThread;
  212. string m_strAppPath; //模块工作目录
  213. string m_strWorkPath; //SDK工作路径
  214. int m_nPanelCount;
  215. int m_nDetectorID; //SDK探测器ID(1,2,3)
  216. int m_nDetectorIndex; //当前激活探测器的index(0,1,2)
  217. void* m_pCurrentDPC;
  218. map<FPDDeviceYuying*, int>* m_pDPC2PanelID;
  219. map<int, FPDDeviceYuying*>* m_pPanelID2DPC;
  220. DeviceIndexStruct m_stDeviceIndex[3]; //配置的探测器列表//不超过三块板
  221. ResDataObject m_ObjFPDsInfo[3]; //存储探测器数量和类型
  222. CPanelStatus* m_pStPanelStatus[2]; //
  223. std::vector<std::string> m_vecDetectorID; //SDK探测器ID
  224. HANDLE m_pHardwareStatusThread;
  225. HANDLE m_hEndHWStatusThreadEvent;
  226. HANDLE m_hHWStatusThreadEndEvent;
  227. WORD* m_pImgBuffer; //裁剪后图像内存
  228. WORD* m_pwRawImageData; //原始图像内存
  229. WORD* m_pwPreviewImg; //预览图内存
  230. bool m_bInitialing; //是否在初始化过程中
  231. bool m_bInCalibrating;
  232. bool m_bInExposure;
  233. bool m_bAEDWorkFlag;
  234. int m_nDoseParam;// 校正用的曝光计量,发送到UI 且本地记录
  235. int m_nCalibDueSetting; // 校正文件的保质期天数
  236. int m_nCalibStatus;
  237. int m_nSID; //SID值
  238. //校正相关变量
  239. list<RefrenceCal> m_listCalibItem;
  240. list<RefrenceCal>::iterator m_iterCalibDose;
  241. int m_nCalibrationMode; //校正模式,ZSKK or Factory
  242. int m_nDefectExpTimes;
  243. int m_nDefectTotalTimes;
  244. int m_nGainExpTimes;
  245. int m_nGainTotalFrames;
  246. int m_nDefectTotalFrames;
  247. };
  248. }