Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
8be2ac4
docs: remove obsolete fix notes
claude May 9, 2026
3716016
docs: refresh README, QuickStart, examples README for v3.79
claude May 9, 2026
242be2a
docs: add RADIO_CALCULATORS guide and missing example READMEs
claude May 9, 2026
c9f58b1
docs: clarify ownership of planning docs
claude May 9, 2026
bee772c
docs: split CHANGELOG, add subsystem reference and docs index
claude May 9, 2026
544f8d2
docs: add v3.80 extension plan
claude May 9, 2026
6a94b66
v3.80 / 3.2: radio code brand registry + 8 pending stubs
claude May 9, 2026
4cf5f8c
v3.80 / 3.3: VIN-aware radio code variant resolver
claude May 9, 2026
24fb60e
v3.80 / 4.1: coding diff & dry-run with explicit confirm
claude May 9, 2026
36b8355
v3.80 / 4.2: tamper-evident coding audit log
claude May 9, 2026
0f2ffe5
v3.80 / 4.3: resumable flashing checkpoint sidecar
claude May 9, 2026
a07643a
v3.80 / 4.4: coding encoders for Toyota / Honda / HMG / Stellantis
claude May 9, 2026
f428a3b
v3.80 / 4.5: PQC-ready signature verifier scaffolding
claude May 9, 2026
d0d1a97
v3.80 / 4.6: pre-flash programming-voltage gate
claude May 9, 2026
de4de95
v3.80 / 5.1: DoIP UDP discovery + AliveCheck wire codec
claude May 9, 2026
1465997
v3.80 / 5.2: adapter capabilities registry + CAN-FD flag
claude May 9, 2026
d59ea83
v3.80 / 5.3: AUTOSAR SecOC framing + HMAC-SHA-256 auth (Profile 3)
claude May 9, 2026
da853c8
v3.80 / 5.4: ISO-TP timing audit harness
claude May 9, 2026
e96794b
v3.80 / 5.5: J2534-2 (2018) IOCTL constants + SET_CONFIG builder
claude May 9, 2026
479c6a8
v3.80 / 8.2: EV battery-health helpers
claude May 9, 2026
62bfd0a
v3.80 / 8.3: tachograph DDD signature chain verification
claude May 9, 2026
e608195
docs: add v3.81 extension plan
claude May 9, 2026
988f20b
v3.81 / A1: service routines library
claude May 9, 2026
58754ae
v3.81 / A2: tachograph workshop operations
claude May 9, 2026
d8ad1bc
v3.81 / A3: OBD-II Mode 06 (ISO 15031-5)
claude May 9, 2026
b8d8b06
v3.81 / A4: WWH-OBD (UN GTR No.5 / ISO 27145)
claude May 9, 2026
2ea76f8
v3.81 / A5: J1939 named-PGN library
claude May 9, 2026
4fa63dd
v3.81 / A6: ISO 14229-1 NRC catalog
claude May 9, 2026
87745ca
docs: add v3.82 extension plan
claude May 9, 2026
c9dc1ba
v3.82 / B1: WWH-OBD readiness monitor decoder
claude May 9, 2026
f09b0b4
v3.82 / B2: CalID + CVN sweep + drive-cycle advisor
claude May 9, 2026
2e74ee3
v3.82 / B3: BMW key adaptation framing (EWS / CAS / FEM-BDC)
claude May 9, 2026
5a3a682
v3.82 / B4: VAG Component Protection request/response framing
claude May 9, 2026
b10ac9e
v3.82 / B5: Mercedes SCN coding flow framing
claude May 9, 2026
aab8ba7
v3.82 / B6+B7+B8: HMG / Ford / Toyota key-adaptation framing
claude May 9, 2026
26b43a4
docs: add v3.83 extension plan
claude May 9, 2026
06775c9
v3.83 / C1: OEM session helper for one-call routine execution
claude May 9, 2026
0ba59c9
v3.83 / C2: per-OEM drive-cycle resolvers
claude May 9, 2026
3c99ffc
docs: add v3.84 extension plan (style + JSON-catalog alignment)
claude May 9, 2026
d28aab5
v3.84 / S1: standardise headers + COPYRIGHT across v3.80-v3.83 code
claude May 9, 2026
59f9b5c
docs: widen v3.84/S5 scope to pre-existing hardcoded data
claude May 9, 2026
5fff3e5
v3.84 / S2: restore //---- section banners across v3.80-v3.83 code
claude May 9, 2026
eee53e3
v3.84 / S5 tier 1: move UDS NRC + J1939 PGN + service-routine seeds t…
claude May 9, 2026
0897271
v3.84 / S5 tier 2: move WWH-OBD DIDs + adapters + radio-code pending …
claude May 9, 2026
0635514
v3.84 / S5 tier 3: move DriveCycle generic + Mode 06 lookups to JSON
claude May 9, 2026
845bd78
v3.84 / S3: add XML summaries to test-method declarations
claude May 9, 2026
036a95d
v3.84 / S5 pre-existing: move Becker4 + Becker5 10,000-entry tables t…
claude May 9, 2026
74e43e0
v3.84 / S5 pre-existing: move VIN regions/countries/manufacturers/pla…
claude May 9, 2026
5b7f5ad
v3.85 / S6 A+B: add per-method banners + XML summaries across v3.80+ …
claude May 9, 2026
d1e1549
v3.85 / S6 C: inject v2-style inline body comments
claude May 9, 2026
a2b897e
v3.85 / S6 D: reformat XML to v2 three-line form + split inline 'var …
claude May 9, 2026
fd0b00e
v3.85 / S6 E+F: full-repo style alignment to v2 conventions
claude May 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3,252 changes: 23 additions & 3,229 deletions CHANGELOG.md

