OilSourceStatusViewModel.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. using Avalonia.Collections;
  2. using Avalonia.Controls;
  3. using Shaker.Models;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace ShakerApp.ViewModels
  10. {
  11. public class OilSourceStatusViewModel : ViewModelBase<OilSourceStatusModel>
  12. {
  13. public override double Width => 1300;
  14. public override double Height => 800;
  15. public override bool CanResize => false;
  16. private OilSourceStatusViewModel()
  17. {
  18. ButtonVisibily = false;
  19. Content = typeof(Views.OilControlView);
  20. Circulate?.UpDateModel(Model.Circulate);
  21. for (int i = 0; i < Model.OilSourceAnalogs.Count; i++)
  22. {
  23. OilSourceAnalogs.Add(new OilSourceAnalogViewModel(Model.OilSourceAnalogs[i]));
  24. }
  25. for (int i = 0; i < Model.Circuit.Count; i++)
  26. {
  27. Circuit.Add(new IndexValueItemViewModel<CircuitViewModel>(i + 1, new CircuitViewModel(Model.Circuit[i])));
  28. }
  29. for (int i = 0; i < Model.OilErrors.Count; i++)
  30. {
  31. OilErrors.Add(new OilErrorInfoViewModel(Model.OilErrors[i]));
  32. }
  33. Forerunner.UpDateModel(Model.Forerunner);
  34. Assistant?.UpDateModel(Model.Assistant);
  35. GetEvent<AllConfig>().Subscrip((sender, args) =>
  36. {
  37. UpDateModel(args.Data.OilSource);
  38. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<OilSourceStatusModel>()?.Subscrip((sender, args) =>
  39. {
  40. UpDateModel(args.Data);
  41. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<OilSourceStatusModel>()?.Publish(this, args.Data);
  42. });
  43. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.OilStatusChanged)?.Subscrip((sender, args) =>
  44. {
  45. if(args.Data.Length>=1 && args.Data[0] is bool state)
  46. {
  47. string msg = App.Current?.FindResource(state ? "OilConnect" : "OilDisConnect") + "";
  48. if(state)
  49. {
  50. MainViewModel.Default.ShowToast(msg, Avalonia.Controls.Notifications.NotificationType.Information);
  51. }
  52. else
  53. {
  54. MainViewModel.Default.ShowToast(msg, Avalonia.Controls.Notifications.NotificationType.Error);
  55. }
  56. LogViewModel.Instance.AddLog(msg,state ? LogType.Info : LogType.Error);
  57. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.OilStatusChanged)?.Publish(this,null, state);
  58. }
  59. });
  60. });
  61. }
  62. static OilSourceStatusViewModel()
  63. {
  64. }
  65. public void EmergencyStop()
  66. {
  67. CommunicationViewModel.Instance.LocalCommunication.GetEvent(Topic.OilEmergencyStop)?.Publish(this, null, false);
  68. }
  69. public override bool CanCancel => false;
  70. public static OilSourceStatusViewModel Instance { get; } = new OilSourceStatusViewModel();
  71. public CircuitViewModel Circulate { get; } = new CircuitViewModel()
  72. {
  73. PressureAction = (pressure) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculatePressure)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, pressure),
  74. StartAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculateStart)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state),
  75. LoadAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculateLoad)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state)
  76. };
  77. [PropertyAssociation(nameof(OilSourceStatusModel.IsRemote))]
  78. public bool IsRemote
  79. {
  80. get => Model.IsRemote;
  81. set => SetProperty(ref Model.IsRemote, value);
  82. }
  83. [PropertyAssociation(nameof(OilSourceStatusModel.IsEnabled))]
  84. public bool IsEnabled
  85. {
  86. get => Model.IsEnabled;
  87. set => SetProperty(ref Model.IsEnabled, value);
  88. }
  89. [PropertyAssociation(nameof(OilSourceStatusModel.IsConnect))]
  90. public bool IsConnect { get => Model.IsConnect; set => SetProperty(ref Model.IsConnect, value); }
  91. /// <summary>
  92. /// 先导油路
  93. /// </summary>
  94. public CircuitViewModel Forerunner { get; } = new CircuitViewModel()
  95. {
  96. PressureAction = (pressure)=> CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerPressure)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, pressure),
  97. StartAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerStart)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state),
  98. LoadAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerLoad)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state)
  99. };
  100. /// <summary>
  101. /// 主油路
  102. /// </summary>
  103. public AvaloniaList<IndexValueItemViewModel<CircuitViewModel>> Circuit { get; } = new AvaloniaList<IndexValueItemViewModel<CircuitViewModel>>();
  104. public AvaloniaList<OilSourceAnalogViewModel> OilSourceAnalogs { get; } = new AvaloniaList<OilSourceAnalogViewModel>();
  105. public CircuitViewModel Assistant { get; } = new CircuitViewModel()
  106. {
  107. PressureAction = (pressure) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantPressure)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, pressure),
  108. StartAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantStart)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state),
  109. LoadAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantLoad)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state)
  110. };
  111. public AvaloniaList<OilErrorInfoViewModel> OilErrors { get; } = new AvaloniaList<OilErrorInfoViewModel>();
  112. public bool IsError => (OilErrors.Count > 0 ? OilErrors.Any(x => x.Status) : false) | (OilSourceAnalogs.Count > 0 ? OilSourceAnalogs.Any(x => x.IsError) : false);
  113. protected override void Cancel()
  114. {
  115. }
  116. public override void UpDateModel(OilSourceStatusModel model)
  117. {
  118. bool lasterror = IsError;
  119. base.UpDateModel(model);
  120. Forerunner?.UpDateModel(model.Forerunner);
  121. Circulate?.UpDateModel(model.Circulate);
  122. int count = Circuit.Count;
  123. if (count < model.Circuit.Count)
  124. {
  125. for (int i = 0; i < model.Circuit.Count-count; i++)
  126. {
  127. Circuit.Add(new IndexValueItemViewModel<CircuitViewModel>(Circuit.Count + 1, new CircuitViewModel()));
  128. }
  129. }
  130. else if (count > model.Circuit.Count)
  131. {
  132. Circuit.RemoveRange(model.Circuit.Count, count - model.Circuit.Count);
  133. }
  134. if (model.Circuit.Count > 0)
  135. {
  136. for (int i = 0; i < model.Circuit.Count; i++)
  137. {
  138. Circuit[i].Value?.UpDateModel(model.Circuit[i]);
  139. Circuit[i].Value.StartAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitStart)?.Publish(this, null,i, state);
  140. Circuit[i].Value.LoadAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitLoad)?.Publish(this, null,i, state);
  141. Circuit[i].Value.PressureAction = (pressure) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitPressure)?.Publish(this, null,i, pressure);
  142. }
  143. }
  144. Assistant?.UpDateModel(model.Assistant);
  145. count = OilSourceAnalogs.Count;
  146. if (count < model.OilSourceAnalogs.Count)
  147. {
  148. for (int i = 0; i < model.OilSourceAnalogs.Count-count; i++)
  149. {
  150. OilSourceAnalogs.Add(new OilSourceAnalogViewModel());
  151. }
  152. }
  153. else if (count > model.OilSourceAnalogs.Count)
  154. {
  155. OilSourceAnalogs.RemoveRange(model.OilSourceAnalogs.Count, count - model.OilSourceAnalogs.Count);
  156. }
  157. if (model.OilSourceAnalogs.Count > 0)
  158. {
  159. for (int i = 0; i < model.OilSourceAnalogs.Count; i++)
  160. {
  161. OilSourceAnalogs[i].UpDateModel(model.OilSourceAnalogs[i]);
  162. }
  163. }
  164. count = OilErrors.Count;
  165. if (count < model.OilErrors.Count)
  166. {
  167. for (int i = 0; i < model.OilErrors.Count-count; i++)
  168. {
  169. OilErrors.Add(new OilErrorInfoViewModel());
  170. }
  171. }
  172. else if (count > model.OilErrors.Count)
  173. {
  174. OilErrors.RemoveRange(model.OilErrors.Count, count - model.OilErrors.Count);
  175. }
  176. if (model.OilErrors.Count > 0)
  177. {
  178. for (int i = 0; i < model.OilErrors.Count; i++)
  179. {
  180. OilErrors[i].UpDateModel(model.OilErrors[i]);
  181. }
  182. }
  183. OnPropertyChanged(nameof(IsError));
  184. if(IsError!=lasterror)OnPropertyChanged(nameof(OilStatus));
  185. }
  186. public string OilStatus => App.Current?.FindResource(IsError ? "OilError" : "OilSuccess") + "";
  187. }
  188. }