Files
HC_APTBS/CLAUDE.md
LucianoDev 827b811b39 feat: developer tools page, auto-test orchestrator, BIP display, tests redesign
Bundles several feature streams that have been iterating on the working tree:

- Developer Tools page (Debug-only via DEVELOPER_TOOLS symbol): hosts the
  identification card, manual KWP write + transaction log, ROM/EEPROM dump
  card with progress banner and completion message, persisted custom-commands
  library, persisted EEPROM passwords library. New service primitives:
  IKwpService.SendRawCustomAsync / ReadEepromAsync / ReadRomEepromAsync.
  Persistence mirrors the Clients XML pattern in two new files
  (custom_commands.xml, eeprom_passwords.xml).
- Auto-test orchestrator (IAutoTestOrchestrator + AutoTestState): linear
  K-Line read -> unlock -> bench-on -> test sequence with snackbar UI and
  progress dialog VM, gated on dashboard alarms.
- BIP-STATUS display: BipDisplayViewModel + BipDisplayView, RAM read at
  0x0106 via IKwpService.ReadBipStatusAsync; status definitions in
  BipStatusDefinition.
- Tests page redesign: TestSectionCard + PhaseTileView replacing the old
  TestPlanView/TestRunningView/TestDoneView/TestPreconditionsView/
  TestSectionView controls and their VMs.
- Pump command sliders: Fluent thick-track style with overhang thumb,
  click-anywhere-and-drag, mouse-wheel adjustment.
- Window startup: app.manifest declares PerMonitorV2 DPI awareness,
  MainWindow installs a WM_GETMINMAXINFO hook in OnSourceInitialized and
  maximizes there (after the hook is in place) so the app fits the work
  area exactly on any display configuration.
- Misc: PercentToPixelsConverter, seed_aliases.py one-shot pump-alias
  importer, tools/Import-BipStatus.ps1, kline_eeprom_spec.md and
  dump-functions reference docs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 13:59:50 +02:00

12 KiB
Raw Permalink Blame History

HC_APTBS

What this is

WPF desktop application (.NET 10 / x64) that controls a VP44 diesel injection pump test bench.

  • Reads/writes bench sensors (temperature, RPM, flow) via CAN bus (PCAN-Basic, 500 kbps)
  • Communicates with the pump ECU via K-Line/KWP2000 (FTDI USB adapter, 9600 bps)
  • Runs automated multi-phase test sequences with PID temperature control
  • Generates PDF test reports (QuestPDF)
  • Supports Ford VP44 immobilizer unlock via CAN (Types 1 & 2)

Build

Windows only, .NET 10 x64. dotnet build -r win-x64 from solution root. SDK pinned in global.json. No WSL/Linux — native DLLs (PCANBasic.dll, ftd2xx.dll) are x64 Windows binaries. No test project; validation is code review + manual hardware testing.

Stack

  • C# / .NET 10, WPF, XAML
  • CommunityToolkit.Mvvm: [ObservableProperty], [RelayCommand]
  • Microsoft.Extensions.DependencyInjection / Hosting for bootstrap
  • QuestPDF 2025.3.2 (requires LicenseType.Community in constructor)
  • LiveChartsCore.SkiaSharpView.WPF 2.0.0-rc3.5 for real-time charts
  • Extended.Wpf.Toolkit 4.6.1 (AvalonDock, NumericUpDown, BusyIndicator)
  • Native DLLs in output: PCANBasic.dll, ftd2xx.dll (x64 only)

Architecture

Infrastructure/
  Pcan/PcanBasic.cs          — Vendor P/Invoke file. NEVER modify.
  Pcan/PcanAdapter.cs        — CAN read thread, OEM legitimation, frame decode, IIR filter, liveness tracking
  Kwp/FtdiInterface.cs       — FTDI D2XX wrapper (manual LoadLibrary, not NativeLibrary.Load)
  Kwp/KwpCommon.cs           — 5-baud slow-init, complement-ACK byte I/O
  Kwp/KW1281Connection.cs    — KWP/KW1281 protocol state machine
  Kwp/Packets/               — 10 packet types (Ack, Nak, FaultCodes, Eeprom R/W, Custom, etc.)
  Logging/AppLogger.cs       — Daily rotating log files (ERR/WAR/MSG/DBG)

Services/
  ICanService.cs             — CAN bus abstraction (parameter map, frame routing, liveness)
  IBenchService.cs           — Test orchestration, RPM/temp control, relay control
  IKwpService.cs             — K-Line ECU diagnostics (keep-alive, EEPROM, DTCs, DFI)
  IUnlockService.cs          — Ford VP44 immobilizer unlock state machine
  IConfigurationService.cs   — XML persistence for all config files
  ICalibrationService.cs     — Sensor calibration operations
  IPdfService.cs             — PDF test report generation
  IAutoTestOrchestrator.cs   — Dashboard "Connect & Auto Test" state machine (K-Line → read → unlock → bench on → test)

