| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | 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<RouteManager>.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;        }    }}
 |