using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.Util; using CyberX8_Core; using CyberX8_RT.Devices.EFEM; using MECF.Framework.Common.Equipment; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Modules.EFEM { public class EfemSafeCloseRoutine : ModuleRoutineBase, IRoutine { private enum SafeCloseStep { Close, Resume, ResumeActionDoneCheck, End } EfemBase _efem; private EfemEntity _efemEntity; public EfemSafeCloseRoutine(EfemBase efem) : base(ModuleName.EFEM) { _efem = efem; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { return Runner.Start(Module, "Save Close"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(SafeCloseStep.Close, () => { return Close(); }, _delay_1ms) .Run(SafeCloseStep.Resume, () => { return Resume(); }, CheckResumeDone,_delay_1s) .Wait(SafeCloseStep.ResumeActionDoneCheck, ResumeActionDoneCheck) .End(SafeCloseStep.End, NullFun, 0); return Runner.Status; } /// /// 暂停功能 /// /// private bool Resume() { return _efem.Resume(); } /// /// 检查是否收到Resume_rdy /// /// private bool CheckResumeDone() { return _efem.IsResumeRDYReceived; } /// /// 检查Resume动作是否完成 /// /// private bool ResumeActionDoneCheck() { if (_efem.Status == RState.End) { return true; } else if (_efem.Status == RState.Failed) { LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, Module, $"Efem Resume Action failed: {_efem.Status}"); return true; } return false; } private bool Close() { _efemEntity = Singleton.Instance.GetModule(Module.ToString()); bool myBool = false; return _efemEntity.DoorUnlock(new object[] { myBool }); } public void Abort() { Runner.Stop("Manual Abort"); } } }