Files
dbc/changelog.md
T
2026-10-20 13:38:21 -04:00

345 lines
18 KiB
Markdown
Raw 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-20
#### Maintenance
- Share attribute number conversion, skip unrelated default scopes, simplify CAN
ID normalization, and remove duplicate signal length checks. Keep explicit
return types, lambda-free code, and the existing TypeFactory dispatch.
- Add numeric boundary/locale and malformed-attribute regressions, including
diagnostics for invalid definitions, defaults, assignments, and CAN references.
- Fill empty Doxygen file summaries, correct TypeFactory template parameter
documentation, and document public metadata, parser state, and Qt model methods.
Reword escape examples that caused a Doxygen Markdown warning.
#### Added
- Parse typed `BA_DEF_`, `BA_DEF_DEF_`, and `BA_` attributes with deferred
definitions/references, validated ranges, defaults, and explicit overrides.
Preserve definitions and assignments plus effective database/frame/signal values.
- Expose optional frame format and cycle time metadata in parsed frames, runtime
snapshots, and tree payloads. Preserve unknown frame format labels with source
warnings, and report format/ID conflicts without changing ID or J1939 behavior.
- Add attribute syntax, scope, reference, numeric, override, diagnostics, and
metadata propagation regressions; document supported forms and limitations.
Verified the qmake build, all six QtTest suites, the qmake tree target, and
the standalone C++17 tree test. The existing named C locale test skipped
because the required locale is not installed.
#### Changed
- J1939 interpretation now requires `DbcParserOptions::enableJ1939` (default off)
or explicit per-frame `hasPgn` metadata. Extended CAN alone no longer derives
PGN metadata. Runtime construction validates opted-in PGNs against frame IDs.
- Add indexed PGN lookup with PDU1 destination exclusion, PDU2 group extension,
and both data-page bits. Decoder exact-ID matches take precedence; otherwise
one J1939 PGN candidate is accepted and multiple candidates return
`AmbiguousFrame`. Result and selection keys identify the DBC definition.
- Add opt-in, PDU1/PDU2, address/priority changes, ambiguity, exact precedence,
metadata validation, selected decode, and snapshot-lifetime regressions.
Verified with `qmake6 ../dbc.pro`, `make -j4`, and `make check` in `build/`:
all six QtTest suites and the Qt-free tree target passed; the existing named
comma-decimal C locale test skipped because that locale is not installed.
#### Added
- Expose stable frame and signal keys from Qt-free tree nodes using the existing
runtime identifier types. Document missing-key cases and identity rules.
- Expand standalone navigation tests and add a Qt-free qmake test target covering
ownership transfer, vector growth, bounds, key identity, and cycle rejection.
#### Fixed
- Reject self/ancestor insertion before consuming child ownership, preventing
cycles while preserving parent links. Keep node copying and movement disabled.
### 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`)