using CommunityToolkit.Mvvm.ComponentModel; using HC_APTBS.Models; using HC_APTBS.Services; namespace HC_APTBS.ViewModels { /// /// ViewModel for the three manual pump control sliders: FBKW (advance), ME (quantity), /// and PreIn (pre-injection quantity). Each slider change calls /// to update the CAN bus. /// public sealed partial class PumpControlViewModel : ObservableObject { private readonly IBenchService _bench; /// /// When true, suppress forwarding slider changes to the bench service. /// Used during programmatic updates to avoid re-entrant CAN sends. /// private bool _suppressSend; // ── FBKW (Advance Control) ─────────────────────────────────────────────── /// Current FBKW slider value. [ObservableProperty] private double _fbkwValue; /// FBKW slider minimum. [ObservableProperty] private double _fbkwMin; /// FBKW slider maximum. [ObservableProperty] private double _fbkwMax = 100; /// FBKW slider tick frequency / step. [ObservableProperty] private double _fbkwStep = 10; // ── ME (Quantity Control) ───────────────────────────────────────────────── /// Current ME slider value. [ObservableProperty] private double _meValue; /// ME slider minimum. [ObservableProperty] private double _meMin; /// ME slider maximum. [ObservableProperty] private double _meMax = 100; /// ME slider tick frequency / step. [ObservableProperty] private double _meStep = 10; // ── PreIn (Pre-injection Quantity) ──────────────────────────────────────── /// Current PreIn slider value. [ObservableProperty] private double _preInValue; /// PreIn slider minimum. [ObservableProperty] private double _preInMin; /// PreIn slider maximum. [ObservableProperty] private double _preInMax = 100; /// PreIn slider tick frequency / step. [ObservableProperty] private double _preInStep = 10; // ── Visibility / enablement ─────────────────────────────────────────────── /// True when the current pump supports pre-injection. [ObservableProperty] private bool _isPreInVisible; /// True when a pump is selected and CAN is connected. [ObservableProperty] private bool _isEnabled; // ── Constructor ─────────────────────────────────────────────────────────── /// Creates the ViewModel wired to the bench service for CAN output. public PumpControlViewModel(IBenchService bench) { _bench = bench; } // ── Property-changed callbacks → CAN send ───────────────────────────────── partial void OnFbkwValueChanged(double value) { if (!_suppressSend) _bench.SetPumpControlValue(PumpParameterNames.Fbkw, value); } partial void OnMeValueChanged(double value) { if (!_suppressSend) _bench.SetPumpControlValue(PumpParameterNames.Me, value); } partial void OnPreInValueChanged(double value) { if (!_suppressSend) _bench.SetPumpControlValue(PumpParameterNames.PreIn, value); } // ── Public API ──────────────────────────────────────────────────────────── /// /// Called when the test executor sets a pump parameter value. /// Auto-expands slider min/max if the value exceeds the current range. /// Must be called on the UI thread. /// public void SetValueFromTest(string paramName, double value) { _suppressSend = true; try { switch (paramName) { case PumpParameterNames.Me: if (value > MeMax) MeMax = value; else if (value < MeMin) MeMin = value; MeValue = value; break; case PumpParameterNames.Fbkw: if (value > FbkwMax) FbkwMax = value; else if (value < FbkwMin) FbkwMin = value; FbkwValue = value; break; case PumpParameterNames.PreIn: if (value > PreInMax) PreInMax = value; else if (value < PreInMin) PreInMin = value; PreInValue = value; break; } } finally { _suppressSend = false; } } /// Resets all slider values to zero and restores default min/max/step. public void Reset() { _suppressSend = true; try { FbkwValue = 0; FbkwMin = 0; FbkwMax = 100; FbkwStep = 10; MeValue = 0; MeMin = 0; MeMax = 100; MeStep = 10; PreInValue = 0; PreInMin = 0; PreInMax = 100; PreInStep = 10; } finally { _suppressSend = false; } } } }