forked from amkovkov/GranuSightSoftware2
comprehensive update
1) remove unused components: camera view (due it causes segmentation faults), compute resources and all related, illuminator controller (due in useless without camera view), image storage service, temperature and humidity service 2) database schema - reduce tables references, features storing in records themselves in compressed form, add records creation and editing date and time, add separator comment column 3) analysis - rework of pipeline and ui, now database storing only raw data and all display values calculated from it 4) lights service - add reconnection if disconnected 5) add width and height command line arguments 6) fix some typos and other issues
This commit is contained in:
@@ -4,22 +4,24 @@ using Avalonia.Threading;
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
|
||||
namespace GSS2.UI.Core.ViewModels;
|
||||
|
||||
public partial class AsyncImageRecordViewModel : ViewModelBase
|
||||
{
|
||||
private static readonly SemaphoreSlim _semaphore = new(1, 1);
|
||||
|
||||
[ObservableProperty] public partial string? Data { get; set; }
|
||||
[ObservableProperty] public partial string Data { get; set; }
|
||||
[ObservableProperty] public partial IImage? Image { get; set; }
|
||||
[ObservableProperty] public partial bool IsLoading { get; set; } = false;
|
||||
|
||||
public AsyncImageRecordViewModel(string? data = null)
|
||||
public AsyncImageRecordViewModel(string data = "")
|
||||
{
|
||||
Data = data;
|
||||
}
|
||||
|
||||
partial void OnDataChanged(string? value) => _ = LoadAsync();
|
||||
partial void OnDataChanged(string value) => _ = LoadAsync();
|
||||
|
||||
private async Task LoadAsync()
|
||||
{
|
||||
@@ -27,7 +29,7 @@ public partial class AsyncImageRecordViewModel : ViewModelBase
|
||||
|
||||
try
|
||||
{
|
||||
if (Data is not null)
|
||||
if (!string.IsNullOrEmpty(Data))
|
||||
{
|
||||
IsLoading = true;
|
||||
byte[] imageBytes = Convert.FromBase64String(Data);
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
using LibCameraSharp;
|
||||
|
||||
using GSS2.Core.Hardware;
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
using Avalonia.Media;
|
||||
|
||||
namespace GSS2.UI.Core.ViewModels;
|
||||
|
||||
public partial class CameraViewModel : ViewModelBase, IDisposable
|
||||
{
|
||||
private bool _disposedValue;
|
||||
|
||||
private readonly ILogger<CameraViewModel> _logger;
|
||||
private readonly CameraService _cameraService;
|
||||
private readonly System.Timers.Timer _renderTimer;
|
||||
|
||||
public event EventHandler? RenderRequested;
|
||||
|
||||
[ObservableProperty] private Color _background = Colors.Transparent;
|
||||
[ObservableProperty] private Stretch _stretchMode = Stretch.Uniform;
|
||||
[ObservableProperty] private TileMode _tileMode = TileMode.None;
|
||||
|
||||
public CameraViewModel(ILogger<CameraViewModel> logger, CameraService cameraService)
|
||||
{
|
||||
_logger = logger;
|
||||
_logger.LogInformation("Initialization");
|
||||
|
||||
_cameraService = cameraService;
|
||||
_renderTimer = new System.Timers.Timer(33);
|
||||
_renderTimer.Elapsed += (_, _) =>
|
||||
{
|
||||
if (!_cameraService.IsImageCapturing)
|
||||
RenderRequested?.Invoke(this, new EventArgs());
|
||||
};
|
||||
|
||||
_logger.LogInformation("Initialized");
|
||||
}
|
||||
|
||||
public void StartViewFinder()
|
||||
{
|
||||
_cameraService.StartViewFinder();
|
||||
_renderTimer.Start();
|
||||
}
|
||||
public void StopViewFinder()
|
||||
{
|
||||
_renderTimer.Stop();
|
||||
_cameraService.StopViewFinder();
|
||||
}
|
||||
public bool CanGrabViewFinderFrame() => !_cameraService.IsImageCapturing;
|
||||
public (FrameBuffer, StreamConfiguration)? GrabViewFinderFrame() => _cameraService.GrabViewFinderFrame();
|
||||
public void ReturnViewFinderFrame(FrameBuffer frameBuffer) => _cameraService.ReturnViewFinderFrame(frameBuffer);
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!_disposedValue)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
_renderTimer.Stop();
|
||||
_renderTimer.Dispose();
|
||||
}
|
||||
_disposedValue = true;
|
||||
}
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(disposing: true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
using Avalonia.Layout;
|
||||
|
||||
using GSS2.Core.Hardware;
|
||||
|
||||
namespace GSS2.UI.Core.ViewModels;
|
||||
|
||||
public partial class IlluminatorControllerViewModel : ViewModelBase
|
||||
{
|
||||
private readonly ILogger<IlluminatorControllerViewModel> _logger;
|
||||
private readonly IlluminatorService _illuminatorService;
|
||||
|
||||
private bool _whiteIntensityChanging = false;
|
||||
private bool _uv365IntensityChanging = false;
|
||||
private bool _uv254IntensityChanging = false;
|
||||
|
||||
[ObservableProperty] private double _whiteIntensity;
|
||||
[ObservableProperty] private double _uv365Intensity;
|
||||
[ObservableProperty] private double _uv254Intensity;
|
||||
[ObservableProperty] private bool _enabled;
|
||||
[ObservableProperty] Orientation _orientation;
|
||||
|
||||
public IlluminatorControllerViewModel(ILogger<IlluminatorControllerViewModel> logger, IlluminatorService illuminatorService)
|
||||
{
|
||||
_logger = logger;
|
||||
_logger.LogInformation("Initialization");
|
||||
|
||||
_illuminatorService = illuminatorService;
|
||||
|
||||
WhiteIntensity = 0;
|
||||
Uv365Intensity = 0;
|
||||
Uv254Intensity = 0;
|
||||
Orientation = Orientation.Horizontal;
|
||||
Enabled = false;
|
||||
|
||||
_logger.LogInformation("Initialized");
|
||||
}
|
||||
|
||||
partial void OnWhiteIntensityChanged(double value)
|
||||
{
|
||||
if (_whiteIntensityChanging)
|
||||
return;
|
||||
_whiteIntensityChanging = true;
|
||||
_illuminatorService.SetIntensity(white: value);
|
||||
_whiteIntensityChanging = false;
|
||||
}
|
||||
partial void OnUv365IntensityChanged(double value)
|
||||
{
|
||||
if (_uv365IntensityChanging)
|
||||
return;
|
||||
_uv365IntensityChanging = true;
|
||||
_illuminatorService.SetIntensity(uv365: value);
|
||||
_uv365IntensityChanging = false;
|
||||
}
|
||||
partial void OnUv254IntensityChanged(double value)
|
||||
{
|
||||
if (_uv254IntensityChanging)
|
||||
return;
|
||||
_uv254IntensityChanging = true;
|
||||
_illuminatorService.SetIntensity(uv254: value);
|
||||
_uv254IntensityChanging = false;
|
||||
}
|
||||
|
||||
partial void OnEnabledChanged(bool value)
|
||||
{
|
||||
if (value)
|
||||
_illuminatorService.TurnOn();
|
||||
else
|
||||
_illuminatorService.TurnOff();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -10,6 +10,8 @@ public partial class MainWindowViewModel : ViewModelBase
|
||||
[ObservableProperty] public partial WindowDecorations WindowDecorations { get; set; }
|
||||
[ObservableProperty] public partial bool Topmost { get; set; }
|
||||
[ObservableProperty] public partial WindowState WindowState { get; set; }
|
||||
[ObservableProperty] public partial double Width { get; set; }
|
||||
[ObservableProperty] public partial double Height { get; set; }
|
||||
|
||||
public MainWindowViewModel()
|
||||
{
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
using Avalonia;
|
||||
|
||||
using LiveChartsCore;
|
||||
using LiveChartsCore.Defaults;
|
||||
using LiveChartsCore.SkiaSharpView;
|
||||
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace GSS2.UI.Core.ViewModels;
|
||||
|
||||
public partial class ResourceBarViewModel : ViewModelBase
|
||||
{
|
||||
private readonly ILogger<ResourceBarViewModel> _logger;
|
||||
|
||||
[ObservableProperty] private ObservableCollection<ISeries> _series;
|
||||
[ObservableProperty] private Rect _bounds;
|
||||
|
||||
public ResourceBarViewModel(ILogger<ResourceBarViewModel> logger, IEnumerable<ISeries> series)
|
||||
{
|
||||
_logger = logger;
|
||||
_logger.LogInformation("Initialization");
|
||||
|
||||
Series = new ObservableCollection<ISeries>(series);
|
||||
|
||||
_logger.LogInformation("Initialized");
|
||||
}
|
||||
|
||||
partial void OnBoundsChanged(Rect value)
|
||||
{
|
||||
var size = Math.Min(value.Width, value.Height);
|
||||
|
||||
var textSize = size switch
|
||||
{
|
||||
< 100 => 8,
|
||||
< 150 => 10,
|
||||
< 175 => 12,
|
||||
_ => 14
|
||||
};
|
||||
var innerRadius = size switch
|
||||
{
|
||||
< 50 => size / 2,
|
||||
< 120 => size / 3,
|
||||
_ => size / 4,
|
||||
};
|
||||
|
||||
foreach (var series in Series.OfType<PieSeries<ObservableValue>>())
|
||||
{
|
||||
series.DataLabelsSize = textSize;
|
||||
series.InnerRadius = innerRadius;
|
||||
series.OuterRadiusOffset = 0;
|
||||
series.RelativeOuterRadius = 1;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateValue(double value, double maxValue)
|
||||
{
|
||||
if (Series.Count() == 2 &&
|
||||
Series.Skip(0).First().Values is ObservableCollection<ObservableValue> value1 &&
|
||||
Series.Skip(1).First().Values is ObservableCollection<ObservableValue> value2)
|
||||
{
|
||||
value1.First().Value = value > maxValue ? maxValue : value;
|
||||
value2.First().Value = value > maxValue ? 0 : maxValue - value;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
using Avalonia;
|
||||
|
||||
using LiveChartsCore;
|
||||
using LiveChartsCore.SkiaSharpView;
|
||||
|
||||
namespace GSS2.UI.Core.ViewModels;
|
||||
|
||||
public partial class ResourceChartViewModel : ViewModelBase
|
||||
{
|
||||
private readonly ILogger<ResourceChartViewModel> _logger;
|
||||
[ObservableProperty] private ObservableCollection<ISeries> _series;
|
||||
[ObservableProperty] private ObservableCollection<Axis> _yAxes;
|
||||
[ObservableProperty] private ObservableCollection<Axis> _xAxes;
|
||||
[ObservableProperty] private Rect _bounds;
|
||||
|
||||
public ResourceChartViewModel(ILogger<ResourceChartViewModel> logger, IEnumerable<ISeries> series, IEnumerable<Axis> yAxes, IEnumerable<Axis> xAxes)
|
||||
{
|
||||
_logger = logger;
|
||||
_logger.LogInformation("Initialization");
|
||||
|
||||
Series = new ObservableCollection<ISeries>(series);
|
||||
YAxes = new ObservableCollection<Axis>(yAxes);
|
||||
XAxes = new ObservableCollection<Axis>(xAxes);
|
||||
|
||||
_logger.LogInformation("Initialized");
|
||||
}
|
||||
|
||||
partial void OnBoundsChanged(Rect value)
|
||||
{
|
||||
var textSize = value.Height switch
|
||||
{
|
||||
< 100 => 8,
|
||||
< 150 => 10,
|
||||
< 200 => 12,
|
||||
_ => 14
|
||||
};
|
||||
var labelsDensity = value.Height switch
|
||||
{
|
||||
< 100 => 0.2f,
|
||||
< 150 => 0.3f,
|
||||
< 200 => 0.4f,
|
||||
_ => 0.5f
|
||||
};
|
||||
foreach (var axis in YAxes)
|
||||
{
|
||||
axis.TextSize = textSize;
|
||||
axis.NameTextSize = textSize;
|
||||
axis.LabelsDensity = labelsDensity;
|
||||
}
|
||||
}
|
||||
|
||||
public void AppendValue(double value, int maxValuesCount)
|
||||
{
|
||||
if (Series.Count() != 1 || Series.First().Values is not ObservableCollection<double> values)
|
||||
return;
|
||||
|
||||
values.Add(value);
|
||||
while (values.Count() > maxValuesCount || values.Count() == 0)
|
||||
values.RemoveAt(0);
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
using Avalonia;
|
||||
|
||||
namespace GSS2.UI.Core.ViewModels;
|
||||
|
||||
public partial class ResourceCpuUsageBarsViewModel : ViewModelBase
|
||||
{
|
||||
private readonly ILogger<ResourceCpuUsageBarsViewModel> _logger;
|
||||
|
||||
[ObservableProperty] private Rect _bounds;
|
||||
[ObservableProperty] private bool _isCoresColumnVisible;
|
||||
[ObservableProperty] private ResourceBarViewModel _cpu;
|
||||
[ObservableProperty] private ResourceBarViewModel _cpu0;
|
||||
[ObservableProperty] private ResourceBarViewModel _cpu1;
|
||||
[ObservableProperty] private ResourceBarViewModel _cpu2;
|
||||
[ObservableProperty] private ResourceBarViewModel _cpu3;
|
||||
|
||||
public ResourceCpuUsageBarsViewModel(
|
||||
ILogger<ResourceCpuUsageBarsViewModel> logger,
|
||||
ResourceBarViewModel cpu,
|
||||
ResourceBarViewModel cpu0,
|
||||
ResourceBarViewModel cpu1,
|
||||
ResourceBarViewModel cpu2,
|
||||
ResourceBarViewModel cpu3
|
||||
)
|
||||
{
|
||||
_logger = logger;
|
||||
_logger.LogInformation("Initialized");
|
||||
|
||||
Cpu = cpu;
|
||||
Cpu0 = cpu0;
|
||||
Cpu1 = cpu1;
|
||||
Cpu2 = cpu2;
|
||||
Cpu3 = cpu3;
|
||||
|
||||
_logger.LogInformation("Initialized");
|
||||
}
|
||||
|
||||
partial void OnBoundsChanged(Rect value)
|
||||
{
|
||||
IsCoresColumnVisible = Math.Min(value.Width, value.Height * 1.5) > 200;
|
||||
}
|
||||
}
|
||||
@@ -1,229 +0,0 @@
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
using Avalonia;
|
||||
using Avalonia.Threading;
|
||||
|
||||
using SkiaSharp;
|
||||
|
||||
using LiveChartsCore.SkiaSharpView;
|
||||
using LiveChartsCore.SkiaSharpView.Painting;
|
||||
using LiveChartsCore.Defaults;
|
||||
|
||||
using GSS2.Core.Hardware;
|
||||
|
||||
namespace GSS2.UI.Core.ViewModels;
|
||||
|
||||
public partial class ResourcesViewModel : ViewModelBase, IDisposable
|
||||
{
|
||||
private bool _disposedValue;
|
||||
|
||||
private readonly ComputeResourcesService _computeResourcesService;
|
||||
private readonly ILogger<ResourcesViewModel> _logger;
|
||||
private readonly int _intervalMs = 500;
|
||||
private readonly int _chartsHistorySize = 120;
|
||||
private readonly System.Timers.Timer _updateTimer;
|
||||
|
||||
[ObservableProperty] private Rect _bounds;
|
||||
[ObservableProperty] private bool _isChartsColumnVisible;
|
||||
[ObservableProperty] private bool _isBarsColumnVisible;
|
||||
[ObservableProperty] private ResourceChartViewModel _cpuUsageChartViewModel;
|
||||
[ObservableProperty] private ResourceChartViewModel _cpuTemperatureChartViewModel;
|
||||
[ObservableProperty] private ResourceChartViewModel _memoryUsageChartViewModel;
|
||||
[ObservableProperty] private ResourceCpuUsageBarsViewModel _cpuUsageBarsViewModel;
|
||||
[ObservableProperty] private ResourceBarViewModel _cpuTemperatureBarViewModel;
|
||||
[ObservableProperty] private ResourceBarViewModel _memoryUsageBarViewModel;
|
||||
|
||||
public ResourcesViewModel(
|
||||
ILogger<ResourcesViewModel> logger,
|
||||
ILogger<ResourceCpuUsageBarsViewModel> resourceCpuUsageBarsViewModelLogger,
|
||||
ILogger<ResourceChartViewModel> resourceChartViewModelCpuUsageLogger,
|
||||
ILogger<ResourceChartViewModel> resourceChartViewModelCpuTemperatureLogger,
|
||||
ILogger<ResourceChartViewModel> resourceChartViewModelMemoryUsageLogger,
|
||||
ILogger<ResourceBarViewModel> resourceBarViewModelCpuUsageLogger,
|
||||
ILogger<ResourceBarViewModel> resourceBarViewModelCpu0UsageLogger,
|
||||
ILogger<ResourceBarViewModel> resourceBarViewModelCpu1UsageLogger,
|
||||
ILogger<ResourceBarViewModel> resourceBarViewModelCpu2UsageLogger,
|
||||
ILogger<ResourceBarViewModel> resourceBarViewModelCpu3UsageLogger,
|
||||
ILogger<ResourceBarViewModel> resourceBarViewModelCpuTemperatureLogger,
|
||||
ILogger<ResourceBarViewModel> resourceBarViewModelMemoryUsageLogger,
|
||||
ComputeResourcesService computeResourcesService
|
||||
)
|
||||
{
|
||||
_logger = logger;
|
||||
_logger.LogInformation("Initialization");
|
||||
|
||||
_computeResourcesService = computeResourcesService;
|
||||
|
||||
ResourceChartViewModel CreateChartViewModel(ILogger<ResourceChartViewModel> logger, string name, double minLimit, double maxLimit, double minStep)
|
||||
{
|
||||
return new ResourceChartViewModel(
|
||||
logger: logger,
|
||||
series:
|
||||
[
|
||||
new LineSeries<double>
|
||||
{
|
||||
Name = name,
|
||||
Values = new ObservableCollection<double>(Enumerable.Repeat(0.0, _chartsHistorySize)),
|
||||
Fill = new SolidColorPaint(SKColors.DeepSkyBlue.WithAlpha(127), 0),
|
||||
GeometrySize = 0,
|
||||
ShowDataLabels = false,
|
||||
Stroke = new SolidColorPaint(SKColors.DeepSkyBlue, 1),
|
||||
GeometryFill = new SolidColorPaint(SKColors.Transparent, 0),
|
||||
GeometryStroke = new SolidColorPaint(SKColors.Transparent, 0),
|
||||
IsHoverable = false,
|
||||
DataPadding = new LiveChartsCore.Drawing.LvcPoint(0.1f, 0.1f)
|
||||
}
|
||||
],
|
||||
yAxes:
|
||||
[
|
||||
new Axis
|
||||
{
|
||||
MinLimit = minLimit,
|
||||
MaxLimit = maxLimit,
|
||||
MinStep = minStep,
|
||||
Name = name
|
||||
}
|
||||
],
|
||||
xAxes:
|
||||
[
|
||||
new Axis
|
||||
{
|
||||
IsVisible = false,
|
||||
Padding = new LiveChartsCore.Drawing.Padding(0)
|
||||
}
|
||||
]
|
||||
);
|
||||
}
|
||||
ResourceBarViewModel CreateBarViewModel(ILogger<ResourceBarViewModel> logger, Func<LiveChartsCore.Kernel.ChartPoint<ObservableValue, LiveChartsCore.SkiaSharpView.Drawing.Geometries.DoughnutGeometry, LiveChartsCore.SkiaSharpView.Drawing.Geometries.LabelGeometry>, string> formatter)
|
||||
{
|
||||
return new ResourceBarViewModel(
|
||||
logger: logger,
|
||||
series:
|
||||
[
|
||||
new PieSeries<ObservableValue>
|
||||
{
|
||||
Values = new ObservableCollection<ObservableValue> { new ObservableValue(1) },
|
||||
Fill = new SolidColorPaint(SKColors.DeepSkyBlue, 0),
|
||||
ShowDataLabels = true,
|
||||
IsHoverable = false,
|
||||
HoverPushout = 0,
|
||||
DataLabelsFormatter = formatter,
|
||||
DataLabelsPosition = LiveChartsCore.Measure.PolarLabelsPosition.ChartCenter,
|
||||
DataLabelsPaint = new SolidColorPaint(SKColors.White)
|
||||
},
|
||||
new PieSeries<ObservableValue>
|
||||
{
|
||||
Values = new ObservableCollection<ObservableValue> { new ObservableValue(1) },
|
||||
Fill = new SolidColorPaint(SKColors.DeepSkyBlue.WithAlpha(64), 0),
|
||||
ShowDataLabels = false,
|
||||
IsHoverable = false,
|
||||
HoverPushout = 0
|
||||
}
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
CpuUsageChartViewModel = CreateChartViewModel(resourceChartViewModelCpuUsageLogger, "Нагрузка ЦПУ, %", 0, 100, 10);
|
||||
CpuTemperatureChartViewModel = CreateChartViewModel(resourceChartViewModelCpuTemperatureLogger, "Температура ЦПУ, ℃", 0, 100, 10);
|
||||
MemoryUsageChartViewModel = CreateChartViewModel(resourceChartViewModelMemoryUsageLogger, "Нагрузка ОЗУ, МБ", 0, 8000, 1000);
|
||||
|
||||
CpuUsageBarsViewModel = new ResourceCpuUsageBarsViewModel(
|
||||
resourceCpuUsageBarsViewModelLogger,
|
||||
CreateBarViewModel(resourceBarViewModelCpuUsageLogger, value => $"{value.Model?.Value?.ToString("00.00")} %"),
|
||||
CreateBarViewModel(resourceBarViewModelCpu0UsageLogger, value => $"{value.Model?.Value?.ToString("00.00")} %"),
|
||||
CreateBarViewModel(resourceBarViewModelCpu1UsageLogger, value => $"{value.Model?.Value?.ToString("00.00")} %"),
|
||||
CreateBarViewModel(resourceBarViewModelCpu2UsageLogger, value => $"{value.Model?.Value?.ToString("00.00")} %"),
|
||||
CreateBarViewModel(resourceBarViewModelCpu3UsageLogger, value => $"{value.Model?.Value?.ToString("00.00")} %")
|
||||
);
|
||||
CpuTemperatureBarViewModel = CreateBarViewModel(resourceBarViewModelCpuTemperatureLogger, value => $"{value.Model?.Value?.ToString("00.00")} ℃");
|
||||
MemoryUsageBarViewModel = CreateBarViewModel(resourceBarViewModelMemoryUsageLogger, value => $"{value.Model?.Value?.ToString("000.00")} МБ");
|
||||
|
||||
Update();
|
||||
|
||||
_updateTimer = new System.Timers.Timer(_intervalMs);
|
||||
_updateTimer.Elapsed += UpdateTimerElapsed;
|
||||
_updateTimer.AutoReset = true;
|
||||
_updateTimer.Start();
|
||||
|
||||
_logger.LogInformation("Initialized");
|
||||
}
|
||||
|
||||
partial void OnBoundsChanged(Rect value)
|
||||
{
|
||||
if (value.Width < 300)
|
||||
{
|
||||
IsChartsColumnVisible = false;
|
||||
IsBarsColumnVisible = true;
|
||||
}
|
||||
else if (value.Width < 400)
|
||||
{
|
||||
IsChartsColumnVisible = true;
|
||||
IsBarsColumnVisible = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
IsChartsColumnVisible = true;
|
||||
IsBarsColumnVisible = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateTimerElapsed(object? sender, System.Timers.ElapsedEventArgs ea) => Update();
|
||||
private void Update()
|
||||
{
|
||||
try
|
||||
{
|
||||
var snapshot = _computeResourcesService.GetSnapshot();
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
if (CpuTemperatureChartViewModel.YAxes.Count() == 1)
|
||||
CpuTemperatureChartViewModel.YAxes.First().MaxLimit = snapshot.CpuTemperature.Critical;
|
||||
if (MemoryUsageChartViewModel.YAxes.Count() == 1)
|
||||
MemoryUsageChartViewModel.YAxes.First().MaxLimit = snapshot.MemoryUsage.TotalMB;
|
||||
|
||||
CpuUsageChartViewModel.AppendValue(Math.Round(snapshot.CpuUsage.AllUsagePercent, 2), _chartsHistorySize);
|
||||
CpuTemperatureChartViewModel.AppendValue(Math.Round(snapshot.CpuTemperature.Current, 2), _chartsHistorySize);
|
||||
MemoryUsageChartViewModel.AppendValue(Math.Round(snapshot.MemoryUsage.UsedMB, 2), _chartsHistorySize);
|
||||
|
||||
CpuUsageBarsViewModel.Cpu.UpdateValue(Math.Round(snapshot.CpuUsage.AllUsagePercent, 2), 100);
|
||||
CpuUsageBarsViewModel.Cpu0.UpdateValue(Math.Round(snapshot.CpuUsage.CoreUsagePercents.Skip(0).First(), 2), 100);
|
||||
CpuUsageBarsViewModel.Cpu1.UpdateValue(Math.Round(snapshot.CpuUsage.CoreUsagePercents.Skip(1).First(), 2), 100);
|
||||
CpuUsageBarsViewModel.Cpu2.UpdateValue(Math.Round(snapshot.CpuUsage.CoreUsagePercents.Skip(2).First(), 2), 100);
|
||||
CpuUsageBarsViewModel.Cpu3.UpdateValue(Math.Round(snapshot.CpuUsage.CoreUsagePercents.Skip(3).First(), 2), 100);
|
||||
CpuTemperatureBarViewModel.UpdateValue(Math.Round(snapshot.CpuTemperature.Current, 2), snapshot.CpuTemperature.Critical);
|
||||
MemoryUsageBarViewModel.UpdateValue(Math.Round(snapshot.MemoryUsage.UsedMB, 2), snapshot.MemoryUsage.TotalMB);
|
||||
});
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogWarning(e, "Exception while update");
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!_disposedValue)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
try
|
||||
{
|
||||
_updateTimer.Stop();
|
||||
_updateTimer.Dispose();
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
|
||||
_disposedValue = true;
|
||||
}
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(disposing: true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user