using Aitex.Core.RT.Device;
using Aitex.Sorter.Common;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.TDK
{
    public class ResetHandler : IMsg
    {
        public bool background { get; private set; }
        public string deviceID { private get; set; }
        public ResetHandler()
        {
            background = true;
        }
        public string package(params object[] args)
        {
            return "SET:RESET";
        }
        public string retry()
        {
            return "RST:RESET";
        }
        public bool unpackage(string type, string[] cmds)
        {
            if (type.Equals("INF"))              
                return true;
            return false;
        }
        public bool canhandle(string id)
        {
            return id.Equals("RESET");
        }
    }
    /// 
    /// 将LoadPort切换为FOSB模式
    /// 
    public class FOSBModeHandler : IMsg
    {
        public bool background { get; private set; }
        public string deviceID { private get; set; }
        public FOSBModeHandler()
        {
            background = true;
        }
        public string package(params object[] args)
        {
            return "SET:FSBON";
        }
        public string retry()
        {
            return "RST:FSBON";
        }
        public bool unpackage(string type, string[] cmds)
        {
            if (type.Equals("INF"))              
                return true;
            return false;
        }
        public bool canhandle(string id)
        {
            return id.Equals("FSBON");
        }
    }
    
    /// 
    /// 将LoadPort切换为FOUP模式
    /// 
    public class FOUPModeHandler : IMsg
    {
        public bool background { get; private set; }
        public string deviceID { private get; set; }
        public FOUPModeHandler()
        {
            background = true;
        }
        public string package(params object[] args)
        {
            return "SET:FSBOF";
        }
        public string retry()
        {
            return "RST:FSBOF";
        }
        public bool unpackage(string type, string[] cmds)
        {
            if (type.Equals("INF"))              
                return true;
            return false;
        }
        public bool canhandle(string id)
        {
            return id.Equals("FSBOF");
        }
    }
    
    public class IndicatorHandler : IMsg
    {
        public bool background { get; private set; }
        public string deviceID { private get; set; }
        private string[] _opstring = { "LON", "LBL", "LOF" };
        private string _cmd =" ";
        Indicator light;
        IndicatorState func;
        public IndicatorHandler()
        {
            background = true;
        }
        public string package(params object[] args)
        {
            light = (Indicator)args[0];
            func = (IndicatorState)args[1];
            _cmd = indicator(light,func);
            return string.Format("SET:{0}", _cmd);
        }
        public string retry()
        {
            return string.Format("RST:{0}", _cmd);
        }
        public bool unpackage(string type, string[] cmds)
        {
            if (type.Equals("INF"))
            {
                SetLight(light,func);
                TDKLoadPort device = DEVICE.GetDevice(deviceID);
                string reason = string.Empty;
       //         device.QueryIndicator(out reason);
                return true;
            }
            return false;
        }
        public bool canhandle(string id)
        {
            return id.Equals(_cmd);
        }
        private string indicator(Indicator light, IndicatorState op)
        {
            return string.Format("{0}{1:D2}", _opstring[(int)op], (int)light);
        }
        private void SetLight(Indicator light, IndicatorState op)
        {
            TDKLoadPort device = DEVICE.GetDevice(deviceID);
            switch (light)
            { 
                case Indicator.LOAD:
                    device.IndicatiorLoad = op;
                    break;
                case Indicator.UNLOAD:
                    device.IndicatiorUnload = op;
                    break;
                case Indicator.OPACCESS:
                    device.IndicatiorOpAccess = op;
                    break;
            }
        }
    }
}