using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aitex.Core.Common; using Aitex.Core.RT.Event; using Aitex.Core.Util; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Jobs; using MECF.Framework.Common.SubstrateTrackings; using VirgoRT.HostWrapper; namespace VirgoRT.Modules { public interface ISchedulerFACallback { void JobCreated(ControlJobInfo cj, ProcessJobInfo pj); void JobCreateFailed(string module, string lotID, string jobID, string sequenceID); void JobStarted(ControlJobInfo cj, ProcessJobInfo pj); void JobStopped(ControlJobInfo cj, ProcessJobInfo pj); void JobPaused(ControlJobInfo cj, ProcessJobInfo pj); void JobResumed(ControlJobInfo cj, ProcessJobInfo pj); void JobAborted(ControlJobInfo cj, ProcessJobInfo pj); void JobFinished(ControlJobInfo cj, ProcessJobInfo pj); void JobFailed(ControlJobInfo cj, ProcessJobInfo pj); void JobWaferStart(ControlJobInfo cj, ProcessJobInfo pj, string module, int slotID); void JobWaferEnd(ControlJobInfo cj, ProcessJobInfo pj, string module, int slotID); } public class SchedulerFACallback : ISchedulerFACallback { private const string Port1JobStarted = "Port1JobStarted"; private const string Port1JobStopped = "Port1JobStopped"; private const string Port1JobPaused = "Port1JobPaused"; private const string Port1JobResumed = "Port1JobResumed"; private const string Port1JobAborted = "Port1JobAborted"; private const string Port1JobFinished = "Port1JobFinished"; private const string Port1JobFailed = "Port1JobFailed"; private const string Port1SequenceSelected = "Port1SequenceSelected"; private const string Port1SequenceSelectFailed = "Port1SequenceSelectFailed"; private const string Port1JobWaferStart = "Port1JobWaferStart"; private const string Port1JobWaferEnd = "Port1JobWaferEnd"; private const string Port2JobStarted = "Port2JobStarted"; private const string Port2JobStopped = "Port2JobStopped"; private const string Port2JobPaused = "Port2JobPaused"; private const string Port2JobResumed = "Port2JobResumed"; private const string Port2JobAborted = "Port2JobAborted"; private const string Port2JobFinished = "Port2JobFinished"; private const string Port2JobFailed = "Port2JobFailed"; private const string Port2SequenceSelected = "Port2SequenceSelected"; private const string Port2SequenceSelectFailed = "Port2SequenceSelectFailed"; private const string Port2JobWaferStart = "Port2JobWaferStart"; private const string Port2JobWaferEnd = "Port2JobWaferEnd"; private Dictionary PortJobWaferStart = new Dictionary() { {ModuleName.LP1, Port1JobWaferStart}, {ModuleName.LP2, Port2JobWaferStart}, }; private Dictionary PortJobWaferEnd = new Dictionary() { {ModuleName.LP1, Port1JobWaferEnd}, {ModuleName.LP2, Port2JobWaferEnd}, }; private Dictionary PortJobStarted = new Dictionary() { {ModuleName.LP1, Port1JobStarted}, {ModuleName.LP2, Port2JobStarted}, }; private Dictionary PortJobStopped = new Dictionary() { {ModuleName.LP1, Port1JobStopped}, {ModuleName.LP2, Port2JobStopped}, }; private Dictionary PortJobPaused = new Dictionary() { {ModuleName.LP1, Port1JobPaused}, {ModuleName.LP2, Port2JobPaused}, }; private Dictionary PortJobResumed = new Dictionary() { {ModuleName.LP1, Port1JobResumed}, {ModuleName.LP2, Port2JobResumed}, }; private Dictionary PortJobAborted = new Dictionary() { {ModuleName.LP1, Port1JobAborted}, {ModuleName.LP2, Port2JobAborted}, }; private Dictionary PortJobFinished = new Dictionary() { {ModuleName.LP1, Port1JobFinished}, {ModuleName.LP2, Port2JobFinished}, }; private Dictionary PortJobFailed = new Dictionary() { {ModuleName.LP1, Port1JobFailed}, {ModuleName.LP2, Port2JobFailed}, }; private Dictionary PortSequenceSelected = new Dictionary() { {ModuleName.LP1, Port1SequenceSelected}, {ModuleName.LP2, Port2SequenceSelected}, }; private Dictionary PortSequenceSelectFailed = new Dictionary() { {ModuleName.LP1, Port1SequenceSelectFailed}, {ModuleName.LP2, Port2SequenceSelectFailed}, }; private Dictionary PortId = new Dictionary() { {ModuleName.LP1, "1"}, {ModuleName.LP2, "2"}, }; public SchedulerFACallback() { EV.Subscribe(new EventItem("Event", Port1JobStarted, Port1JobStarted)); EV.Subscribe(new EventItem("Event", Port1JobStopped, Port1JobStopped)); EV.Subscribe(new EventItem("Event", Port1JobPaused, Port1JobPaused)); EV.Subscribe(new EventItem("Event", Port1JobResumed, Port1JobResumed)); EV.Subscribe(new EventItem("Event", Port1JobAborted, Port1JobAborted)); EV.Subscribe(new EventItem("Event", Port1JobFinished, Port1JobFinished)); EV.Subscribe(new EventItem("Event", Port1JobFailed, Port1JobFailed)); EV.Subscribe(new EventItem("Event", Port1SequenceSelected, Port1SequenceSelected)); EV.Subscribe(new EventItem("Event", Port1SequenceSelectFailed, Port1SequenceSelectFailed)); EV.Subscribe(new EventItem("Event", Port1JobWaferStart, Port1JobWaferStart)); EV.Subscribe(new EventItem("Event", Port1JobWaferEnd, Port1JobWaferEnd)); EV.Subscribe(new EventItem("Event", Port2JobStarted, Port2JobStarted)); EV.Subscribe(new EventItem("Event", Port2JobStopped, Port2JobStopped)); EV.Subscribe(new EventItem("Event", Port2JobPaused, Port2JobPaused)); EV.Subscribe(new EventItem("Event", Port2JobResumed, Port2JobResumed)); EV.Subscribe(new EventItem("Event", Port2JobAborted, Port2JobAborted)); EV.Subscribe(new EventItem("Event", Port2JobFinished, Port2JobFinished)); EV.Subscribe(new EventItem("Event", Port2JobFailed, Port2JobFailed)); EV.Subscribe(new EventItem("Event", Port2SequenceSelected, Port2SequenceSelected)); EV.Subscribe(new EventItem("Event", Port2SequenceSelectFailed, Port2SequenceSelectFailed)); EV.Subscribe(new EventItem("Event", Port2JobWaferStart, Port2JobWaferStart)); EV.Subscribe(new EventItem("Event", Port2JobWaferEnd, Port2JobWaferEnd)); } public void JobCreated(ControlJobInfo cj, ProcessJobInfo pj) { ModuleName module = ModuleHelper.Converter(cj.Module); EV.Notify(PortSequenceSelected[module], new SerializableDictionary() { {DVIDName.LotID, pj.LotName}, {DVIDName.JobID, pj.ControlJobName}, {DVIDName.PortID, PortId[module] }, {DVIDName.SequenceID, pj.Sequence.Name } }); } public void JobCreateFailed(string module, string lotID, string jobID, string sequenceID) { ModuleName moduleName = ModuleHelper.Converter(module); EV.Notify(PortSequenceSelectFailed[moduleName], new SerializableDictionary() { {DVIDName.LotID, lotID}, {DVIDName.JobID, jobID}, {DVIDName.PortID, PortId[moduleName] }, {DVIDName.SequenceID, sequenceID } }); } public void JobStarted(ControlJobInfo cj, ProcessJobInfo pj) { ModuleName module = ModuleHelper.Converter(cj.Module); EV.Notify(PortJobStarted[module], new SerializableDictionary() { {DVIDName.LotID, pj.LotName}, {DVIDName.JobID, pj.ControlJobName}, {DVIDName.PortID, PortId[module] }, {DVIDName.SequenceID, pj.Sequence.Name } }); } public void JobStopped(ControlJobInfo cj, ProcessJobInfo pj) { ModuleName module = ModuleHelper.Converter(cj.Module); EV.Notify(PortJobStopped[module], new SerializableDictionary() { {DVIDName.LotID, pj.LotName}, {DVIDName.JobID, pj.ControlJobName}, {DVIDName.PortID, PortId[module] }, {DVIDName.SequenceID, pj.Sequence.Name } }); } public void JobPaused(ControlJobInfo cj, ProcessJobInfo pj) { ModuleName module = ModuleHelper.Converter(cj.Module); EV.Notify(PortJobPaused[module], new SerializableDictionary() { {DVIDName.LotID, pj.LotName}, {DVIDName.JobID, pj.ControlJobName}, {DVIDName.PortID, PortId[module] }, {DVIDName.SequenceID, pj.Sequence.Name } }); } public void JobResumed(ControlJobInfo cj, ProcessJobInfo pj) { ModuleName module = ModuleHelper.Converter(cj.Module); EV.Notify(PortJobResumed[module], new SerializableDictionary() { {DVIDName.LotID, pj.LotName}, {DVIDName.JobID, pj.ControlJobName}, {DVIDName.PortID, PortId[module] }, {DVIDName.SequenceID, pj.Sequence.Name } }); } public void JobAborted(ControlJobInfo cj, ProcessJobInfo pj) { ModuleName module = ModuleHelper.Converter(cj.Module); EV.Notify(PortJobAborted[module], new SerializableDictionary() { {DVIDName.LotID, cj.LotName}, {DVIDName.JobID, cj.Name}, {DVIDName.PortID, PortId[module] }, {DVIDName.SequenceID, "" } }); } public void JobFinished(ControlJobInfo cj, ProcessJobInfo pj) { ModuleName module = ModuleHelper.Converter(cj.Module); int count = pj.SlotWafers.Count; EV.Notify(PortJobFinished[module], new SerializableDictionary() { {DVIDName.LotID, pj.LotName}, {DVIDName.JobID, pj.ControlJobName}, {DVIDName.PortID, PortId[module] }, {DVIDName.SequenceID, pj.Sequence.Name }, {DVIDName.ProcessedWaferCount, count.ToString() }, }); } public void JobFailed(ControlJobInfo cj, ProcessJobInfo pj) { ModuleName module = ModuleHelper.Converter(cj.Module); EV.Notify(PortJobFailed[module], new SerializableDictionary() { {DVIDName.LotID, pj.LotName}, {DVIDName.JobID, pj.ControlJobName}, {DVIDName.PortID, PortId[module] }, {DVIDName.SequenceID, pj.Sequence.Name } }); } public void JobWaferStart(ControlJobInfo cj, ProcessJobInfo pj, string module1, int slotID) { ModuleName module = ModuleHelper.Converter(cj.Module); EV.Notify(PortJobWaferStart[module], new SerializableDictionary() { {DVIDName.LotID, pj.LotName}, {DVIDName.JobID, pj.ControlJobName}, {DVIDName.PortID, PortId[module] }, {DVIDName.SlotID, (slotID+1).ToString() } }); } public void JobWaferEnd(ControlJobInfo cj, ProcessJobInfo pj, string module1, int slotID) { ModuleName module = ModuleHelper.Converter(cj.Module); WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module1), slotID); EV.Notify(PortJobWaferEnd[module], new SerializableDictionary() { {DVIDName.LotID, pj.LotName}, {DVIDName.JobID, pj.ControlJobName}, {DVIDName.PortID, PortId[module] }, {DVIDName.SlotID, (slotID+1).ToString() }, {DVIDName.WaferProcessResult, (wafer.ProcessState==EnumWaferProcessStatus.Failed ? 0:1).ToString()} }); } } }