using LiveCharts; using RealTimeGraphX.DataPoints; using RealTimeGraphX.WPF; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Media; using Tango.Core.Commands; using Tango.Core.Helpers; using Tango.FSE.Common; using Tango.FSE.Common.Connection; using Tango.FSE.Common.Graphs; using Tango.FSE.Common.Performance; using Tango.PPC.Shared.Information; using Tango.SystemInfo; using static Tango.SharedUI.Controls.NavigationControl; namespace Tango.FSE.PPCConsole.ViewModels { /// /// Represents the PPC monitoring view model. /// /// /// public class MonitoringViewVM : FSEViewModel, INavigationViewModel { #region Properties /// /// Gets or sets the CPU real-time graph controller. /// public WpfGraphController CPUController { get; set; } /// /// Gets or sets the RAM real-time controller. /// public WpfGraphController RAMController { get; set; } /// /// Gets or sets the disk space point label (Live Charts). /// public Func DiskSpacePointLabel { get; set; } private InformationPackage _systemInfo; /// /// Gets or sets the system information package. /// public InformationPackage SystemInfo { get { return _systemInfo; } set { _systemInfo = value; RaisePropertyChangedAuto(); } } private SystemObjectsCollection _selectedSystemObjectCollection; /// /// Gets or sets the selected system object collection. /// public SystemObjectsCollection SelectedSystemObjectCollection { get { return _selectedSystemObjectCollection; } set { _selectedSystemObjectCollection = value; RaisePropertyChangedAuto(); } } private bool _fetchingSystemInfo; /// /// Gets or sets a value indicating whether the view model is currently busy with fetching the remote system information. /// public bool FetchingSystemInfo { get { return _fetchingSystemInfo; } set { _fetchingSystemInfo = value; RaisePropertyChangedAuto(); } } private double _usedDiskSpace; /// /// Gets or sets the PPC used disk space. /// public double UsedDiskSpace { get { return _usedDiskSpace; } set { if (_usedDiskSpace != value) { _usedDiskSpace = value; RaisePropertyChangedAuto(); } } } private double _availableDiskSpace; /// /// Gets or sets the PPC available disk space. /// public double AvailableDiskSpace { get { return _availableDiskSpace; } set { if (_availableDiskSpace != value) { _availableDiskSpace = value; RaisePropertyChangedAuto(); } } } #endregion #region Commands /// /// Performs disk space optimization. /// public RelayCommand PerformDiskSpaceOptimizationCommand { get; set; } #endregion #region Constructors /// /// Initializes a new instance of the class. /// public MonitoringViewVM() { CPUController = CreateController(CreateSeries("Total", GraphHelper.GraphColor.White), CreateSeries("Application", GraphHelper.GraphColor.Red)); RAMController = CreateController(CreateSeries("Total", GraphHelper.GraphColor.White), CreateSeries("Application", GraphHelper.GraphColor.Yellow)); UsedDiskSpace = 1000 * 40; AvailableDiskSpace = 1000 * 60; DiskSpacePointLabel = (point) => { return $"{(point.Y / 1000d).ToString("0.0")} GB"; }; PerformDiskSpaceOptimizationCommand = new RelayCommand(PerformDiskSpaceOptimization); } #endregion #region Override Methods public override void OnApplicationStarted() { base.OnApplicationStarted(); PerformanceProvider.PerformancePackageAvailable += PerformanceProvider_PerformancePackageAvailable; MachineProvider.MachineDisconnected += MachineProvider_MachineDisconnected; MachineProvider.MachineConnected += MachineProvider_MachineConnected; } public override void OnNavigatedTo() { base.OnNavigatedTo(); if (MachineProvider.IsConnected && MachineProvider.ConnectionType.IsRemote()) { LoadSystemInformation(); } } #endregion #region Event Handlers private void MachineProvider_MachineConnected(object sender, Common.Connection.MachineConnectedEventArgs e) { CPUController.Clear(); RAMController.Clear(); AvailableDiskSpace = 0; UsedDiskSpace = 0; LoadSystemInformation(); } private void MachineProvider_MachineDisconnected(object sender, Common.Connection.MachineDisconnectedEventArgs e) { SystemInfo = null; } private void PerformanceProvider_PerformancePackageAvailable(object sender, PerformancePackageEventArgs e) { List xx = new List() { DateTime.Now, DateTime.Now }; //CPU CPUController.PushData(xx, new List() { e.Package.CPU, e.Package.ApplicationCPU }); //App RAM RAMController.Range.MaximumY = e.Package.MaxRAM; RAMController.PushData(xx, new List() { e.Package.RAM, e.Package.ApplicationRAM }); //Disk Space var usedDiskSpace = e.Package.DiskCapacity - e.Package.AvailableDiskSpace; var availableDiskSpace = e.Package.AvailableDiskSpace; if (Math.Abs(UsedDiskSpace - usedDiskSpace) > 10) { UsedDiskSpace = usedDiskSpace; } if (Math.Abs(AvailableDiskSpace - availableDiskSpace) > 10) { AvailableDiskSpace = availableDiskSpace; } } #endregion #region Private Methods private WpfGraphController CreateController(params WpfGraphDataSeries[] seriesCollection) { var controller = new WpfGraphController(); foreach (var series in seriesCollection) { controller.DataSeriesCollection.Add(series); } controller.Range.AutoY = false; controller.Range.MaximumY = 100; controller.Range.MinimumY = 0; controller.Range.MaximumX = new DateTime(0).AddMinutes(1); controller.RefreshRate = TimeSpan.FromMilliseconds(100); return controller; } private WpfGraphDataSeries CreateSeries(String name, GraphHelper.GraphColor fill) { WpfGraphDataSeries series = new WpfGraphDataSeries(); series.Name = name; series.Fill = GraphHelper.GetGraphBrush(fill); series.StrokeThickness = 1; series.Stroke = GraphHelper.GetGraphStrokeColor(); return series; } private async void LoadSystemInformation() { if (!MachineProvider.ConnectionType.IsRemote()) return; if (SystemInfo == null && !FetchingSystemInfo) { try { FetchingSystemInfo = true; SystemInfo = await SystemInfoProvider.GetSystemInformationPackage(); SelectedSystemObjectCollection = SystemInfo.System.FirstOrDefault(); } catch (Exception ex) { FetchingSystemInfo = false; LogManager.Log(ex, "Error retrieving system information from remote machine."); NotificationProvider.PushErrorReportingSnackbar(ex, "PPC Module Error", "Error retrieving the remote machine PPC system information."); } finally { FetchingSystemInfo = false; } } } private async void PerformDiskSpaceOptimization() { if (await NotificationProvider.ShowQuestion("The following stage will try to optimize the disk space on the remote machine panel PC. Do you wish to continue?", "RUN OPTIMIZATION", "NO")) { try { using (NotificationProvider.PushTaskItem("Performing disk space optimization, please wait...")) { var response = await FileSystemProvider.PerformDiskSpaceOptimization(); await NotificationProvider.ShowSuccess($"Disk space optimization completed successfully.\n{FileHelper.GetFriendlyFileSize(response.DeletedBytes)} cleared!"); } } catch (Exception ex) { await NotificationProvider.ShowError($"Error occurred while trying disk space optimization.\n{ex.FlattenMessage()}"); } } } #endregion } }