feat: redesign bench calibration (factor/offset), add Ttank/P2 displays, fix sensor calibration

- Replace P1-P6 rational transfer function with factor/offset model for bench params
- Add explicit rx/tx direction flags in bench XML configuration
- Add T.Tank (BenchTemp) and P2 (AnalogSensor2) to temperature/pressure display
- Apply SensorConfiguration calibration to pressure channels, fix empty sensors.xml fallback
- Add live value labels to flowmeter charts
- Hide pump live values and PSG encoder standalone label
- Add K-Line connection state model, improve KWP service and status displays
- Restructure .claude/skills into subdirectory format

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-14 21:25:30 +02:00
parent 4964806de1
commit 4891eb6812
20 changed files with 881 additions and 185 deletions

View File

@@ -34,6 +34,7 @@ namespace HC_APTBS.ViewModels
// ── Services ──────────────────────────────────────────────────────────────
private readonly ICanService _can;
private readonly IKwpService _kwp;
private readonly IBenchService _bench;
private readonly IConfigurationService _config;
private readonly IPdfService _pdf;
@@ -96,6 +97,7 @@ namespace HC_APTBS.ViewModels
IAppLogger logger)
{
_can = canService;
_kwp = kwpService;
_bench = benchService;
_config = configService;
_pdf = pdfService;
@@ -129,6 +131,10 @@ namespace HC_APTBS.ViewModels
_can.PumpLivenessChanged += alive =>
App.Current.Dispatcher.Invoke(() => IsPumpConnected = alive);
// K-Line session state → indicator
_kwp.KLineStateChanged += state =>
App.Current.Dispatcher.Invoke(() => KLineState = state);
// Bench service events
_bench.TestStarted += OnTestStarted;
_bench.TestFinished += OnTestFinished;
@@ -276,15 +282,21 @@ namespace HC_APTBS.ViewModels
/// <summary>Auxiliary temperature T4 (°C).</summary>
[ObservableProperty] private double _temp4;
/// <summary>Oil tank temperature (°C).</summary>
[ObservableProperty] private double _benchTemp;
/// <summary>Fuel delivery measurement Q-delivery (cc/stroke).</summary>
[ObservableProperty] private double _qDelivery;
/// <summary>Fuel overflow/pilot measurement Q-over (cc/stroke).</summary>
[ObservableProperty] private double _qOver;
/// <summary>Bench oil pressure (bar).</summary>
/// <summary>Bench oil pressure P1 (bar), sensor-calibrated.</summary>
[ObservableProperty] private double _pressure;
/// <summary>Analogue sensor 2 pressure P2 (bar), sensor-calibrated.</summary>
[ObservableProperty] private double _pressure2;
/// <summary>PSG encoder position value.</summary>
[ObservableProperty] private double _psgEncoderValue;
@@ -316,8 +328,8 @@ namespace HC_APTBS.ViewModels
/// <summary>True when oil circulation has been detected.</summary>
[ObservableProperty] private bool _isOilCirculating;
/// <summary>True when a K-Line session is active.</summary>
[ObservableProperty] private bool _isKLineConnected;
/// <summary>Current K-Line session state (Disconnected / Connected / Failed).</summary>
[ObservableProperty] private KLineConnectionState _kLineState = KLineConnectionState.Disconnected;
// ── Test status ───────────────────────────────────────────────────────────
@@ -500,11 +512,17 @@ namespace HC_APTBS.ViewModels
TempIn = _bench.ReadBenchParameter(BenchParameterNames.TempIn);
TempOut = _bench.ReadBenchParameter(BenchParameterNames.TempOut);
Temp4 = _bench.ReadBenchParameter(BenchParameterNames.Temp4);
BenchTemp = _bench.ReadBenchParameter(BenchParameterNames.Temp);
QDelivery = _bench.ReadBenchParameter(BenchParameterNames.QDelivery);
QOver = _bench.ReadBenchParameter(BenchParameterNames.QOver);
Pressure = _bench.ReadBenchParameter(BenchParameterNames.Pressure);
PsgEncoderValue = _bench.ReadBenchParameter(BenchParameterNames.PsgEncoderValue);
// Apply analogue sensor calibration for pressure channels.
double rawP1 = _bench.ReadBenchParameter(BenchParameterNames.Pressure);
Pressure = _config.Settings.Sensors.TryGetValue(1, out var s1) ? s1.GetValueFromRaw(rawP1) : rawP1;
double rawP2 = _bench.ReadBenchParameter(BenchParameterNames.AnalogSensor2);
Pressure2 = _config.Settings.Sensors.TryGetValue(2, out var s2) ? s2.GetValueFromRaw(rawP2) : rawP2;
// Feed the angle display with all three encoder channels + status.
AngleDisplay.Update(
PsgEncoderValue,