using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace YG.Device
{
    /// 
    /// 设备状态
    /// 
    public enum DeviceState
    {
        /// 
        /// 运行中
        /// 
        Runing,
        /// 
        /// 准备就绪
        /// 
        Start,
        /// 
        /// 停止 
        /// 
        Stop,
    }
    /// 
    /// 发送状态
    /// 
    public enum SendState
    {
        /// 
        /// 准备发送
        /// 
        StartSend,
        /// 
        /// 发送了请求,没有回应
        /// 
        SendNoReceive,
        /// 
        /// 已回应
        /// 
        Received
    }
    interface InterfacleDevice
    {
        /// 
        /// 初始化设备
        /// 
        void DeviceInit();
        /// 
        /// 打开设备
        /// 
        void DeviceOpen();
        /// 
        /// 关闭设备
        /// 
        void DeviceClose();
        /// 
        /// 设备检测
        /// 
        void DeviceCheck();
        void DeviceStart();
    }
    public abstract class DeviceList : InterfacleDevice
    {
        /// 
        /// 设备类型
        /// 
        public DeviceType Dtype { get; set; } =  DeviceType.其他;
        /// 
        /// 设备运行状态
        /// 
        /// 
        /// 
        public delegate void RunState(string enumDeviceList, bool ison);
        /// 
        /// 设备运行状态
        /// 
        public virtual event RunState rState;
        /// 
        /// 接受设备反馈指令
        /// 
        /// 
        /// 
        /// 
        public delegate void RunMessage(string obje1,string obje2, string obje3);
        public virtual object Clone()
        {
            return this.MemberwiseClone();
        }
        /// 
        /// 设备正常运行
        /// 
        public virtual bool IsOn { get; set; }
        /// 
        /// 事件
        /// 
        public virtual event RunMessage Msg;
        /// 
        /// 超时时间
        /// 
        public int timeout { get; set; } = 2500;
        /// 
        /// 发送的内容
        /// 
        public string SendValue { get; set; } = "";
        public DeviceList(string name)
        {
            DeviceName = name;
        }
        public DeviceList()
        {
            DeviceName = "";
        }
        /// 
        /// 设备名称
        /// 
        public virtual string DeviceName { get; set; }
        public virtual string ServerUrl { get; set; } 
        public virtual string Ip { get; set; }
        public virtual string ReadType { get; set; }
        public virtual void DeviceClose()
        {
            Console.WriteLine(this.DeviceName+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + this.DeviceName + "关闭");
            if (Msg != null)
            {
                Msg(this.DeviceName,"", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")+ this.DeviceName + "关闭");
            }
        }
        public virtual void DeviceInit() {
            Console.WriteLine(this.DeviceName+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + this.DeviceName + "初始化");
            if (Msg != null)
            {
                Msg(this.DeviceName,"", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + this.DeviceName + "初始化");
            }
        }
        public virtual T DeviceRead(string value,ushort leng=0)
        {
            return default(T);
        }
        public virtual void DeviceOpen() {
            Console.WriteLine(this.DeviceName+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + this.DeviceName + "打开");
            if (Msg != null)
            {
                Msg(this.DeviceName,"",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + this.DeviceName + "打开");
            }
        }
        /// 
        /// 设备运行状态
        /// 
       
        public virtual void DeviceSend(object ob)
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + this.DeviceName + "发送一次数据");
            Log.Instance.WriteLogAdd(this.DeviceName + "发送一次数据"+ob.ToString());
            if (Msg != null)
            {
                Msg(this.DeviceName, ob.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + this.DeviceName + "发送一次数据");
            }
        }
        public virtual void DeviceSend(object ob, object ob1)
        {
            Console.WriteLine(this.DeviceName+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + ob.ToString()+" "+ob1.ToString());
        }
        public virtual void DeviceSend(object ob, object ob1,string readType)
        {
            Console.WriteLine(this.DeviceName + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + ob.ToString() + " " + ob1.ToString());
        }
        public virtual void DeviceCheck() { }
        public virtual void PrintMsg()
        {
            
        }
        public virtual void DeviceStart() { }
        public virtual void DeviceState()
        { }
             
    }
}