ModuleDataMonitor.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Windows;
  7. using System.Windows.Threading;
  8. using Aitex.Core.RT.Log;
  9. using Aitex.Core.Util;
  10. using MECF.Framework.Common.DataCenter;
  11. using RTDefine = Aitex.Core.Common;
  12. namespace MECF.Framework.UI.Client.ClientBase
  13. {
  14. public class ModuleDataMonitor
  15. {
  16. public Dictionary<string, ModuleInfo> _mapWaferDataModule = new Dictionary<string, ModuleInfo>();
  17. public List<string> _lstWaferDataName = new List<string>();
  18. private PeriodicJob _monitorThread;
  19. public ModuleDataMonitor()
  20. {
  21. foreach (var moduleInfo in ModuleManager.ModuleInfos)
  22. {
  23. if (!string.IsNullOrEmpty(moduleInfo.Value.WaferDataName))
  24. {
  25. _lstWaferDataName.Add(moduleInfo.Value.WaferDataName);
  26. _mapWaferDataModule[moduleInfo.Value.WaferDataName] = moduleInfo.Value;
  27. }
  28. }
  29. _monitorThread = new PeriodicJob(500, OnTimer, "Monitor Module Data Thread", true);
  30. }
  31. private bool OnTimer()
  32. {
  33. try
  34. {
  35. Dictionary<string, object> data = QueryDataClient.Instance.Service.PollData(_lstWaferDataName);
  36. if (data != null && Application.Current != null)
  37. {
  38. Application.Current.Dispatcher.Invoke(new Action(() =>
  39. {
  40. foreach (var waferData in data)
  41. {
  42. if (!_mapWaferDataModule.ContainsKey(waferData.Key))
  43. continue;
  44. RTDefine.WaferInfo[] wafers = waferData.Value as RTDefine.WaferInfo[];
  45. if (wafers == null)
  46. continue;
  47. ModuleInfo info = _mapWaferDataModule[waferData.Key];
  48. if (info.WaferManager.Wafers.Count == 0)
  49. {
  50. for (int i = 0; i < wafers.Length; i++)
  51. {
  52. info.WaferManager.Wafers.Add(WaferInfoConverter(wafers[i], info.WaferModuleID, i));
  53. }
  54. if (info.IsWaferReverseDisplay)
  55. {
  56. info.WaferManager.Wafers = new ObservableCollection<WaferInfo>(info.WaferManager.Wafers.Reverse());
  57. }
  58. continue;
  59. }
  60. if (wafers.Length == info.WaferManager.Wafers.Count)
  61. {
  62. int index;
  63. for (int i = 0; i < wafers.Length; i++)
  64. {
  65. if (info.IsWaferReverseDisplay)
  66. index = wafers.Length - i - 1;
  67. else
  68. index = i;
  69. var convertedWafer = WaferInfoConverter(wafers[index], info.WaferModuleID, index);
  70. info.WaferManager.Wafers[i].WaferStatus = convertedWafer.WaferStatus;
  71. info.WaferManager.Wafers[i].WaferID = convertedWafer.WaferID;
  72. info.WaferManager.Wafers[i].SourceName = convertedWafer.SourceName;
  73. info.WaferManager.Wafers[i].WaferType = convertedWafer.WaferType;
  74. info.WaferManager.Wafers[i].UseCount = convertedWafer.UseCount;
  75. info.WaferManager.Wafers[i].UseTime = convertedWafer.UseTime;
  76. info.WaferManager.Wafers[i].UseThick = convertedWafer.UseThick;
  77. info.WaferManager.Wafers[i].Thick = convertedWafer.Thick;
  78. info.WaferManager.Wafers[i].LotId = convertedWafer.LotId;
  79. info.WaferManager.Wafers[i].ProcessJobID = convertedWafer.ProcessJobID;
  80. }
  81. }
  82. }
  83. }));
  84. }
  85. }
  86. catch (Exception ex)
  87. {
  88. LOG.Error(ex.Message);
  89. }
  90. return true;
  91. }
  92. private WaferInfo WaferInfoConverter(RTDefine.WaferInfo awafer, string modid, int slotid)
  93. {
  94. WaferInfo wafer = new WaferInfo();
  95. wafer.ModuleID = modid;
  96. wafer.SlotID = slotid;
  97. wafer.SlotIndex = slotid + 1;
  98. wafer.WaferID = awafer.WaferID;
  99. wafer.SourceName = awafer.WaferOrigin;
  100. wafer.WaferStatus = WaferStatusConverter(awafer);
  101. wafer.WaferType = awafer.WaferType;
  102. wafer.UseCount = awafer.UseCount;
  103. wafer.UseThick = awafer.UseThick;
  104. wafer.Thick = awafer.Thick;
  105. wafer.UseTime = awafer.UseTime;
  106. wafer.LotId = awafer.LotId;
  107. wafer.ProcessJobID = awafer.ProcessJobID;
  108. return wafer;
  109. }
  110. //0: no wafer
  111. //1:light blue == idle no pj
  112. //2:blue = idle with pj
  113. //3:cyan = in process
  114. //4:green = complete
  115. //5:error = error
  116. //6:dummy
  117. //7:warning = has error
  118. //8:partial processed
  119. //9:abort
  120. private int WaferStatusConverter(RTDefine.WaferInfo awafer)
  121. {
  122. if (awafer.Status == RTDefine.WaferStatus.Empty)
  123. return 0;
  124. if (awafer.Status == RTDefine.WaferStatus.Normal)
  125. {
  126. switch (awafer.ProcessState)
  127. {
  128. case RTDefine.EnumWaferProcessStatus.InProcess: return 3;
  129. case RTDefine.EnumWaferProcessStatus.Completed: return awafer.HasError ? 5 :(awafer.HasWarning?7:4);
  130. case RTDefine.EnumWaferProcessStatus.Failed: return 5;
  131. case RTDefine.EnumWaferProcessStatus.Wait: return 3;
  132. case RTDefine.EnumWaferProcessStatus.Idle: return awafer.ProcessJob == null ? 1 : 2;
  133. case RTDefine.EnumWaferProcessStatus.Abort: return 9;
  134. }
  135. }
  136. if (awafer.Status == RTDefine.WaferStatus.Dummy)
  137. {
  138. return 6;
  139. }
  140. return 5;
  141. }
  142. }
  143. }