using Avalonia.Collections; using Avalonia.Controls; using Shaker.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ShakerApp.ViewModels { public class OilSourceStatusViewModel : ViewModelBase { 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(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().Subscrip((sender, args) => { UpDateModel(args.Data.OilSource); CommunicationViewModel.Instance.LocalCommunication?.GetEvent()?.Subscrip((sender, args) => { UpDateModel(args.Data); CommunicationViewModel.Instance.ServiceCommunication?.GetEvent()?.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 = App.Current?.FindResource(state ? "OilConnect" : "OilDisConnect") + ""; if(state) { MainViewModel.Default.ShowToast(msg, Avalonia.Controls.Notifications.NotificationType.Information); } else { MainViewModel.Default.ShowToast(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); } /// /// 先导油路 /// 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) }; /// /// 主油路 /// public AvaloniaList> Circuit { get; } = new AvaloniaList>(); public AvaloniaList OilSourceAnalogs { get; } = new AvaloniaList(); 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 OilErrors { get; } = new AvaloniaList(); 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(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 => App.Current?.FindResource(IsError ? "OilError" : "OilSuccess") + ""; } }