ShakerControlViewModel.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using Shaker.Models;
  2. using ShakerApp.Tools;
  3. using System;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Collections.ObjectModel;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Input;
  11. namespace ShakerApp.ViewModels
  12. {
  13. public class ShakerControlViewModel : DisplayViewModelBase<ShakerControlModel>
  14. {
  15. public override bool CanResize => false;
  16. public override double Width => 960;
  17. public override double Height => 560;
  18. public static ShakerControlViewModel Instance { get; } = new ShakerControlViewModel();
  19. static ShakerControlViewModel()
  20. {
  21. }
  22. public void SaveTdmsConfig(TDMS.ITDMSFile? config)
  23. {
  24. if (config == null) return;
  25. var group=config.Contains(nameof(ShakerControlModel)) ? config[nameof(ShakerControlModel)]:config.AddGroup(nameof(ShakerControlModel));
  26. if (group == null) return;
  27. typeof(ShakerControlModel).GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
  28. .Select(x => (x, x.GetValue(Model)))
  29. .ToList()
  30. .ForEach(x =>
  31. {
  32. if (x.Item2 == null)
  33. {
  34. return;
  35. }
  36. if (x.x.FieldType.IsAssignableTo(typeof(IList)) || x.x.FieldType.IsArray)
  37. {
  38. group.CreateOrUpdateProperty($"{x.x.Name}",string.Join("", Tools.Tools.Serialize(x.x.FieldType, x.Item2).Select(x => $"{x:X2}")));
  39. }
  40. else
  41. {
  42. group.CreateOrUpdateProperty($"{x.x.Name}", x.Item2?.ToString() ?? string.Empty);
  43. }
  44. });
  45. }
  46. private ShakerControlViewModel()
  47. {
  48. for (int i = 0; i < Model.ValveConfig.Count; i++)
  49. {
  50. ValveConfig.Add(new IndexValueItemViewModel<ValveConfigItemViewModel>(i + 1, new ValveConfigItemViewModel(Model.ValveConfig[i])));
  51. }
  52. GetEvent<AllConfig>().Subscrip((sender, args) =>
  53. {
  54. UpDateModel(args.Data.ShakerControl);
  55. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<ShakerControlModel>()?.Subscrip((sender, args) =>
  56. {
  57. UpDateModel(args.Data);
  58. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<ShakerControlModel>()?.Publish(this, args.Data);
  59. });
  60. });
  61. }
  62. public override void UpDateModel(ShakerControlModel model)
  63. {
  64. ValveConfig.Clear();
  65. base.UpDateModel(model);
  66. for(int i=0;i<model.ValveConfig.Count;i++)
  67. {
  68. ValveConfig.Add(new IndexValueItemViewModel<ValveConfigItemViewModel>(i + 1, new ValveConfigItemViewModel(model.ValveConfig[i])));
  69. }
  70. if (model.ControlItems == null)
  71. {
  72. model.ControlItems = new List<SweepControlItemModel>();
  73. }
  74. var items = model.ControlItems.ToArray();
  75. ControlItems.Clear();
  76. if (items.Length > 0)
  77. {
  78. for (int i = 0; i < model.ControlItems.Count; i++)
  79. {
  80. ControlItems.Add(new IndexValueItemViewModel<SweepControlItemViewModel>(i + 1, new SweepControlItemViewModel(items[i])));
  81. }
  82. }
  83. }
  84. [PropertyAssociation(nameof(ShakerControlModel.PageType))]
  85. public MainPageType PageType
  86. {
  87. get => Model.PageType;
  88. set
  89. {
  90. bool changed = Model.PageType != value;
  91. SetProperty(ref Model.PageType, value);
  92. if (!changed) return;
  93. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<MainPageType>()?.Publish(this, value);
  94. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<MainPageType>()?.Publish(this, value);
  95. }
  96. }
  97. [PropertyAssociation(nameof(ShakerControlModel.MaxControlItemCount))]
  98. public int MaxControlItemCount => Model.MaxControlItemCount;
  99. [PropertyAssociation(nameof(ShakerControlModel.MaxDisplacementVoltage))]
  100. public float MaxDisplacementVoltage => Model.MaxDisplacementVoltage;
  101. [PropertyAssociation(nameof(ShakerControlModel.MinDisplacementVoltage))]
  102. public float MinDisplacementVoltage => Model.MinDisplacementVoltage;
  103. [PropertyAssociation(nameof(ShakerControlModel.MaxValveVoltage))]
  104. public float MaxValveVoltage => Model.MaxValveVoltage;
  105. [PropertyAssociation(nameof(ShakerControlModel.MinValveVoltage))]
  106. public float MinValveVoltage => Model.MinValveVoltage;
  107. [PropertyAssociation(nameof(ShakerControlModel.ValvePolarity))]
  108. public Polarity ValvePolarity { get => Model.ValvePolarity; set => SetProperty(ref Model.ValvePolarity, value); }
  109. [PropertyAssociation(nameof(ShakerControlModel.SelfLoop))]
  110. public bool SelfLoop { get => Model.SelfLoop; set => SetProperty(ref Model.SelfLoop, value); }
  111. [PropertyAssociation(nameof(ShakerControlModel.Debug))]
  112. public bool Debug { get => Model.Debug; set => SetProperty(ref Model.Debug, value); }
  113. [PropertyAssociation(nameof(ShakerControlModel.DisplacementP))]
  114. public float DisplacementP { get => Model.DisplacementP; set => SetProperty(ref Model.DisplacementP, value); }
  115. [PropertyAssociation(nameof(ShakerControlModel.DisplacementI))]
  116. public float DisplacementI { get => Model.DisplacementI; set => SetProperty(ref Model.DisplacementI, value); }
  117. [PropertyAssociation(nameof(ShakerControlModel.FlutterFrequency))]
  118. public float FlutterFrequency { get => Model.FlutterFrequency; set => SetProperty(ref Model.FlutterFrequency, value); }
  119. [PropertyAssociation(nameof(ShakerControlModel.FlutterAmpt))]
  120. public float FlutterAmpt { get => Model.FlutterAmpt; set => SetProperty(ref Model.FlutterAmpt, value); }
  121. [PropertyAssociation(nameof(ShakerControlModel.ValveConfig))]
  122. public int ServoValveCount => Model.ValveConfig.Count;
  123. [PropertyAssociation(nameof(ShakerControlModel.MaxDisplacementIntegral))]
  124. public float MaxDisplacementIntegral { get => Model.MaxDisplacementIntegral; set => SetProperty(ref Model.MaxDisplacementIntegral, value); }
  125. [PropertyAssociation(nameof(ShakerControlModel.ValveConfig))]
  126. public ObservableCollection<IndexValueItemViewModel<ValveConfigItemViewModel>> ValveConfig { get; } = new ObservableCollection<IndexValueItemViewModel<ValveConfigItemViewModel>>();
  127. [PropertyAssociation(nameof(ShakerControlModel.OilStopped))]
  128. public bool OilStopped { get => Model.OilStopped; set => SetProperty(ref Model.OilStopped, value); }
  129. [PropertyAssociation(nameof(ShakerControlModel.DisplacementOpenLoop))]
  130. public bool DisplacementOpenLoop { get => Model.DisplacementOpenLoop; set => SetProperty(ref Model.DisplacementOpenLoop, value); }
  131. [PropertyAssociation(nameof(ShakerControlModel.ControlItems))]
  132. public ObservableCollection<IndexValueItemViewModel<SweepControlItemViewModel>> ControlItems { get; } = new ObservableCollection<IndexValueItemViewModel<SweepControlItemViewModel>>();
  133. [PropertyAssociation(nameof(ShakerControlModel.OutSignal))]
  134. public bool OutSignal { get => Model.OutSignal; set => SetProperty(ref Model.OutSignal, value); }
  135. [PropertyAssociation(nameof(ShakerControlModel.ControlItems))]
  136. public bool AddEnabled => ControlItems.Count < SweepFreqConfigModel.MAXITEM;
  137. [PropertyAssociation(nameof(ShakerControlModel.ControlItems))]
  138. public bool RemoveEnabled => ControlItems.Count > 0;
  139. public ICommand AddCommand => new CommunityToolkit.Mvvm.Input.RelayCommand(Add);
  140. private void Add()
  141. {
  142. if (ControlItems.Count >= MaxControlItemCount) return;
  143. SaveIsEnabled = true;
  144. Model.ControlItems.Add(new SweepControlItemModel());
  145. ControlItems.Add(new IndexValueItemViewModel<SweepControlItemViewModel>(ControlItems.Count + 1,new SweepControlItemViewModel( Model.ControlItems[^1])));
  146. }
  147. public ICommand DeleteLastCommand => new CommunityToolkit.Mvvm.Input.RelayCommand(Delete);
  148. private void Delete()
  149. {
  150. if (ControlItems.Count == 0) return;
  151. Model.ControlItems.RemoveAt(Model.ControlItems.Count - 1);
  152. ControlItems.RemoveAt(ControlItems.Count - 1);
  153. }
  154. public ICommand RefreshCommand => new CommunityToolkit.Mvvm.Input.RelayCommand(Refresh);
  155. private void Refresh()
  156. {
  157. if (ControlItems.Count == 0) return;
  158. var items = ControlItems.OrderBy(x => x.Value.Frequency).DistinctBy(x => x.Value.Frequency).Select(x => x.Value).ToList();
  159. if (items.Count == 0)
  160. {
  161. ControlItems.Clear();
  162. return;
  163. }
  164. for (int i = 0; i < items.Count; i++)
  165. {
  166. ControlItems[i].Value = items[i];
  167. }
  168. if (ControlItems.Count > items.Count)
  169. {
  170. int removecount = ControlItems.Count - items.Count;
  171. for (int i = 0; i < removecount; i++)
  172. {
  173. ControlItems.RemoveAt(items.Count);
  174. }
  175. }
  176. }
  177. protected override void Save()
  178. {
  179. base.Save();
  180. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<Shaker.Models.ShakerControlModel>()?.Publish(this, Model);
  181. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<Shaker.Models.ShakerControlModel>()?.Publish(this, Model);
  182. }
  183. }
  184. }