using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Routine;
using CyberX8_Core;
using CyberX8_RT.Devices.AXIS.CANOpen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Devices.Loader
{
    public class LoaderSideUnloadVacuumLevelCheckRoutine : RoutineBase, IRoutine
    {
        private enum UnloadVacuumLevelStep
        {
            VecuumLevel,
            VecuumLevelCheck,
            ConditionWHBladder,
            ConditionWHBladderCheck,
            ConditionVacuumLevel,
            ConditionVacuumLevelCheck,
            End
        }
        #region 内部变量
        private bool _continue = false;
        private bool _vacuumLevelCheckFailed = false;
        private LoaderSideVacuumLevelCheckRoutine _vacuumLevelCheckRoutine;
        private LoaderSideWhBladderRoutine _whBladderRoutine;
        #endregion
        /// 
        /// 构造函数
        /// 
        /// 
        public LoaderSideUnloadVacuumLevelCheckRoutine(string module) : base(module)
        {
        }
        /// 
        /// 中止
        /// 
        public void Abort()
        {
        }
        /// 
        /// 监控
        /// 
        /// 
        public RState Monitor()
        {
            Runner.Run(UnloadVacuumLevelStep.VecuumLevel, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, NullFun, _delay_1ms)
                .WaitWithStopCondition(UnloadVacuumLevelStep.VecuumLevelCheck, FirstVacuumLevelCheck, () => { return _vacuumLevelCheckFailed; })
                .Run(UnloadVacuumLevelStep.ConditionWHBladder,ConditionWHBladder,_delay_1ms)
                .WaitWithStopCondition(UnloadVacuumLevelStep.ConditionWHBladderCheck,ConditionWHBladderEndStatus,ConditionWHBladderStopStatus)
                .Run(UnloadVacuumLevelStep.ConditionVacuumLevelCheck,ConditionVacuumLevel,_delay_1ms)
                .WaitWithStopCondition(UnloadVacuumLevelStep.ConditionVacuumLevelCheck,ConditionVacuumLevelEndStatus,ConditionVacuumLevelStopStatus)
                .End(UnloadVacuumLevelStep.End,NullFun,100);
            return Runner.Status;
        }
        /// 
        /// 首次VacuumLevel校验
        /// 
        /// 
        private bool FirstVacuumLevelCheck()
        {
            RState state = _vacuumLevelCheckRoutine.Monitor();
            if(state==RState.End)
            {
                return true;
            }
            else if(state==RState.Timeout)
            {
                _continue = true;
                return true;
            }
            else if(state==RState.Failed)
            {
                _vacuumLevelCheckFailed = true;
                return false;
            }
            else
            {
                return false;
            }
        }
        /// 
        /// 条件WHBladder
        /// 
        /// 
        private bool ConditionWHBladder()
        {
            if(_continue)
            {
                return true;
            }
            else
            {
                return _whBladderRoutine.Start(true) == RState.Running;
            }
        }
        /// 
        /// 条件WHBladder检验
        /// 
        /// 
        private bool ConditionWHBladderEndStatus()
        {
            if(_continue)
            {
                return true;
            }
            else
            {
                return _whBladderRoutine.Monitor() == RState.End;
            }
        }
        /// 
        /// 条件WHBladder停止检验
        /// 
        /// 
        private bool ConditionWHBladderStopStatus()
        {
            if (_continue)
            {
                return true;
            }
            else
            {
                RState state = _whBladderRoutine.Monitor();
                return state == RState.Failed || state == RState.Timeout;
            }
        }
        /// 
        /// 条件Vacuum Level
        /// 
        /// 
        private bool ConditionVacuumLevel()
        {
            if (_continue)
            {
                return true;
            }
            else
            {
                return _vacuumLevelCheckRoutine.Start(true) == RState.Running;
            }
        }
        /// 
        /// 条件Vacuum Level
        /// 
        /// 
        private bool ConditionVacuumLevelEndStatus()
        {
            if (_continue)
            {
                return true;
            }
            else
            {
                return _vacuumLevelCheckRoutine.Monitor() == RState.End;
            }
        }
        /// 
        /// 条件Vacuum Level
        /// 
        /// 
        private bool ConditionVacuumLevelStopStatus()
        {
            if (_continue)
            {
                return true;
            }
            else
            {
                RState state = _vacuumLevelCheckRoutine.Monitor();
                return state == RState.Failed || state == RState.Timeout;
            }
        }
        /// 
        /// 启动
        /// 
        /// 
        /// 
        public RState Start(params object[] objs)
        {
            _vacuumLevelCheckRoutine = new LoaderSideVacuumLevelCheckRoutine(Module);
            _whBladderRoutine = new LoaderSideWhBladderRoutine(Module);
            Runner.Start(Module, "UnloadVacuumLevelCheck");
            return RState.Running;
        }
    }
}