using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Beckhoff.ModuleIO;
using MECF.Framework.Common.Routine;
using MECF.Framework.Common.TwinCat;
using CyberX8_Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using MECF.Framework.Common.IOCore;

namespace CyberX8_RT.Devices.SRD
{
    public class SrdCommonChuckVacuumRoutine : RoutineBase, IRoutine
    {
        #region 常量 
        private const string CHUCK_VACUUM = "ChuckVacuum";
        #endregion
        private enum ChuckVacuumStep
        {
            ChuckVauum,
            End
        }
        #region 内部变量
        private bool _chuckVacuum;
        private SrdCommonDevice _srdCommon;
        private int _timeout = 2000;
        private int _vacuumOnLimit;
        private int _vacuumOffLimit;
        #endregion
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="module"></param>
        public SrdCommonChuckVacuumRoutine(string module) : base(module)
        {
        }

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

        public RState Monitor()
        {
            Runner.Run(ChuckVacuumStep.ChuckVauum, ChuckVacuum, CheckVacuumStatus, _timeout)
                .End(ChuckVacuumStep.End, NullFun, 100);
            return Runner.Status;
        }

        private bool ChuckVacuum()
        {
            string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{CHUCK_VACUUM}");
            return IOModuleManager.Instance.WriteIoValue(ioName, _chuckVacuum);
        }

        private bool CheckVacuumStatus()
        {
            if (_srdCommon.CommonData.ChuckVacuum == _chuckVacuum)
            {
                if(!_chuckVacuum)
                {
                    LOG.WriteLog(eEvent.INFO_SRD, Module, $"Chuck Vacuum is on, VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOnLimit}");
                    return _srdCommon.CommonData.VacuumValue < _vacuumOnLimit;
                }
                else
                {
                    //LOG.WriteLog(eEvent.INFO_SRD, Module, $"Chuck Vacuum is off, VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}");
                    //return _srdCommon.CommonData.VacuumValue > _vacuumOffLimit;
                    return true;
                }
            }
            else
            {
                LOG.WriteLog(eEvent.INFO_SRD, Module, $"Chuck Vacuum is no equal to _chuckVacuum");
                return false;
            }
        }

        public RState Start(params object[] objs)
        {
            _chuckVacuum = (bool)objs[0];
            _srdCommon = DEVICE.GetDevice<SrdCommonDevice>($"{Module}.Common");
            _vacuumOffLimit = SC.GetValue<int>("SRD.ChuckVacuumOffLimit");
            _vacuumOnLimit = SC.GetValue<int>("SRD.ChuckVacuumOnLimit");
            if (_chuckVacuum)
            {
                return Runner.Start(Module, "Chuck Vacuum Off");
            }
            else
            {
                return Runner.Start(Module, "Chuck Vacuum On");
            }
        }
    }
}