This commit is contained in:
GukSang.Jin
2026-05-27 11:23:41 +08:00
parent e264bf4d12
commit db213436ad

View File

@@ -1,5 +1,6 @@
using System.Diagnostics;
using System.Globalization;
using System.Threading;
using System.Windows.Threading;
using CommunityToolkit.Mvvm.Input;
using ConeCalorimeter.Models;
@@ -27,6 +28,8 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
private const double HeatTransferInputMinimum = 0;
private const double HeatTransferReadMinimum = 0.01;
private const double HeatTransferMaximum = 20000;
private const int TargetTemperatureWriteConfirmationAttempts = 3;
private const int TargetTemperatureWriteConfirmationDelayMilliseconds = 80;
private const int ParameterRefreshReleaseDelayMilliseconds = 500;
private const ushort AlarmCoil = 91;
private const ushort CirculatingWaterCoil = 49;
@@ -469,14 +472,37 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
return false;
}
if (_tcpDeviceConnectionService.TryWriteInt16(TargetTemperatureRegister, (short)scaledValue))
var registerValue = (short)scaledValue;
if (TryWriteAndConfirmTargetTemperature(registerValue))
{
_parameterRefreshBlockedUntil = DateTime.UtcNow.AddMilliseconds(ParameterRefreshReleaseDelayMilliseconds);
TargetTemperatureText = value.ToString("0.#", CultureInfo.InvariantCulture);
LastAction = "辐射温度设置成功";
return true;
}
LastAction = "设置辐射温度失败";
Debug.WriteLine("Cone radiation target temperature write failed.");
LastAction = "辐射温度写入未生效";
Debug.WriteLine($"Cone radiation target temperature write was not confirmed. Expected raw D{TargetTemperatureRegister}={registerValue}.");
return false;
}
private bool TryWriteAndConfirmTargetTemperature(short registerValue)
{
for (var attempt = 1; attempt <= TargetTemperatureWriteConfirmationAttempts; attempt++)
{
if (_tcpDeviceConnectionService.TryWriteInt16(TargetTemperatureRegister, registerValue)
&& _tcpDeviceConnectionService.TryReadInt16(TargetTemperatureRegister, out var readBackValue)
&& readBackValue == registerValue)
{
return true;
}
if (attempt < TargetTemperatureWriteConfirmationAttempts)
{
Thread.Sleep(TargetTemperatureWriteConfirmationDelayMilliseconds);
}
}
return false;
}