Large diffs are not rendered by default.

93 changes: 93 additions & 0 deletions CHANGELOG/v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# Changelog — v2.x

Releases from the v2.1 Foundation milestone through v2.5 Hardening & ECU.
Newer entries are in [v3.md](v3.md). The top-level
[../CHANGELOG.md](../CHANGELOG.md) indexes both.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.5.0] - 2026-05-06 — Hardening & ECU

### Added
- `TOBDECUFlashing` (`src/Services/OBD.ECU.Flashing.pas`) — first-class flashing coordinator. Runs the strict pre-check → signature → snapshot → erase → write → finalise → verify pipeline; OEM-specific I/O plugs in via `OnHealthCheck` / `OnSnapshot` / `OnWriteChunk` / `OnFinalise` / `OnVerifyEcu`. Snapshot persists to `BackupPath`; `BlockSize` chunks the stream; `RequestCancel` honoured at every stage boundary; automatic rollback re-writes the snapshot on write/finalise/verify failure. Stage / progress / completed / failed events expose UI hooks.
- `IFirmwareSignatureVerifier` + `TOBDSha256SignatureVerifier` (constant-time hash compare) + `TOBDPermissiveSignatureVerifier` (development only) in `src/Services/OBD.ECU.Signature.pas`. `ComputeSha256` helper for one-liners.
- `TOBDSecureSettings` (`src/Utilities/OBD.SecureSettings.pas`) — DPAPI-encrypted INI storage. Wraps `CryptProtectData` / `CryptUnprotectData` (current-user scope). Plaintext never touches disk; failed decryption falls back to caller-supplied default rather than raising. Standalone `DPAPIEncrypt` / `DPAPIDecrypt` exported for ad-hoc byte-level use.
- `TOBDAuditRecorder` (`src/Utilities/OBD.Audit.pas`) — structured audit events routed through the configured `TOBDLogger` with `SourceTag = "audit"` and JSON-serialised payload (actor / action / resource / outcome / detail). Outcomes map onto log levels: success → Info, failure → Error, denied → Warning.
- `TOBDAttemptCounter` (`src/Utilities/OBD.Security.AttemptCounter.pas`) — per-identity exponential back-off lockout. `BaseLockoutSeconds` doubles per failure beyond `FreeAttempts`, capped at `MaxLockoutSeconds`. Thread-safe; identities don't interfere.
- 32 new tests across `Tests.ECU.Signature`, `Tests.ECU.Flashing`, `Tests.SecureSettings`, `Tests.Audit`, `Tests.Security.AttemptCounter` exercising real DPAPI round-trips, golden SHA-256 vectors, every flashing-failure path with rollback verification, lockout math, and JSON audit shape.

