FPGAFXPWriteProperty.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using FxpConvert.Common;
  2. using NIFPGA.lvbitx;
  3. using System.Runtime.CompilerServices;
  4. namespace NIFPGA
  5. {
  6. public sealed class FPGAFXPWriteProperty: FPGABaseProperty
  7. {
  8. Interop.NiFpgaDll_ReadU64 Read;
  9. Interop.NiFpgaDll_WriteU64 Write;
  10. private object _Lock = new object();
  11. private NiFpga_FxpTypeInfo _TypeInfo;
  12. private IFxpConvert _Convert;
  13. internal FPGAFXPWriteProperty(FPGASession session, Register indicator,IFxpConvert convert) : base(session, indicator)
  14. {
  15. _TypeInfo = indicator.FxpTypeInfo;
  16. _Convert = convert;
  17. Read = _Session.GetDelegate<Interop.NiFpgaDll_ReadU64>();
  18. Write = _Session.GetDelegate<Interop.NiFpgaDll_WriteU64>();
  19. }
  20. private double GetValue()
  21. {
  22. lock (_Lock)
  23. {
  24. ulong value = 0;
  25. double temp = 0;
  26. _Session.CheckResult(Read(_Session.Session, Register, ref value));
  27. _Convert.FxpConvertToDouble(ref value, _TypeInfo, ref temp, 1);
  28. return temp;
  29. }
  30. }
  31. private void SetValue(double value)
  32. {
  33. lock (_Lock)
  34. {
  35. ulong tempul = 0;
  36. _Session.CheckResult(Read(_Session.Session, Register, ref tempul));
  37. ulong temp = 0;
  38. _Convert.DoubleConvertToDxp(ref value, _TypeInfo, ref temp, 1);
  39. if (temp == tempul) return;
  40. var _ = _TypeInfo.wordLength switch
  41. {
  42. var x when x <= 8 => _Session.CheckResult(_Session.GetDelegate<Interop.NiFpgaDll_WriteU8>()(_Session.Session, Register, Unsafe.As<ulong, byte>(ref temp))),
  43. var x when x > 8 && x <= 16 => _Session.CheckResult(_Session.GetDelegate<Interop.NiFpgaDll_WriteU16>()(_Session.Session, Register, Unsafe.As<ulong, ushort>(ref temp))),
  44. var x when x > 16 && x <= 32 => _Session.CheckResult(_Session.GetDelegate<Interop.NiFpgaDll_WriteU32>()(_Session.Session, Register, Unsafe.As<ulong, uint>(ref temp))),
  45. var x when x > 32 && x <= 64 => _Session.CheckResult(_Session.GetDelegate<Interop.NiFpgaDll_WriteU64>()(_Session.Session, Register, temp)),
  46. _ => _Session.CheckResult(_Session.GetDelegate<Interop.NiFpgaDll_WriteU64>()(_Session.Session, Register, temp)),
  47. };
  48. //_Session.CheckResult(Write(_Session.Session, Indicator, temp));
  49. }
  50. }
  51. public double Value { get => GetValue(); set => SetValue(value); }
  52. }
  53. }