Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5bb26c1c3f | |||
| f8aa7c9118 | |||
| afa7bd987a | |||
| 4cd7e74923 | |||
| d65c556656 |
@@ -11,9 +11,9 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="LibreHardwareMonitorLib" Version="0.9.5" />
|
<PackageReference Include="LibreHardwareMonitorLib" Version="0.9.6" />
|
||||||
<PackageReference Include="PipeMethodCalls" Version="4.0.3" />
|
<PackageReference Include="PipeMethodCalls" Version="4.0.3" />
|
||||||
<PackageReference Include="Serilog" Version="4.3.0" />
|
<PackageReference Include="Serilog" Version="4.3.1" />
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
<PackageReference Include="TaskScheduler" Version="2.12.2" />
|
<PackageReference Include="TaskScheduler" Version="2.12.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace HardwareMonitorStatusWindow.StatusWindow;
|
|||||||
|
|
||||||
public partial class App
|
public partial class App
|
||||||
{
|
{
|
||||||
private List<IDisposable> _windowSourceList;
|
private List<IDisposable>? _windowSourceList;
|
||||||
|
|
||||||
protected override void OnStartup(StartupEventArgs e)
|
protected override void OnStartup(StartupEventArgs e)
|
||||||
{
|
{
|
||||||
@@ -30,7 +30,7 @@ public partial class App
|
|||||||
|
|
||||||
protected override void OnExit(ExitEventArgs e)
|
protected override void OnExit(ExitEventArgs e)
|
||||||
{
|
{
|
||||||
_windowSourceList.ForEach(ws => ws.Dispose());
|
_windowSourceList?.ForEach(ws => ws.Dispose());
|
||||||
|
|
||||||
base.OnExit(e);
|
base.OnExit(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,17 +6,18 @@ using System.Collections.ObjectModel;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Serilog;
|
||||||
|
|
||||||
namespace HardwareMonitorStatusWindow.StatusWindow;
|
namespace HardwareMonitorStatusWindow.StatusWindow;
|
||||||
|
|
||||||
internal static class Data
|
internal static class Data
|
||||||
{
|
{
|
||||||
private static PipeClient<IHardwareMonitorService> _pipeClient;
|
private static PipeClient<IHardwareMonitorService>? _pipeClient;
|
||||||
private static IEnumerable<Hardware> _hardware;
|
private static IEnumerable<Hardware>? _hardware;
|
||||||
|
|
||||||
internal static ObservableCollection<SensorEntry> SensorEntries { get; set; }
|
internal static ObservableCollection<SensorEntry> SensorEntries { get; set; } = [];
|
||||||
|
|
||||||
internal static async Task LoadComputer()
|
private static async Task LoadComputer()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -25,25 +26,28 @@ internal static class Data
|
|||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
|
Log.Error(exception, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void RefreshComputer()
|
internal static async Task RefreshComputer()
|
||||||
{
|
{
|
||||||
|
if (_pipeClient is not { State: PipeState.Connected })
|
||||||
|
await LoadComputer();
|
||||||
|
|
||||||
_hardware = _pipeClient.InvokeAsync(service => service.GetHardware()).Result;
|
_hardware = _pipeClient.InvokeAsync(service => service.GetHardware()).Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void CloseComputer()
|
internal static void CloseComputer()
|
||||||
{
|
{
|
||||||
_pipeClient.Dispose();
|
_pipeClient?.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static IList<Hardware> ComputerHardware => _hardware.ToList();
|
internal static IList<Hardware> ComputerHardware => _hardware?.ToList() ?? [];
|
||||||
|
|
||||||
internal static void Load()
|
internal static void Load()
|
||||||
{
|
{
|
||||||
SensorEntries = JsonSerializer.Deserialize<ObservableCollection<SensorEntry>>(Settings.Default.Sensors);
|
SensorEntries = JsonSerializer.Deserialize<ObservableCollection<SensorEntry>>(Settings.Default.Sensors) ?? [];
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void Save()
|
internal static void Save()
|
||||||
|
|||||||
@@ -7,15 +7,18 @@ namespace HardwareMonitorStatusWindow.StatusWindow;
|
|||||||
|
|
||||||
internal class DataErrorDictionary : Dictionary<string, List<string>>
|
internal class DataErrorDictionary : Dictionary<string, List<string>>
|
||||||
{
|
{
|
||||||
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
|
public event EventHandler<DataErrorsChangedEventArgs>? ErrorsChanged;
|
||||||
|
|
||||||
private void OnErrorsChanged(string propertyName)
|
private void OnErrorsChanged(string propertyName)
|
||||||
{
|
{
|
||||||
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
|
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable GetErrors(string propertyName)
|
public IEnumerable? GetErrors(string? propertyName)
|
||||||
{
|
{
|
||||||
|
if (propertyName == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
return TryGetValue(propertyName, out var value) ? value : null;
|
return TryGetValue(propertyName, out var value) ? value : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using Serilog;
|
using HardwareMonitorStatusWindow.Service;
|
||||||
|
using Microsoft.Win32.TaskScheduler;
|
||||||
|
using Serilog;
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using Velopack;
|
using Velopack;
|
||||||
@@ -17,7 +19,30 @@ internal class Program
|
|||||||
|
|
||||||
Log.Information("Start");
|
Log.Information("Start");
|
||||||
|
|
||||||
VelopackApp.Build().SetLogger(new SerilogVelopackLogger()).Run();
|
var stopServiceHook = new VelopackHook(_ =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var taskService = new TaskService();
|
||||||
|
|
||||||
|
Log.Information("Checking for task name: {name}", HardwareMonitorService.ScheduledTaskName);
|
||||||
|
|
||||||
|
var existingTask = taskService.FindTask(HardwareMonitorService.ScheduledTaskName);
|
||||||
|
|
||||||
|
Log.Information("Task: {existingTask}", existingTask);
|
||||||
|
|
||||||
|
Log.Information("Stopping task");
|
||||||
|
|
||||||
|
existingTask?.Stop();
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
// Ignored
|
||||||
|
Log.Error(exception, "");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
VelopackApp.Build().OnBeforeUpdateFastCallback(stopServiceHook).OnBeforeUninstallFastCallback(stopServiceHook).SetLogger(new SerilogVelopackLogger()).Run();
|
||||||
|
|
||||||
var app = new App();
|
var app = new App();
|
||||||
app.InitializeComponent();
|
app.InitializeComponent();
|
||||||
|
|||||||
9
StatusWindow/Resources.Designer.cs
generated
9
StatusWindow/Resources.Designer.cs
generated
@@ -169,6 +169,15 @@ namespace HardwareMonitorStatusWindow.StatusWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Current Value.
|
||||||
|
/// </summary>
|
||||||
|
public static string CurrentValueWatermark {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("CurrentValueWatermark", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Delete.
|
/// Looks up a localized string similar to Delete.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -248,4 +248,7 @@ Would you like to download and install it now?</value>
|
|||||||
<data name="ServiceNotStarted" xml:space="preserve">
|
<data name="ServiceNotStarted" xml:space="preserve">
|
||||||
<value>Waiting for service to start...</value>
|
<value>Waiting for service to start...</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="CurrentValueWatermark" xml:space="preserve">
|
||||||
|
<value>Current Value</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -11,15 +11,14 @@ namespace HardwareMonitorStatusWindow.StatusWindow;
|
|||||||
|
|
||||||
public class SensorEntry : INotifyDataErrorInfo, INotifyPropertyChanged
|
public class SensorEntry : INotifyDataErrorInfo, INotifyPropertyChanged
|
||||||
{
|
{
|
||||||
private readonly DataErrorDictionary _dataErrorDictionary;
|
private readonly DataErrorDictionary _dataErrorDictionary = new();
|
||||||
|
|
||||||
public SensorEntry()
|
public SensorEntry()
|
||||||
{
|
{
|
||||||
_dataErrorDictionary = new DataErrorDictionary();
|
|
||||||
_dataErrorDictionary.ErrorsChanged += DataErrorDictionaryErrorsChanged;
|
_dataErrorDictionary.ErrorsChanged += DataErrorDictionaryErrorsChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Label
|
public string? Label
|
||||||
{
|
{
|
||||||
get;
|
get;
|
||||||
set
|
set
|
||||||
@@ -31,7 +30,7 @@ public class SensorEntry : INotifyDataErrorInfo, INotifyPropertyChanged
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string HardwareId
|
public string? HardwareId
|
||||||
{
|
{
|
||||||
get;
|
get;
|
||||||
set
|
set
|
||||||
@@ -41,7 +40,7 @@ public class SensorEntry : INotifyDataErrorInfo, INotifyPropertyChanged
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string SensorId
|
public string? SensorId
|
||||||
{
|
{
|
||||||
get;
|
get;
|
||||||
set
|
set
|
||||||
@@ -52,7 +51,7 @@ public class SensorEntry : INotifyDataErrorInfo, INotifyPropertyChanged
|
|||||||
}
|
}
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public Hardware? Hardware => Data.ComputerHardware.FirstOrDefault(h => h.Identifier.ToString() == HardwareId);
|
public Hardware? Hardware => Data.ComputerHardware?.FirstOrDefault(h => h.Identifier.ToString() == HardwareId);
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public Sensor? Sensor => Hardware?.Sensors.FirstOrDefault(s => s.Identifier.ToString() == SensorId);
|
public Sensor? Sensor => Hardware?.Sensors.FirstOrDefault(s => s.Identifier.ToString() == SensorId);
|
||||||
@@ -60,19 +59,22 @@ public class SensorEntry : INotifyDataErrorInfo, INotifyPropertyChanged
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public bool HasErrors => _dataErrorDictionary.Any();
|
public bool HasErrors => _dataErrorDictionary.Any();
|
||||||
|
|
||||||
public IEnumerable GetErrors(string propertyName)
|
public IEnumerable GetErrors(string? propertyName)
|
||||||
{
|
{
|
||||||
return _dataErrorDictionary.GetErrors(propertyName);
|
if (string.IsNullOrWhiteSpace(propertyName))
|
||||||
|
throw new InvalidOperationException();
|
||||||
|
|
||||||
|
return _dataErrorDictionary.GetErrors(propertyName) ?? Enumerable.Empty<string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
|
public event EventHandler<DataErrorsChangedEventArgs>? ErrorsChanged;
|
||||||
|
|
||||||
private void DataErrorDictionaryErrorsChanged(object sender, DataErrorsChangedEventArgs e)
|
private void DataErrorDictionaryErrorsChanged(object? sender, DataErrorsChangedEventArgs e)
|
||||||
{
|
{
|
||||||
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(e.PropertyName));
|
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(e.PropertyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool ValidateLabel(string newValue)
|
private bool ValidateLabel(string? newValue)
|
||||||
{
|
{
|
||||||
_dataErrorDictionary.ClearErrors(nameof(Label));
|
_dataErrorDictionary.ClearErrors(nameof(Label));
|
||||||
|
|
||||||
@@ -84,14 +86,14 @@ public class SensorEntry : INotifyDataErrorInfo, INotifyPropertyChanged
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
public event PropertyChangedEventHandler? PropertyChanged;
|
||||||
|
|
||||||
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
|
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
|
||||||
{
|
{
|
||||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
|
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
|
||||||
{
|
{
|
||||||
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
|
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
|
||||||
field = value;
|
field = value;
|
||||||
|
|||||||
@@ -58,12 +58,12 @@
|
|||||||
<DataGridTemplateColumn.CellTemplate>
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Text="{Binding Path=Hardware.Type}"
|
<TextBlock Text="{Binding Path=Hardware.Type, FallbackValue=null}"
|
||||||
Height="Auto"
|
Height="Auto"
|
||||||
FontSize="10"
|
FontSize="10"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Margin="0,2,0,2" />
|
Margin="0,2,0,2" />
|
||||||
<TextBlock Text="{Binding Path=Hardware.Name}"
|
<TextBlock Text="{Binding Path=Hardware.Name, FallbackValue=null}"
|
||||||
Height="Auto"
|
Height="Auto"
|
||||||
VerticalAlignment="Center" />
|
VerticalAlignment="Center" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
@@ -75,12 +75,12 @@
|
|||||||
<DataGridTemplateColumn.CellTemplate>
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Text="{Binding Path=Sensor.Type}"
|
<TextBlock Text="{Binding Path=Sensor.Type, FallbackValue=null}"
|
||||||
Height="Auto"
|
Height="Auto"
|
||||||
FontSize="10"
|
FontSize="10"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Margin="0,2,0,2" />
|
Margin="0,2,0,2" />
|
||||||
<TextBlock Text="{Binding Path=Sensor.Name}"
|
<TextBlock Text="{Binding Path=Sensor.Name, FallbackValue=null}"
|
||||||
Height="Auto"
|
Height="Auto"
|
||||||
VerticalAlignment="Center" />
|
VerticalAlignment="Center" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace HardwareMonitorStatusWindow.StatusWindow.SettingsWindow;
|
|||||||
|
|
||||||
public partial class HardwareSettingsPanel
|
public partial class HardwareSettingsPanel
|
||||||
{
|
{
|
||||||
private CollectionViewSource _collectionViewSource;
|
private CollectionViewSource? _collectionViewSource;
|
||||||
|
|
||||||
public HardwareSettingsPanel()
|
public HardwareSettingsPanel()
|
||||||
{
|
{
|
||||||
@@ -67,13 +67,13 @@ public partial class HardwareSettingsPanel
|
|||||||
EditSelectedSensor();
|
EditSelectedSensor();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddSensor()
|
private async void AddSensor()
|
||||||
{
|
{
|
||||||
var sensorEntry = new SensorEntry();
|
var sensorEntry = new SensorEntry();
|
||||||
|
|
||||||
var sensorWindow = new SensorWindow();
|
var sensorWindow = new SensorWindow();
|
||||||
|
|
||||||
var result = sensorWindow.Display(sensorEntry, Window.GetWindow(this));
|
var result = await sensorWindow.Display(sensorEntry, Window.GetWindow(this));
|
||||||
|
|
||||||
if (!result.HasValue || !result.Value)
|
if (!result.HasValue || !result.Value)
|
||||||
return;
|
return;
|
||||||
@@ -83,7 +83,7 @@ public partial class HardwareSettingsPanel
|
|||||||
SetSensorButtonStates();
|
SetSensorButtonStates();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EditSelectedSensor()
|
private async void EditSelectedSensor()
|
||||||
{
|
{
|
||||||
if (SensorDataGrid.SelectedItem == null)
|
if (SensorDataGrid.SelectedItem == null)
|
||||||
return;
|
return;
|
||||||
@@ -92,7 +92,7 @@ public partial class HardwareSettingsPanel
|
|||||||
|
|
||||||
var sensorWindow = new SensorWindow();
|
var sensorWindow = new SensorWindow();
|
||||||
|
|
||||||
sensorWindow.Display(sensorEntry, Window.GetWindow(this));
|
await sensorWindow.Display(sensorEntry, Window.GetWindow(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeleteSelectedSensors()
|
private void DeleteSelectedSensors()
|
||||||
@@ -105,7 +105,7 @@ public partial class HardwareSettingsPanel
|
|||||||
SensorDataGrid.SelectedItems.CopyTo(selectedItems, 0);
|
SensorDataGrid.SelectedItems.CopyTo(selectedItems, 0);
|
||||||
|
|
||||||
foreach (var sensorEntry in selectedItems)
|
foreach (var sensorEntry in selectedItems)
|
||||||
Data.SensorEntries.Remove(sensorEntry);
|
Data.SensorEntries?.Remove(sensorEntry);
|
||||||
|
|
||||||
SetSensorButtonStates();
|
SetSensorButtonStates();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,8 +68,14 @@
|
|||||||
DisplayMemberPath="Name"
|
DisplayMemberPath="Name"
|
||||||
VirtualizingPanel.IsVirtualizing="False"
|
VirtualizingPanel.IsVirtualizing="False"
|
||||||
mah:TextBoxHelper.UseFloatingWatermark="True"
|
mah:TextBoxHelper.UseFloatingWatermark="True"
|
||||||
mah:TextBoxHelper.Watermark="{x:Static hardwareMonitorStatusWindow:Resources.SensorWatermark}">
|
mah:TextBoxHelper.Watermark="{x:Static hardwareMonitorStatusWindow:Resources.SensorWatermark}"
|
||||||
|
SelectionChanged="SensorComboBox_SelectionChanged">
|
||||||
</ComboBox>
|
</ComboBox>
|
||||||
|
<TextBox Name="CurrentValueTextBox"
|
||||||
|
mah:TextBoxHelper.UseFloatingWatermark="True"
|
||||||
|
mah:TextBoxHelper.Watermark="{x:Static hardwareMonitorStatusWindow:Resources.CurrentValueWatermark}"
|
||||||
|
mah:TextBoxHelper.SelectAllOnFocus="True"
|
||||||
|
IsReadOnly="True" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Grid.Column="0"
|
<StackPanel Grid.Column="0"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
|
|||||||
@@ -1,22 +1,28 @@
|
|||||||
using System.Linq;
|
using System;
|
||||||
using System.Windows;
|
|
||||||
using ChrisKaczor.Wpf.Validation;
|
using ChrisKaczor.Wpf.Validation;
|
||||||
using HardwareMonitorStatusWindow.Service;
|
using HardwareMonitorStatusWindow.Service;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Timers;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
|
||||||
namespace HardwareMonitorStatusWindow.StatusWindow.SettingsWindow;
|
namespace HardwareMonitorStatusWindow.StatusWindow.SettingsWindow;
|
||||||
|
|
||||||
public partial class SensorWindow
|
public partial class SensorWindow
|
||||||
{
|
{
|
||||||
|
private readonly DispatcherTimer _timer = new();
|
||||||
|
|
||||||
public SensorWindow()
|
public SensorWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool? Display(SensorEntry sensorEntry, Window owner)
|
public async Task<bool?> Display(SensorEntry sensorEntry, Window? owner)
|
||||||
{
|
{
|
||||||
DataContext = sensorEntry;
|
DataContext = sensorEntry;
|
||||||
|
|
||||||
Data.RefreshComputer();
|
await Data.RefreshComputer();
|
||||||
|
|
||||||
HardwareTypeComboBox.ItemsSource = Data.ComputerHardware.Where(h => h.Sensors.Any()).DistinctBy(h => h.Type).Select(s => new HardwareTypeItem(s.Type)).OrderBy(s => s.Name);
|
HardwareTypeComboBox.ItemsSource = Data.ComputerHardware.Where(h => h.Sensors.Any()).DistinctBy(h => h.Type).Select(s => new HardwareTypeItem(s.Type)).OrderBy(s => s.Name);
|
||||||
|
|
||||||
@@ -32,9 +38,18 @@ public partial class SensorWindow
|
|||||||
|
|
||||||
Owner = owner;
|
Owner = owner;
|
||||||
|
|
||||||
|
_timer.Interval = TimeSpan.FromSeconds(1);
|
||||||
|
_timer.Tick += TimerOnTick;
|
||||||
|
_timer.Start();
|
||||||
|
|
||||||
return ShowDialog();
|
return ShowDialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void TimerOnTick(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
UpdateCurrentSensorValue();
|
||||||
|
}
|
||||||
|
|
||||||
private void HandleOkayButtonClick(object sender, RoutedEventArgs e)
|
private void HandleOkayButtonClick(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (!this.IsValid())
|
if (!this.IsValid())
|
||||||
@@ -95,4 +110,26 @@ public partial class SensorWindow
|
|||||||
|
|
||||||
SensorComboBox.ItemsSource = hardware.Sensors.Where(s => s.Type == sensorType.Value);
|
SensorComboBox.ItemsSource = hardware.Sensors.Where(s => s.Type == sensorType.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SensorComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
UpdateCurrentSensorValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateCurrentSensorValue()
|
||||||
|
{
|
||||||
|
var sensor = (Sensor)SensorComboBox.SelectedItem;
|
||||||
|
|
||||||
|
if (sensor?.Value == null)
|
||||||
|
{
|
||||||
|
CurrentValueTextBox.Text = string.Empty;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hardware = (Hardware)HardwareComboBox.SelectedItem;
|
||||||
|
|
||||||
|
var displaySensorEntry = new SensorEntry { HardwareId = hardware.Identifier, SensorId = sensor.Identifier };
|
||||||
|
|
||||||
|
CurrentValueTextBox.Text = string.Format(displaySensorEntry.SensorValueFormat, displaySensorEntry.Sensor!.Value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using HardwareMonitorStatusWindow.StatusWindow;
|
|
||||||
|
|
||||||
namespace HardwareMonitorStatusWindow.StatusWindow.SettingsWindow;
|
namespace HardwareMonitorStatusWindow.StatusWindow.SettingsWindow;
|
||||||
|
|
||||||
|
|||||||
@@ -28,10 +28,10 @@
|
|||||||
<PackageReference Include="ChrisKaczor.Wpf.Controls.Link" Version="1.0.4" />
|
<PackageReference Include="ChrisKaczor.Wpf.Controls.Link" Version="1.0.4" />
|
||||||
<PackageReference Include="ChrisKaczor.Wpf.Validation" Version="1.0.4" />
|
<PackageReference Include="ChrisKaczor.Wpf.Validation" Version="1.0.4" />
|
||||||
<PackageReference Include="ChrisKaczor.Wpf.Windows.CategoryWindow" Version="1.0.2" />
|
<PackageReference Include="ChrisKaczor.Wpf.Windows.CategoryWindow" Version="1.0.2" />
|
||||||
<PackageReference Include="ChrisKaczor.Wpf.Windows.FloatingStatusWindow" Version="2.0.0.7" />
|
<PackageReference Include="ChrisKaczor.Wpf.Windows.FloatingStatusWindow" Version="2.0.0.8" />
|
||||||
<PackageReference Include="gong-wpf-dragdrop" Version="4.0.0" />
|
<PackageReference Include="gong-wpf-dragdrop" Version="4.0.0" />
|
||||||
<PackageReference Include="PipeMethodCalls" Version="4.0.3" />
|
<PackageReference Include="PipeMethodCalls" Version="4.0.3" />
|
||||||
<PackageReference Include="Serilog" Version="4.3.0" />
|
<PackageReference Include="Serilog" Version="4.3.1" />
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
<PackageReference Include="Velopack" Version="0.0.1298" />
|
<PackageReference Include="Velopack" Version="0.0.1298" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using ChrisKaczor.Wpf.Windows.FloatingStatusWindow;
|
using ChrisKaczor.Wpf.Windows.FloatingStatusWindow;
|
||||||
using HardwareMonitorStatusWindow.Service;
|
using HardwareMonitorStatusWindow.Service;
|
||||||
using HardwareMonitorStatusWindow.StatusWindow.SettingsWindow;
|
using HardwareMonitorStatusWindow.StatusWindow.SettingsWindow;
|
||||||
|
using LibreHardwareMonitor.PawnIo;
|
||||||
using Microsoft.Win32.TaskScheduler;
|
using Microsoft.Win32.TaskScheduler;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using System;
|
using System;
|
||||||
@@ -30,6 +31,17 @@ internal class WindowSource : IWindowSource, IDisposable
|
|||||||
{
|
{
|
||||||
using var taskService = new TaskService();
|
using var taskService = new TaskService();
|
||||||
|
|
||||||
|
if (!PawnIo.IsInstalled)
|
||||||
|
{
|
||||||
|
Log.Information("PawnIO not installed");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var pawnIoVersion = PawnIo.Version;
|
||||||
|
|
||||||
|
Log.Information("PawnIO installed: {version}", pawnIoVersion);
|
||||||
|
}
|
||||||
|
|
||||||
Log.Information("Checking for task name: {name}", HardwareMonitorService.ScheduledTaskName);
|
Log.Information("Checking for task name: {name}", HardwareMonitorService.ScheduledTaskName);
|
||||||
|
|
||||||
var existingTask = taskService.FindTask(HardwareMonitorService.ScheduledTaskName);
|
var existingTask = taskService.FindTask(HardwareMonitorService.ScheduledTaskName);
|
||||||
@@ -127,7 +139,7 @@ internal class WindowSource : IWindowSource, IDisposable
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task Start(bool hasUpdate)
|
private void Start(bool hasUpdate)
|
||||||
{
|
{
|
||||||
Log.Information("Start: hasUpdate={hasUpdate}", hasUpdate);
|
Log.Information("Start: hasUpdate={hasUpdate}", hasUpdate);
|
||||||
|
|
||||||
@@ -136,7 +148,7 @@ internal class WindowSource : IWindowSource, IDisposable
|
|||||||
|
|
||||||
Log.Information("Load");
|
Log.Information("Load");
|
||||||
|
|
||||||
await Load();
|
Load();
|
||||||
|
|
||||||
Log.Information("Starting timer");
|
Log.Information("Starting timer");
|
||||||
|
|
||||||
@@ -145,14 +157,12 @@ internal class WindowSource : IWindowSource, IDisposable
|
|||||||
_timer.Enabled = true;
|
_timer.Enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task Load()
|
private static void Load()
|
||||||
{
|
{
|
||||||
await Data.LoadComputer();
|
|
||||||
|
|
||||||
Data.Load();
|
Data.Load();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Save()
|
private static void Save()
|
||||||
{
|
{
|
||||||
Data.Save();
|
Data.Save();
|
||||||
}
|
}
|
||||||
@@ -215,22 +225,30 @@ internal class WindowSource : IWindowSource, IDisposable
|
|||||||
if (existingTask == null)
|
if (existingTask == null)
|
||||||
{
|
{
|
||||||
_dispatcher.Invoke(() => _floatingStatusWindow.SetText(Resources.ServiceNotInstalled));
|
_dispatcher.Invoke(() => _floatingStatusWindow.SetText(Resources.ServiceNotInstalled));
|
||||||
|
_timer.Start();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (existingTask.State != TaskState.Running)
|
if (existingTask.State != TaskState.Running)
|
||||||
{
|
{
|
||||||
_dispatcher.Invoke(() => _floatingStatusWindow.SetText(Resources.ServiceNotStarted));
|
_dispatcher.Invoke(() => _floatingStatusWindow.SetText(Resources.ServiceNotStarted));
|
||||||
|
|
||||||
|
existingTask.Run();
|
||||||
|
_timer.Start();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var text = new StringBuilder();
|
var text = new StringBuilder();
|
||||||
|
|
||||||
Data.RefreshComputer();
|
Data.RefreshComputer().Wait();
|
||||||
|
|
||||||
foreach (var sensorEntry in Data.SensorEntries)
|
foreach (var sensorEntry in Data.SensorEntries)
|
||||||
{
|
{
|
||||||
|
if (sensorEntry.Sensor == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (text.Length > 0)
|
if (text.Length > 0)
|
||||||
text.AppendLine();
|
text.AppendLine();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user