using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.Serialization; using Aitex.Core.Common; using Aitex.Core.Util; using MECF.Framework.Common.CommonData; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Utilities; namespace MECF.Framework.Common.SubstrateTrackings { public enum ProcessJobStateEnum { pjCREATED = -1, pjQUEUED = 0, pjSETTING_UP = 1, pjWAITING_FOR_START = 2, pjPROCESSING = 3, pjPROCESS_COMPLETED = 4, pjRESERVED5 = 5, pjPAUSING = 6, pjPAUSED = 7, pjSTOPPING = 8, pjABORTING = 9, pjSTOPPED = 10, pjABORTED = 11, pjPROCESSJOB_COMPLETED = 12, } public enum CarrierStatus { Empty = 0, Normal = 1, [Description("NOFOUP")] NOFOUP = 5, [Description("READY")] READY = 10, [Description("W.CHARG")] WCHARG = 20, [Description("ON.BOAT")] ONBOAT = 30, [Description("W.DCHRG")] WDCHRG = 40, [Description("PRC.END")] PRCEND = 50, [Description("SERRE_1")] SERRE1 = 60, [Description("SERRE_2")] SERRE2 = 70, [Description("SERRE_3")] SERRE3 = 80, [Description("MOVECST")] MOVECST = 90, [Description("TRAKCST")] TRAKCST = 100, [Description("MAPPING")] MAPPING = 110, } public enum CarrierType { None, P,//Production wafer M,//Monitor wafer M1,//Monitor wafer M2,//Monitor wafer SD,//Side dummy wafer ED,//Extra dummy wafer XD,//Expert dummy wafer T,//Test wafer } [Serializable] [DataContract] public class CarrierInfo : NotifiableItem { public bool IsEmpty { get { return Status == CarrierStatus.Empty; } } private CarrierStatus status; [DataMember] public CarrierStatus Status { get { return status; } set { status = value; InvokePropertyChanged(nameof(Status)); } } [DataMember] public Guid InnerId { get; set; } [DataMember] public string Name { get; set; } public object ProcessJob; [DataMember] public string CarrierId { get; set; } [DataMember] public int StockerIndex { get; set; } [DataMember] public string Rfid { get; set; } [DataMember] public string LotId { get; set; } [DataMember] public string ProductCategory { get; set; } [DataMember] public WaferInfo[] Wafers { get; set; } [DataMember] public SerializableDictionary ProcessStatus { get; set; } [DataMember] public SerializableDictionary Attributes { get; set; } [DataMember] public bool IsStart { get; set; } [DataMember] public DateTime LoadTime { get; set; } [DataMember] public string JobSelectedRecipeName { get; set; } [DataMember] public int Priority { get; set; } [DataMember] public ModuleName InternalModuleName { get; set; } //For Internal carrier only [DataMember] public WaferSize CarrierWaferSize { get; set; } [DataMember] public bool IsProcessCompleted { get; set; } [DataMember] public bool IsVertical { get; set; } [DataMember] public bool HasWaferIn { get; set; } [DataMember] public int NextSequenceStep { get; set; } [DataMember] public CarrierType CarrierType { get; set; } [DataMember] public bool IsMapped { get; set; } [DataMember] public bool IsMapOK { get; set; } [DataMember] public int PortID { get; set; } public int WaferCount { get { return Wafers.Where(x => x != null && !x.IsEmpty).ToArray().Length; } } public object Job { get; set; } [DataMember] public string UICarrierType { get; set; } = "P1"; [DataMember] public bool UICarrierTypeVisibility { get; set; } = true; [DataMember] public string UICarrierWaferCount { get; set; } = "(0)"; [DataMember] public bool UICarrierWaferCountVisibility { get; set; } = true; [DataMember] public string UICarrierStatus { get { return UICarrierStatusEnum.ToDescription(); } set { } } [DataMember] public CarrierStatus UICarrierStatusEnum { get; set; } [DataMember] public bool UICarrierStatusVisibility { get; set; } = true; [DataMember] public string UICarrierColor { get; set; } = "#ccc"; [DataMember] public bool UICarrierColorVisibility { get; set; } = true; [DataMember] public bool UIStockerExitFoup { get; set; } = false; [DataMember] public bool UIExitFoup { get; set; } = false; public T GetProcessJob() { return (T)ProcessJob; } public bool IsProcessed(string module) { return ProcessStatus.ContainsKey(module) && ProcessStatus[module]; } public void Clear() { this.Status = CarrierStatus.Empty; this.InnerId = Guid.Empty; this.ProcessJob = null; this.Name = ""; this.IsStart = false; this.CarrierId = ""; this.Rfid = ""; this.JobSelectedRecipeName = ""; this.LotId = ""; this.ProductCategory = ""; this.ProcessStatus = new SerializableDictionary(); this.Attributes = new SerializableDictionary(); this.Priority = 0; this.HasWaferIn = false; this.IsProcessCompleted = false; this.IsVertical = false; this.NextSequenceStep = -1; this.Job = null; this.CarrierType = CarrierType.None; this.IsMapped = false; this.IsMapOK = false; this.UICarrierColor = "#ccc"; this.UICarrierColorVisibility = true; this.UICarrierStatus = CarrierStatus.READY.ToDescription(); this.UICarrierStatusEnum = CarrierStatus.READY; this.UICarrierStatusVisibility = true; this.UICarrierType = "P1"; this.UICarrierTypeVisibility = true; this.UICarrierWaferCount = "(0)"; this.UICarrierWaferCountVisibility = true; this.UIStockerExitFoup = false; this.UIExitFoup = false; this.PortID = 0; } public CarrierInfo(int capacity) { List waferList = new List(); for (int i = 0; i < capacity; i++) { waferList.Add(new WaferInfo((i+1).ToString())); } Wafers = waferList.ToArray(); InnerId = Guid.Empty; Status = CarrierStatus.Empty; ProcessStatus = new SerializableDictionary(); Attributes = new SerializableDictionary(); } public void CopyInfo(CarrierInfo source) { this.CarrierId = source.CarrierId; this.InnerId = source.InnerId; this.Attributes = source.Attributes; this.CarrierId = source.CarrierId; this.Rfid = source.Rfid; this.IsStart = source.IsStart; this.JobSelectedRecipeName = source.JobSelectedRecipeName; this.LoadTime = source.LoadTime; this.LotId = source.LotId; this.Name = source.Name; this.ProcessStatus = source.ProcessStatus; this.Status = source.status; this.ProductCategory = source.ProductCategory; this.Wafers = source.Wafers; this.ProcessJob = source.ProcessJob; this.Priority = source.Priority; this.CarrierWaferSize = source.CarrierWaferSize; this.InternalModuleName = source.InternalModuleName; this.HasWaferIn = source.HasWaferIn; this.IsProcessCompleted = source.IsProcessCompleted; this.IsVertical = source.IsVertical; this.NextSequenceStep = source.NextSequenceStep; this.Job = source.Job; this.CarrierType = source.CarrierType; this.IsMapped = source.IsMapped; this.IsMapOK = source.IsMapOK; this.UICarrierColor = source.UICarrierColor; this.UICarrierColorVisibility = source.UICarrierColorVisibility; this.UICarrierStatus = source.UICarrierStatus; this.UICarrierStatusVisibility = source.UICarrierStatusVisibility; this.UICarrierType = source.UICarrierType; this.UICarrierTypeVisibility = source.UICarrierTypeVisibility; this.UICarrierWaferCount = source.UICarrierWaferCount; this.UICarrierWaferCountVisibility = source.UICarrierWaferCountVisibility; this.UIStockerExitFoup = source.UIStockerExitFoup; this.UICarrierStatusEnum = source.UICarrierStatusEnum; this.UIExitFoup = source.UIExitFoup; this.PortID = source.PortID; } } }