diff --git a/ConeCalorimeter/ViewModels/SmokeDensityCalibrationViewModel.cs b/ConeCalorimeter/ViewModels/SmokeDensityCalibrationViewModel.cs index 421b752..2e7861f 100644 --- a/ConeCalorimeter/ViewModels/SmokeDensityCalibrationViewModel.cs +++ b/ConeCalorimeter/ViewModels/SmokeDensityCalibrationViewModel.cs @@ -1,16 +1,11 @@ -using System.Windows.Input; - namespace ConeCalorimeter.ViewModels; public sealed class SmokeDensityCalibrationViewModel { - public SmokeDensityCalibrationViewModel(string label, ICommand command) + public SmokeDensityCalibrationViewModel(string label) { Label = label; - Command = command; } public string Label { get; } - - public ICommand Command { get; } } diff --git a/ConeCalorimeter/ViewModels/SmokeDensitySettingsViewModel.cs b/ConeCalorimeter/ViewModels/SmokeDensitySettingsViewModel.cs index 767cc8e..01e56a1 100644 --- a/ConeCalorimeter/ViewModels/SmokeDensitySettingsViewModel.cs +++ b/ConeCalorimeter/ViewModels/SmokeDensitySettingsViewModel.cs @@ -21,6 +21,7 @@ public sealed class SmokeDensitySettingsViewModel : PageViewModel private readonly DispatcherTimer _refreshTimer; private readonly HashSet _loggedFloatDiagnostics = []; private readonly HashSet _loggedInvalidFloatDiagnostics = []; + private readonly HashSet _pressedCalibrationLabels = []; private double? _stableAbsorbance; private double? _pendingAbsorbance; private int _pendingAbsorbanceReadCount; @@ -34,15 +35,14 @@ public sealed class SmokeDensitySettingsViewModel : PageViewModel _closeAction = closeAction; _tcpDeviceConnectionService = tcpDeviceConnectionService; CloseCommand = new RelayCommand(_closeAction); - CalibrationCommand = new RelayCommand(Calibrate); CalibrationActions = [ - new SmokeDensityCalibrationViewModel("0%校准", CalibrationCommand), - new SmokeDensityCalibrationViewModel("25%校准", CalibrationCommand), - new SmokeDensityCalibrationViewModel("50%校准", CalibrationCommand), - new SmokeDensityCalibrationViewModel("75%校准", CalibrationCommand), - new SmokeDensityCalibrationViewModel("100%校准", CalibrationCommand) + new SmokeDensityCalibrationViewModel("0%校准"), + new SmokeDensityCalibrationViewModel("25%校准"), + new SmokeDensityCalibrationViewModel("50%校准"), + new SmokeDensityCalibrationViewModel("75%校准"), + new SmokeDensityCalibrationViewModel("100%校准") ]; RefreshDeviceValues(); @@ -58,8 +58,6 @@ public sealed class SmokeDensitySettingsViewModel : PageViewModel public IRelayCommand CloseCommand { get; } - public IRelayCommand CalibrationCommand { get; } - public string AbsorbanceText { get => _absorbanceText; @@ -72,13 +70,18 @@ public sealed class SmokeDensitySettingsViewModel : PageViewModel private set => SetProperty(ref _lastCalibration, value); } - private void Calibrate(string? label) + public void PressCalibration(string? label) { if (string.IsNullOrWhiteSpace(label)) { return; } + if (_pressedCalibrationLabels.Contains(label)) + { + return; + } + LastCalibration = label; if (!TryGetCalibrationCoil(label, out var coilAddress)) @@ -89,7 +92,34 @@ public sealed class SmokeDensitySettingsViewModel : PageViewModel if (!_tcpDeviceConnectionService.TryWriteCoil(coilAddress, true)) { LastCalibration = $"{label}失败"; - Debug.WriteLine($"Smoke density calibration '{label}' write failed."); + Debug.WriteLine($"Smoke density calibration '{label}' press write failed."); + return; + } + + _pressedCalibrationLabels.Add(label); + } + + public void ReleaseCalibration(string? label) + { + if (string.IsNullOrWhiteSpace(label)) + { + return; + } + + if (!_pressedCalibrationLabels.Remove(label)) + { + return; + } + + if (!TryGetCalibrationCoil(label, out var coilAddress)) + { + return; + } + + if (!_tcpDeviceConnectionService.TryWriteCoil(coilAddress, false)) + { + LastCalibration = $"{label}复位失败"; + Debug.WriteLine($"Smoke density calibration '{label}' release write failed."); } } diff --git a/ConeCalorimeter/Views/SmokeDensitySettingsView.xaml b/ConeCalorimeter/Views/SmokeDensitySettingsView.xaml index 9bd40ba..f4b7c3a 100644 --- a/ConeCalorimeter/Views/SmokeDensitySettingsView.xaml +++ b/ConeCalorimeter/Views/SmokeDensitySettingsView.xaml @@ -78,8 +78,14 @@