using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using Aitex.Sorter.Common; using Venus_RT.Devices; using MECF.Framework.Common.Routine; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; using Venus_Core; using Aitex.Core.RT.Log; using Aitex.Core.Util; using MECF.Framework.Common.Schedulers; using System.Collections.Generic; using Venus_RT.Devices.EFEM; namespace Venus_RT.Modules.EFEM { class EfemHomeRoutine : ModuleRoutineBase, IRoutine { private enum HomeStep { ClearError, InitRobot, HomeAllAxes, CheckWaferPresence, End, } private enum HomeModuleStep { Home, End, } private int _homeTimeout = 30 * 1000; ModuleName _targetModule; EfemBase _efem; public EfemHomeRoutine(EfemBase efem) : base(ModuleName.EfemRobot) { _efem = efem; } public RState Start(params object[] objs) { _targetModule = (ModuleName)objs[0]; _homeTimeout = SC.GetValue($"EFEM.HomeTimeout") * 1000; return Runner.Start(Module, $"Home {_targetModule}"); } public RState Monitor() { if(_targetModule == ModuleName.System) { Runner.Run((int)HomeStep.ClearError, ClearError, IsStepComplete, _homeTimeout) .Run((int)HomeStep.InitRobot, HomeAll, IsStepComplete, _homeTimeout) .Run((int)HomeStep.HomeAllAxes, HomeAllAxes, IsStepComplete, _homeTimeout) .Run((int)HomeStep.CheckWaferPresence, CheckWaferPresence, IsStepComplete, _homeTimeout) .End((int)HomeStep.End, NullFun, _delay_50ms); } else { Runner.Run((int)HomeModuleStep.Home, HomeModule, IsStepComplete, _homeTimeout) .End((int)HomeModuleStep.End, NullFun, _delay_50ms); } return Runner.Status; } public void Abort() { } private bool IsStepComplete() { if (_efem.Status == RState.End) { return true; } else if (_efem.Status != RState.Running) { LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Efem home failed: {_efem.Status}"); return true; } else return false; } private bool ClearError() { return _efem.ClearError(); } private bool HomeAll() { return _efem.HomeAll(); } private bool HomeModule() { return _efem.Home(_targetModule); } private bool HomeAllAxes() { return true; } private bool CheckWaferPresence() { return true; } } }