using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using Aitex.Core.Util;
using PunkHPX8_Core;
using PunkHPX8_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 PunkHPX8_RT.Modules.EFEM
{
    public class EfemSafeCloseRoutine : ModuleRoutineBase, IRoutine
    {
        private enum SafeCloseStep
        {
            Close,
            Resume,
            ResumeSignalCheck,
            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(); },_delay_1ms)
                  .Wait(SafeCloseStep.ResumeSignalCheck, CheckResumeDone)
                  .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()
        {
            return _efem.IsActionRDYReceived;
        }
        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");
        }
    }
}