using System; using System.Collections.Generic; using System.Linq; using System.Net.Http.Headers; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using FxpConvert.Common; using NIFPGA.lvbitx; namespace NIFPGA { public class ReadFifo:Fifo where T : unmanaged { private object _Lock = new object(); internal ReadFifo(FPGASession session, DMA fifosession) : base(session, fifosession) { } public void Read(ref T value,uint count, uint timeout, ref uint elementsRemaining) { lock (_Lock) { switch (value) { case bool: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case byte: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case sbyte: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case ushort: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case short: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case int: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case uint: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case long: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case ulong: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case float: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; case double: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref Unsafe.As(ref value), count, timeout, ref elementsRemaining)); break; } } } public void ReadAcquire(uint count, uint timeout,ref uint elementsAcquired, ref uint elementsRemaining,ref nint ptr) { lock (_Lock) { T value = default; switch (value) { case bool: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case byte: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case sbyte: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case ushort: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case short: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case int: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case uint: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case long: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case ulong: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case float: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; case double: _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, ref ptr, count, timeout,ref elementsAcquired, ref elementsRemaining)); break; } } } public uint ElementsRemaining { get { T val = default; uint elementsRemaining = 0; Read(ref val, 0, 10, ref elementsRemaining); return elementsRemaining; } } } public class ReadFXPFifo : ReadFifo { private NiFpga_FxpTypeInfo _TypeInfo; private IFxpConvert _Convert; internal ReadFXPFifo(FPGASession session, DMA fifosession, IFxpConvert convert) : base(session, fifosession) { if(convert ==null)throw new ArgumentNullException(nameof(convert)); _Convert = convert; _TypeInfo = fifosession.FxpTypeInfo; } public void Read(ref float value,uint count, uint timeout, ref uint elementsRemaining) { if (count == 0) { ulong[] temp = new ulong[1]; base.Read(ref temp[0], count, timeout, ref elementsRemaining); } else { ulong[] temp = new ulong[count]; base.Read(ref temp[0], count, timeout, ref elementsRemaining); _Convert.FxpConvertToFloat(ref temp[0], _TypeInfo, ref value, count); } } public unsafe void ReadAcquire(ref float value, uint count, uint timeout, ref uint elementsRemaining) { if (count == 0) { ulong[] temp = new ulong[1]; base.Read(ref temp[0], count, timeout, ref elementsRemaining); } else { nint ptr = 0; uint c = 0; base.ReadAcquire(count, timeout,ref c, ref elementsRemaining, ref ptr); if (ptr != 0 && c!=0) { _Convert.FxpConvertToFloat(ref Unsafe.AsRef((void*)ptr), _TypeInfo, ref value, count); _Session.CheckResult(_Session.GetDelegate()(_Session.Session, FifoSession, c)); } } } } }