## [2.4.0] - 2026-05-06 — Distribution & Docs

### Added
- `Packages/getit.json` — GetIt package manifest (name, version, runtime + design-time paths, examples, doc references). Submission to Embarcadero is the maintainer-side follow-up.
- `.github/workflows/docs.yml` — automated PasDoc API-reference build + GitHub Pages deploy on every push to main and every tag. `docs/pasdoc.cfg` carries the PasDoc configuration.
- `docs/ARCHITECTURE.md` — full architectural overview with Mermaid diagrams (layered model, per-PID sequence diagram, connection / adapter / protocol / service / async / logging / UI maps).
- `docs/PROTOCOLS.md` — protocol-stack reference: OBD-II transports, ISO-TP framing, SAE J1979 services, UDS/KWP2000/DoIP/J1939/FlexRay/LIN/MOST/tachograph, adapter dialect notes.
- `docs/TROUBLESHOOTING.md` — symptom-keyed FAQ across connection, protocol, components, ECU flashing, async, logging, build/packaging.
- `docs/PERFORMANCE.md` — headline numbers, per-component tuning levers, anti-patterns, profiling tooling, regression-reporting guidance.

## [2.3.0] - 2026-05-06 — Async & Logging

### Added
- `IOBDFuture<T>` / `IOBDPromise<T>` / `IOBDCancellationToken` async primitives in `src/Utilities/OBD.Async.pas`. `TEvent`-backed `Await` with timeout, `OnComplete` handlers (synchronous when already settled), idempotent settlement.
- `TOBDConnectionAsync` (`src/Connection/OBD.Connection.Async.pas`) — wraps `IOBDConnection` with `SendAsync` / `ATAsync` / `OBDAsync` returning `IOBDFuture<string>`. Resolves on the configured terminator (default '>' ELM327 prompt). Per-request timeout + shared cancellation tokens.
- `TOBDProtocolAsync` (`src/Protocol/OBD.Protocol.Async.pas`) — `RequestAsync(Service, PID)` / `RequestRawAsync(HexCommand)` return parsed `TArray<IOBDDataMessage>`; `PollAsync(PIDs)` chains Service-01 polls sequentially.
- `IOBDLogSink` + bundled sinks (`TFileRotationSink`, `TDailyRotationSink`, `TJsonLineSink`, `TConsoleSink`, `TInMemorySink`) in `src/Utilities/OBD.Logger.Sinks.pas`. `TOBDLogger` gains `RegisterSink` / `UnregisterSink` / `SinkCount` / `SourceTag`; legacy `OnLog` event and existing file-write are unchanged.
- `TOBDLogViewer` (`src/Components/OBD.LogViewer.pas`) — `TOBDTerminal` subclass that implements `IOBDLogSink`, so any logger can render directly into the in-app conversation viewer with severity-coloured rows.
- `TOBDRecorder` + `TOBDReplayer` (`src/Services/OBD.Service.Recorder.pas`) — capture and replay `.obdlog` files with elapsed-millisecond timing + direction tagging. `examples/replay/` ships a console replayer with configurable speed multiplier; documented in `examples/replay/README.md`.

## [2.2.0] - 2026-05-06 — Components

