FISManager.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. using FISLib;
  2. using FISLib.AfterSales;
  3. using FISLib.Connect;
  4. using FISLib.Hardware;
  5. using FISLib.LiveVideo;
  6. using FISLib.Remedical;
  7. using FISLib.Vid;
  8. using FISSDKDemoV2.AfterSalesImplement;
  9. using FISSDKDemoV2.Database.Entity;
  10. using FISSDKDemoV2.Database.IRespository;
  11. using FISSDKDemoV2.Helper;
  12. using FISSDKDemoV2.Model;
  13. using FISSDKDemoV2.Model.Log;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.IO;
  17. using System.Linq;
  18. using System.Threading;
  19. using System.Windows;
  20. namespace FISSDKDemoV2.Manager
  21. {
  22. internal class FISManager
  23. {
  24. private static FISManager _instance;
  25. private bool _isEncryptedShow;
  26. private FISConnectionInfo _connectionInfo;
  27. private bool _tempConnectStatus;
  28. private IExamImageInfoDatabaseService _examImageInfoDatabaseService;
  29. internal static FISManager Instance => _instance ?? (_instance = new FISManager());
  30. internal FISProxy FISProxy { get; private set; }
  31. internal IFISConnect FISConnect { get; private set; }
  32. internal IFISRemedical FISRemedical { get; private set; }
  33. internal IFISVid FISVid { get; private set; }
  34. internal IFISLiveVideo FISLiveVideo { get; private set; }
  35. internal IFISHardwareDetector FISHardwareDetector { get; private set; }
  36. internal IFISAfterSales FISAfterSales { get; private set; }
  37. internal bool IsConnected => DeviceStatus == DeviceStatus.Logon;
  38. internal DeviceStatus DeviceStatus { get; private set; }
  39. internal bool IsEncryptedShow
  40. {
  41. get
  42. {
  43. return _isEncryptedShow;
  44. }
  45. set
  46. {
  47. if (_isEncryptedShow != value)
  48. {
  49. _isEncryptedShow = value;
  50. }
  51. }
  52. }
  53. internal UltrasoundMachineInfo UltrasoundMachineInfo { get; private set; }
  54. internal event EventHandler<DeviceStatus> DeviceStatusChanged;
  55. internal event EventHandler<FISLogEventArgs> FISLogInfoNotificated;
  56. internal event EventHandler<ExamImageInfo> ExamImageInfoStatusChanged;
  57. internal event EventHandler<FISLiveNotificationArgs> ConsultaitonLiveNotification;
  58. internal event EventHandler<FISVideoFrameData> PreviewCameraCaptured;
  59. internal void Init()
  60. {
  61. _examImageInfoDatabaseService = DataBaseManager.GetService<IExamImageInfoDatabaseService>();
  62. FIS.UpgradeFinished += OnUpgradeFinished;
  63. FIS.FISLogInfoNotificated += OnFISLogInfoNotificated;
  64. FIS.FISAbnormalCrashed += OnFISAbnormalCrashed;
  65. FIS.RestartedAfterCrashed += OnRestartedAfterCrashed;
  66. var fisFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FIS");
  67. if (!Directory.Exists(fisFolder))
  68. {
  69. Directory.CreateDirectory(fisFolder);
  70. }
  71. var cpuId = HardwareHelper.GetCPUId();
  72. var cpuName = HardwareHelper.GetCpuName();
  73. var rootPath = Path.GetPathRoot(AppDomain.CurrentDomain.BaseDirectory);
  74. var fisLogPath = Path.Combine(rootPath, "FISLogFolder");
  75. if (!Directory.Exists(fisLogPath))
  76. {
  77. Directory.CreateDirectory(fisLogPath);
  78. }
  79. var screenWidth = FISSDKDemoSettings.Instance.Width == 0 ? 1280 : FISSDKDemoSettings.Instance.Width;
  80. var screenHeight = FISSDKDemoSettings.Instance.Height == 0 ? 720 : FISSDKDemoSettings.Instance.Height;
  81. UltrasoundMachineInfo = new UltrasoundMachineInfo(string.Empty, "", true, string.Empty, "USDemoV2", "2.11.0", "2.2.27.5", cpuName, screenWidth, screenHeight, fisFolder, fisLogPath, FISLoginSourceV2.PC, FISPlatform.Windows, "US");
  82. var fisAfterSalesTaskLibs = new List<IFISAfterSalesTask>
  83. {
  84. new ExecutePrinterSettingTask(),
  85. new ExecuteProbeApplicationSettingTask(),
  86. new ExecuteProbeApplicationTask(),
  87. new ExecuteSystemSettingTask(),
  88. new GetLogTask(),
  89. new GetDeviceScreenShotTask(),
  90. new PushPatchTask(),
  91. new RunExecuteApiTask(),
  92. new UpdateMonitorRGBTask()
  93. };
  94. FISProxy = FIS.Enable(UltrasoundMachineInfo, fisAfterSalesTaskLibs);
  95. if (FISProxy == null)
  96. {
  97. throw new Exception("FIS Enable Failed");
  98. }
  99. FISProxy.FeatureUpdated += OnFeatureUpdated;
  100. FISConnect = FISProxy.GetFISConnect();
  101. FISConnect.StatusChanged += OnStatusChanged;
  102. FISVid = FISProxy.GetFISVid();
  103. FISHardwareDetector = FISProxy.GetFISHardwareDetector();
  104. DeviceStatus = DeviceStatus.Offline;
  105. }
  106. private void OnFeatureUpdated(object sender, FISFeatureUpdatedInfo e)
  107. {
  108. var createFeatureList = e.CreateFeatureList?.ToList();
  109. var disposeFeatureList = e.DisposeFeatureList?.ToList();
  110. foreach (var createFeature in createFeatureList)
  111. {
  112. switch (createFeature)
  113. {
  114. case FISFeature.Remedical:
  115. CreateFISRemedical();
  116. break;
  117. case FISFeature.LiveVideo:
  118. CreateFISLiveVideo();
  119. break;
  120. case FISFeature.AfterSales:
  121. CreateFISAfterSales();
  122. break;
  123. }
  124. }
  125. foreach (var disposeFeature in disposeFeatureList)
  126. {
  127. switch (disposeFeature)
  128. {
  129. case FISFeature.Remedical:
  130. DisposeFISRemedical();
  131. break;
  132. case FISFeature.LiveVideo:
  133. DisposeFISLiveVideo();
  134. break;
  135. case FISFeature.AfterSales:
  136. DisposeFISAfterSales();
  137. break;
  138. }
  139. }
  140. }
  141. private void CreateFISRemedical()
  142. {
  143. if (FISRemedical == null)
  144. {
  145. FISRemedical = FISProxy.GetFISRemedical();
  146. FISRemedical.FISScanDataChanged += OnFISScanDataChanged;
  147. }
  148. }
  149. private void CreateFISLiveVideo()
  150. {
  151. if (FISLiveVideo == null)
  152. {
  153. FISLiveVideo = FISProxy.GetFISLiveVideo();
  154. FISLiveVideo.LiveNotification += OnLiveNotification;
  155. FISLiveVideo.PreviewCameraCaptured += OnPreviewCameraCaptured;
  156. }
  157. }
  158. private void CreateFISAfterSales()
  159. {
  160. if (FISAfterSales == null)
  161. {
  162. FISAfterSales = FISProxy.GetFISAfterSales();
  163. FISAfterSales.CurrentTaskChanged += OnCurrentTaskChanged;
  164. FISAfterSales.MasterChanged += OnMasterChanged;
  165. }
  166. }
  167. private void DisposeFISRemedical()
  168. {
  169. if (FISRemedical != null)
  170. {
  171. FISRemedical.FISScanDataChanged -= OnFISScanDataChanged;
  172. FISRemedical.Dispose();
  173. FISRemedical = null;
  174. }
  175. }
  176. private void DisposeFISLiveVideo()
  177. {
  178. if (FISLiveVideo != null)
  179. {
  180. FISLiveVideo.LiveNotification -= OnLiveNotification;
  181. FISLiveVideo.PreviewCameraCaptured -= OnPreviewCameraCaptured;
  182. FISLiveVideo.Dispose();
  183. FISLiveVideo = null;
  184. }
  185. }
  186. private void DisposeFISAfterSales()
  187. {
  188. if (FISAfterSales == null)
  189. {
  190. FISAfterSales.CurrentTaskChanged -= OnCurrentTaskChanged;
  191. FISAfterSales.MasterChanged -= OnMasterChanged;
  192. FISAfterSales.Dispose();
  193. FISAfterSales = null;
  194. }
  195. }
  196. private void OnCurrentTaskChanged(object sender, FISAfterSalesTask e)
  197. {
  198. Logger.WriteLineInfo($"FISManager OnCurrentTaskChanged,Current Task is {e.Type}");
  199. }
  200. private void OnMasterChanged(object sender, FISMasterInfo e)
  201. {
  202. Logger.WriteLineInfo($"FISManager OnMasterChanged,Current UserId is {e?.UserId},UserName:{e?.UserName}");
  203. }
  204. private void OnPreviewCameraCaptured(object sender, FISVideoFrameData e)
  205. {
  206. if (e != null)
  207. {
  208. PreviewCameraCaptured?.Invoke(this, e);
  209. }
  210. }
  211. private void OnLiveNotification(object sender, FISLiveNotificationArgs e)
  212. {
  213. ConsultaitonLiveNotification?.Invoke(this, e);
  214. }
  215. private void OnStatusChanged(object sender, DeviceStatus e)
  216. {
  217. Logger.WriteLineInfo($"FISManager OnStatusChanged :{e}");
  218. DeviceStatus = e;
  219. if (e == DeviceStatus.Logon)
  220. {
  221. var cameraSetting = new CameraSetting(FIS.FISSettingsInfo.LiveVideoEnabled, FIS.FISSettingsInfo.CameraEnabled, FIS.FISSettingsInfo.LiveConfiguration.LiveCameraInfo, FIS.FISSettingsInfo.LiveConfiguration.LiveMicInfo, FIS.FISSettingsInfo.CameraPreviewEnabled, FIS.FISSettingsInfo.LiveConfiguration.IsMute);
  222. FISLiveVideo.ChangeCameraSetting(cameraSetting);
  223. }
  224. DeviceStatusChanged?.Invoke(this, e);
  225. }
  226. private void OnUpgradeFinished(object sender, EventArgs e)
  227. {
  228. Logger.WriteLineError($"OnUpgradeFinished Invoke");
  229. }
  230. private void OnFISLogInfoNotificated(object sender, FISLogEventArgs e)
  231. {
  232. var errorMsg = $"OnFISLogInfoNotificated:Log Type:{e.LogType},Log Content:{e.Msg} ";
  233. switch (e.LogType)
  234. {
  235. case FISDeviceLogCategory.Info:
  236. Logger.WriteLineInfo(errorMsg);
  237. break;
  238. case FISDeviceLogCategory.Warn:
  239. Logger.WriteLineWarn(errorMsg);
  240. break;
  241. case FISDeviceLogCategory.Error:
  242. Logger.WriteLineError(errorMsg);
  243. break;
  244. case FISDeviceLogCategory.Verb:
  245. Logger.WriteLineVerbose(errorMsg);
  246. break;
  247. }
  248. FISLogInfoNotificated?.Invoke(this, e);
  249. }
  250. private void OnFISAbnormalCrashed(object sender, EventArgs e)
  251. {
  252. _tempConnectStatus = FIS.FISSettingsInfo.IsConnected;
  253. Logger.WriteLineError($"OnFISAbnormalCrashed Invoke");
  254. if (FISProxy != null)
  255. {
  256. FISProxy.FeatureUpdated += OnFeatureUpdated;
  257. FISProxy = null;
  258. }
  259. if (FISConnect != null)
  260. {
  261. FISConnect.StatusChanged -= OnStatusChanged;
  262. FISConnect = null;
  263. }
  264. if (FISVid != null)
  265. {
  266. FISVid = null;
  267. }
  268. if (FISHardwareDetector != null)
  269. {
  270. FISHardwareDetector = null;
  271. }
  272. if (FISRemedical != null)
  273. {
  274. FISRemedical.FISScanDataChanged -= OnFISScanDataChanged;
  275. FISRemedical = null;
  276. }
  277. if (FISLiveVideo != null)
  278. {
  279. FISLiveVideo.PreviewCameraCaptured -= OnPreviewCameraCaptured;
  280. FISLiveVideo.LiveNotification -= OnLiveNotification;
  281. FISLiveVideo = null;
  282. }
  283. OnStatusChanged(this, DeviceStatus.Offline);
  284. MessageBox.Show("FIS Exe Abnormal Crashed", "提示", MessageBoxButton.OK, MessageBoxImage.Error);
  285. }
  286. private void OnFISScanDataChanged(object sender, FISVidDataChangedEventArgs e)
  287. {
  288. try
  289. {
  290. if (e == null)
  291. {
  292. return;
  293. }
  294. var examImageInfo = _examImageInfoDatabaseService.GetExamImageByScanDataId(e.FISVidData.Id);
  295. if (examImageInfo == null)
  296. {
  297. Logger.WriteLineError($"OnFISSVidDataChanged GetExamImageByScanDataId Result is null 1stTime.");
  298. Thread.Sleep(1000);
  299. examImageInfo = _examImageInfoDatabaseService.GetExamImageByScanDataId(e.FISVidData.Id);
  300. if (examImageInfo == null)
  301. {
  302. Logger.WriteLineError($"OnFISSVidDataChanged GetExamImageByScanDataId Result is null last Time.");
  303. return;
  304. }
  305. }
  306. Logger.WriteLineInfo($"OnFISSVidDataChanged Current ExamImageInfo,ExamImageId:{examImageInfo.Id},ExamId:{examImageInfo.ExamId},ScanDataId:{examImageInfo.ScanDataId}");
  307. examImageInfo.UploadResult = e.FISVidData.Status;
  308. Logger.WriteLineInfo($"OnFISSVidDataChanged Action:{e.ChangeType}, ScanDataId:{e.FISVidData.Id},Upload Status:{e.FISVidData.Status}");
  309. _examImageInfoDatabaseService.Update(examImageInfo);
  310. ExamImageInfoStatusChanged?.Invoke(this, examImageInfo);
  311. }
  312. catch (Exception ex)
  313. {
  314. Logger.WriteLineError(ex.ToString());
  315. FISLogInfoNotificated?.Invoke(this, new FISLogEventArgs(FISDeviceLogCategory.Error, $"FISManager OnFISScanDataChanged Error:{ex}"));
  316. }
  317. }
  318. private void OnRestartedAfterCrashed(object sender, FISProxy e)
  319. {
  320. Logger.WriteLineError($"OnRestartedAfterCrashed Invoke");
  321. FISProxy = e;
  322. if (FISProxy == null)
  323. {
  324. throw new Exception("OnRestartedAfterCrashed Failed, The FISProxy is null");
  325. }
  326. FISProxy.FeatureUpdated += OnFeatureUpdated;
  327. FISConnect = FISProxy.GetFISConnect();
  328. FISConnect.StatusChanged += OnStatusChanged;
  329. FISVid = FISProxy.GetFISVid();
  330. MessageBox.Show("FIS Exe Restarted After Crashed", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
  331. if (_tempConnectStatus)
  332. {
  333. Connect();
  334. }
  335. }
  336. internal void Connect()
  337. {
  338. if (IsConnected)
  339. {
  340. return;
  341. }
  342. _connectionInfo = new FISConnectionInfo(FIS.FISSettingsInfo.CurrentServer, new FISAccountInfo("", "", false), "", new FISFeatureSettings
  343. {
  344. RemedicalEnabled = true,
  345. LiveVideoEnabled = FIS.FISSettingsInfo.LiveVideoEnabled,
  346. AfterSalesEnabled = true,
  347. });
  348. if (FISConnect == null)
  349. {
  350. FISLogInfoNotificated?.Invoke(this, new FISLogEventArgs(FISDeviceLogCategory.Error, "FISConnect is Null"));
  351. return;
  352. }
  353. DeviceStatus = FISConnect.Connect(_connectionInfo);
  354. }
  355. internal void Disconnect()
  356. {
  357. if (!IsConnected)
  358. {
  359. return;
  360. }
  361. FISConnect.Disconnect();
  362. }
  363. }
  364. }