ServiceShakerConfigViewModel.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using Shaker.Model;
  2. using Shaker.Models;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Diagnostics.Metrics;
  6. using System.Linq;
  7. using System.Runtime.Versioning;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace ShakerService.ViewModel
  11. {
  12. internal class ServiceShakerConfigViewModel:BaseServiceViewModel<Shaker.Models.ShakerConfigModel>
  13. {
  14. public AccelerationSynthesisType SynthesisType { get => Model.SynthesisType; }
  15. public float OutSignalGain { get => Model.OutSignalGain; }
  16. public uint MaxRiseCount => Model.MaxRiseCount;
  17. public uint MaxZeroChangedCount => Model.MaxZeroChangedCount;
  18. public uint MaxSignalCount => Model.MaxSignalCount;
  19. public uint MaxEmergencyStopCount => Model.MaxEmergencyStopCount;
  20. public uint MaxStopWindowCount => MaxStopWindowCount;
  21. public uint MaxAdjustCount => Model.MaxAdjustCount;
  22. public uint MaxFallCount => Model.MaxFallCount;
  23. public uint StartCount => Model.StartCount;
  24. public float InitialLocation { get => Model.InitialLocation; }
  25. public uint SampleRate => Model.SampleRate;
  26. public uint FPGAClock => Model.FPGAClock;
  27. public int ChannelCount => Model.AnalogSignalConfigs.Count;
  28. public float MaxFrequency { get => Model.MaxFrequency; }
  29. public float MinFrequency { get => Model.MinFrequency;}
  30. public float MaxOutInput { get => Model.MaxOutInput; }
  31. public float MaxAcceleration { get => Model.MaxAcceleration; }
  32. public float MaxDisplacement { get => Model.MaxDisplacement; }
  33. public float MaxDriver { get => Model.MaxDriver;}
  34. public float MaxJitterAcceleration { get => Model.MaxJitterAcceleration; }
  35. public float MaxJitterDisplacement { get => Model.MaxJitterDisplacement; }
  36. public float MaxVelocity { get => Model.MaxVelocity; }
  37. public int AccelerationSensorCount => Model.AccelerationConfigs.Count;
  38. public List<ServiceAnalogSignalConfigViewModel> AnalogSignals { get; } = new List<ServiceAnalogSignalConfigViewModel>();
  39. public List<ServiceAccelerationConfigViewModel> Accelerations { get; } = new List<ServiceAccelerationConfigViewModel>();
  40. public float DisplacementSensitivity { get => Model.DisplacementSensitivity; }
  41. public float AccelerationSensitivity => Accelerations.Count > 0 ? Accelerations[0].Sensitivity : 1;
  42. private ServiceShakerConfigViewModel()
  43. {
  44. Communication.Instance.DbConnection.CreateTable<Shaker.Models.ShakerConfigModel>();
  45. var model = Communication.Instance.DbConnection.Query<Shaker.Models.ShakerConfigModel>($"select * from {nameof(Shaker.Models.ShakerConfigModel)} LIMIT 1")?.FirstOrDefault() ?? new Shaker.Models.ShakerConfigModel();
  46. Communication.Instance.DbConnection.CreateTable<AnalogSignalConfigModel>(tableName: nameof(AnalogSignals));
  47. model.AnalogSignalConfigs = Communication.Instance.DbConnection.Query<AnalogSignalConfigModel>($"select * from {nameof(AnalogSignals)}") ??new List<AnalogSignalConfigModel>();
  48. int count = model.AnalogSignalConfigs.Count;
  49. if(count<ServiceConfigViewModel.Instance.AnalogCount)
  50. {
  51. model.AnalogSignalConfigs.AddRange(Enumerable.Range(0, ServiceConfigViewModel.Instance.AnalogCount - count).Select(x => new AnalogSignalConfigModel()));
  52. }
  53. Communication.Instance.DbConnection.CreateTable<AccelerationConfigModel>(tableName: nameof(Accelerations));
  54. model.AccelerationConfigs = Communication.Instance.DbConnection.Query<AccelerationConfigModel>($"select * from {nameof(Accelerations)}") ?? new List<AccelerationConfigModel>();
  55. count = model.AccelerationConfigs.Count;
  56. if(count<ServiceConfigViewModel.Instance.AccelerationCount)
  57. {
  58. model.AccelerationConfigs.AddRange(Enumerable.Range(0, ServiceConfigViewModel.Instance.AccelerationCount - count).Select(x => new AccelerationConfigModel()));
  59. }
  60. UpModel(model);
  61. SaveData();
  62. Communication.Instance.Context.GetEvent<Shaker.Models.ShakerConfigModel>().Subscrip((sender, args) =>
  63. {
  64. UpModel(model);
  65. SetFpga();
  66. ServiceSweepConfigViewModel.Instance.SetFpga();
  67. SaveData();
  68. });
  69. }
  70. public override void SetFpga()
  71. {
  72. base.SetFpga();
  73. ShakerFpga.Instance.MaxRiseCount.Value = MaxRiseCount;
  74. ShakerFpga.Instance.MaxZeroChangedCount.Value = MaxZeroChangedCount;
  75. ShakerFpga.Instance.MaxSignalCount.Value =MaxSignalCount;
  76. ShakerFpga.Instance.MaxEmergencyStopCount.Value = MaxEmergencyStopCount;
  77. ShakerFpga.Instance.MaxStopWindowCount.Value = MaxStopWindowCount;
  78. ShakerFpga.Instance.MaxFallCount.Value = MaxFallCount;
  79. ShakerFpga.Instance.InitialLocation.Value = Tools.Tools.QuantitiesToVoltage(InitialLocation, DisplacementSensitivity);
  80. ShakerFpga.Instance.SampleRate.Value = SampleRate;
  81. ShakerFpga.Instance.SampleInterval.Value = 1f /SampleRate;
  82. ShakerFpga.Instance.RiseInterval.Value = Tools.Tools.CalcInterval(MaxRiseCount);
  83. ShakerFpga.Instance.ZeroChangedInterval.Value = Tools.Tools.CalcInterval(MaxZeroChangedCount);
  84. ShakerFpga.Instance.EmergencyStopInterval.Value = Tools.Tools.CalcInterval(MaxEmergencyStopCount);
  85. ShakerFpga.Instance.FallInterval.Value = Tools.Tools.CalcInterval(MaxFallCount);
  86. ShakerFpga.Instance.StopWindowInterval.Value = Tools.Tools.CalcInterval(MaxStopWindowCount);
  87. ShakerFpga.Instance.SignalInterval.Value = Tools.Tools.CalcInterval(MaxSignalCount);
  88. ShakerFpga.Instance.MaxOutInput.Value = MaxOutInput;
  89. ShakerFpga.Instance.WarnOutInput.Value = MaxOutInput * 0.8f;
  90. ShakerFpga.Instance.MaxAcceleration.Value = Tools.Tools.QuantitiesToVoltage(MaxAcceleration, AccelerationSensitivity);
  91. ShakerFpga.Instance.WarnAcceleration.Value = Tools.Tools.QuantitiesToVoltage(MaxAcceleration * 0.8f, AccelerationSensitivity);
  92. ShakerFpga.Instance.MaxDisplacement.Value = Tools.Tools.QuantitiesToVoltage(MaxDisplacement, DisplacementSensitivity);
  93. ShakerFpga.Instance.WarnDisplacement.Value = Tools.Tools.QuantitiesToVoltage(MaxDisplacement * 0.8f, DisplacementSensitivity);
  94. ShakerFpga.Instance.MaxDriver.Value =MaxDriver;
  95. ShakerFpga.Instance.AccelerationPolarity.Values = Accelerations.Select(x => x.Polarity == Shaker.Model.Polarity.Positive).ToArray();
  96. ShakerFpga.Instance.MaxAdjustCount.Value = MaxAdjustCount;
  97. ShakerFpga.Instance.AdjustInverval.Value = Tools.Tools.CalcInterval(MaxAdjustCount);
  98. ShakerFpga.Instance.StartCount.Value = StartCount;
  99. ShakerFpga.Instance.LoopRate.Value = FPGAClock / SampleRate;
  100. ShakerFpga.Instance.SynthesisType.Value = (ushort)SynthesisType;
  101. ShakerFpga.Instance.OutSignalGain.Value = OutSignalGain;
  102. ShakerFpga.Instance.MaxAdjustCount.Value = MaxAdjustCount;
  103. ShakerFpga.Instance.StartCount.Value = StartCount;
  104. ShakerFpga.Instance.MaxJitterAcceleration.Value = Tools.Tools.QuantitiesToVoltage(MaxJitterAcceleration, AccelerationSensitivity);
  105. ShakerFpga.Instance.MaxJitterDisplacement.Value = Tools.Tools.QuantitiesToVoltage(MaxJitterDisplacement, DisplacementSensitivity);
  106. }
  107. public override void UpModel(Shaker.Models.ShakerConfigModel model)
  108. {
  109. base.UpModel(model);
  110. model.AnalogSignalConfigs ??= new List<AnalogSignalConfigModel>();
  111. model.AccelerationConfigs ??= new List<AccelerationConfigModel>();
  112. int count = model.AnalogSignalConfigs.Count;
  113. if (count < ServiceConfigViewModel.Instance.AnalogCount)
  114. {
  115. model.AnalogSignalConfigs.AddRange(Enumerable.Range(0, ServiceConfigViewModel.Instance.AnalogCount - count).Select(x => new AnalogSignalConfigModel()));
  116. }
  117. else if(count>ServiceConfigViewModel.Instance.AnalogCount)
  118. {
  119. model.AnalogSignalConfigs = model.AnalogSignalConfigs.Take(ServiceConfigViewModel.Instance.AnalogCount).ToList();
  120. }
  121. model.AccelerationConfigs = Communication.Instance.DbConnection.Query<AccelerationConfigModel>($"select * from {nameof(Accelerations)}") ?? new List<AccelerationConfigModel>();
  122. count = model.AccelerationConfigs.Count;
  123. if (count < ServiceConfigViewModel.Instance.AccelerationCount)
  124. {
  125. model.AccelerationConfigs.AddRange(Enumerable.Range(0, ServiceConfigViewModel.Instance.AccelerationCount - count).Select(x => new AccelerationConfigModel()));
  126. }
  127. else if(count>ServiceConfigViewModel.Instance.AccelerationCount)
  128. {
  129. model.AccelerationConfigs = model.AccelerationConfigs.Take(ServiceConfigViewModel.Instance.AccelerationCount).ToList();
  130. }
  131. AnalogSignals.Clear();
  132. Accelerations.Clear();
  133. if(model.AnalogSignalConfigs.Count>0)
  134. {
  135. AnalogSignals.AddRange(model.AnalogSignalConfigs.Select(x => new ServiceAnalogSignalConfigViewModel(x)));
  136. }
  137. if(model.AccelerationConfigs.Count > 0)
  138. {
  139. Accelerations.AddRange(model.AccelerationConfigs.Select(x => new ServiceAccelerationConfigViewModel(x)));
  140. }
  141. }
  142. private protected override void SaveData()
  143. {
  144. base.SaveData();
  145. Communication.Instance.DbConnection.DeleteAll<AnalogSignalConfigModel>(tableName: nameof(AnalogSignals));
  146. Communication.Instance.DbConnection.InsertAll(Model.AnalogSignalConfigs, tableName: nameof(AnalogSignals));
  147. Communication.Instance.DbConnection.DeleteAll<AccelerationConfigModel>(tableName: nameof(Accelerations));
  148. Communication.Instance.DbConnection.InsertAll(Model.AccelerationConfigs, tableName: nameof(Accelerations));
  149. }
  150. static ServiceShakerConfigViewModel()
  151. {
  152. }
  153. public static ServiceShakerConfigViewModel Instance { get; } = new ServiceShakerConfigViewModel();
  154. }
  155. }