using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MECF.Framework.Common.Equipment; using VirgoRT.Scheduler; using Aitex.Core.Util; using Aitex.Core.RT.Fsm; using Aitex.Sorter.Common; namespace VirgoRT.Modules.Schedulers { public class SchedulerFlipper : SchedulerModule { private EfemEntity _entity = null; private int _entityTaskToken = (int)FSM_MSG.NONE; public override bool IsAvailable { get { return _entity.IsIdle && /*_entity.IsOnline && */CheckTaskDone(); } } public SchedulerFlipper(ModuleName flipper) : base(flipper.ToString()) { _task = TaskType.None; _entity = Singleton.Instance.EFEM; EventWaferArrived += WaferArrived; } private void WaferArrived(object sender, EventArgs e) { var eArgs = e as WaferMoveArgs; WaferArriveTicks[eArgs.DstSlot] = DateTime.Now.Ticks; Flip("AlwaysReverse"); } public void Flip(string orient) { _entityTaskToken = _entity.InvokeFlip(orient); if (_entityTaskToken != (int)FSM_MSG.NONE) _task = TaskType.Flip; } private bool CheckTaskDone() { bool ret = false; switch (_task) { case TaskType.Flip: ret = _entity.CheckAcked(_entityTaskToken) && _entity.IsIdle; break; case TaskType.None: ret = true; break; } if (ret && _task != TaskType.None) _task = TaskType.None; return ret; } } }