diff --git a/ConeCalorimeter/ViewModels/CValueCalibrationViewModel.cs b/ConeCalorimeter/ViewModels/CValueCalibrationViewModel.cs index 1043a48..d468670 100644 --- a/ConeCalorimeter/ViewModels/CValueCalibrationViewModel.cs +++ b/ConeCalorimeter/ViewModels/CValueCalibrationViewModel.cs @@ -10,11 +10,12 @@ namespace ConeCalorimeter.ViewModels; public sealed class CValueCalibrationViewModel : PageViewModel { - private const ushort BaselineOxygenRegister = 280; + private const ushort BaselineOxygenRegister = 268; private const ushort TemperatureRegister = 282; private const ushort PressureDifferenceRegister = 284; private const ushort CalibrationOxygenRegister = 286; private const ushort CValueRegister = 308; + private const ushort MethaneFlowRegister = 34; private const ushort CirculatingWaterCoil = 49; private const ushort SamplingPumpCoil = 50; private const ushort IgniterCoil = 53; @@ -34,6 +35,8 @@ public sealed class CValueCalibrationViewModel : PageViewModel private readonly Action _closeAction; private readonly Action _helpAction; + private readonly Action _baselineCollectionCompletedAction; + private readonly Action _calibrationCompletedAction; private readonly ITcpDeviceConnectionService _tcpDeviceConnectionService; private readonly DispatcherTimer _refreshTimer; private readonly Dictionary _actionsByLabel = []; @@ -42,15 +45,20 @@ public sealed class CValueCalibrationViewModel : PageViewModel private string _pressureDifferenceText = ""; private string _calibrationOxygenText = ""; private string _cValueText = ""; + private string _methaneFlowText = ""; private string _lastAction = "待机"; public CValueCalibrationViewModel( Action closeAction, Action helpAction, + Action baselineCollectionCompletedAction, + Action calibrationCompletedAction, ITcpDeviceConnectionService tcpDeviceConnectionService) : base("C值标定") { _closeAction = closeAction; _helpAction = helpAction; + _baselineCollectionCompletedAction = baselineCollectionCompletedAction; + _calibrationCompletedAction = calibrationCompletedAction; _tcpDeviceConnectionService = tcpDeviceConnectionService; CloseCommand = new RelayCommand(_closeAction); HelpCommand = new RelayCommand(_helpAction); @@ -122,6 +130,12 @@ public sealed class CValueCalibrationViewModel : PageViewModel private set => SetProperty(ref _cValueText, value); } + public string MethaneFlowText + { + get => _methaneFlowText; + private set => SetProperty(ref _methaneFlowText, value); + } + public string LastAction { get => _lastAction; @@ -153,6 +167,7 @@ public sealed class CValueCalibrationViewModel : PageViewModel PressureDifferenceText = ReadFloatText(PressureDifferenceRegister); CalibrationOxygenText = ReadFloatText(CalibrationOxygenRegister); CValueText = ReadFloatText(CValueRegister); + MethaneFlowText = ReadFloatText(MethaneFlowRegister); RefreshActionStates(); } @@ -250,12 +265,26 @@ public sealed class CValueCalibrationViewModel : PageViewModel if (_tcpDeviceConnectionService.TryWriteCoil(coilAddress, true)) { - LastAction = actionText; + var completedBaselineCollection = action == BaselineCollectionAction && isActive; + var completedCalibration = action == CalibrationStartAction && isActive; + LastAction = completedBaselineCollection + ? "基线采集完成" + : completedCalibration ? "标定完成" : actionText; if (_actionsByLabel.TryGetValue(action, out var actionViewModel)) { actionViewModel.UpdateStatus(!isActive); } + if (completedBaselineCollection) + { + _baselineCollectionCompletedAction(); + } + + if (completedCalibration) + { + _calibrationCompletedAction(); + } + return; } diff --git a/ConeCalorimeter/ViewModels/MainViewModel.cs b/ConeCalorimeter/ViewModels/MainViewModel.cs index 71f19f0..99f7b35 100644 --- a/ConeCalorimeter/ViewModels/MainViewModel.cs +++ b/ConeCalorimeter/ViewModels/MainViewModel.cs @@ -34,6 +34,8 @@ public sealed class MainViewModel : ObservableObject new CValueCalibrationViewModel( () => SelectPage(testItem), ShowCValueCalibrationHelp, + ShowBaselineCollectionCompleted, + ShowCalibrationCompleted, tcpDeviceConnectionService)); var coneRadiationItem = new NavigationItemViewModel( "辐射锥设置", @@ -161,6 +163,22 @@ public sealed class MainViewModel : ObservableObject + "6.标定完成后,弹出“标定完成!”;"); } + private void ShowBaselineCollectionCompleted() + { + _helpDialogService.ShowHelp( + "C值标定提示", + "C值标定提示", + "基线采集完成"); + } + + private void ShowCalibrationCompleted() + { + _helpDialogService.ShowHelp( + "C值标定提示", + "C值标定提示", + "标定完成!"); + } + private void ShowConeRadiationHelp() { _helpDialogService.ShowHelp( diff --git a/ConeCalorimeter/ViewModels/TestPageViewModel.cs b/ConeCalorimeter/ViewModels/TestPageViewModel.cs index c52bdfe..2428e44 100644 --- a/ConeCalorimeter/ViewModels/TestPageViewModel.cs +++ b/ConeCalorimeter/ViewModels/TestPageViewModel.cs @@ -17,6 +17,8 @@ public sealed class TestPageViewModel : PageViewModel private const string ResetAction = "复位"; private const ushort ResetCoil = 88; private const ushort ResetCompleteCoil = 89; + private static readonly TimeSpan ResetPulseDuration = TimeSpan.FromMilliseconds(300); + private static readonly TimeSpan ResetCompletionTimeout = TimeSpan.FromSeconds(15); private readonly IExperimentDataService _experimentDataService; private readonly ITcpDeviceConnectionService _tcpDeviceConnectionService; @@ -27,6 +29,7 @@ public sealed class TestPageViewModel : PageViewModel private DeviceActionViewModel _resetAction = null!; private bool _flameDetected; private bool _resetInProgress; + private DateTime _resetStartedAt; private string _lastAction = "待机"; public TestPageViewModel( @@ -331,8 +334,13 @@ public sealed class TestPageViewModel : PageViewModel } } - private void ExecuteResetAction() + private async void ExecuteResetAction() { + if (_resetInProgress) + { + return; + } + if (!_tcpDeviceConnectionService.TryWriteCoil(ResetCoil, true)) { LastAction = "复位失败"; @@ -341,6 +349,14 @@ public sealed class TestPageViewModel : PageViewModel } SetResetInProgress(true); + LastAction = "复位中"; + _resetStartedAt = DateTime.Now; + + await Task.Delay(ResetPulseDuration); + if (!_tcpDeviceConnectionService.TryWriteCoil(ResetCoil, false)) + { + Debug.WriteLine("Device reset pulse release failed."); + } } private void RefreshResetStatus() @@ -350,13 +366,21 @@ public sealed class TestPageViewModel : PageViewModel return; } - if (!_tcpDeviceConnectionService.TryReadCoil(ResetCompleteCoil, out var resetComplete) || !resetComplete) + var statusRead = _tcpDeviceConnectionService.TryReadCoil(ResetCompleteCoil, out var resetComplete); + if (statusRead && resetComplete) + { + SetResetInProgress(false); + LastAction = "复位完成"; + return; + } + + if (DateTime.Now - _resetStartedAt < ResetCompletionTimeout) { return; } SetResetInProgress(false); - LastAction = "复位完成"; + LastAction = statusRead ? "复位超时" : "复位状态读取失败"; } private void SetResetInProgress(bool resetInProgress) diff --git a/ConeCalorimeter/Views/CValueCalibrationView.xaml b/ConeCalorimeter/Views/CValueCalibrationView.xaml index c45c11d..af76f5b 100644 --- a/ConeCalorimeter/Views/CValueCalibrationView.xaml +++ b/ConeCalorimeter/Views/CValueCalibrationView.xaml @@ -201,6 +201,18 @@ Text="%" Style="{StaticResource DataLabelStyle}" /> + + + +