using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; using static InnovEnergy.Lib.Protocols.Modbus.Protocol.FunctionCode; namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Replies; internal class WriteRegistersResponseFrame : ModbusFrame { private const Int32 Size = 6; public MbWord WriteAddress => Data.WordAt(2); public MbWord NbWritten => Data.WordAt(4); internal static Int32 ExpectedSize() => Size; public WriteRegistersResponseFrame(Byte slave, UInt16 writeAddress, UInt16 nbWritten) : base(Size) { SlaveAddress.Set(slave); FunctionCode.Set(WriteMultipleRegisters); WriteAddress.Set(writeAddress); NbWritten .Set(nbWritten); } private WriteRegistersResponseFrame(Byte[] data) : this (new ArraySegment(data) ) { } private WriteRegistersResponseFrame(ArraySegment data) : base(data) { if (data.Count != Size) throw new ArgumentException($"Expecting an array of size {Size}", nameof(data)); AssertFunctionCode(WriteMultipleRegisters); } public static WriteRegistersResponseFrame Parse(ArraySegment data) => new WriteRegistersResponseFrame(data); public static WriteRegistersResponseFrame Parse(Byte[] data) => new WriteRegistersResponseFrame(data); public static WriteRegistersResponseFrame Parse(ModbusFrame frame) => new WriteRegistersResponseFrame(frame.Data); }