using Aitex.Core.RT.Routine; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aitex.Core.RT.Log; using MECF.Framework.Common.Equipment; using Aitex.Core.RT.SCCore; using CyberX8_Core; using System.Windows.Controls; namespace CyberX8_RT.Modules.LPs { class LoadPortMapRoutine : ModuleRoutineBase, IRoutine { enum RoutineStep { GotoMapWaitIdle, GotoMap, WaitEFEMIdle, Map, RequestMapWaitIdle, RequestMap, BackWaitIdle, Back, End, } private int _timeout = 0; private LoadPortModule _lpModule; public LoadPortMapRoutine(LoadPortModule lpModule) : base(ModuleHelper.Converter(lpModule.Module)) { _lpModule = lpModule; Name = "Map"; } public RState Start(params object[] objs) { Reset(); _timeout = SC.GetValue("EFEM.LoadPort.MotionTimeout"); Notify($"Start"); return Runner.Start(Module, Name); } public RState Monitor() { Runner.Wait(RoutineStep.GotoMapWaitIdle, () => _lpModule.IsRobotIdle) .Run(RoutineStep.GotoMap,GotoMap,CheckDevice,_timeout*1000) .Wait(RoutineStep.WaitEFEMIdle,()=> _lpModule.IsRobotIdle) .Run(RoutineStep.Map, Map, CheckDevice, _timeout * 1000) .Wait(RoutineStep.RequestMapWaitIdle,()=> _lpModule.IsRobotIdle) .Run(RoutineStep.RequestMap,RequestMap,CheckDevice,_timeout*1000) .Wait(RoutineStep.BackWaitIdle,()=> _lpModule.IsRobotIdle) .Run(RoutineStep.Back,Back,CheckDevice,_timeout*1000) .End(RoutineStep.End, NullFun, _delay_1s); return Runner.Status; } private bool GotoMap() { return _lpModule.JetEfem.GotoMap(Module, Aitex.Sorter.Common.Hand.Blade1); } private bool Map() { Notify($"Start Map {_lpModule.LPDevice.Module}"); _lpModule.LPDevice.Map(); return true; } private bool Back() { return _lpModule.JetEfem.GotoMap(Module, Aitex.Sorter.Common.Hand.Blade1,"RE"); } private bool RequestMap() { return _lpModule.JetEfem.RequestMapResult(Module); } bool CheckDevice() { if (_lpModule.LPDevice.IsError) return false; if (_lpModule.LPDevice.IsBusy) return false; return true; } public void Abort() { Runner.Stop("Manual Abort"); } } }