Files
HC_APTBS/ViewModels/PumpControlViewModel.cs
2026-04-11 12:45:18 +02:00

154 lines
6.2 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
using HC_APTBS.Models;
using HC_APTBS.Services;
namespace HC_APTBS.ViewModels
{
/// <summary>
/// ViewModel for the three manual pump control sliders: FBKW (advance), ME (quantity),
/// and PreIn (pre-injection quantity). Each slider change calls
/// <see cref="IBenchService.SetPumpControlValue"/> to update the CAN bus.
/// </summary>
public sealed partial class PumpControlViewModel : ObservableObject
{
private readonly IBenchService _bench;
/// <summary>
/// When true, suppress forwarding slider changes to the bench service.
/// Used during programmatic updates to avoid re-entrant CAN sends.
/// </summary>
private bool _suppressSend;
// ── FBKW (Advance Control) ───────────────────────────────────────────────
/// <summary>Current FBKW slider value.</summary>
[ObservableProperty] private double _fbkwValue;
/// <summary>FBKW slider minimum.</summary>
[ObservableProperty] private double _fbkwMin;
/// <summary>FBKW slider maximum.</summary>
[ObservableProperty] private double _fbkwMax = 100;
/// <summary>FBKW slider tick frequency / step.</summary>
[ObservableProperty] private double _fbkwStep = 10;
// ── ME (Quantity Control) ─────────────────────────────────────────────────
/// <summary>Current ME slider value.</summary>
[ObservableProperty] private double _meValue;
/// <summary>ME slider minimum.</summary>
[ObservableProperty] private double _meMin;
/// <summary>ME slider maximum.</summary>
[ObservableProperty] private double _meMax = 100;
/// <summary>ME slider tick frequency / step.</summary>
[ObservableProperty] private double _meStep = 10;
// ── PreIn (Pre-injection Quantity) ────────────────────────────────────────
/// <summary>Current PreIn slider value.</summary>
[ObservableProperty] private double _preInValue;
/// <summary>PreIn slider minimum.</summary>
[ObservableProperty] private double _preInMin;
/// <summary>PreIn slider maximum.</summary>
[ObservableProperty] private double _preInMax = 100;
/// <summary>PreIn slider tick frequency / step.</summary>
[ObservableProperty] private double _preInStep = 10;
// ── Visibility / enablement ───────────────────────────────────────────────
/// <summary>True when the current pump supports pre-injection.</summary>
[ObservableProperty] private bool _isPreInVisible;
/// <summary>True when a pump is selected and CAN is connected.</summary>
[ObservableProperty] private bool _isEnabled;
// ── Constructor ───────────────────────────────────────────────────────────
/// <summary>Creates the ViewModel wired to the bench service for CAN output.</summary>
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 ────────────────────────────────────────────────────────────
/// <summary>
/// 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.
/// </summary>
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;
}
}
/// <summary>Resets all slider values to zero and restores default min/max/step.</summary>
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;
}
}
}
}