using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using Aitex.Core.Util;
using PunkHPX8_Core;
using PunkHPX8_RT.Devices.EFEM;
using PunkHPX8_RT.Modules.SRD;
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 EfemSafeOpenRoutine : ModuleRoutineBase, IRoutine
    {
        private enum SafeOpenStep 
        { 
            Pause,
            PauseSignalCheck,
            Open,
            End
        }
        private EfemEntity _efemEntity;
        EfemBase _efem;
        public EfemSafeOpenRoutine(EfemBase efem) : base(ModuleName.EFEM)
        {
            _efem = efem;
        }
        /// 
        /// 启动
        /// 
        /// 
        /// 
        public RState Start(params object[] objs)
        {
            return Runner.Start(Module, "Save Open");
        }
        /// 
        /// 监控
        /// 
        /// 
        public RState Monitor()
        {
            Runner.Run(SafeOpenStep.Pause, () => { return Pause(); }, _delay_1ms)
                   .Wait(SafeOpenStep.PauseSignalCheck, CheckPauseDone)
                   .Run(SafeOpenStep.Open, () => { return Open(); },_delay_1ms)
                   .End(SafeOpenStep.End, NullFun, 0);
            return Runner.Status;
        }
        /// 
        /// 暂停功能
        /// 
        /// 
        private bool Pause()
        {
            return _efem.Pause();
        }
        /// 
        /// 检查是否Pause
        /// 
        /// 
        private bool CheckPauseDone()
        {
            return _efem.IsPauseRDYReceived;
        }
        private bool Open()
        {
            _efemEntity = Singleton.Instance.GetModule(Module.ToString());
            bool myBool = true;
            return _efemEntity.DoorUnlock(new object[] { myBool });
        }
        public void Abort()
        {
            Runner.Stop("Manual Abort");
        }
    }
}