using System.Reflection; using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; using InnovEnergy.Lib.Utils; namespace InnovEnergy.Lib.Protocols.Modbus.Reflection; internal readonly struct ModbusBoolean : IAddress { public UInt16 Address => _Attribute.Address; private readonly ModbusBooleanAttribute _Attribute ; private readonly MemberInfo _MemberInfo ; private readonly Object _Record; [Obsolete] public ModbusBoolean() => throw new Exception("Forbidden"); public ModbusBoolean(ModbusBooleanAttribute attribute, MemberInfo memberInfo, Object record) { _Attribute = attribute; _MemberInfo = memberInfo; _Record = record; } public UInt16 SetStatusRecordMemberFromRawModbusValue(Boolean rawBooleanValue) { if (_MemberInfo is FieldInfo fi) { var converted = rawBooleanValue.ConvertTo(fi.FieldType); fi.SetValue(_Record, converted); } else if (_MemberInfo is PropertyInfo pi) { var converted = rawBooleanValue.ConvertTo(pi.PropertyType); pi.SetValue(_Record, converted); } return Address; } public Boolean GetRawModbusValueFromControlRecord() { var value = _MemberInfo switch { FieldInfo fi => fi.GetValue(_Record)!, PropertyInfo pi => pi.GetValue(_Record)!, _ => throw new ArgumentException(nameof(_MemberInfo)) }; return value .CastTo() .ConvertTo(); } }