using AR;
using System;
using System.Windows.Media.Media3D.Converters;
using vmsnet.Configures;

namespace vmsnet
{
    public class DigitalIndicator : JdModbusRTU
    {

        /// <summary>
        /// default value  = 1
        /// </summary>
        public byte SlaveID { get; set; } = 1;  // Slave No 

        public DigitalIndicator(byte slaveID = 0) : base("", new RtuConfigure { BaudRate = 9600, DataBits = 8, StopBits = System.IO.Ports.StopBits.One, Parity = System.IO.Ports.Parity.None })
        {
            SlaveID = slaveID;
         
        }

        public DigitalIndicator(string comPort, RtuConfigure configure, byte slaveId = 0) : base(comPort, configure)
        {
            SlaveID = slaveId;
        }

        /// <summary>
        /// value 값을 디스플레이에 전송합니다.
        /// 전송 주소는 기본 0으로 설정되어 있습니다
        /// 이 명령은 회신값을 체크하고 True를 반환하지 않습니다.
        /// False 반환시에는 장치 상태를 점검 하세요
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool SetKA(int value)
        {
            // Config 에서 가져온 코드
            var valuebuffer = new ushort[20];
            valuebuffer[0] = Convert.ToUInt16(value);
            for (int i = 1; i < valuebuffer.Length; i++) valuebuffer[i] = 0;
            return WriteValue(valuebuffer);

            // 이전 코드
            //var buffer = splitI32(value);
            //return WriteValue(buffer);
        }

        UInt16[] splitI32(Int32 value)
        {
            var hValue = (UInt16)(value >> 16);     // 상위 16 Bit
            var lValue = (UInt16)(value & 0xFFFF);  // 하위 16 Bit
            return new ushort[] { hValue, lValue };
        }

        public bool WriteValue(UInt16[] values)
        {
            if (IsOpen == false)
            {
                ErrorMessage = "포트가 열리지 않았습니다";
                return false;
            }
            if (master == null)
            {
                ErrorMessage = "모드버스가 초기화 되지 않았습니다";
                return false;
            }
            try
            {
                master.WriteMultipleRegisters(this.SlaveID, 0, values);
                return true;
            }
            catch (Exception ex)
            {
                ErrorMessage = ex.Message;
                return false;
            }
        }


    }
}
