using Avalonia.Controls; using CommunityToolkit.Mvvm.Input; using Shaker.Models; using System; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Linq.Expressions; using System.Threading.Tasks; using System.Windows.Input; namespace ShakerApp.ViewModels { public class CircuitViewModel : ViewModelBase { private int waitTime = 2000; public CircuitViewModel() { Content = typeof(Views.PumpControlView); } public override bool CanCancel => false; public CircuitViewModel(CircuitModel model) : this() { UpDateModel(model); } [PropertyAssociation(nameof(CircuitModel.IsLoadPressure))] public bool IsLoadPressure { get => Model.IsLoadPressure; set => SetProperty(ref Model.IsLoadPressure, value); } [PropertyAssociation(nameof(CircuitModel.IsEnablePressure))] public bool IsEnablePressure => Model.IsEnablePressure; [PropertyAssociation(nameof(CircuitModel.Name))] public string Name => Model.Name; private float _Pressure = 0; public float Pressure { get => _Pressure; set => SetProperty(ref _Pressure, value); } [PropertyAssociation(nameof(CircuitModel.IsStart))] public bool IsStart { get => Model.IsStart; set => SetProperty(ref Model.IsStart, value); } [PropertyAssociation(nameof(CircuitModel.Name))] public bool IsVisible => !string.IsNullOrEmpty(Name); public ICommand StartCommand => new RelayCommand(Start); private async void Start() { StartAction?.Invoke(true); await Task.Delay(waitTime); if(!IsStart) { string msg = string.Format(App.Current?.FindResource("PumpStartError")+"",App.Current?.FindResource(Name)); OilSourceStatusViewModel.Instance.ShowToast(msg, Avalonia.Controls.Notifications.NotificationType.Error); LogViewModel.Instance.AddLog(msg, LogType.Error); return; } LogViewModel.Instance.AddLog(string.Format(App.Current?.FindResource("PumpStartSuccess")+"",App.Current?.FindResource(Name)), LogType.Info); } public ICommand StopCommand => new RelayCommand(Stop); private async void Stop() { StartAction?.Invoke(false); await Task.Delay(waitTime); if (IsStart) { string msg = string.Format(App.Current?.FindResource("PumpStopError") + "", App.Current?.FindResource(Name)); OilSourceStatusViewModel.Instance.ShowToast(msg, Avalonia.Controls.Notifications.NotificationType.Error); LogViewModel.Instance.AddLog(msg, LogType.Error); return; } LogViewModel.Instance.AddLog(string.Format(App.Current?.FindResource("PumpStopSuccess") + "", App.Current?.FindResource(Name)), LogType.Info); } public ICommand LoadPressureCommand => new RelayCommand(LoadPressure); private async void LoadPressure() { LoadAction?.Invoke(true); await Task.Delay(waitTime); if (!IsLoadPressure) { string msg = string.Format(App.Current?.FindResource("PumpLoadError") + "", App.Current?.FindResource(Name)); OilSourceStatusViewModel.Instance.ShowToast(msg, Avalonia.Controls.Notifications.NotificationType.Error); LogViewModel.Instance.AddLog(msg, LogType.Error); return; } LogViewModel.Instance.AddLog(string.Format(App.Current?.FindResource("PumpLoadSuccess") + "", App.Current?.FindResource(Name)), LogType.Info); } [AllowNull] public Action StartAction { get; set; } [AllowNull] public Action LoadAction { get; set; } [AllowNull] public Action PressureAction { get; set; } public ICommand UnloadPressureCommand => new RelayCommand(UnloadPressure); private async void UnloadPressure() { Pressure = 0; LoadAction?.Invoke(false); await Task.Delay(waitTime); if (IsLoadPressure) { string msg = string.Format(App.Current?.FindResource("PumpUnloadError") + "", App.Current?.FindResource(Name)); OilSourceStatusViewModel.Instance.ShowToast(msg, Avalonia.Controls.Notifications.NotificationType.Error); LogViewModel.Instance.AddLog(msg, LogType.Error); return; } LogViewModel.Instance.AddLog(string.Format(App.Current?.FindResource("PumpUnloadSuccess") + "", App.Current?.FindResource(Name)), LogType.Info); } protected override void OnPropertyChanged(PropertyChangedEventArgs e) { base.OnPropertyChanged(e); if (e.PropertyName == nameof(Pressure) && IsLoadPressure) { SetPressure(Pressure); } } private void SetPressure(float pressure) { PressureAction?.Invoke(pressure); LogViewModel.Instance.AddLog(string.Format(App.Current?.FindResource("PumpPressure") + "", App.Current?.FindResource(Name), pressure,"MPa"), LogType.Info); } } }