ShakerDataViewModel.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using OxyPlot;
  2. using Shaker.Models;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace ShakerApp.ViewModels
  9. {
  10. internal class ShakerDataViewModel:ViewModelBase<IModel>
  11. {
  12. private float[,] _Data = new float[0,0];
  13. private object _datalocker = new object();
  14. private Dictionary<Shaker.Models.AnalogType, List<(List<DataPoint>,Models.StatisticsModel)>> AnalogDataCache = new Dictionary<AnalogType, List<(List<DataPoint>, Models.StatisticsModel)>>();
  15. private ShakerDataViewModel()
  16. {
  17. GetEvent<AllConfig>().Subscrip((sender, args) =>
  18. {
  19. CommunicationViewModel.Intance.LocalCommunication.GetEvent(Topic.DATA).Subscrip((sender, args) =>
  20. {
  21. if(args.Data.Length>0 && args.Data[0] is float[,] v)
  22. {
  23. _Data = v;
  24. CalcAnalog();
  25. }
  26. });
  27. });
  28. }
  29. static ShakerDataViewModel()
  30. {
  31. }
  32. public List<(List<DataPoint>, Models.StatisticsModel)> GetAnalogData(AnalogType analogType)
  33. {
  34. lock(_datalocker)
  35. {
  36. if(AnalogDataCache.TryGetValue(analogType,out var list))
  37. {
  38. if (list == null) return new List<(List<DataPoint>, Models.StatisticsModel)>();
  39. return list;
  40. }
  41. return new List<(List<DataPoint>, Models.StatisticsModel)>();
  42. }
  43. }
  44. private void CalcAnalog()
  45. {
  46. if (_Data.Length == 0) return;
  47. lock (_datalocker)
  48. {
  49. AnalogDataCache.Clear();
  50. for (int i = 0; i < ShakerConfigViewModel.Instance.AnalogSignals.Count; i++)
  51. {
  52. if (i >= _Data.GetLength(0)) break;
  53. List<DataPoint> dataPoints = new List<DataPoint>();
  54. float max = float.MinValue;
  55. float min = float.MaxValue;
  56. float v = 0;
  57. for (int j= 0; j < _Data.GetLength(1); j++)
  58. {
  59. dataPoints.Add(new DataPoint(1.0 / ShakerConfigViewModel.Instance.SampleRate * j, _Data[i, j]));
  60. max = _Data[i, j] > max ? _Data[i, j] : max;
  61. min = _Data[i, j] < min ? _Data[i, j] : min;
  62. v += _Data[i, j];
  63. }
  64. Models.StatisticsModel model = new Models.StatisticsModel()
  65. {
  66. Name = ShakerConfigViewModel.Instance.Model.AnalogSignalConfigs[i].Name,
  67. Max = max,
  68. Min = min,
  69. RMS = MainViewModel.Default.Calc.Sum.Rms(ref _Data[i, 0], (uint)_Data.GetLength(1)),
  70. Average = v/ _Data.GetLength(1),
  71. Unit = ShakerConfigViewModel.Instance.Model.AnalogSignalConfigs[i].Unit,
  72. };
  73. if (AnalogDataCache.TryGetValue(ShakerConfigViewModel.Instance.Model.AnalogSignalConfigs[i].AnalogType,out var list))
  74. {
  75. if (list == null) list = new List<(List<DataPoint>, Models.StatisticsModel)>();
  76. list.Add((dataPoints,model));
  77. }
  78. else
  79. {
  80. AnalogDataCache[ShakerConfigViewModel.Instance.Model.AnalogSignalConfigs[i].AnalogType] = new List<(List<DataPoint>, Models.StatisticsModel)> { (dataPoints,model) };
  81. }
  82. }
  83. }
  84. GetEvent(Topic.DATA).Publish(this,null);
  85. }
  86. public static ShakerDataViewModel Instance { get; } = new ShakerDataViewModel();
  87. }
  88. }