using Aitex.Core.RT.Device;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Routine;
using CyberX8_Core;
using CyberX8_RT.Devices.AXIS;
using CyberX8_RT.Devices.PUF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CyberX8_RT.Modules.Transporter
{
    public class TransporterSwitchOffRoutine : RoutineBase, IRoutine
    {
        private enum SwitchOffStep
        {
            Vertical,
            Gantry,
            End
        }
        #region 憅郹揘量
        private JetAxisBase _gantryAxis;
        private JetAxisBase _elevatorAxis;
        private int _timeOut = 6000;
        #endregion
        public TransporterSwitchOffRoutine(string module) : base(module)
        {
        }

        public void Abort()
        {
            Runner.Stop("Manual Abort");
        }

        public RState Monitor()
        {
            Runner.Run(SwitchOffStep.Vertical, VerticalAxisSwitchOff, CheckVerticalSwitchOff, _timeOut)
                .Run(SwitchOffStep.Gantry, GantryAxisSwitchOff, CheckGantrySwitchOff, _timeOut)
                .End(SwitchOffStep.End,NullFun);

            return Runner.Status; 
        }
       
        private bool VerticalAxisSwitchOff()
        {
            _elevatorAxis.SwitchOff();
            return true;
        }

        private bool CheckVerticalSwitchOff()
        {
            return !_elevatorAxis.IsSwitchOn;
        }

        private bool GantryAxisSwitchOff()
        {
            _gantryAxis.SwitchOff();
            return true;
        }
        private bool CheckGantrySwitchOff()
        {
            return !_gantryAxis.IsSwitchOn;
        }

        public RState Start(params object[] objs)
        {
            _gantryAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Gantry");
            _elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Elevator");
            Runner.Start(Module, "SwitchOff");
            return RState.Running;
        }
    }
}