### Added
- `TOBDLinearGauge` (`src/Components/OBD.LinearGauge.pas`) — horizontal/vertical bar gauge with gradient fill, normal/reversed direction, optional caption + units + value text, eased `Value` transitions. Registered on the IDE palette and exercised by `Tests.Components.Smoke`.
- `TOBDTachometer` (`src/Components/OBD.Tachometer.pas`) — analog RPM gauge with redline arc, shift light, configurable tick intervals, eased Value transitions. Public `ShiftLightActive` for driving external indicators.
- `TOBDTrendGraph` (`src/Components/OBD.TrendGraph.pas`) — multi-series live trend graph, per-series ring buffer with overwrite-oldest semantics, per-series Min/Max range so unlike-unit series share a single plot, optional grid + legend + border. `AddSeries` / `PushValue` / `ClearSamples` / `RemoveSeries` API; `MaxSamples` resizes preserving the most recent samples.
- `TOBDDtcList` (`src/Components/OBD.DtcList.pas`) — virtualised diagnostic-code list. Severity stripes (info/warning/critical), status badges (active/pending/permanent/history), alternate-row striping, mouse-wheel scrolling with thumb scroll-bar, single-click + double-click events. `EnsureVisible(Index)` for programmatic scroll.
- `TOBDTerminal` (`src/Components/OBD.Terminal.pas`) — live monospace conversation viewer for ELM327 / protocol traffic. Four entry points (`LogSent`, `LogReceived`, `LogInfo`, `LogError`), per-direction colours, optional timestamps, follow-tail auto-scroll, MaxLines eviction.
- `TOBDKnob` (`src/Components/OBD.Knob.pas`) — rotary input. Drag-to-rotate, mouse-wheel stepping, snap-to-step, configurable arc start + sweep, `OnChange` event.
- `TOBDSegmentedSwitch` (`src/Components/OBD.SegmentedSwitch.pas`) — iOS-style multi-state toggle backed by a `TStringList` of segments. Click to select, `OnChange` event, SelectedIndex clamping on segment changes.
- `TOBDTheme` (`src/CustomControls/OBD.Theme.pas`) — central palette with role-named slots (chrome / plot / accent / severity / selection). Explicit `Apply(component)` overloads for every shipped v2.2 component plus an `ApplyToTree(Form)` helper that walks the entire control tree. Two factory themes ship out of the box: `TOBDTheme.Dark` and `TOBDTheme.Light`.
- `docs/COMPONENT_AUTHORING.md` — canonical pattern for adding a new visual component, covering base class, file/unit naming, skeleton, property-setter rules, animation pattern, Skia drawing helpers, theme integration, package registration, smoke-test minimum, anti-patterns, and a copy-paste PR checklist.

### Changed
- Removed `OBD.CustomControl.AnimationManager.pas` and the `IOBDAnimatable` interface contract on `TOBDCircularGauge` / `TOBDMatrixDisplay`. Each component now interpolates animated state directly inside `PaintSkia` using its existing `TStopwatch`; the inherited `TOBDCustomControl` timer keeps firing `Invalidate` at `FramesPerSecond` Hz so every paint observes the current state.

## [2.1.0] - 2026-05-06 — Foundation

