using System; using System.Collections.Generic; using System.Linq; using System.Text; using Aitex.Core.Common; using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using Aitex.Sorter.Common; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; namespace Aitex.Sorter.RT.Module.Recipe { class RecipeParserTransferNToN : IRecipeParser { public SorterRecipeXml XmlRecipe { get; set; } public bool Init(SorterRecipeXml xmlRecipe, out string reason) { reason = string.Empty; if (xmlRecipe.RecipeType != SorterRecipeType.TransferNToN) { LOG.Write("xml recipe type not valid, " + xmlRecipe.RecipeType); reason = "Recipe xml file not valid"; return false; } XmlRecipe = xmlRecipe; return true; } public List Parse(out string reason) { List result = new List(); reason = string.Empty; SCConfigItem _scEnable = SC.GetConfigItem("LoadPort.EnableSlot1OnLP2"); SCConfigItem _scLP2Pitch = SC.GetConfigItem("LoadPort.LoadPort2Pitch"); if (_scLP2Pitch == null || _scLP2Pitch.IntValue == 10) { foreach (var item in XmlRecipe.TransferItems) { WaferInfo[] wafersInSource = WaferManager.Instance.GetWafers(item.SourceStation); WaferInfo[] wafersInDestination = WaferManager.Instance.GetWafers(item.DestinationStation); if (wafersInSource[item.SourceSlot].IsEmpty || !wafersInDestination[item.DestinationSlot].IsEmpty) continue; result.Add(new TransferInfo() { Angle = item.AlignAngle, Option = (item.IsAlign ? MoveOption.Align : MoveOption.None) | (item.IsReadLaserMarker ? MoveOption.ReadID : MoveOption.None) | (item.IsReadT7Code ? MoveOption.ReadID2 : MoveOption.None) | (XmlRecipe.WaferReaderIndex == 1 ? MoveOption.Reader1 : MoveOption.None) | (XmlRecipe.WaferReaderIndex == 2 ? MoveOption.Reader2 : MoveOption.None) | (XmlRecipe.IsTurnOver ? MoveOption.Turnover : MoveOption.None), SourceSlot = item.SourceSlot, Source = item.SourceStation, Slot = item.DestinationSlot, Station = item.DestinationStation, WaferID = wafersInSource[item.SourceSlot].WaferID, }); } } else { int index = 0; foreach (var item in XmlRecipe.TransferItems) { WaferInfo[] wafersInSource = WaferManager.Instance.GetWafers(item.SourceStation); WaferInfo[] wafersInDestination = WaferManager.Instance.GetWafers(item.DestinationStation); if (wafersInSource[item.SourceSlot].IsEmpty || !wafersInDestination[item.DestinationSlot].IsEmpty || (!_scEnable.BoolValue && item.DestinationStation == ModuleName.LP2 && item.DestinationSlot == 0)|| (item.DestinationStation == ModuleName.LP2 && ((item.DestinationSlot > 0&& !wafersInDestination[item.DestinationSlot-1].IsEmpty)||(index > 0 &&item.DestinationSlot-1== XmlRecipe.TransferItems[index-1].DestinationSlot)))|| (item.SourceStation == ModuleName.LP2 && ((item.SourceSlot > 0 && !wafersInSource[item.SourceSlot - 1].IsEmpty) || (item.SourceSlot - 1 == XmlRecipe.TransferItems[index+1].SourceSlot)))) continue; result.Add(new TransferInfo() { Angle = item.AlignAngle, Option = (item.IsAlign ? MoveOption.Align : MoveOption.None) | (item.IsReadLaserMarker ? MoveOption.ReadID : MoveOption.None) | (item.IsReadT7Code ? MoveOption.ReadID2 : MoveOption.None) | (XmlRecipe.WaferReaderIndex == 1 ? MoveOption.Reader1 : MoveOption.None) | (XmlRecipe.WaferReaderIndex == 2 ? MoveOption.Reader2 : MoveOption.None) | (XmlRecipe.IsTurnOver ? MoveOption.Turnover : MoveOption.None), SourceSlot = item.SourceSlot, Source = item.SourceStation, Slot = item.DestinationSlot, Station = item.DestinationStation, WaferID = wafersInSource[item.SourceSlot].WaferID, }); index++; } } //if (result.Count == 0) // reason = "Recipe has no vaild transfer task."; return result; } } }