This commit is contained in:
GukSang.Jin
2026-05-21 19:58:12 +08:00
parent 95a4d4d671
commit 97094e19da
2 changed files with 32 additions and 17 deletions

View File

@@ -2,18 +2,16 @@ using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.Windows.Threading; using System.Windows.Threading;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using ConeCalorimeter.Models;
using ConeCalorimeter.Services; using ConeCalorimeter.Services;
namespace ConeCalorimeter.ViewModels; namespace ConeCalorimeter.ViewModels;
public sealed class ConeRadiationSettingsViewModel : PageViewModel public sealed class ConeRadiationSettingsViewModel : PageViewModel
{ {
private const ushort CurrentTemperatureRegister = 26; private const ushort CurrentHeatFluxRegister = 32;
private const ushort TargetTemperatureRegister = 400; private const ushort TargetTemperatureRegister = 400;
private const ushort CurrentHeatFluxRegister = 410;
private const ushort HeatTransferRegister = 418; private const ushort HeatTransferRegister = 418;
private const double CurrentTemperatureMinimum = 0;
private const double CurrentTemperatureMaximum = 1200;
private const double CurrentHeatFluxMinimum = 0; private const double CurrentHeatFluxMinimum = 0;
private const double CurrentHeatFluxMaximum = 1000; private const double CurrentHeatFluxMaximum = 1000;
private const double HeatTransferInputMinimum = 0; private const double HeatTransferInputMinimum = 0;
@@ -27,6 +25,7 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
private readonly Action _closeAction; private readonly Action _closeAction;
private readonly Action _helpAction; private readonly Action _helpAction;
private readonly IExperimentDataService _experimentDataService;
private readonly ITcpDeviceConnectionService _tcpDeviceConnectionService; private readonly ITcpDeviceConnectionService _tcpDeviceConnectionService;
private readonly DispatcherTimer _refreshTimer; private readonly DispatcherTimer _refreshTimer;
private readonly HashSet<ushort> _loggedFloatDiagnostics = []; private readonly HashSet<ushort> _loggedFloatDiagnostics = [];
@@ -45,16 +44,20 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
public ConeRadiationSettingsViewModel( public ConeRadiationSettingsViewModel(
Action closeAction, Action closeAction,
Action helpAction, Action helpAction,
IExperimentDataService experimentDataService,
ITcpDeviceConnectionService tcpDeviceConnectionService) : base("辐射锥设置") ITcpDeviceConnectionService tcpDeviceConnectionService) : base("辐射锥设置")
{ {
_closeAction = closeAction; _closeAction = closeAction;
_helpAction = helpAction; _helpAction = helpAction;
_experimentDataService = experimentDataService;
_tcpDeviceConnectionService = tcpDeviceConnectionService; _tcpDeviceConnectionService = tcpDeviceConnectionService;
CloseCommand = new RelayCommand(_closeAction); CloseCommand = new RelayCommand(_closeAction);
HelpCommand = new RelayCommand(_helpAction); HelpCommand = new RelayCommand(_helpAction);
ActionCommand = new RelayCommand<string>(ExecuteAction); ActionCommand = new RelayCommand<string>(ExecuteAction);
SaveParametersCommand = new RelayCommand(SaveParameters); SaveParametersCommand = new RelayCommand(SaveParameters);
UpdateCurrentReadings(_experimentDataService.CurrentSnapshot);
_experimentDataService.SnapshotUpdated += (_, snapshot) => UpdateCurrentReadings(snapshot);
RefreshDeviceValues(); RefreshDeviceValues();
_refreshTimer = new DispatcherTimer _refreshTimer = new DispatcherTimer
{ {
@@ -177,24 +180,17 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
private void RefreshDeviceValues() private void RefreshDeviceValues()
{ {
CurrentTemperatureText = TryReadRangedFloatText( if (TryReadRangedFloatText(
"ConeCurrentTemperature",
CurrentTemperatureRegister,
CurrentTemperatureMinimum,
CurrentTemperatureMaximum,
"0.0",
out var currentTemperatureText)
? currentTemperatureText
: string.Empty;
CurrentHeatFluxText = TryReadRangedFloatText(
"ConeCurrentHeatFlux", "ConeCurrentHeatFlux",
CurrentHeatFluxRegister, CurrentHeatFluxRegister,
CurrentHeatFluxMinimum, CurrentHeatFluxMinimum,
CurrentHeatFluxMaximum, CurrentHeatFluxMaximum,
"0.00", "0.00",
out var currentHeatFluxText) out var currentHeatFluxText))
? currentHeatFluxText {
: string.Empty; CurrentHeatFluxText = currentHeatFluxText;
}
if (CanRefreshConeParameters()) if (CanRefreshConeParameters())
{ {
TargetTemperatureText = ReadInt16Text(TargetTemperatureRegister); TargetTemperatureText = ReadInt16Text(TargetTemperatureRegister);
@@ -218,6 +214,24 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
} }
} }
private void UpdateCurrentReadings(RealtimeSnapshot snapshot)
{
if (double.IsFinite(snapshot.ConeTemperature))
{
CurrentTemperatureText = NormalizeDisplayValue(snapshot.ConeTemperature)
.ToString("0.0", CultureInfo.InvariantCulture);
}
if (double.IsFinite(snapshot.Irradiance))
{
if (string.IsNullOrWhiteSpace(CurrentHeatFluxText))
{
CurrentHeatFluxText = NormalizeDisplayValue(snapshot.Irradiance)
.ToString("0.00", CultureInfo.InvariantCulture);
}
}
}
private bool TryReadRangedFloatText( private bool TryReadRangedFloatText(
string label, string label,
ushort registerAddress, ushort registerAddress,

View File

@@ -40,6 +40,7 @@ public sealed class MainViewModel : ObservableObject
new ConeRadiationSettingsViewModel( new ConeRadiationSettingsViewModel(
() => SelectPage(testItem), () => SelectPage(testItem),
ShowConeRadiationHelp, ShowConeRadiationHelp,
experimentDataService,
tcpDeviceConnectionService)); tcpDeviceConnectionService));
var smokeDensityItem = new NavigationItemViewModel( var smokeDensityItem = new NavigationItemViewModel(
"烟密度设置", "烟密度设置",