AnalogDataViewModel.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using Shaker.Model;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using OxyPlot;
  8. using System.Collections.ObjectModel;
  9. using ShakerControl.Tools;
  10. using System.Runtime.CompilerServices;
  11. using System.Diagnostics;
  12. namespace ShakerControl.ViewModel
  13. {
  14. public class EigenwertViewModel:ViewModelBase<IModel>
  15. {
  16. private float max;
  17. private float min;
  18. private float avg;
  19. private float rms;
  20. public float Max { get => max; set =>UpdateProperty(ref max , value); }
  21. public float Min { get => min; set =>UpdateProperty(ref min, value); }
  22. public float Avg { get => avg; set =>UpdateProperty(ref avg , value); }
  23. public float Rms { get => rms; set =>UpdateProperty(ref rms , value); }
  24. public unsafe void CalcEigenwert(ref float value,uint len)
  25. { float low = float.MaxValue;
  26. float upper = float.MinValue;
  27. float* ptr = (float*)Unsafe.AsPointer<float>(ref value);
  28. for(uint i=0;i<len;i++)
  29. {
  30. low = low < ptr[i] ? low : ptr[i];
  31. upper = upper > ptr[i] ? upper : ptr[i];
  32. }
  33. Max = upper;
  34. Min = low;
  35. if(len==0)
  36. {
  37. Max = 0;
  38. Min = 0;
  39. Avg = 0;
  40. Rms = 0;
  41. return;
  42. }
  43. Avg = MainWindowViewModel.Default.Calc.Sum.Sum(ref value, len)/len;
  44. Rms = MainWindowViewModel.Default.Calc.Sum.Rms(ref value, len);
  45. }
  46. }
  47. public class AnalogDataViewModel : ViewModelBase<IModel>
  48. {
  49. public const string DATACHANGEDEVENT = "DataChangedEvent";
  50. private object locker = new object();
  51. private bool isSaveData = false;
  52. private ShakerControl.ShakerFile.IShakerFile file = new ShakerFile.V1_0.ShakerFile();
  53. public static AnalogDataViewModel Default { get; } = new AnalogDataViewModel();
  54. public ObservableCollection<EigenwertViewModel> Eigenwerts { get; } = new ObservableCollection<EigenwertViewModel>();
  55. static AnalogDataViewModel()
  56. {
  57. }
  58. private AnalogDataViewModel()
  59. {
  60. }
  61. public bool IsSaveData
  62. {
  63. get => isSaveData;
  64. set
  65. {
  66. if (value == isSaveData) return;
  67. UpdateProperty(ref isSaveData, value);
  68. if(value)
  69. {
  70. if (file.IsOpen) file.Close();
  71. file.CreateFile($"{ShakerControlConfigViewModel.Default.DataDirectory}{DateTime.Now:yyyyMMdd-HHmmSS}.sdt");
  72. file.WriteInfo(new ShakerFile.ShakerInfo()
  73. {
  74. AccelerationSensitivity = MainWindowViewModel.Default.ShakerSensitivity.Acceleration,
  75. ChannelCount = MainWindowViewModel.Default.ShakerConfig.ChannelCount,
  76. DisplacementSensitivity = MainWindowViewModel.Default.ShakerSensitivity.Displacement,
  77. FPGAClock = MainWindowViewModel.Default.ShakerConfig.FPGAClock,
  78. FrameCount = 0,
  79. InitialLocation = MainWindowViewModel.Default.ShakerConfig.InitialLocation,
  80. IsOutSignal = MainWindowViewModel.Default.ShakerControl.OutSignal,
  81. MaxAcceleration = MainWindowViewModel.Default.ShakerSecurity.MaxAcceleration,
  82. MaxDisplacement = MainWindowViewModel.Default.ShakerSecurity.MaxDisplacement,
  83. MaxDriver = MainWindowViewModel.Default.ShakerSecurity.MaxDriver,
  84. MaxFrequency = MainWindowViewModel.Default.ShakerConfig.MaxFrequency,
  85. MaxJitterAcceleration = MainWindowViewModel.Default.ShakerSecurity.MaxJitterAcceleration,
  86. MaxJitterDisplacement = MainWindowViewModel.Default.ShakerSecurity.MaxJitterDisplacement,
  87. MaxOutInput = MainWindowViewModel.Default.ShakerSecurity.MaxOutInput,
  88. MaxVelocity = MainWindowViewModel.Default.ShakerSecurity.MaxVelocity,
  89. MinFrequency = MainWindowViewModel.Default.ShakerConfig.MinFrequency,
  90. SampleRate = MainWindowViewModel.Default.ShakerConfig.SampleRate,
  91. TestType =MainWindowViewModel.Default.TestType,
  92. },new ShakerFile.ShakerStringInfo()
  93. {
  94. ChannelNames =string.Join(',', MainWindowViewModel.Default.ShakerConfig.ChannelNames),
  95. ShakerName = DeviceMangerViewModel.Default.CurrentDevice.Name,
  96. ShakerSN = DeviceMangerViewModel.Default.CurrentDevice.SN,
  97. TestConfig = MainWindowViewModel.Default.SweepFreqConfig.Model.GetBytes(),
  98. });
  99. }
  100. else
  101. {
  102. if (file.IsOpen) file.Close();
  103. }
  104. }
  105. }
  106. public ObservableCollection<List<DataPoint>> DataPoints { get; } = new ObservableCollection<List<DataPoint>>();
  107. public override void Init()
  108. {
  109. base.Init();
  110. lock (locker)
  111. {
  112. DataPoints.Clear();
  113. Eigenwerts.Clear();
  114. for (int i = 0; i < MainWindowViewModel.Default.ShakerConfig.ChannelCount; i++)
  115. {
  116. DataPoints.Add(new List<DataPoint>());
  117. Eigenwerts.Add(new EigenwertViewModel());
  118. }
  119. }
  120. float[,] data = new float[MainWindowViewModel.Default.ShakerConfig.ChannelCount, MainWindowViewModel.Default.ShakerConfig.SampleRate];
  121. Random random = new Random();
  122. for(int i=0;i<MainWindowViewModel.Default.ShakerConfig.ChannelCount;i++)
  123. {
  124. float ampt = random.NextSingle() * 15 + 2;
  125. float freq = random.NextSingle() * 10 + 1;
  126. for(int j=0;j<MainWindowViewModel.Default.ShakerConfig.SampleRate;j++)
  127. {
  128. data[i, j] = MathF.Sin(MathF.PI * ((float)j / MainWindowViewModel.Default.ShakerConfig.SampleRate) * freq * 360 / 180f) * ampt + random.NextSingle()*2;
  129. }
  130. }
  131. UpdateData(data);
  132. }
  133. public void UpdateData(float[,] data)
  134. {
  135. if (data == null) return;
  136. if (data.GetLength(1) != MainWindowViewModel.Default.ShakerConfig.SampleRate || data.GetLength(0) != MainWindowViewModel.Default.ShakerConfig.ChannelCount) return;
  137. lock (locker)
  138. {
  139. List<List<DataPoint>> points = Enumerable.Range(0, (int)MainWindowViewModel.Default.ShakerConfig.ChannelCount).Select(x => new List<DataPoint>()).ToList();
  140. for (int j = 0; j < MainWindowViewModel.Default.ShakerConfig.SampleRate; j++)
  141. {
  142. double t = (double)j / MainWindowViewModel.Default.ShakerConfig.SampleRate;
  143. for (int i = 0; i < MainWindowViewModel.Default.ShakerConfig.ChannelCount; i++)
  144. {
  145. points[i].Add(new DataPoint(t, data[i, j]));
  146. }
  147. }
  148. for (int i = 0; i < MainWindowViewModel.Default.ShakerConfig.ChannelCount; i++)
  149. {
  150. Eigenwerts[i].CalcEigenwert(ref data[i, 0], MainWindowViewModel.Default.ShakerConfig.SampleRate);
  151. DataPoints[i] = points[i];
  152. }
  153. if(IsSaveData && file.IsOpen)
  154. {
  155. file.WriteData(ref data[0, 0], data.Length);
  156. }
  157. }
  158. GetEvent(DATACHANGEDEVENT).Publish(this, null);
  159. }
  160. }
  161. }