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, uint indicator, uint count) : base(session, indicator, false) { Count = count; tempvalue = new T[Count]; } 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, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (byte): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (sbyte): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (short): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (ushort): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (int): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (uint): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (long): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (ulong): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (float): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref values[0]), Count)); break; case (double): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, 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, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (byte): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (sbyte): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case short: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (ushort): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (int): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (uint): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (long): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (ulong): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (float): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; case (double): _Session.CheckResult(_Session.GetDelegate()(_Session.Session, Indicator, ref Unsafe.As(ref tempvalue[0]), Count)); break; } return tempvalue; } } public uint Count { get; } public T[] Values { get => GetValues(); set => SetValue(value); } } }