Files
dbc/changelog.md
2026-10-14 10:41:17 -04:00

289 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
This changelog summarizes release and development history. Entries are listed
newest first. Historical dates follow the commit author dates. `v1.0` is the
existing Git tag; subsequent changes are listed as unreleased.
## Unreleased
### 2026-10-14
#### Fixed
- Issue #19: parse signal factor, offset, minimum, and maximum independently of
C/C++ application locales with `std::from_chars`, retaining signed decimals,
scientific notation, complete-token validation, and range/finite checks.
- Added custom C++ and named C comma-decimal locale regressions for valid physical
values and invalid syntax, grouping, overflow/underflow, and reversed ranges.
Documented portable test coverage and Linux locale generation. Verified with
`qmake6`, `make -j4`, and `LOCPATH=/tmp/dbc-issue19-locales make check`: all six
suites passed without skips. The named C locale regression fails with the old
`std::stod` converter.
- Issue #18: frame/signal comments share frame-definition CAN ID validation and
resolve after definitions are read. Support tabs, escaped quotes/backslashes,
and multiline text while preserving whitespace and starting source locations.
- Report malformed comments and missing references as `InvalidStatement` errors;
keep statement-order overwrites, including empty comments. Added regression
coverage and updated parser/test documentation. Verified with `qmake6`,
`make -j4`, and `make check`: all six regression suites passed.
#### Changed
- Validate duplicate frame keys before building the runtime lookup index, alongside
CAN IDs, signal layouts, numeric parameters, and multiplexing metadata.
#### Added
- Root `AGENTS.md` with project coding rules, build/test commands, and
documentation requirements, based on the existing `.project_rules`.
- End-to-end DBC fixture tests for parsed metadata, runtime frame/signal lookup,
raw and physical decoding, value descriptions, and tree nodes. Both builders
preserve supported metadata across same-numeric standard/extended IDs, comments,
empty databases, and database replacement.
- Exhaustive layout checks for both byte orders at representative payload sizes
(0, 1, 8, 64, and 255 bytes), including invalid lengths and uint32 overflow inputs.
- Regression coverage for builder input mutation/destruction and failed replacement
with duplicate frame or signal keys, preserving existing lookups.
### 2026-10-13
#### Added
- Issue #16: construction-time validation for both manual runtime definitions and
`DbcDecodeBuilder` input: normalized CAN IDs, duplicate keys, signal lengths and
positions, enums, finite numeric parameters, ordered ranges, selectors, branch
ranges, and overlaps.
- Regression tests for both construction paths, numeric and bit boundaries,
mixed byte orders, exclusive overlaps, mutable input aliases, and failed reloads.
- `FrameDecodeStatus` distinguishes unknown frames, insufficient payloads,
signal errors, and successful decoding; frame `valid` still means matched.
- `SignalDecodeStatus::PhysicalConversionFailed` reports NaN/Inf results,
retaining exact raw values and the non-finite physical result.
- Regression tests for payload-length policy, partial results, invalid runtime
metadata, physical overflow/non-finite parameters, and raw branch selection
when selector physical conversion fails.
#### Changed
- Runtime construction rejects invalid definitions with `std::invalid_argument`
before publishing a snapshot. Decoder tests now expect construction failures
for malformed definitions; finite arithmetic overflow remains a decode status.
- Shared overflow-safe layout validation across parsing, construction, and
decoding. Intel extraction also widens bit coordinates before arithmetic.
- `DecodeDatabase` now accepts definitions by const reference and copies them,
even for rvalues, preventing retained
mutable aliases from modifying the frozen snapshot or invalidating its index.
- Short payloads decode available signals without padding; longer payloads
ignore bytes beyond the declared DLC. Short frame status takes precedence
over signal errors, with per-signal causes retained in definition order.
- Runtime signal validation checks enum values and bit layouts against declared
DLC using overflow-safe coordinates. Extra bytes cannot rescue invalid layouts.
- Documented frame/signal status meanings, value availability, and payload policy.
### 2026-10-11
#### Added
- Stable application identifiers: `FrameKey` (normalized CAN ID and frame type)
and `SignalKey` (frame key and signal name), with equality and hashers.
- Runtime `FindSignal`, frame `GetKey`, and keys on decoded frame/signal results.
- Reload/lifetime tests for retained frames and independent signals, lookup
handles, copies/moves, snapshot release, stable keys, removed/renamed definitions,
failed/empty reloads, duplicate keys, and insufficient payloads.
- `ParseFileWithDiagnostics` and `DbcParseResult` with severity, stable error
code, supplied file path, physical line number, and message for each diagnostic.
- Warnings for unregistered statements, including floating-point signal types,
attributes, signal type references, environment variables, and vendor extensions.
- Quiet common DBC header handlers registered through TypeFactory; `NS_` symbol
declarations do not produce unsupported-statement warnings.
- Regression tests for warning locations, header handling, immediate/deferred
errors, file errors, empty results on failure, and legacy exception compatibility.
#### Changed
- **API change:** `DecodeDatabase` is an immutable shared snapshot. Use
`GetFrames()` for reads or construct a new snapshot from a vector; its frame
index is private and built automatically, with duplicate-key validation.
- **API change:** decoded `definition` fields and `DbcDecoder::FindFrame` return
`shared_ptr<const ...>` ownership. Stored results retain old definitions across
reload/clear/destruction, including separately copied signals and `VAL_` strings.
Decoding shares metadata without per-result definition copies.
- Documented borrowed views, owning handles, snapshot retention, identifier scope,
reload behavior, application migration, and synchronization requirements.
- Kept `ParseFile` compatible while sharing parsing with the diagnostic API.
Parsing stops at the first error and never returns a partial database.
- Deferred value-description and multiplexing errors carry structured source
locations without extracting them from exception messages.
- Documented supported syntax, warning behavior, diagnostic codes, and limitations.
- Audited diagnostic coverage and added unsupported-statement variants, namespace
termination, formatting/path handling, first-error stopping, deferred diagnostic
order, duplicate/overlap errors, and supported decoding preservation tests.
Linux file-read errors and legacy file-error messages are checked explicitly.
### 2026-10-07
#### Added
- Added regression coverage for signed bit-length boundaries, deterministic
Intel/Motorola extraction, lookup failures, runtime validation, PGN, comments,
file formatting, metadata copying/lifetime, and TypeFactory behavior.
- Added direct-handler and resolver tests for unsupported comments and ambiguous
`VAL_` references in manually constructed databases.
- Documented GCC/gcov/LCOV instrumentation, Qt Creator setup, and HTML reports.
Coverage after the added tests: 98.4% of lines and 71.4% of branches with
GCC 14.2 and Qt 6.8.2, including the standalone tree test.
- Added a reusable post-build coverage report script and step-by-step Qt Creator
configurations for model tests, strict warning checks, coverage, core-only,
standalone tree tests, and the demo. Machine-specific `.user` settings stay
outside version control.
- Basic `M` / `mN` multiplexing metadata in parsed, tree, and runtime definitions.
- Deferred selector and overlap validation with source locations: one unsigned
selector, representable branch values, and overlaps only between exclusive branches.
- Selector-first decoding using exact raw values, preserving definition order and
unconditional signals. Explicit statuses distinguish inactive branches, missing
selector data, insufficient payloads, and malformed runtime metadata.
- Registered `SG_MUL_VAL_` rejection through TypeFactory; extended and nested
multiplexing remain unsupported. Added parser/decoder regression coverage and
documented supported syntax and consumer behavior.
#### Changed
- Qt-dependent targets now require the installed Qt 6.8.2 through a shared qmake
version check; removed Qt 5 compatibility instructions. Core remains Qt-free.
- Used explicit local types in the additional coverage and model tests. Functions
retain explicit return types, and runtime handler selection uses TypeFactory
without lambdas or extra factory layers for concrete objects.
- Coverage documentation now describes the selected open GCC/LCOV toolchain.
- Overlapping unconditional signals are now rejected during parsing.
#### Fixed
- Linked QtGui only in the optional model tests and used QGuiApplication with an
offscreen default, resolving the QAbstractItemModelTester invalid QPixmap
metatype warning without adding QtGui to the adapter library.
- Accepted tabs after `CM_` by using the comment parser's keyword extraction
instead of requiring a literal-space prefix.
- Removed test compiler warnings by using `QVERIFY_THROWS_EXCEPTION` and
explicitly discarding `nodiscard` return values in exception checks.
- Reject duplicate frames by normalized CAN ID and frame type, including
equivalent extended ID encodings, and duplicate signal names within a frame.
Errors report the file path and line of the repeated definition. Standard and
extended frames may share a numeric ID; separate frames may reuse signal names.
Added regression coverage and updated parser documentation.
### 2026-10-06
#### Added
- Added non-owning TreeNode parent navigation and stable sibling positions;
disabled node moves to preserve links while retaining unique_ptr ownership.
- Added optional read-only Qt Core DbcTreeModel with documented columns and
metadata roles, exact VAL_ entries, exclusive tree ownership, and reset-based
reload/clear support. Core remains independent of Qt.
- Added QAbstractItemModelTester coverage, navigation/metadata/reset tests,
a standalone Qt-free tree test, and adapter build and usage documentation.
- Added `VAL_` signal value descriptions through the statement dispatcher and
factory, with complete syntax validation, exact signed/unsigned 64-bit keys,
deferred reference resolution, duplicate detection, and source error locations.
Distinct keys from multiple statements merge; standard and extended frames
remain distinct under existing CAN ID normalization.
- Preserved descriptions in parsed metadata, runtime decode definitions, and UI
tree metadata. Added `DecodedSignalValue::GetValueDescription()` and
`FindValueDescription()` for raw integer lookup before physical scaling.
Unknown values retain normal numeric decoding.
- Added regression coverage for syntax, quoting, whitespace, integer boundaries,
declaration order, invalid references, duplicates, scaling, and both builders;
documented syntax, lookup behavior, and limitations in README.
### 2026-10-05
#### Changed
- Split the qmake project into a reusable static library in `core/`, a demo in
`examples/`, and a combined regression test executable in `tests/`. Added
shared `.pri` files and updated build instructions. (`f17ddb6`, #11)
- Added `.clang-format` and applied consistent formatting to the source code
and tests. (`b91cf4a`, #7)
- Replaced lambdas with explicit functions and simpler code in statement
handlers, the decoder, the demo, and regression tests. (`03dc8f2`)
#### Fixed
- Added complete validation of `SG_` signal statements, including syntax,
receivers, numeric fields, lengths of 1–64 bits, physical ranges, and signal
bounds within the declared frame payload for Intel and Motorola bit order.
Invalid definitions report the file path and line number. Multiplexing
markers are explicitly rejected. Added regression tests and documentation.
(`8d82b13`, #6)
#### Documentation and maintenance
- Regenerated Doxygen documentation after code changes and the project
restructuring. (`6cd9976`, `0067cb4`, `f17ddb6`)
- Removed the temporary signal-validation issue document. (`1163277`)
### 2026-10-01
#### Changed
- Moved DBC statement parsing into `TypeFactory`-registered handlers for
`BO_`, `SG_`, and `CM_`, with a shared parse context and keyword dispatcher.
Added tests for dispatch and handler replacement, and documented how to
register additional handlers. (`88b5883`, #4)
- **API change:** `DecodedSignalValue::rawValue` now uses
`std::variant<std::int64_t, std::uint64_t>` instead of `int64_t`. Consumers
must handle the appropriate variant alternative. Physical values remain
`double` and may lose precision for large integers. (`69074e3`, #2)
#### Fixed
- Corrected Motorola signal extraction within bytes and across byte
boundaries using DBC sawtooth bit numbering. Added decoder regression
tests and build instructions; introduced the `TypeFactory` utility.
(`2c057b6`)
- Preserved the full unsigned 64-bit raw-value range, including values above
`INT64_MAX`, and updated physical conversion and demo output. Added tests
for signed and unsigned boundaries and numeric output. (`69074e3`, #2)
- Validated `BO_` frame syntax, CAN identifiers, payload lengths, numeric
overflow, and unexpected trailing fields. Parsing errors now include the
file path and physical line number. Added parser regression tests.
(`3bd9339`, #3)
## v1.0 — 2026-06-14
Tag `v1.0` points to `38ce043` and includes the initial implementation below.
### Documentation
- Added source-file headers with author information and MIT license
references. (`e2ffa97`)
- Added and subsequently simplified the Doxygen configuration.
(`e2c07dd`, `4c8af9f`)
- Generated API documentation and refreshed the generated documentation.
(`dfec39d`, `38ce043`)
### Initial implementation — 2026-03-13
#### Added
- Initialized the repository with a README and MIT license. (`4270459`)
- Added the DBC parser, frame and signal metadata, a tree representation and
builder, a demonstration program, and a qmake project. (`2a90b2d`)
- Added runtime decoding through `DbcDecodeBuilder`, `DecodeDatabase`, and
`DbcDecoder`, including CAN-frame lookup, Intel and Motorola extraction,
signed and unsigned signals, and factor/offset conversion. Updated parser
metadata and the demo to support decoding. (`a53a5df`)
#### Documentation and maintenance
- Added `.gitignore` and expanded the README with architecture, data
structures, parsing behavior, decoding examples, and usage documentation.
(`efc57d6`, `f2aa10c`, `cb20f5f`, `f0e7065`)