Services/Impl/
  BenchService.cs            — Test orchestration, temperature PID, relay control (background Task)
  BenchPidController.cs      — Discrete-time PID for RPM ramp (derivative-on-measurement, anti-windup)
  KwpService.cs              — All KWP operations; persistent session with keep-alive loop
  UnlockService.cs           — Ford unlock: 600.5s Phase 1 + TestUnlock Phase 2 + verification
  ConfigurationService.cs    — XML persistence for pumps, bench, config, clients, sensors, alarms, status
  CalibrationService.cs      — Sensor calibration
  PdfService.cs              — QuestPDF report generation (multi-page, charts, verdict)
  ReportChartRenderer.cs     — SVG chart rendering for PDF tolerance-band visualizations
  ReportTheme.cs             — Report styling constants
  AutoTestOrchestrator.cs    — Linear auto-test sequence; E-stops past TurningOnBench, aborts cleanly before

Models/
  CanBusParameter.cs         — CAN parameter model + BenchParameterNames/PumpParameterNames/KlineKeys constants
  BenchConfiguration.cs      — Bench config + embedded AppSettings (PID, timers, safety limits)
  PumpDefinition.cs          — Pump model, CAN params, tests, K-Line data
  TestDefinition.cs          — Test type + phase list + tolerance evaluation
  PhaseDefinition.cs         — Phase readies/sends/receives/results
  TestParameter.cs           — Measurement point (name, value, tolerance)
  TestResult.cs              — Accumulated result with samples and pass/fail evaluation
  MeasurementSample.cs       — Single timestamped measurement
  SensorConfiguration.cs     — ADC calibration (voltage → engineering units)
  Relay.cs                   — Relay output + RotationDirection/EncoderMode/BaudrateSelection constants
  Alarm.cs                   — Alarm condition (bit, description, criticality, active state)
  PumpStatusDefinition.cs    — Status word bit definitions with color-coded states
  RpmVoltageRelation.cs      — RPM → voltage lookup table entry
  KLineConnectionState.cs    — K-Line session state enum

Converters/
  BoolToPassFailBrushConverter.cs
  HexColorToBrushConverter.cs

ViewModels/                  — [ObservableProperty] / [RelayCommand], no UI logic
  MainViewModel.cs           — Central orchestrator, event marshalling, child VMs
  PumpIdentificationViewModel.cs — Pump selection + K-Line ECU read
  DfiManageViewModel.cs      — DFI calibration read/write/auto-adjust
  TestPanelViewModel.cs      — Test suite management (phase enable/disable)
  TestDisplayViewModel.cs    — Current test execution progress
  ResultDisplayViewModel.cs  — Test result table (per-phase pass/fail)
  PumpControlViewModel.cs    — Manual pump control sliders (ME, FBKW, PreIn)
  BenchControlViewModel.cs   — Bench control (rotation, RPM ramp, oil pump)
  FlowmeterChartViewModel.cs — Real-time flowmeter charts
  AngleDisplayViewModel.cs   — Encoder angle monitoring (PSG, INJ, Manual, Lock Angle)
  StatusDisplayViewModel.cs  — Pump status word display
  Dialogs/                   — KlineErrors, OilPumpConfirm, Progress, Report, RpmSafetyWarning,
                               Settings, UnlockProgress, UserCheck, VoltageWarning ViewModels

Views/
  MainWindow.xaml            — Root UI (multi-panel layout)
  Dialogs/                   — KlineErrorsDialog, OilPumpConfirmDialog, ProgressDialog,
                               ReportDialog, RpmSafetyWarningDialog, SettingsDialog,
                               UnlockProgressDialog, UserCheckDialog, VoltageWarningDialog
  UserControls/              — AngleDisplay, BenchParamConfig, DfiManage, FlowmeterChart,
                               PumpControl, PumpIdentification, ResultDisplay, StatusDisplay,
                               TestDisplay, TestPanel

Configuration files

All XML files stored in %UserProfile%\.HC_APTBS\config\:

File Purpose
config.xml Global settings: temp limits, PID tuning, refresh rates, safety limits, encoder, motor, company info, K-Line port, language, users, RPM-voltage relations
pumps.xml Pump database: per-pump identity, CAN parameters (P1P6 legacy), test definitions with phases
bench.xml Bench CAN parameters (Factor/Offset model) + relay definitions. Embedded default fallback in code
sensors.xml ADC sensor calibrations (channel → voltage → engineering units)
clients.xml Client/operator directory (name → contact)
alarms.xml Alarm definitions (bit position, description, criticality)
status.xml Pump status word bit definitions with color-coded states

Constants quick reference

