StartMain.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. using Google.Protobuf.WellKnownTypes;
  2. using ivf_tl_Com;
  3. using IvfTl.Control.Entity.DTO;
  4. using IvfTl.Control.Entity.DTO.ApiRequestDTO;
  5. using IvfTl.Control.Entity.DTO.ControllerResults;
  6. using IvfTl.Control.Entity.GlobalEntitys;
  7. using IvfTl.Control.Entity.GlobalEnums;
  8. using IvfTl.Control.Entity.InitEntitys;
  9. using ivf_tl_UtilHelper;
  10. using Newtonsoft.Json;
  11. using System.Diagnostics;
  12. using System.Runtime.InteropServices;
  13. using System.Text;
  14. using System.Windows;
  15. namespace ivf_tl_Control
  16. {
  17. public class StartMain
  18. {
  19. AppData AppData { get; set; }
  20. public int CamNum { get; set; } = 0;
  21. public StartMain()
  22. {
  23. //HouseBin houseBin = new HouseBin();
  24. //houseBin.ComBin._channel.ErrorLogEvent += AppData.logControl.TLLog;
  25. //houseBin.ComBin._channel.ExceptionLogEvent += AppData.logControl.ExceptionLog;
  26. //houseBin.ComBin._channel.CommandLogEvent += AppData.logControl.HouseLog;
  27. }
  28. public string StartRun()
  29. {
  30. try
  31. {
  32. string errorInfo = "";
  33. AppData = AppData.Instance;
  34. AppData.LogService.TLLog($"程序开始启动", LogEnum.RunRecord);
  35. var initTLResult = InitTL(ref errorInfo);
  36. if (!string.IsNullOrEmpty(errorInfo)) return errorInfo;
  37. if (errorInfo == "结束") return errorInfo;
  38. AppData.TLSetting = initTLResult.Item1.TLSetting;
  39. PathHelper.pan = initTLResult.Item1.TLSetting.tmpDir;
  40. AppData.LogService.Pan = initTLResult.Item1.TLSetting.tmpDir;
  41. if (!InitHouse(initTLResult.Item1, initTLResult.Item2, ref errorInfo)) return errorInfo;
  42. AppData.StartAsync().Wait();
  43. return null;
  44. }
  45. catch (Exception ex)
  46. {
  47. AppData.LogService.ExceptionLog(ex, "仪器初始化", null, LogEnum.RunException);
  48. return ex.Message;
  49. }
  50. }
  51. /// <summary>
  52. /// TL数据初始化
  53. /// </summary>
  54. /// <returns></returns>
  55. public (TLInitControllerResult, List<int>) InitTL(ref string errora)
  56. {
  57. try
  58. {
  59. SerialBin serialBin = new SerialBin();
  60. serialBin.TLLogEvent += AppData.LogService.TLLog;
  61. serialBin.ExceptionLogEvent += AppData.LogService.ExceptionLog;
  62. serialBin.HouseLogEvent += AppData.LogService.HouseLog;
  63. var errorList = serialBin.UpdataCamera();
  64. AppData.LogService.TLLog($"相机信息:{JsonConvert.SerializeObject(serialBin.CCDidSn)}", LogEnum.RunRecord);
  65. if (errorList.Any())
  66. {
  67. errora = $"获取相机Id和CCDSN错误{JsonConvert.SerializeObject(errorList)}";
  68. AppData.LogService.TLLog(errora, LogEnum.RunRecord);
  69. return (new TLInitControllerResult(), new List<int>());
  70. }
  71. CamNum = serialBin.CCDidSn.Where(x => x.Value != null).Count();
  72. errorList = serialBin.Start();
  73. AppData.LogService.TLLog($"仓室信息:{JsonConvert.SerializeObject(serialBin.SerialModels)}", LogEnum.RunRecord);
  74. AppData.LogService.TLLog($"E方数据:{JsonConvert.SerializeObject(serialBin.HouseEEPROInfos)}", LogEnum.RunRecord);
  75. if (errorList.Any())
  76. {
  77. errora = $"获取串口信息错误{JsonConvert.SerializeObject(errorList)}";
  78. AppData.LogService.TLLog(errora, LogEnum.RunRecord);
  79. return (new TLInitControllerResult(), new List<int>());
  80. }
  81. var modelCount = serialBin.SerialModels.Count;
  82. if (modelCount != 11)
  83. {
  84. // M1-01 步骤2:合并后是单进程无人值守前台,不能弹模态框。
  85. // 原 hack(MessageBox + Task.Delay(3000) + FindWindow/EnumChildWindows/SendMessage(BM_CLICK) 自动点 Yes)
  86. // 改为静默 + 日志记录;是否继续由配置项 ContinueOnModuleCountMismatch 控制(默认继续)。
  87. // 相关 [DllImport] 声明(FindWindow/SendMessage/EnumChildWindows/GetClassName/GetWindowText)按代码隔离原则保留为死代码,仅停止调用。
  88. bool continueOnMismatch = true;
  89. try
  90. {
  91. string cfg = System.Configuration.ConfigurationManager.AppSettings["ContinueOnModuleCountMismatch"];
  92. if (!string.IsNullOrEmpty(cfg) && bool.TryParse(cfg, out bool parsed)) continueOnMismatch = parsed;
  93. }
  94. catch { /* 读取配置失败时按默认(继续)处理 */ }
  95. AppData.LogService.TLLog($"检测到 {modelCount} 个模块(期望 11),ContinueOnModuleCountMismatch={continueOnMismatch},按配置策略{(continueOnMismatch ? "继续运行" : "中止初始化")}", LogEnum.RunRecord);
  96. if (!continueOnMismatch)
  97. {
  98. errora = "结束";
  99. return (new TLInitControllerResult(), new List<int>());
  100. }
  101. }
  102. List<int> listIntRunHoues = serialBin.SerialModels.Select(x => x.houseSn).ToList();
  103. TLInitData tLInitData = new TLInitData();
  104. tLInitData.tlSn = $"NEO-1-{serialBin.TLNum}";
  105. tLInitData.dayLighting = serialBin.dayLighting;
  106. tLInitData.softwareVersion = "V2.0.0";
  107. tLInitData.verticalMotorPulseMax = 125000;
  108. tLInitData.houseLinkDataList = serialBin.SerialModels.OrderBy(x => x.houseSn).ToList();
  109. foreach (var item in serialBin.HouseEEPROInfos)
  110. {
  111. item.tlSn = tLInitData.tlSn;
  112. }
  113. tLInitData.houseEEPROInitDTOList = serialBin.HouseEEPROInfos.OrderBy(x => x.houseSn).ToList();
  114. AppData.LogService.TLLog($"【CamNum:{CamNum}】设备基础数据:{JsonConvert.SerializeObject(tLInitData)}", LogEnum.RunRecord);
  115. TLInitControllerResult tLInitControllerResult = AppData.SerialBinController.UpdateTLInfoController(tLInitData);
  116. if (tLInitControllerResult == null)
  117. {
  118. errora = "获取TL设置失败";
  119. AppData.LogService.TLLog(errora, LogEnum.RunRecord);
  120. return (new TLInitControllerResult(), new List<int>());
  121. }
  122. //AppData.LogService.TLLog($"TL初始化结果:{JsonConvert.SerializeObject(tLInitControllerResult)};{string.Join("_", listIntRunHoues)}", LogEnum.RunRecord);
  123. return (tLInitControllerResult, listIntRunHoues);
  124. }
  125. catch (Exception ex)
  126. {
  127. errora = ex.Message;
  128. AppData.LogService.ExceptionLog(ex, "数据初始化", null, LogEnum.RunException);
  129. return (new TLInitControllerResult(), new List<int>());
  130. }
  131. }
  132. /// <summary>
  133. /// 仓室初始化
  134. /// </summary>
  135. /// <param name="tLInitControllerResult"></param>
  136. /// <param name="runHouses"></param>
  137. /// <param name="errorInfo"></param>
  138. /// <returns></returns>
  139. private bool InitHouse(TLInitControllerResult tLInitControllerResult, List<int> runHouses, ref string errorInfo)
  140. {
  141. try
  142. {
  143. TLSetting tLSetting = tLInitControllerResult.TLSetting;
  144. AppData.TLSetting = tLSetting;
  145. var allList = AppData.SerialBinController.GetDishAndBalanceDataController(tLSetting.tlSn);
  146. int housesn = 11;
  147. AppData.BufferBottleBin = new BufferBottleBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), AppData.Instance.guanbiTime);
  148. AppData.InitBufferBottleBinEvent(AppData.BufferBottleBin);
  149. housesn = 1;
  150. AppData.HouseBin1 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  151. AppData.InitHouseBinEvent(AppData.HouseBin1);
  152. housesn = 2;
  153. AppData.HouseBin2 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  154. AppData.InitHouseBinEvent(AppData.HouseBin2);
  155. housesn = 3;
  156. AppData.HouseBin3 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  157. AppData.InitHouseBinEvent(AppData.HouseBin3);
  158. housesn = 4;
  159. AppData.HouseBin4 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  160. AppData.InitHouseBinEvent(AppData.HouseBin4);
  161. housesn = 5;
  162. AppData.HouseBin5 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  163. AppData.InitHouseBinEvent(AppData.HouseBin5);
  164. housesn = 6;
  165. AppData.HouseBin6 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  166. AppData.InitHouseBinEvent(AppData.HouseBin6);
  167. housesn = 7;
  168. AppData.HouseBin7 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  169. AppData.InitHouseBinEvent(AppData.HouseBin7);
  170. housesn = 8;
  171. AppData.HouseBin8 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  172. AppData.InitHouseBinEvent(AppData.HouseBin8);
  173. housesn = 9;
  174. AppData.HouseBin9 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  175. AppData.InitHouseBinEvent(AppData.HouseBin9);
  176. housesn = 10;
  177. AppData.HouseBin10 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  178. AppData.InitHouseBinEvent(AppData.HouseBin10);
  179. AppData.HouseBin1.CamNum = CamNum;
  180. AppData.HouseBin2.CamNum = CamNum;
  181. AppData.HouseBin3.CamNum = CamNum;
  182. AppData.HouseBin4.CamNum = CamNum;
  183. AppData.HouseBin5.CamNum = CamNum;
  184. AppData.HouseBin6.CamNum = CamNum;
  185. AppData.HouseBin7.CamNum = CamNum;
  186. AppData.HouseBin8.CamNum = CamNum;
  187. AppData.HouseBin9.CamNum = CamNum;
  188. AppData.HouseBin10.CamNum = CamNum;
  189. if (!AppData.MvcTest)
  190. {
  191. if (runHouses.Contains(1)) AppData.HouseBin1.StartTask();
  192. if (runHouses.Contains(2)) AppData.HouseBin2.StartTask();
  193. if (runHouses.Contains(3)) AppData.HouseBin3.StartTask();
  194. if (runHouses.Contains(4)) AppData.HouseBin4.StartTask();
  195. if (runHouses.Contains(6)) AppData.HouseBin6.StartTask();
  196. if (runHouses.Contains(7)) AppData.HouseBin7.StartTask();
  197. if (runHouses.Contains(8)) AppData.HouseBin8.StartTask();
  198. if (runHouses.Contains(9)) AppData.HouseBin9.StartTask();
  199. if (runHouses.Contains(10)) AppData.HouseBin10.StartTask();
  200. }
  201. if (runHouses.Contains(5)) AppData.HouseBin5.StartTask();
  202. if (runHouses.Contains(11)) AppData.BufferBottleBin.StartTask();
  203. return true;
  204. }
  205. catch (Exception ex)
  206. {
  207. AppData.LogService.ExceptionLog(ex, "仓室初始化", null, LogEnum.RunException);
  208. errorInfo = ex.Message;
  209. return false;
  210. }
  211. }
  212. public void testc()
  213. {
  214. AppData = AppData.Instance;
  215. string body1 = AppData.ReadText(@"C:\Users\jxb\Desktop\work\10 时差\8 开发文档\6 服务器架构\link接口请求参数.txt");
  216. string body2 = AppData.ReadText(@"C:\Users\jxb\Desktop\work\10 时差\8 开发文档\6 服务器架构\init接口请求参数.txt");
  217. //AppData.SerialBinController.TLInitController(body1, body2);
  218. }
  219. public void testGetAutoFocusController()
  220. {
  221. AppData = AppData.Instance;
  222. PositionRequestDTO autoFocusDTO = new PositionRequestDTO
  223. {
  224. tlSn = "NEO-1-20230101",
  225. houseSn = 1,
  226. };
  227. AppData.HouseBinController.GetAutoFocusController(autoFocusDTO);
  228. }
  229. public void TestGetCCDPositionController()
  230. {
  231. AppData = AppData.Instance;
  232. PositionRequestDTO autoFocusDTO = new PositionRequestDTO
  233. {
  234. tlSn = "NEO-1-20230101",
  235. houseSn = 1,
  236. };
  237. AppData.HouseBinController.GetCCDPositionController(autoFocusDTO);
  238. }
  239. public void TestGetDishAndBalanceDataController()
  240. {
  241. AppData = AppData.Instance;
  242. //AppData.HouseBinController.GetDishAndBalanceDataController("NEO-1-20230101");
  243. }
  244. [DllImport("user32.dll", SetLastError = true)]
  245. static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  246. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  247. static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
  248. delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
  249. [DllImport("user32.dll")]
  250. static extern bool EnumChildWindows(IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
  251. [DllImport("user32.dll")]
  252. static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
  253. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  254. static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
  255. const uint WM_CLOSE = 0x0010;
  256. const uint BM_CLICK = 0x00F5;
  257. }
  258. }