using System.Globalization; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using HC_APTBS.Models; using HC_APTBS.Services; namespace HC_APTBS.ViewModels { /// /// ViewModel for the bench Temperature Control panel: /// PID setpoint input and heater / deposit cooler / inlet cooler relay toggles. /// public sealed partial class TemperatureControlViewModel : ObservableObject { private readonly IBenchService _bench; private readonly IConfigurationService _config; /// Operator-entered PID setpoint in °C (text to allow invariant parsing). [ObservableProperty] private string _setpointText = "40"; /// Tolerance ±°C applied when the setpoint is committed. [ObservableProperty] private string _toleranceText = "2"; /// True when the deposit heater relay is energised. [ObservableProperty] private bool _isHeaterOn; /// True when the deposit cooler relay is energised. [ObservableProperty] private bool _isDepositCoolerOn; /// True when the T-in (inlet) cooler relay is energised. [ObservableProperty] private bool _isTinCoolerOn; /// Bench service for PID setpoint and relay control. /// Configuration service — seeds setpoint from . public TemperatureControlViewModel(IBenchService benchService, IConfigurationService configService) { _bench = benchService; _config = configService; // Seed setpoint from global temperature band midpoint, tolerance from its half-width. int min = _config.Settings.TempMin; int max = _config.Settings.TempMax; int mid = (min + max) / 2; int tol = (max - min) / 2; SetpointText = mid.ToString(CultureInfo.InvariantCulture); ToleranceText = tol.ToString(CultureInfo.InvariantCulture); } partial void OnIsHeaterOnChanged(bool value) => _bench.SetRelay(RelayNames.DepositHeater, value); partial void OnIsDepositCoolerOnChanged(bool value) => _bench.SetRelay(RelayNames.DepositCooler, value); partial void OnIsTinCoolerOnChanged(bool value) => _bench.SetRelay(RelayNames.TinCooler, value); /// Applies the PID setpoint entered by the operator. [RelayCommand] private void ApplySetpoint() { if (!double.TryParse(SetpointText, NumberStyles.Float, CultureInfo.InvariantCulture, out double sp)) return; if (!double.TryParse(ToleranceText, NumberStyles.Float, CultureInfo.InvariantCulture, out double tol)) tol = 2; _bench.SetTemperatureSetpoint(sp, tol); } } }