using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aitex.Core.Util; using Aitex.Sorter.Common; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Schedulers; using MECF.Framework.Common.SubstrateTrackings; using VirgoRT.Modules.LPs; using VirgoRT.Scheduler; namespace VirgoRT.Modules.Schedulers { public class SchedulerLoadPort : SchedulerModule { public override bool IsAvailable { get { return _entity.IsReady /*&& _entity.IsOnline*/ && CheckTaskDone(); } } public override bool IsOnline { get { return true; } } public override bool IsError { get { return _entity.IsError; } } private LoadPortModule _entity = null; public SchedulerLoadPort(ModuleName module) : base(module.ToString()) { _module = module.ToString(); _entity = Singleton.Instance.EFEM.LPEntity[module - ModuleName.LP1]; } public bool Load() { //_busy = true; //_entity.Load(_chamber); return true; } public bool Unload() { //_busy = true; //_entity.Unloaded(_chamber); return true; } public bool Monitor() { return true; } public override bool IsReadyForPick(ModuleName robot, int slot, Hand blade) { if (blade == Hand.Both) return _entity.IsPrepareTransferReady(Module, EnumTransferType.Pick, slot) && WaferManager.Instance.CheckHasWafer(ModuleHelper.Converter(_module), slot) && WaferManager.Instance.CheckHasWafer(ModuleHelper.Converter(_module), slot + 1); return _entity.IsPrepareTransferReady(Module, EnumTransferType.Pick, slot) && WaferManager.Instance.CheckHasWafer(ModuleHelper.Converter(_module), slot) && WaferManager.Instance.CheckNoWafer(robot, (int)blade); } public override bool IsReadyForPlace(ModuleName robot, int slot, Hand blade) { return _entity.IsPrepareTransferReady(Module, EnumTransferType.Place, slot) && WaferManager.Instance.CheckNoWafer(ModuleHelper.Converter(_module), slot); } public bool CheckTaskDone() { bool ret = false; switch (_task) { case TaskType.None: ret = true; break; case TaskType.PrepareTransfer: ret = _entity.IsPrepareTransferReady(ModuleName.EfemRobot, EnumTransferType.Pick, 0); break; } if (ret && _task != TaskType.None) { LogTaskDone(_task, ""); _task = TaskType.None; } return ret; } internal bool CheckReadyRunJob() { return _entity.CheckReadyRunNewJob(this.Module); } internal bool CheckReadyTransfer() { return _entity.CheckReadyTransfer(this.Module); } internal bool CheckPlaced() { return _entity.LPDevice.HasCassette; } public void NoteJobStart() { _entity.LPDevice.NoteJobStart(); } public void NoteJobComplete() { _entity.LPDevice.NoteJobComplete(); } public bool CheckOrSetThickness(string thickness, out string s) { if (string.IsNullOrEmpty(_entity.LPDevice.ThicknessType)) { if (thickness == "Thick") _entity.LPDevice.SetThick(); if (thickness == "Thin") _entity.LPDevice.SetThin(); } if (_entity.LPDevice.ThicknessType != thickness) { s = $"Thickness not match, Sequence Set={thickness}, Pod Set={_entity.LPDevice.ThicknessType}"; return false; } s = ""; return true; } } }