123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Linq;
- using System.Threading;
- using System.Windows;
- using System.Windows.Threading;
- using Aitex.Core.RT.Log;
- using Aitex.Core.Util;
- using MECF.Framework.Common.DataCenter;
- using MECF.Framework.Common.OperationCenter;
- using RTDefine = Aitex.Core.Common;
-
- namespace MECF.Framework.UI.Client.ClientBase
- {
- public class ModuleDataMonitor
- {
- public Dictionary<string, ModuleInfo> _mapWaferDataModule = new Dictionary<string, ModuleInfo>();
- public List<string> _lstWaferDataName = new List<string>();
- private PeriodicJob _monitorThread;
- public ModuleDataMonitor()
- {
- foreach (var moduleInfo in ModuleManager.ModuleInfos)
- {
- if (!string.IsNullOrEmpty(moduleInfo.Value.WaferDataName))
- {
- _lstWaferDataName.Add(moduleInfo.Value.WaferDataName);
- _mapWaferDataModule[moduleInfo.Value.WaferDataName] = moduleInfo.Value;
- }
- }
- _monitorThread = new PeriodicJob(500, OnTimer, "Monitor Module Data Thread", true);
- }
- private bool OnTimer()
- {
- try
- {
- var changeModule = QueryDataClient.Instance.Service.GetData("System.ChangeWafers");
- if (changeModule is Dictionary<string, bool> module && module?.Count > 0)
- {
- var changedModule = module.Where(r => r.Value);
- if (!changedModule.Any()) return true;
- InvokeClient.Instance.Service.DoOperation("System.UpdateWafersNotify", changeModule);
- Dictionary<string, object> data = QueryDataClient.Instance.Service.PollData(changedModule.Select(r => $"{r.Key}.ModuleWaferList"));
- if (data != null && Application.Current != null)
- {
- Application.Current.Dispatcher.Invoke(new Action(() =>
- {
- foreach (var waferData in data)
- {
- if (!_mapWaferDataModule.ContainsKey(waferData.Key))
- continue;
- RTDefine.WaferInfo[] wafers = waferData.Value as RTDefine.WaferInfo[];
- if (wafers == null)
- continue;
- ModuleInfo info = _mapWaferDataModule[waferData.Key];
- if (info.WaferManager.Wafers.Count == 0)
- {
- for (int i = 0; i < wafers.Length; i++)
- {
- info.WaferManager.Wafers.Add(WaferInfoConverter(wafers[i], info.WaferModuleID, i));
- }
- if (info.IsWaferReverseDisplay)
- {
- info.WaferManager.Wafers = new ObservableCollection<WaferInfo>(info.WaferManager.Wafers.Reverse());
- }
- continue;
- }
- if (wafers.Length == info.WaferManager.Wafers.Count)
- {
- int index;
- for (int i = 0; i < wafers.Length; i++)
- {
- if (info.IsWaferReverseDisplay)
- index = wafers.Length - i - 1;
- else
- index = i;
- var convertedWafer = WaferInfoConverter(wafers[index], info.WaferModuleID, index);
- info.WaferManager.Wafers[i].WaferStatus = convertedWafer.WaferStatus;
- info.WaferManager.Wafers[i].WaferID = convertedWafer.WaferID;
- info.WaferManager.Wafers[i].SourceName = convertedWafer.SourceName;
- info.WaferManager.Wafers[i].WaferType = convertedWafer.WaferType;
- info.WaferManager.Wafers[i].UseCount = convertedWafer.UseCount;
- info.WaferManager.Wafers[i].UseTime = convertedWafer.UseTime;
- info.WaferManager.Wafers[i].UseThick = convertedWafer.UseThick;
- info.WaferManager.Wafers[i].Thick = convertedWafer.Thick;
- info.WaferManager.Wafers[i].LotId = convertedWafer.LotId;
- info.WaferManager.Wafers[i].ProcessJobID = convertedWafer.ProcessJobID;
- }
- }
- }
- }));
- }
- }
- }
- catch (Exception ex)
- {
- LOG.Error(ex.Message);
- }
- return true;
- }
- private WaferInfo WaferInfoConverter(RTDefine.WaferInfo awafer, string modid, int slotid)
- {
- WaferInfo wafer = new WaferInfo();
- wafer.ModuleID = modid;
- wafer.SlotID = slotid;
- wafer.SlotIndex = slotid + 1;
- wafer.WaferID = awafer.WaferID;
- wafer.SourceName = awafer.WaferOrigin;
- wafer.WaferStatus = WaferStatusConverter(awafer);
- wafer.WaferType = awafer.WaferType;
- wafer.UseCount = awafer.UseCount;
- wafer.UseThick = awafer.UseThick;
- wafer.Thick = awafer.Thick;
- wafer.UseTime = awafer.UseTime;
- wafer.LotId = awafer.LotId;
- wafer.ProcessJobID = awafer.ProcessJobID;
- return wafer;
- }
- //0: no wafer
- //1:light blue == idle no pj
- //2:blue = idle with pj
- //3:cyan = in process
- //4:green = complete
- //5:error = error
- //6:dummy
- //7:warning = has error
- //8:partial processed
- //9:abort
- private int WaferStatusConverter(RTDefine.WaferInfo awafer)
- {
- if (awafer.Status == RTDefine.WaferStatus.Empty)
- return 0;
- if (awafer.Status == RTDefine.WaferStatus.Normal)
- {
- switch (awafer.ProcessState)
- {
- case RTDefine.EnumWaferProcessStatus.InProcess: return 3;
- case RTDefine.EnumWaferProcessStatus.Completed: return awafer.HasError ? 5 :(awafer.HasWarning?7:4);
- case RTDefine.EnumWaferProcessStatus.Failed: return 5;
- case RTDefine.EnumWaferProcessStatus.Wait: return 3;
- case RTDefine.EnumWaferProcessStatus.Idle: return awafer.ProcessJob == null ? 1 : 2;
- case RTDefine.EnumWaferProcessStatus.Abort: return 9;
- }
- }
- if (awafer.Status == RTDefine.WaferStatus.Dummy)
- {
- return 6;
- }
- return 5;
- }
-
- }
-
- }
|