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>
This commit is contained in:
2026-05-07 13:59:50 +02:00
parent da0581967b
commit 827b811b39
102 changed files with 7522 additions and 1798 deletions

View File

@@ -43,6 +43,28 @@ namespace HC_APTBS.Services
/// <summary>Persists a pump definition back to the database.</summary>
void SavePump(PumpDefinition pump);
// ── Pump equivalence / alias lookup ───────────────────────────────────────
/// <summary>
/// Returns the canonical pump ID whose <c>&lt;Aliases&gt;&lt;KlineId&gt;</c>
/// entries contain <paramref name="klinePumpId"/>, or <c>null</c> if no
/// alias matches. Comparison is case-insensitive and trims whitespace.
/// </summary>
string? FindPumpIdByKlineAlias(string klinePumpId);
/// <summary>
/// Returns the canonical pump ID whose <c>&lt;Aliases&gt;&lt;ModelRef&gt;</c>
/// entries equal <paramref name="modelRef"/> (case-insensitive, trimmed),
/// or <c>null</c> if no alias matches.
/// </summary>
string? FindPumpIdByModelRef(string modelRef);
/// <summary>
/// Persists a new K-Line alias under the given canonical pump.
/// No-op if the canonical pump does not exist or if the alias is already present.
/// </summary>
void AddKlineAlias(string canonicalPumpId, string klineAlias);
// ── Clients ───────────────────────────────────────────────────────────────
/// <summary>Sorted client name → contact info dictionary.</summary>
@@ -51,6 +73,26 @@ namespace HC_APTBS.Services
/// <summary>Persists the client list to <c>clients.xml</c>.</summary>
void SaveClients();
// ── Developer libraries (saved KWP commands + EEPROM passwords) ──────────
/// <summary>
/// User-saved raw KWP custom commands, persisted in <c>custom_commands.xml</c>.
/// Populated and edited by the Developer Tools page; not used by production paths.
/// </summary>
ObservableCollection<CustomCommand> CustomCommands { get; }
/// <summary>Persists <see cref="CustomCommands"/> to <c>custom_commands.xml</c>.</summary>
void SaveCustomCommands();
/// <summary>
/// User-saved EEPROM unlock passwords (zone + 16-bit key), persisted in
/// <c>eeprom_passwords.xml</c>. Populated and edited by the Developer Tools page.
/// </summary>
ObservableCollection<EepromPassword> EepromPasswords { get; }
/// <summary>Persists <see cref="EepromPasswords"/> to <c>eeprom_passwords.xml</c>.</summary>
void SaveEepromPasswords();
// ── Pump status definitions ───────────────────────────────────────────────
/// <summary>