Defined in Models/CanBusParameter.cs:

  • BenchParameterNames — RPM, Counter, BaudRate, BenchTemp, T-in, T-out, T4, QDelivery, QOver, Alarms, Pressure, AnalogSensor2, encoders (PSG/INJ/Manual)
  • PumpParameterNames — me, FBKW, mepi, RPM, Temp, Tein, MemoryRequest, TestUnlock, TestImmo, Status, Empf3
  • KlineKeys — pumpID, SerialNumber, ModelReference, DFI, ErrorCodes, SWV1, SWV2, PumpControl, DataRecord, result
  • RelayNames — Electronic, OilPump, DepositCooler, DepositHeater, Counter, Direction, TinCooler, Pulse4Signal, Flasher (in Models/Relay.cs)

Rules for all edits

Always:

  • Read the file before editing it
  • Keep XML doc comments on all public types and members
  • Use BenchParameterNames / PumpParameterNames / KlineKeys / RelayNames constants — no magic strings
  • Marshal to the UI thread when consuming IBenchService or IKwpService events (they fire on background threads)
  • Use CultureInfo.InvariantCulture when parsing/formatting doubles in XML (avoid locale bugs)
  • Log skipped or malformed XML elements — never silently swallow parse failures
  • New bench parameters must use Factor/Offset calibration, not P1P6 (legacy model is for pump params only)

Never:

  • Modify Infrastructure/Pcan/PcanBasic.cs (vendor file, intentionally untouched)
  • Modify anything under old_source/ (archived reference only)
  • Add logic to View code-behind files
  • Add Thread.Sleep, allocations, or logging inside the per-byte K-Line loops in KwpCommon/KW1281Connection

Protocol constants

Do not change without knowing why. Use /protocol-ref skill for full reference including DFI encoding, IIR filter, OEM legitimation, and K-Line timing.

Conventions

  • ViewModels in /ViewModels, Views in /Views, Models in /Models
  • Async methods use Async suffix
  • Commit format: feat:, fix:, refactor: (conventional commits)
  • Git remote: self-hosted Gitea at 192.168.8.130

Known gaps (from old_source comparison)

See docs/ guidelines for full specs. Priority: CRITICAL > HIGH > MEDIUM > LOW.

CRITICAL:

  • No config XML validation — malformed files silently produce partial/default state

HIGH — Missing safety features:

  • No QOver zero-flow safety check (old: emergency stop if QOver==0 while RPM>300 + oil pump on)
  • Alarm bit collection during tests not wired up (PhaseDefinition.RecordErrorBit never called)
  • No per-sample real-time UI callback during measurement (old fired per-sample events for live charts)
  • Pump parameters (ME/FBKW/PreIn) not zeroed between test phases

HIGH — Missing features:

  • No encryption (old encrypted user passwords with AES-256 + pump data with Rijndael; new stores plaintext)
  • No KlineIDs auto-mapping (old remembered K-Line ID → pump ID associations)

MEDIUM — Missing UI components:

  • WConfigPanel (full settings dialog)
  • WUsersManage (user CRUD — only auth dialog exists)
  • KlineIDSelection (COM port selection for K-Line)
  • BitDisplay / SingleBit (bit-level status toggles)
  • TimerDisplay (test timer/countdown)
  • FilteredComboBox (searchable dropdown)
  • PDF report observations/notes section missing from interface

LOW:

  • 4ms PeriodicTimer may fire at ~15ms on Windows (old MultimediaTimer had ~1ms precision)
  • Sensor calibration divide-by-zero when MaxVolt==MinVolt (no guard)
  • P1P6 transfer function can produce Infinity/NaN (no denominator check)
  • CAN parameter byteh/bytel not bounds-checked to 07

Known debt

Do not worsen before addressing deliberately. See memory file project_known_debt.md for details.

Additional debt items:

  • KW1281Connection allocates List<byte> per packet — GC pressure under long K-Line sessions
  • PcanAdapter.DrainMessageQueue polls with Thread.Sleep(2) — hardcoded, was configurable in old
  • No unit tests exist yet
  • Users stored as plaintext user:password in config.xml
  • Config file format has no version tracking or migration logic
  • Pump ID uniqueness not enforced on load
  • ParseEcuText() depends on exact spacing format (fragile)
  • AppSettings properties have no bounds validation (timer intervals, safety limits)
  • SaveSettings() triggers SaveSensors() + SaveClients() as side effects

CFG/pump data migration

The old system had 32 CFG files defining pump-specific data NOT present in the new XML model:

  • Status bit reaction codes (0=none, 1=abort, 2=warning, 3=log) — controlled test flow on errors
  • BIP-STATUS definitions (needle-motion detection) — absent from new system entirely
  • Diagnostic RAM addresses (solenoid timing, temperature compensation, learning procedures)
  • Flow regulator sensitivity parameters (measurement time adjustment, tolerance, FM sensitivity)
  • EEPROM/EPROM/RAM passwords per pump family
  • CAN-BUS-KENNUNG protocol variant code (0/1/2/6/10) — derived implicitly in new code See docs/gap-pump-data-migration.md for migration field mapping.