|
@@ -0,0 +1,199 @@
|
|
|
+using Avalonia;
|
|
|
+using Avalonia.Collections;
|
|
|
+using Avalonia.Controls;
|
|
|
+using IViewModel.Models;
|
|
|
+using IViewModel.ViewModels;
|
|
|
+using IViewModel;
|
|
|
+using OilSourceModel;
|
|
|
+using OilSourceModel.Models;
|
|
|
+using Shaker.Models;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+
|
|
|
+namespace OilSourceControl.ViewModel
|
|
|
+{
|
|
|
+ internal sealed class OilSourceStatusViewModel:IViewModel.ViewModels.DisplayViewModelBase<OilSourceModel.Models.OilSourceStatusModel>
|
|
|
+ { public override double Width => 1300;
|
|
|
+ public override double Height => 800;
|
|
|
+ public override bool CanResize => false;
|
|
|
+ private OilSourceStatusViewModel()
|
|
|
+ {
|
|
|
+ ButtonVisibily = false;
|
|
|
+ //Content = typeof(Views.OilControlView);
|
|
|
+ Circulate?.UpDateModel(Model.Circulate);
|
|
|
+ for (int i = 0; i < Model.OilSourceAnalogs.Count; i++)
|
|
|
+ {
|
|
|
+ OilSourceAnalogs.Add(new OilSourceAnalogViewModel(Model.OilSourceAnalogs[i]));
|
|
|
+ }
|
|
|
+ for (int i = 0; i < Model.Circuit.Count; i++)
|
|
|
+ {
|
|
|
+ Circuit.Add(new IndexValueItemViewModel<CircuitViewModel>(i + 1, new CircuitViewModel(Model.Circuit[i])));
|
|
|
+ }
|
|
|
+ for (int i = 0; i < Model.OilErrors.Count; i++)
|
|
|
+ {
|
|
|
+ OilErrors.Add(new OilErrorInfoViewModel(Model.OilErrors[i]));
|
|
|
+ }
|
|
|
+ Forerunner.UpDateModel(Model.Forerunner);
|
|
|
+ Assistant?.UpDateModel(Model.Assistant);
|
|
|
+ GetEvent<AllConfig>().Subscrip((sender, args) =>
|
|
|
+ {
|
|
|
+ UpDateModel(args.Data.OilSource);
|
|
|
+ CommunicationViewModel.Instance.LocalCommunication?.GetEvent<OilSourceStatusModel>()?.Subscrip((sender, args) =>
|
|
|
+ {
|
|
|
+ UpDateModel(args.Data);
|
|
|
+ CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<OilSourceStatusModel>()?.Publish(this, args.Data);
|
|
|
+ });
|
|
|
+ CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.OilStatusChanged)?.Subscrip((sender, args) =>
|
|
|
+ {
|
|
|
+ if(args.Data.Length>=1 && args.Data[0] is bool state)
|
|
|
+ {
|
|
|
+ string msg = Application.Current?.FindResource(state ? "OilConnect" : "OilDisConnect") + "";
|
|
|
+ if(state)
|
|
|
+ {
|
|
|
+ EventBus.EventBroker.Instance.GetEvent(Shaker.Model.Topic.MIANWINDOWTOAST).Publish(this, null, msg, Avalonia.Controls.Notifications.NotificationType.Information);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ EventBus.EventBroker.Instance.GetEvent(Shaker.Model.Topic.MIANWINDOWTOAST).Publish(this, null, msg, Avalonia.Controls.Notifications.NotificationType.Error);
|
|
|
+ }
|
|
|
+ LogViewModel.Instance.AddLog(msg,state ? LogType.Info : LogType.Error);
|
|
|
+ CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.OilStatusChanged)?.Publish(this,null, state);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ static OilSourceStatusViewModel()
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ public void EmergencyStop()
|
|
|
+ {
|
|
|
+ CommunicationViewModel.Instance.LocalCommunication.GetEvent(Topic.OilEmergencyStop)?.Publish(this, null, false);
|
|
|
+ }
|
|
|
+ public override bool CanCancel => false;
|
|
|
+ public static OilSourceStatusViewModel Instance { get; } = new OilSourceStatusViewModel();
|
|
|
+
|
|
|
+
|
|
|
+ public CircuitViewModel Circulate { get; } = new CircuitViewModel()
|
|
|
+ {
|
|
|
+ PressureAction = (pressure) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculatePressure)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, pressure),
|
|
|
+ StartAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculateStart)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state),
|
|
|
+ LoadAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculateLoad)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state)
|
|
|
+ };
|
|
|
+ [PropertyAssociation(nameof(OilSourceStatusModel.IsRemote))]
|
|
|
+ public bool IsRemote
|
|
|
+ {
|
|
|
+ get => Model.IsRemote;
|
|
|
+ set => SetProperty(ref Model.IsRemote, value);
|
|
|
+ }
|
|
|
+ [PropertyAssociation(nameof(OilSourceStatusModel.IsEnabled))]
|
|
|
+ public bool IsEnabled
|
|
|
+ {
|
|
|
+ get => Model.IsEnabled;
|
|
|
+ set => SetProperty(ref Model.IsEnabled, value);
|
|
|
+ }
|
|
|
+ [PropertyAssociation(nameof(OilSourceStatusModel.IsConnect))]
|
|
|
+ public bool IsConnect { get => Model.IsConnect; set => SetProperty(ref Model.IsConnect, value); }
|
|
|
+ /// <summary>
|
|
|
+ /// 先导油路
|
|
|
+ /// </summary>
|
|
|
+ public CircuitViewModel Forerunner { get; } = new CircuitViewModel()
|
|
|
+ {
|
|
|
+ PressureAction = (pressure)=> CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerPressure)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, pressure),
|
|
|
+ StartAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerStart)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state),
|
|
|
+ LoadAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerLoad)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state)
|
|
|
+ };
|
|
|
+ /// <summary>
|
|
|
+ /// 主油路
|
|
|
+ /// </summary>
|
|
|
+ public AvaloniaList<IndexValueItemViewModel<CircuitViewModel>> Circuit { get; } = new AvaloniaList<IndexValueItemViewModel<CircuitViewModel>>();
|
|
|
+ public AvaloniaList<OilSourceAnalogViewModel> OilSourceAnalogs { get; } = new AvaloniaList<OilSourceAnalogViewModel>();
|
|
|
+
|
|
|
+ public CircuitViewModel Assistant { get; } = new CircuitViewModel()
|
|
|
+ {
|
|
|
+ PressureAction = (pressure) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantPressure)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, pressure),
|
|
|
+ StartAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantStart)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state),
|
|
|
+ LoadAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantLoad)?.Publish(OilSourceStatusViewModel.Instance.Forerunner, null, state)
|
|
|
+ };
|
|
|
+
|
|
|
+ public AvaloniaList<OilErrorInfoViewModel> OilErrors { get; } = new AvaloniaList<OilErrorInfoViewModel>();
|
|
|
+ public bool IsError => (OilErrors.Count > 0 ? OilErrors.Any(x => x.Status) : false) | (OilSourceAnalogs.Count > 0 ? OilSourceAnalogs.Any(x => x.IsError) : false);
|
|
|
+ protected override void Cancel()
|
|
|
+ {
|
|
|
+ }
|
|
|
+ public override void UpDateModel(OilSourceStatusModel model)
|
|
|
+ {
|
|
|
+ bool lasterror = IsError;
|
|
|
+ base.UpDateModel(model);
|
|
|
+ Forerunner?.UpDateModel(model.Forerunner);
|
|
|
+ Circulate?.UpDateModel(model.Circulate);
|
|
|
+ int count = Circuit.Count;
|
|
|
+ if (count < model.Circuit.Count)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < model.Circuit.Count-count; i++)
|
|
|
+ {
|
|
|
+ Circuit.Add(new IndexValueItemViewModel<CircuitViewModel>(Circuit.Count + 1, new CircuitViewModel()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (count > model.Circuit.Count)
|
|
|
+ {
|
|
|
+ Circuit.RemoveRange(model.Circuit.Count, count - model.Circuit.Count);
|
|
|
+ }
|
|
|
+ if (model.Circuit.Count > 0)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < model.Circuit.Count; i++)
|
|
|
+ {
|
|
|
+ Circuit[i].Value?.UpDateModel(model.Circuit[i]);
|
|
|
+ Circuit[i].Value.StartAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitStart)?.Publish(this, null,i, state);
|
|
|
+ Circuit[i].Value.LoadAction = (state) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitLoad)?.Publish(this, null,i, state);
|
|
|
+ Circuit[i].Value.PressureAction = (pressure) => CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitPressure)?.Publish(this, null,i, pressure);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Assistant?.UpDateModel(model.Assistant);
|
|
|
+ count = OilSourceAnalogs.Count;
|
|
|
+ if (count < model.OilSourceAnalogs.Count)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < model.OilSourceAnalogs.Count-count; i++)
|
|
|
+ {
|
|
|
+ OilSourceAnalogs.Add(new OilSourceAnalogViewModel());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (count > model.OilSourceAnalogs.Count)
|
|
|
+ {
|
|
|
+ OilSourceAnalogs.RemoveRange(model.OilSourceAnalogs.Count, count - model.OilSourceAnalogs.Count);
|
|
|
+ }
|
|
|
+ if (model.OilSourceAnalogs.Count > 0)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < model.OilSourceAnalogs.Count; i++)
|
|
|
+ {
|
|
|
+ OilSourceAnalogs[i].UpDateModel(model.OilSourceAnalogs[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ count = OilErrors.Count;
|
|
|
+ if (count < model.OilErrors.Count)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < model.OilErrors.Count-count; i++)
|
|
|
+ {
|
|
|
+ OilErrors.Add(new OilErrorInfoViewModel());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (count > model.OilErrors.Count)
|
|
|
+ {
|
|
|
+ OilErrors.RemoveRange(model.OilErrors.Count, count - model.OilErrors.Count);
|
|
|
+ }
|
|
|
+ if (model.OilErrors.Count > 0)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < model.OilErrors.Count; i++)
|
|
|
+ {
|
|
|
+ OilErrors[i].UpDateModel(model.OilErrors[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ OnPropertyChanged(nameof(IsError));
|
|
|
+ if(IsError!=lasterror)OnPropertyChanged(nameof(OilStatus));
|
|
|
+ }
|
|
|
+ public string OilStatus => Application.Current?.FindResource(IsError ? "OilError" : "OilSuccess") + "";
|
|
|
+ }
|
|
|
+}
|