### Added
- DUnitX test harness (`tests/Tests.dpr`) with TestInsight and console-mode runners.
- Smoke fixture (`Tests.Smoke.pas`) that proves the rig is alive.
- VIN decoder golden tests (`Tests.VIN.Decoder.pas`): SAE J853 + Honda goldens, ISO-3779 check-digit calculation, validate-acceptance/rejection cases, round-trip property test, WMI/VDS/VIS extraction, model-year decoding.
- Radio code universal smoke tests (`Tests.RadioCode.Smoke.pas`): all 42 calculators are instantiated and asserted to have non-empty descriptions, deterministic `Calculate`, and empty-input rejection.
- Becker 4-digit golden tests (`Tests.RadioCode.Becker4.pas`): hard goldens drawn from the published lookup table, plus determinism, invalid-input rejection, whitespace trimming.
- Service 01–0A encoder tests (`Tests.Service.Encoders.pas`): every service produces the expected hex frame with and without trailing data bytes.
- Service response decoder tests (`Tests.Service.Decoders.pas`): positive / negative / too-short / Service-03 dispatching, plus PID decoders for percentage, temperature, fuel trim, fuel pressure, RPM, timing advance, and MAF — asserted against SAE J1979 formulas.
- GitHub Actions CI workflow (`.github/workflows/ci.yml`) with a static-checks job (mangled signatures, stray `end.`, leftover `Redraw;` / back-buffer fields, line endings) and a self-hosted-runner build/test job (currently gated off; flip `if: false` once a Delphi runner is registered).
- `docs/ROADMAP.md` — staged improvement plan (v2.1 → v3.0).
- `CHANGELOG.md` — this file.
- ELM327 adapter tests (`Tests.Adapter.ELM327.pas`): `FormatATCommand` for no-param, single-string, and parameterised commands; param-count mismatch raises `TATCommandException`; `TELM327Detector.GetChipTypeDescription` non-empty + expected substring per chip type.
- ISO-TP framing tests (`Tests.Protocol.IsoTp.pas`): SF/FF/CF parsing, flow-control rejection, odd-length / too-short rejection, multi-frame VIN reassembly via `TISO_15765_4_11BIT_500K_OBDProtocol`, out-of-order CF sorting.
- **BLE transport** (`src/Connection/OBD.Connection.BLE.pas`): GATT-over-BLE OBD-II support targeting the FFE0/FFE1 ELM327 BLE clone family (Vgate iCar Pro BLE, Veepeak BLE+, OBDLink CX) with override hooks for Nordic UART or vendor-specific service/characteristic UUIDs. New `ctBluetoothLE` connection type plugs into `TOBDConnectionComponent` via published `BluetoothLEManager` / `BluetoothLEAddress` / `BluetoothLEServiceUUID` / `BluetoothLEWriteCharUUID` / `BluetoothLENotifyCharUUID` properties.

### Changed
- `src/CustomControls/OBD.CustomControl.pas` — restored to baseline (no double-buffer, no `InvalidateBackBuffer`, simple `Draw` → `PaintSkia`).
- `src/CustomControls/OBD.CustomControl.AnimationManager.pas` — default and cap lowered from 60 FPS to 30 FPS.
- `src/Components/OBD.CircularGauge.pas`, `OBD.MatrixDisplay.pas`, `OBD.Touch.Header.pas`, `OBD.Touch.Subheader.pas`, `OBD.Touch.Statusbar.pas`, `OBD.LED.pas` — all `Redraw;` calls replaced with `Invalidate;`; `Redraw` methods deleted; `InvalidateBackground` design-time guards removed; baseline `class constructor`/`class destructor` and `Repaint` overrides restored where the spiral had stripped them.
- LED component reverted to baseline (the `InvalidateColors` lazy-load tier was over-engineered).

### Fixed
- 42 corrupted `Parse` signatures in `OBD.Response.Decoders.pas`. Every `TOBD*Decoder.Parse` had a botched search/replace that produced lines like `function TOBDfunction TOBDErrorDecoder.Parse(Data: TBytes;Decoder.Parse(...)`. All repaired to match the `IOBD*Decoder` interface declarations.
- Stray mid-file `end.` terminators in `OBD.MatrixDisplay.pas` and `OBD.Touch.Header.pas`.
- Component back-buffer dimension check in `OBD.CustomControl.pas` — was guarding `FBackBuffer.Width` access without first checking `Assigned(FBackBuffer)` (since removed entirely as part of the back-buffer revert).

[Unreleased]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v3.3.0...HEAD
[3.3.0]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v3.2.0...v3.3.0
[3.2.0]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v3.1.0...v3.2.0
[3.1.0]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v3.0.0...v3.1.0
[3.0.0]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v2.5.0...v3.0.0
[2.5.0]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v2.4.0...v2.5.0
[2.4.0]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v2.3.0...v2.4.0
[2.3.0]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v2.2.0...v2.3.0
[2.2.0]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v2.1.0...v2.2.0
[2.1.0]: https://github.com/erdesigns-eu/Delphi-OBD/compare/v2.0.0...v2.1.0
Loading