using NIFPGA.lvbitx; using System.Runtime.CompilerServices; namespace NIFPGA { public sealed class FPGAArrayWriteProperty : FPGABaseProperty where T : unmanaged { private T[] tempvalue = new T[0]; private object lockObject = new object(); internal FPGAArrayWriteProperty(FPGASession session, Register indicator) : base(session, indicator) { Count = indicator.Size; tempvalue = new T[Count]; } public override bool IsArray => true; private void SetValue(T[] values) { lock (lockObject) { if (values.Length != Count || Count ==0) return; T[] oldvalue = GetValues(); bool changed = Enumerable.Range(0, (int)Count).Any(x => !object.Equals(values[x], oldvalue[x])); if (!changed) return; switch (values[0]) { case (bool): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (byte): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (sbyte): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (short): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (ushort): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (int): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (uint): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (long): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (ulong): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (float): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; case (double): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref values[0]), Count)); break; } } } private T[] GetValues() { lock (lockObject) { if (Count == 0) return tempvalue; switch (tempvalue[0]) { case (bool): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (byte): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (sbyte): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case short: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (ushort): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (int): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (uint): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (long): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (ulong): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (float): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (double): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Register, ref Unsafe.As(ref tempvalue[0]), Count)); break; } return tempvalue; } } public uint Count { get; } public T[] Value { get => GetValues(); set => SetValue(value); } } }