|
@@ -0,0 +1,294 @@
|
|
|
+using Aitex.Core.Common;
|
|
|
+using Aitex.Core.RT.Event;
|
|
|
+using Aitex.Core.UI.Control;
|
|
|
+using Aitex.Core.Util;
|
|
|
+using MECF.Framework.Common.Equipment;
|
|
|
+using MECF.Framework.Common.Jobs;
|
|
|
+using MECF.Framework.Common.SubstrateTrackings;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using System.Windows.Controls;
|
|
|
+using Venus_RT.FAs;
|
|
|
+using Venus_RT.HostWrapper;
|
|
|
+
|
|
|
+namespace Venus_RT.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<ModuleName, string> PortJobWaferStart = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1JobWaferStart},
|
|
|
+ {ModuleName.LP2, Port2JobWaferStart},
|
|
|
+ };
|
|
|
+
|
|
|
+ private Dictionary<ModuleName, string> PortJobWaferEnd = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1JobWaferEnd},
|
|
|
+ {ModuleName.LP2, Port2JobWaferEnd},
|
|
|
+ };
|
|
|
+
|
|
|
+ private Dictionary<ModuleName, string> PortJobStarted = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1JobStarted},
|
|
|
+ {ModuleName.LP2, Port2JobStarted},
|
|
|
+ };
|
|
|
+
|
|
|
+ private Dictionary<ModuleName, string> PortJobStopped = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1JobStopped},
|
|
|
+ {ModuleName.LP2, Port2JobStopped},
|
|
|
+ };
|
|
|
+ private Dictionary<ModuleName, string> PortJobPaused = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1JobPaused},
|
|
|
+ {ModuleName.LP2, Port2JobPaused},
|
|
|
+ };
|
|
|
+ private Dictionary<ModuleName, string> PortJobResumed = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1JobResumed},
|
|
|
+ {ModuleName.LP2, Port2JobResumed},
|
|
|
+ };
|
|
|
+ private Dictionary<ModuleName, string> PortJobAborted = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1JobAborted},
|
|
|
+ {ModuleName.LP2, Port2JobAborted},
|
|
|
+ };
|
|
|
+ private Dictionary<ModuleName, string> PortJobFinished = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1JobFinished},
|
|
|
+ {ModuleName.LP2, Port2JobFinished},
|
|
|
+ };
|
|
|
+ private Dictionary<ModuleName, string> PortJobFailed = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1JobFailed},
|
|
|
+ {ModuleName.LP2, Port2JobFailed},
|
|
|
+ };
|
|
|
+ private Dictionary<ModuleName, string> PortSequenceSelected = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1SequenceSelected},
|
|
|
+ {ModuleName.LP2, Port2SequenceSelected},
|
|
|
+ };
|
|
|
+ private Dictionary<ModuleName, string> PortSequenceSelectFailed = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, Port1SequenceSelectFailed},
|
|
|
+ {ModuleName.LP2, Port2SequenceSelectFailed},
|
|
|
+ };
|
|
|
+
|
|
|
+ private Dictionary<ModuleName, string> PortId = new Dictionary<ModuleName, string>()
|
|
|
+ {
|
|
|
+ {ModuleName.LP1, "1"},
|
|
|
+ {ModuleName.LP2, "2"},
|
|
|
+ };
|
|
|
+ public SchedulerFACallback()
|
|
|
+ {
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1JobStarted, Port1JobStarted));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1JobStopped, Port1JobStopped));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1JobPaused, Port1JobPaused));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1JobResumed, Port1JobResumed));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1JobAborted, Port1JobAborted));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1JobFinished, Port1JobFinished));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1JobFailed, Port1JobFailed));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1SequenceSelected, Port1SequenceSelected));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1SequenceSelectFailed, Port1SequenceSelectFailed));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1JobWaferStart, Port1JobWaferStart));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port1JobWaferEnd, Port1JobWaferEnd));
|
|
|
+
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobStarted, Port2JobStarted));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobStopped, Port2JobStopped));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobPaused, Port2JobPaused));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobResumed, Port2JobResumed));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobAborted, Port2JobAborted));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobFinished, Port2JobFinished));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobFailed, Port2JobFailed));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2SequenceSelected, Port2SequenceSelected));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2SequenceSelectFailed, Port2SequenceSelectFailed));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobWaferStart, Port2JobWaferStart));
|
|
|
+ FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobWaferEnd, Port2JobWaferEnd));
|
|
|
+ }
|
|
|
+ public void JobCreated(ControlJobInfo cj, ProcessJobInfo pj)
|
|
|
+ {
|
|
|
+ ModuleName module = ModuleHelper.Converter(cj.Module);
|
|
|
+
|
|
|
+ FaEvent.FaNotify(PortSequenceSelected[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {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);
|
|
|
+
|
|
|
+ FaEvent.FaNotify(PortSequenceSelectFailed[moduleName], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {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);
|
|
|
+ FaEvent.FaNotify(PortJobStarted[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {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);
|
|
|
+
|
|
|
+ FaEvent.FaNotify(PortJobStopped[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {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);
|
|
|
+
|
|
|
+ FaEvent.FaNotify(PortJobPaused[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {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);
|
|
|
+
|
|
|
+ FaEvent.FaNotify(PortJobResumed[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {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);
|
|
|
+
|
|
|
+ FaEvent.FaNotify(PortJobAborted[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {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;
|
|
|
+ FaEvent.FaNotify(PortJobFinished[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {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);
|
|
|
+
|
|
|
+ FaEvent.FaNotify(PortJobFailed[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {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);
|
|
|
+
|
|
|
+ FaEvent.FaNotify(PortJobWaferStart[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {DVIDName.LotID, pj.LotName},
|
|
|
+ {DVIDName.JobID, pj.ControlJobName},
|
|
|
+ {DVIDName.PortID, PortId[module] },
|
|
|
+ {DVIDName.SlotID, (slotID+1).ToString() },
|
|
|
+ {DVIDName.CarrierID, cj.CarrierID.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);
|
|
|
+
|
|
|
+ FaEvent.FaNotify(PortJobWaferEnd[module], new SerializableDictionary<string, string>()
|
|
|
+ {
|
|
|
+ {DVIDName.LotID, pj.LotName},
|
|
|
+ {DVIDName.JobID, pj.ControlJobName},
|
|
|
+ {DVIDName.PortID, PortId[module] },
|
|
|
+ {DVIDName.SlotID, (slotID+1).ToString() },
|
|
|
+ {DVIDName.CarrierID, cj.CarrierID.ToString()},
|
|
|
+ {DVIDName.WaferProcessResult, (wafer.ProcessState == EnumWaferProcessStatus.Failed ? 0:1).ToString()}
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|