using BPASmartClient.Peripheral;
using BPASmartClient.Helper;
using BPASmartClient.Message;
using BPASmartClient.EventBus;
using BPASmartClient.Modbus;
using static BPASmartClient.EventBus.EventBus;
using BPASmartClient.Model;
using BPASmartClient.Model.PLC;

namespace BPASmartClient.MORKSM.BK.PLC
{
    public class MorksMachine : BasePeripheral
    {
        ModbusTcp modbusTcp = new ModbusTcp();
        public string IpAddress { get; set; }
        public int Port { get; set; }


        public override void Init()
        {
            //读取数据
            EventBus.EventBus.GetInstance().Subscribe<ReadModel>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
            {
                if (@event == null) return;
                var par = @event as ReadModel;
                ushort address = (ushort)modbusTcp.GetAddress(par?.Address);
                object readData = new object();
                if (par.Address.ToUpper().Contains("M"))
                {
                    //modbusTcp.Read(address, CommandType.Coils, par.Length);
                    modbusTcp.Readbool(address, par.Length, new Action<bool[]>((s) => { readData = s; }));
                }
                else if (par.Address.ToUpper().Contains("VW"))
                {
                    readData = modbusTcp.Read(address, CommandType.HoldingRegisters, par.Length);
                }
                callBack?.Invoke(readData);
                //callBack = new EventCallBackHandle(readData);
            });

            //写入数据
            EventBus.EventBus.GetInstance().Subscribe<WriteModel>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
            {
                if (@event == null) return;
                var par = @event as WriteModel;
                ushort address = (ushort)modbusTcp.GetAddress(par?.Address);
                if (par.Address.ToUpper().Contains("M"))
                {
                    modbusTcp.Write(address, CommandType.Coils, par.Value);
                }
                else if (par.Address.ToUpper().Contains("VW"))
                {
                    modbusTcp.Write(address, CommandType.HoldingRegisters, par.Value);
                }
            });

            ////批量读取数据
            //EventBus.EventBus.GetInstance().Subscribe<>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
            //{

            //});
        }

        public override void Start()
        {
            modbusTcp.ModbusTcpConnect(IpAddress, Port);
        }

        public override void Stop()
        {

        }

        protected override void InitStatus()
        {

        }
    }
}