54 lines
1.6 KiB
C#
54 lines
1.6 KiB
C#
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<IConvertible>()
|
|
.ConvertTo<Boolean>();
|
|
}
|
|
} |