Compare commits

...
11 Commits
Author SHA1 Message Date
deeaitch a0938cb29c Closes #10 2026-10-07 18:32:51 -04:00
deeaitch a533d9aa00 Closes #9 2026-10-06 17:14:50 -04:00
deeaitch e5d818d9b2 Closes 2026-10-06 17:04:13 -04:00
deeaitch 65142fdfe3 Closes #27 2026-10-06 16:54:02 -04:00
deeaitch f17ddb6aad Closes #11 2026-10-05 21:41:19 -04:00
deeaitch 0067cb4ddd update doxygen with last cahnges 2026-10-05 19:08:54 -04:00
deeaitch 03dc8f2a13 avoid lambda to simplify source code 2026-10-05 18:59:04 -04:00
deeaitch 6cd99768ae update doxygen with last cahnges 2026-10-05 18:50:00 -04:00
deeaitch 1163277b17 clean up 2026-10-05 18:49:25 -04:00
deeaitch b91cf4aae5 Closes #7 2026-10-05 18:37:20 -04:00
deeaitch 8d82b13dad Closes #6 2026-10-05 18:33:19 -04:00
353 changed files with 14775 additions and 5008 deletions

No files matched your search

+65
View File
@@ -0,0 +1,65 @@
BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: None
AlignOperands: Align
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Always
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Always
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterReturnType: None
AlwaysBreakTemplateDeclarations: Yes
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterUnion: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: true
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakInheritanceList: BeforeColon
ColumnLimit: 0
CompactNamespaces: false
ContinuationIndentWidth: 8
IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 4
KeepEmptyLinesAtTheStartOfBlocks: true
MaxEmptyLinesToKeep: 2
NamespaceIndentation: All
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PointerAlignment: Right
ReflowComments: false
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 0
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
TabWidth: 4
UseTab: Never
+384 -130
View File
@@ -20,7 +20,13 @@ The implementation follows a simple and practical design:
- Qt is not required at the parser or decoder level
- the same decode engine can be reused for live traffic and trace replay
This is **not a full production-grade DBC implementation yet**, but it is a strong architectural base.
The core library uses C++17 and has no Qt dependency. Qt Core and Qt Test are
used by the regression tests; the optional adapter requires Qt Core. Live CAN acquisition, trace-file readers,
are left to the consuming application. An optional Qt Core model adapter is provided in `qt/`.
See [changelog.md](changelog.md) for the release and development history,
[tests/README.md](tests/README.md) for test instructions, and
[generated API documentation](docs/html/index.html) for the API reference.
---
@@ -49,7 +55,7 @@ DbcTreeBuilder
↓
TreeNode hierarchy
↓
future Qt UI
DbcTreeModel → Qt views
```
### 2. Runtime decode path
@@ -105,65 +111,25 @@ This avoids forcing UI-oriented structures into a decode role they were not mean
## Module Layout
### Parsed DBC structures
```text
core/ C++17 parser, statement handlers, metadata, tree, and decoder
examples/ Command-line demo (built separately)
qt/ Optional read-only Qt Core model adapter
tests/ Parser, decoder, tree, and optional model tests
docs/ Generated Doxygen documentation
dbc.pro Root qmake project: core + tests
Doxyfile API documentation configuration
```
Files:
- `signal_info.h`
- `frame_info.h`
- `dbc_database.h`
These store a readable representation of the parsed DBC file.
### UI tree structures
Files:
- `tree_node.h`
- `tree_node.cpp`
- `dbc_tree_builder.h`
- `dbc_tree_builder.cpp`
These convert parsed DBC content into a tree hierarchy suitable for UI and model/view usage later.
### Runtime decode structures
Files:
- `decode_database.h`
- `dbc_decode_builder.h`
- `dbc_decode_builder.cpp`
These convert parsed DBC content into a structure optimized for decoding.
### Runtime decoder
Files:
- `dbc_decoder.h`
- `dbc_decoder.cpp`
These perform actual decoding of raw CAN frames using `DecodeDatabase`.
### Parser
Files:
- `dbc_parser.h`
- `dbc_parser.cpp`
- `dbc_statement_handler.h`
- `dbc_statement_handler.cpp`
- `typefactory.h`
The parser reads files and reports errors; registered statement handlers parse DBC constructs.
### Demo
File:
- `main.cpp`
Used as a small integration example.
| Component | Source files |
| --- | --- |
| Parsed metadata | `core/dbc_database.h`, `core/frame_info.h`, `core/signal_info.h` |
| Parser and dispatch | `core/dbc_parser.*`, `core/dbc_statement_handler.*`, `core/typefactory.h` |
| UI tree | `core/tree_node.*`, `core/dbc_tree_builder.*` |
| Runtime database | `core/decode_database.h`, `core/dbc_decode_builder.*` |
| Decoder | `core/dbc_decoder.*` |
| Demo | `examples/main.cpp`, `examples/demo.pro` |
| Build integration | `core/core.pro`, `core/core_files.pri`, `core/core.pri` |
---
@@ -264,12 +230,13 @@ dbc
└── Odometer
```
Each node stores either:
Frame and signal nodes store copies of the corresponding metadata; the root
has no metadata payload. The payload types are:
- `FrameInfo`
- `SignalInfo`
The tree is intended for browsing and later Qt model integration.
The tree supports browsing through the optional `DbcTreeModel` adapter.
It is **not** the primary runtime decode structure.
@@ -414,6 +381,7 @@ Fields:
- `rawValue`
- `physicalValue`
- `valid`
- `status`
---
@@ -425,10 +393,14 @@ produce the `int64_t` alternative and unsigned definitions produce the `uint64_t
alternative. Raw values remain exact across their full 64-bit ranges. Check
`valid` before using the value; an invalid result's default value is not decoded data.
Use `std::get` when the numeric type is known, or `std::visit` to handle both:
Use `std::get` when the numeric type is known, or `std::get_if` to handle both:
```cpp
std::visit([] (auto raw) { std::cout << raw; }, decodedSignal.rawValue);
if (const auto *value = std::get_if<std::int64_t>(&decodedSignal.rawValue)) {
std::cout << *value;
} else {
std::cout << std::get<std::uint64_t>(decodedSignal.rawValue);
}
```
This replaces the previous `int64_t` field: consumers that read or print
@@ -455,7 +427,14 @@ Fields:
- `signals`
- `valid`
This is the decoder output for one raw frame.
`valid` means a matching frame definition was found. Check each signal's
`valid` separately: insufficient payload data can leave individual signals
invalid even when the frame is valid. An unknown frame returns `valid == false`.
The frame and signal `definition` pointers refer into `DecodeDatabase`. Keep
that database alive and avoid changes that invalidate its frame or signal
storage while using decoded results. The decoder applies factor and offset;
it does not clamp physical values to the declared minimum and maximum.
---
@@ -466,7 +445,7 @@ Main runtime decoder class.
Responsibilities:
- find a frame definition by CAN ID
- decode all signals in a frame
- decode unconditional signals and the active multiplexed branch
- extract raw values
- sign-extend signed values
- convert raw values into physical values
@@ -486,6 +465,8 @@ The current parser supports the following DBC elements:
- `SG_`
- `CM_ BO_`
- `CM_ SG_`
- `VAL_` signal value descriptions
- basic `M` / `mN` multiplexing
---
@@ -532,9 +513,8 @@ one-based physical line number, including blank lines:
example.dbc:3: Invalid CAN ID: invalid
```
This change validates frame definitions. Signal syntax and unsupported DBC
constructs retain their existing behavior; comprehensive validation is still
planned. File-open errors contain the path but have no line number.
Frame and signal definitions are validated as described here; comprehensive
DBC grammar coverage is still planned. File-open errors contain the path but have no line number.
---
@@ -562,6 +542,84 @@ Parsed fields:
---
### Signal validation and parse errors
`SG_` statements are matched completely. Signal names must be nonempty and
contain no whitespace. Spaces and tabs are accepted between syntax elements;
byte order and signedness remain adjacent (`@0+`, `@0-`, `@1+`, or `@1-`).
A quoted unit (which may be empty) and a nonempty comma-separated receiver
list are required. Unexpected trailing fields are rejected.
Start bits must be unsigned decimal integers fitting `uint32_t`; lengths must
be within `1..64` bits. Signs, fractional values, numeric suffixes, and overflow
are rejected for these fields. Every signal bit must fit within the frame's
declared payload length, using Intel increasing bit positions or Motorola
sawtooth traversal. This uses the stored payload length without introducing
an additional CAN or CAN FD payload limit.
Factor, offset, minimum, and maximum accept signed decimal numbers, fractions,
and scientific notation. The entire numeric token must be valid; hexadecimal
numbers, NaN, infinity, conversion overflow, and conversion underflow are
rejected. Minimum must not exceed maximum. Zero and negative factors are allowed.
Basic multiplexing markers `M` and `mN` are supported as described below.
Overlapping signals are rejected unless their branch values differ.
Duplicate frame/signal name detection remains separate work.
Invalid signal definitions stop parsing with `path:line: description`, including
when the signal exceeds the declared payload length.
---
## Basic multiplexing
```dbc
BO_ 256 Status: 3 ECU
SG_ Mode M : 0|8@1+ (1,0) [0|255] "" ECU
SG_ Temperature m1 : 8|8@1- (1,0) [-128|127] "C" ECU
SG_ Pressure m2 : 8|8@1+ (2,0) [0|510] "kPa" ECU
SG_ Counter : 16|8@1+ (1,0) [0|255] "" ECU
```
`SignalInfo` and `DecodeSignal` contain `multiplexing`: a `MultiplexRole`
(`Unconditional`, `Selector`, or `Branch`) and an exact `uint64_t` branch `value`.
Each frame may have one unsigned selector (`M`); a branch (`mN`) references that
selector implicitly. The selector may appear after its branches. `N` must contain
only decimal digits, fit `uint64_t`, and fit the selector's bit width. Leading
zeros are accepted. A selector without branches is allowed. Signed selectors,
missing selectors, multiple selectors, nested/combined markers, and extended
`SG_MUL_VAL_` statements are rejected with the originating `path:line`.
The dispatcher registers the unsupported statement handler through `TypeFactory`.
Signal bits may overlap only between branches with different selector values.
This validation uses Intel or Motorola bit traversal, including mixed byte orders.
It also rejects overlapping unconditional signals. Metadata survives the runtime
and tree builders; the optional Qt adapter does not add multiplexing roles yet.
The shared decoder extracts the selector before processing branches, compares its
**raw unsigned value**, and leaves result order equal to definition order. Factor,
offset, and `VAL_` descriptions do not influence branch selection. Unconditional
signals continue to decode. An unmapped selector value leaves all branches inactive.
Each result has `SignalDecodeStatus status`:
| Status | Meaning |
| --- | --- |
| `Valid` | Raw and physical values are available; `valid == true` |
| `Inactive` | Selector is available and chooses another branch |
| `SelectorUnavailable` | Branch activation is unknown because selector bytes are missing |
| `InsufficientPayload` | Selected or unconditional signal bytes are missing |
| `InvalidDefinition` | Invalid bit length or missing/invalid selector in manually built runtime metadata |
All statuses except `Valid` have `valid == false`; their numeric fields contain
no decoded data and `GetValueDescription()` returns nullptr. Check `status` to
distinguish inactive branches from errors. Consumers constructing runtime metadata
manually must obey the same non-overlap rules as the parser. Extended and nested
multiplexing are outside this stage and are explicitly rejected, rather than
silently decoded as unconditional signals.
---
## Comments
Frame comment example:
@@ -624,7 +682,8 @@ RawCanFrame
↓
Find frame in DecodeDatabase
↓
For each signal:
Extract multiplexor selector first (when present)
For each unconditional or active signal:
extract raw bits
apply sign extension if needed
convert to physical value
@@ -651,34 +710,44 @@ This is one of the main reasons why the runtime decode layer should be explicit
## Example Usage
## Parse DBC
Include the public headers from the `core/` include directory supplied by
`core/core.pri`:
```cpp
#include "dbc_parser.h"
#include "dbc_tree_builder.h"
#include "dbc_decode_builder.h"
#include "dbc_decoder.h"
```
### Parse DBC
```cpp
DbcParser parser;
DbcDatabase database = parser.ParseFile("example.dbc");
```
## Build UI tree
### Build UI tree
```cpp
DbcTreeBuilder treeBuilder;
std::unique_ptr<TreeNode> root = treeBuilder.Build(database);
```
## Build runtime decode database
### Build runtime decode database
```cpp
DbcDecodeBuilder decodeBuilder;
DecodeDatabase decodeDatabase = decodeBuilder.Build(database);
```
## Decode a raw frame
### Decode a raw frame
```cpp
RawCanFrame rawFrame;
rawFrame.canId = 0x123;
rawFrame.canId = 256; // EngineData from the DBC example above
rawFrame.isExtended = false;
rawFrame.data = {0x01, 0x02, 0x03, 0x04};
rawFrame.data = {0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
DbcDecoder decoder;
DecodedFrameValue decoded = decoder.Decode(decodeDatabase, rawFrame);
@@ -784,9 +853,10 @@ lines:
- `BO_` → `DbcFrameHandler`
- `SG_` → `DbcSignalHandler`
- `CM_` → `DbcCommentHandler`
- `VAL_` → `DbcValueDescriptionHandler`
Grammar implementations live in `dbc_statement_handler.cpp`; their interface,
context, and dispatcher live in `dbc_statement_handler.h`. `typefactory.h`
Grammar implementations live in `core/dbc_statement_handler.cpp`; their interface,
context, and dispatcher live in `core/dbc_statement_handler.h`. `core/typefactory.h`
provides the generic registry and object creation.
To add a construct, implement a default-constructible handler deriving from
@@ -799,14 +869,14 @@ void Handle(const std::string &line, DbcParseContext &context) const override;
Register it in the dispatcher constructor:
```cpp
RegisterType<DbcValueHandler>("VAL_"); // after implementing DbcValueHandler
RegisterType<MyCustomHandler>("CUSTOM_"); // after implementing MyCustomHandler
```
Registration creates one handler; replacing a registration replaces that instance.
Register during initialization before dispatching. A line is routed using its
full first whitespace-delimited keyword, so `BO_TX_BU_` cannot match `BO_`.
Unregistered keywords remain ignored. Existing `SG_` and `CM_` syntax policies
are preserved, including requiring a literal space after those keywords.
Unregistered keywords remain ignored. `SG_` accepts spaces and tabs after its keyword; `CM_` retains its existing
policy requiring a literal space.
This factory handles statements inside DBC files. A separate format-level
factory can be introduced when another file format is implemented. The decoder
@@ -814,14 +884,71 @@ and database builders remain independent of statement dispatch.
---
## Signal value descriptions (`VAL_`)
Signal descriptions attach text to exact raw integer values:
```dbc
BO_ 256 Status: 8 ECU
SG_ State : 0|8@1+ (1,0) [0|255] "" ECU
VAL_ 256 State 0 "Off" 1 "On" 2 "Error";
```
Each statement must occupy one physical line, contain at least one integer/text
pair, and end with a semicolon. Spaces and tabs are accepted between fields;
descriptions may contain whitespace, semicolons, and empty text. Inside quoted
text, `\"` and `\\` represent a quote and a backslash; other escapes are rejected.
Keys are decimal integers in `INT64_MIN..UINT64_MAX`, with an optional minus
sign; plus signs, fractions, hexadecimal numbers, exponents, and overflow are
rejected. Keys never pass through `double`.
`VAL_` may appear before or after its frame and signal declarations. References
are resolved after reading the file using the same CAN ID normalization as
`BO_`, including bit 31 for extended identifiers. Standard and extended frames
with the same normalized ID remain distinct. Missing or ambiguous references,
malformed statements, and duplicate integer keys produce `path:line: description`
errors at the originating `VAL_` line. Distinct keys from multiple statements
are merged; `0`, `00`, and `-0` are the same key. Keys need not fit the referenced
signal's bit width or signedness; unreachable keys simply cannot match a decode.
Mappings are available as `SignalInfo::valueDescriptions` and
`DecodeSignal::valueDescriptions`, and survive both database builders, including
`TreeNode::GetSignal()`. Consumers can look up a decoded result directly:
```cpp
const DecodedSignalValue &value = decodedFrame.signals.at(0);
if (const std::string *description = value.GetValueDescription()) {
std::cout << *description;
}
```
`GetValueDescription()` uses the exact raw integer before factor/offset scaling.
It returns `nullptr` for an invalid decode or an unknown value; numeric decoding
and `physicalValue` are unchanged. A mapped empty string returns a non-null
pointer. The pointer belongs to the signal definition and stays valid while that
definition and mapping remain alive and unchanged.
For metadata or standalone raw values, use
`FindValueDescription(signal.valueDescriptions, rawValue)`, where `rawValue` is
`RawSignalValue` (`std::variant<std::int64_t, std::uint64_t>`). The helper matches
nonnegative signed and unsigned values identically and keeps negative values
distinct from large unsigned values. Stored keys use negative `int64_t` and
nonnegative `uint64_t`; when constructing mappings manually, normalize keys
with `NormalizeValueKey()` before insertion.
Named `VAL_TABLE_` tables, environment-variable mappings, multiline statements,
are outside this implementation; the optional Qt adapter exposes signal mappings.
---
## Current Limitations
This is still a minimal implementation.
Not supported yet:
- multiplexed signals
- `VAL_` tables
- extended and nested multiplexing (`SG_MUL_VAL_`, `mNM`)
- named `VAL_TABLE_` tables and environment-variable value descriptions
- `BA_` attributes
- `BA_DEF_` definitions
- advanced comment handling
@@ -829,7 +956,19 @@ Not supported yet:
- full J1939 validation
- extensive edge-case handling for unusual DBC formatting
Motorola extraction is implemented, but it should still be verified carefully against real-world DBC files and expected values.
Additional behavior to account for:
- unregistered DBC keywords are ignored
- an `SG_` statement before the first frame is rejected
- duplicate frame and signal definitions are not rejected globally; ambiguous
`VAL_` references to them are rejected
- payload lengths are checked against storage bounds (`0..255`), rather than
CAN or CAN FD protocol limits
- comment handling is limited to the supported forms and already parsed targets
Motorola extraction uses DBC sawtooth numbering: a start bit of 7 traverses
`7..0, 15..8, 23..16`. Regression tests cover aligned and unaligned signals,
byte boundaries, and 64-bit values.
---
@@ -842,6 +981,7 @@ A practical development order would be:
- `BO_`
- `SG_`
- `CM_`
- `VAL_` signal value descriptions
- normalized CAN ID
- `isExtended`
- transmitter
@@ -855,17 +995,13 @@ A practical development order would be:
Recommended additions:
- parent pointer in `TreeNode`
- Qt model adapter
- `VAL_` support for enum-style signals
- better display strings for UI
- selective decoding of only chosen signals
### Stage 3
Recommended additions:
- multiplexing support
- basic multiplexing (implemented)
- attribute parsing
- richer J1939 support
- CSV export of decoded traces
@@ -884,53 +1020,171 @@ Advanced functionality:
## Build Integration
The module does not depend on any specific build system.
The repository supplies qmake projects. A C++17 compiler is required; the root
build also requires Qt Core and Qt Test development packages. Other build
systems can compile the sources listed in `core/core_files.pri`; no CMake
configuration is currently provided.
It can be integrated with:
Open `dbc.pro` in Qt Creator to see two subprojects: `core` and `tests`.
`core/core.pro` builds the C++17 static library `dbc_core` without a Qt dependency.
`tests/tests.pro` builds the QtTest executable `dbc_tests` and links that library.
The root project declares `tests.depends = core` for parallel builds.
- CMake
- qmake
- Makefile
Build out of source (Qt 6; use `qmake` for Qt 5):
Just add the source files to the project.
```sh
mkdir build
cd build
qmake6 ../dbc.pro
make -j
make check
```
`core/core_files.pri` lists the library sources and headers.
Consumers include `core/core.pri` for include paths and library linkage; the test
source lists live in `tests/parser_tests.pri` and `tests/decoder_tests.pri`.
When building a consumer separately, pass
`DBC_CORE_BUILD_DIR=/absolute/path/to/build/core` to qmake.
### Build core without Qt libraries
From the repository root:
```sh
mkdir -p build/core
cd build/core
qmake6 ../../core/core.pro
make -j
```
qmake is still the build tool; this target does not link Qt libraries.
### Optional Qt model adapter
Requires Qt 5.11 or newer (including Qt 6) for `QAbstractItemModelTester`.
The adapter itself links only Qt Core. Enable its library and focused QtTest suite:
```sh
mkdir -p build-qt
cd build-qt
qmake6 ../dbc.pro CONFIG+=dbc_qt
make -j
make check
```
Consumers include `qt/qt.pri` instead of `core/core.pri`, and set
`DBC_CORE_BUILD_DIR` and `DBC_QT_BUILD_DIR` to the corresponding library build
directories when building separately. A widget application also needs `QT += widgets`. The adapter integration enables
`no_keywords`, because core metadata has a `signals` member; use `Q_SIGNALS`,
`Q_SLOTS`, and `Q_EMIT` in consuming Qt classes.
```cpp
#include "dbc_parser.h"
#include "dbc_tree_builder.h"
#include "dbc_tree_model.h"
#include <QTreeView>
// Run after constructing QApplication; view owns the model through QObject.
QTreeView view;
auto *model = new DbcTreeModel(&view);
model->SetTree(DbcTreeBuilder().Build(DbcParser().ParseFile("example.dbc")));
view.setModel(model);
view.expandAll();
view.show();
// On reload, pass a newly built tree to SetTree(); to clear:
// model->SetTree(nullptr);
```
The root is invisible: frames are top-level rows, signals are their children.
Only column zero has children. `parent()` always returns column zero.
The model takes exclusive ownership of the tree; do not retain mutable aliases.
Metadata is copied by the tree builder, so the parsed database may be destroyed.
`TreeNode::GetParent()` is non-owning and `GetRow()` gives the zero-based sibling
position (zero for a detached node/root). Nodes cannot be copied or moved;
transferring their `unique_ptr` ownership preserves addresses and navigation.
Call `SetTree()` on the model's thread. It accepts a detached Root or nullptr,
uses `beginResetModel()`/`endResetModel()`, and destroys the previous tree during
reset. All ordinary QModelIndex values expire on reset and must not be reused;
QPersistentModelIndex values are invalidated by Qt. Destroying the model also
invalidates indexes. Invalid and foreign indexes return no data/flags/children.
Valid items are enabled and selectable, with no editing support.
| Column (zero-based enum) | Frame display | Signal display |
| --- | --- | --- |
| 0 `Name` | Name | Name |
| 1 `CanId` | Normalized hexadecimal ID | Empty |
| 2 `PayloadLength` | Bytes | Empty |
| 3 `StartBit` | Empty | DBC start bit |
| 4 `BitLength` | Empty | Bit count |
| 5 `ByteOrder` | Empty | Intel / Motorola |
| 6 `Signed` | Empty | Signed / Unsigned |
| 7 `Unit` | Empty | Unit |
| 8 `Comment` | Comment | Comment |
Horizontal DisplayRole headers describe these columns; other header requests
return invalid QVariant. ToolTipRole returns the comment on every column.
Custom roles also apply on every column; inapplicable roles return invalid QVariant:
| Role | Node types | QVariant content |
| --- | --- | --- |
| `NodeTypeRole` | Frame, signal | int corresponding to NodeType |
| `CanIdRole`, `PayloadLengthRole`, `ExtendedRole` | Frame | uint, int, bool |
| `StartBitRole`, `BitLengthRole` | Signal | uint |
| `LittleEndianRole`, `SignedRole` | Signal | bool |
| `UnitRole` | Signal | QString |
| `CommentRole` | Frame, signal | QString |
| `ValueDescriptionsRole` | Signal | QVariantList of QVariantMap entries |
Each value-description entry contains `value` (qlonglong for negative keys,
qulonglong for nonnegative keys) and `description` (QString). This preserves the
full signed/unsigned 64-bit range without converting through double. An unmapped
signal returns an empty list. Data comes from `SignalInfo::valueDescriptions`.
Unsupported roles return invalid QVariant.
### Standalone tree tests without Qt
From the repository root, use only a C++17 compiler:
```sh
c++ -std=c++17 -Icore tests/tree_node_test.cpp core/tree_node.cpp \
core/dbc_tree_builder.cpp -o /tmp/dbc_tree_node_test
/tmp/dbc_tree_node_test
```
### Build and run the demo
After building core, run these commands from the repository root:
```sh
mkdir -p build/examples
cd build/examples
qmake6 ../../examples/demo.pro DBC_CORE_BUILD_DIR=../core
make -j
./dbc_demo /absolute/path/to/example.dbc
```
The demo prints the parsed tree and decodes eight zero bytes using the first
frame definition. Replace that sample payload in `examples/main.cpp` to feed
live CAN data or trace records.
### Generate API documentation
With Doxygen installed, run from the repository root:
```sh
doxygen Doxyfile
```
Open `docs/html/index.html` to view the generated reference.
---
## Summary
This module is now split into two intentionally separate layers:
### Parsed representation
Used for:
- storing parsed DBC content
- browsing
- UI tree generation
### Runtime decode representation
Used for:
- fast frame lookup
- live CAN decode
- trace decode
- physical value conversion
That separation is the main architectural improvement.
In short, the system now looks like this:
```text
DBC parser → DbcDatabase → DecodeDatabase → DbcDecoder
↘ TreeNode → future UI
```
This gives FrameTap a much better foundation for real use, because both browsing and decoding are supported without forcing one representation to do the other's job.
## Regression tests
See [tests/README.md](tests/README.md) for compiler and qmake commands.
See [tests/README.md](tests/README.md) for QtTest build and execution commands.
Tests cover frame validation and error locations, Intel and Motorola extraction,
signed and unsigned 64-bit boundaries,
physical conversion, numeric output, and invalid signal payloads.
signal syntax and payload bounds, `VAL_` syntax and reference validation,
raw description lookup and preservation through both builders, statement dispatch, signed and unsigned
64-bit boundaries, physical conversion, numeric output, and invalid signal
payloads.
+135
View File
@@ -0,0 +1,135 @@
# 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-07
#### Added
- 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
- Overlapping unconditional signals are now rejected during parsing.
### 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`)
+8
View File
@@ -0,0 +1,8 @@
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
# Consumers can override this when building separately from the root project.
isEmpty(DBC_CORE_BUILD_DIR): DBC_CORE_BUILD_DIR = $$clean_path($$OUT_PWD/../core)
LIBS += -L$$DBC_CORE_BUILD_DIR -ldbc_core
win32-msvc*: DBC_CORE_LIBRARY = $$DBC_CORE_BUILD_DIR/dbc_core.lib
else: DBC_CORE_LIBRARY = $$DBC_CORE_BUILD_DIR/libdbc_core.a
PRE_TARGETDEPS += $$DBC_CORE_LIBRARY
+6
View File
@@ -0,0 +1,6 @@
TEMPLATE = lib
TARGET = dbc_core
CONFIG += staticlib c++17
CONFIG -= qt
include(core_files.pri)
CONFIG -= debug_and_release debug_and_release_target
+22
View File
@@ -0,0 +1,22 @@
SOURCES += \
$$PWD/dbc_decode_builder.cpp \
$$PWD/dbc_decoder.cpp \
$$PWD/dbc_parser.cpp \
$$PWD/dbc_statement_handler.cpp \
$$PWD/dbc_tree_builder.cpp \
$$PWD/tree_node.cpp
HEADERS += \
$$PWD/multiplexing.h \
$$PWD/dbc_database.h \
$$PWD/dbc_decode_builder.h \
$$PWD/dbc_decoder.h \
$$PWD/dbc_parser.h \
$$PWD/dbc_statement_handler.h \
$$PWD/dbc_tree_builder.h \
$$PWD/decode_database.h \
$$PWD/frame_info.h \
$$PWD/signal_info.h \
$$PWD/value_descriptions.h \
$$PWD/tree_node.h \
$$PWD/typefactory.h
File renamed without changes.
+58
View File
@@ -0,0 +1,58 @@
/**
* @file dbc_decode_builder.cpp
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#include "dbc_decode_builder.h"
DecodeDatabase DbcDecodeBuilder::Build(const DbcDatabase &source) const {
DecodeDatabase result;
for (std::size_t frameIndex = 0U; frameIndex < source.frames.size(); ++frameIndex) {
const FrameInfo &sourceFrame = source.frames[frameIndex];
DecodeFrame targetFrame;
targetFrame.name = sourceFrame.name;
targetFrame.canId = sourceFrame.canId;
targetFrame.isExtended = sourceFrame.isExtended;
targetFrame.dlc = sourceFrame.dlc;
targetFrame.pgn = sourceFrame.pgn;
targetFrame.hasPgn = sourceFrame.hasPgn;
targetFrame.transmitter = sourceFrame.transmitter;
targetFrame.comment = sourceFrame.comment;
for (std::size_t signalIndex = 0U; signalIndex < sourceFrame.signals.size(); ++signalIndex) {
const SignalInfo &sourceSignal = sourceFrame.signals[signalIndex];
DecodeSignal targetSignal;
targetSignal.multiplexing = sourceSignal.multiplexing;
targetSignal.name = sourceSignal.name;
targetSignal.startBit = sourceSignal.startBit;
targetSignal.length = sourceSignal.length;
targetSignal.byteOrder = sourceSignal.isLittleEndian ? ByteOrder::Intel : ByteOrder::Motorola;
targetSignal.valueType = sourceSignal.isSigned ? ValueType::Signed : ValueType::Unsigned;
targetSignal.factor = sourceSignal.factor;
targetSignal.offset = sourceSignal.offset;
targetSignal.minimum = sourceSignal.minimum;
targetSignal.maximum = sourceSignal.maximum;
targetSignal.unit = sourceSignal.unit;
targetSignal.receivers = sourceSignal.receivers;
targetSignal.comment = sourceSignal.comment;
targetSignal.valueDescriptions = sourceSignal.valueDescriptions;
targetFrame.signals.push_back(targetSignal);
}
result.frames.push_back(targetFrame);
result.frameIndexByKey[FrameKey(targetFrame.canId, targetFrame.isExtended)] =
result.frames.size() - 1U;
}
return result;
}
@@ -19,13 +19,13 @@
* @brief Converts parsed DBC data into runtime decode database.
*/
class DbcDecodeBuilder {
public:
public:
/**
* @brief Build runtime decode database.
* @param source Parsed DBC database.
* @return Runtime-ready decode database.
*/
DecodeDatabase Build (const DbcDatabase &source) const;
DecodeDatabase Build(const DbcDatabase &source) const;
};
#endif /* DBC_DECODE_BUILDER_H */
+193
View File
@@ -0,0 +1,193 @@
/**
* @file dbc_decoder.cpp
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#include "dbc_decoder.h"
const DecodeFrame *DbcDecoder::FindFrame(const DecodeDatabase &database,
std::uint32_t canId,
bool isExtended) const {
const FrameKey key(canId, isExtended);
const std::unordered_map<FrameKey, std::size_t, FrameKeyHasher>::const_iterator it =
database.frameIndexByKey.find(key);
if (it == database.frameIndexByKey.end())
return nullptr;
const std::size_t index = it->second;
if (index >= database.frames.size())
return nullptr;
return &database.frames[index];
}
DecodedFrameValue DbcDecoder::Decode(const DecodeDatabase &database,
const RawCanFrame &frame) const {
DecodedFrameValue result;
const DecodeFrame *definition = FindFrame(database, frame.canId, frame.isExtended);
if (definition == nullptr)
return result;
result.definition = definition;
result.valid = true;
const DecodeSignal *selector = nullptr;
std::size_t selectorCount = 0U;
for (const DecodeSignal &signal : definition->signals) {
if (signal.multiplexing.role == MultiplexRole::Selector) {
selector = &signal;
++selectorCount;
}
}
const bool selectorDefinitionValid = selectorCount == 1U &&
selector->valueType == ValueType::Unsigned && selector->length > 0U && selector->length <= 64U;
std::uint64_t selectorValue = 0U;
const bool selectorAvailable = selectorDefinitionValid && ExtractUnsigned(frame.data, *selector, selectorValue);
for (std::size_t signalIndex = 0U; signalIndex < definition->signals.size(); ++signalIndex) {
const DecodeSignal &signal = definition->signals[signalIndex];
DecodedSignalValue decoded;
std::uint64_t unsignedValue = 0U;
decoded.definition = &signal;
if (signal.length == 0U || signal.length > 64U ||
(signal.multiplexing.role != MultiplexRole::Unconditional && !selectorDefinitionValid)) {
result.signals.push_back(decoded);
continue;
}
if (signal.multiplexing.role == MultiplexRole::Branch) {
if (selector->length < 64U && signal.multiplexing.value >= (std::uint64_t(1U) << selector->length)) {
result.signals.push_back(decoded);
continue;
}
if (!selectorAvailable) {
decoded.status = SignalDecodeStatus::SelectorUnavailable;
result.signals.push_back(decoded);
continue;
}
if (signal.multiplexing.value != selectorValue) {
decoded.status = SignalDecodeStatus::Inactive;
result.signals.push_back(decoded);
continue;
}
}
if (!ExtractUnsigned(frame.data, signal, unsignedValue)) {
decoded.status = SignalDecodeStatus::InsufficientPayload;
result.signals.push_back(decoded);
continue;
}
if (signal.valueType == ValueType::Signed)
decoded.rawValue = SignExtend(unsignedValue, signal.length);
else
decoded.rawValue = unsignedValue;
double numericValue;
if (const std::int64_t *signedValue = std::get_if<std::int64_t>(&decoded.rawValue))
numericValue = static_cast<double>(*signedValue);
else
numericValue = static_cast<double>(std::get<std::uint64_t>(decoded.rawValue));
decoded.physicalValue = numericValue * signal.factor + signal.offset;
decoded.valid = true;
decoded.status = SignalDecodeStatus::Valid;
result.signals.push_back(decoded);
}
return result;
}
bool DbcDecoder::ExtractUnsigned(const std::vector<std::uint8_t> &data,
const DecodeSignal &signal,
std::uint64_t &value) {
if ((signal.length == 0U) || (signal.length > 64U))
return false;
if (signal.byteOrder == ByteOrder::Intel)
return ExtractIntel(data, signal.startBit, signal.length, value);
return ExtractMotorola(data, signal.startBit, signal.length, value);
}
bool DbcDecoder::ExtractIntel(const std::vector<std::uint8_t> &data,
std::uint32_t startBit,
std::uint32_t length,
std::uint64_t &value) {
value = 0U;
for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
const std::uint32_t absoluteBit = startBit + bitIndex;
const std::uint32_t byteIndex = absoluteBit / 8U;
const std::uint32_t bitInByte = absoluteBit % 8U;
if (byteIndex >= data.size())
return false;
const std::uint64_t bitValue =
(static_cast<std::uint64_t>((data[byteIndex] >> bitInByte) & 0x01U) << bitIndex);
value |= bitValue;
}
return true;
}
bool DbcDecoder::ExtractMotorola(const std::vector<std::uint8_t> &data,
std::uint32_t startBit,
std::uint32_t length,
std::uint64_t &value) {
/*
* DBC Motorola bit numbering:
* - startBit points to the most significant bit of the signal
* - inside a byte, bit numbering goes 7..0
* - crossing byte boundary moves to the next byte, bit 7
* Example: a signal starting at 7 follows 7..0, 15..8, 23..16.
*/
value = 0U;
std::size_t byteIndex = startBit / 8U;
std::uint32_t bitInByte = startBit % 8U;
for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
if (byteIndex >= data.size())
return false;
value <<= 1U;
value |= static_cast<std::uint64_t>((data[byteIndex] >> bitInByte) & 0x01U);
if (bitInByte == 0U) {
++byteIndex;
bitInByte = 7U;
} else
--bitInByte;
}
return true;
}
std::int64_t DbcDecoder::SignExtend(std::uint64_t value, std::uint32_t bitLength) {
if ((bitLength == 0U) || (bitLength > 64U))
return 0;
const std::uint64_t signMask = std::uint64_t(1U) << (bitLength - 1U);
const std::uint64_t valueMask = (bitLength == 64U)
? ~std::uint64_t(0U)
: (std::uint64_t(1U) << bitLength) - 1U;
value &= valueMask;
if ((value & signMask) == 0U)
return static_cast<std::int64_t>(value);
// The complemented magnitude fits int64_t, including for INT64_MIN.
return -1 - static_cast<std::int64_t>((~value) & valueMask);
}
+118
View File
@@ -0,0 +1,118 @@
/**
* @file dbc_decoder.h
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#ifndef DBC_DECODER_H
#define DBC_DECODER_H
#include <cstdint>
#include <variant>
#include <vector>
#include "decode_database.h"
/**
* @brief Raw CAN frame used for runtime or trace decoding.
*/
struct RawCanFrame {
std::uint32_t canId; /**< Normalized CAN ID. */
bool isExtended; /**< true for extended frame. */
std::vector<std::uint8_t> data; /**< Payload bytes. */
RawCanFrame()
: canId(0U), isExtended(false), data() {
}
};
enum class SignalDecodeStatus {
InvalidDefinition,
InsufficientPayload,
SelectorUnavailable,
Inactive,
Valid
};
/**
* @brief One decoded signal value.
*/
struct DecodedSignalValue {
const DecodeSignal *definition; /**< Signal definition. */
RawSignalValue rawValue; /**< Exact signed or unsigned raw value. */
double physicalValue; /**< Converted physical value. */
bool valid; /**< true if decoding succeeded. */
SignalDecodeStatus status = SignalDecodeStatus::InvalidDefinition;
/** Lookup using the raw integer; nullptr for invalid or unmapped values. */
const std::string *GetValueDescription() const {
return valid && definition ? FindValueDescription(definition->valueDescriptions, rawValue) : nullptr;
}
DecodedSignalValue()
: definition(nullptr), rawValue(std::uint64_t(0U)), physicalValue(0.0), valid(false) {
}
};
/**
* @brief Fully decoded frame.
*/
struct DecodedFrameValue {
const DecodeFrame *definition; /**< Frame definition. */
std::vector<DecodedSignalValue> signals; /**< Decoded signal values. */
bool valid; /**< true if frame was matched. */
DecodedFrameValue()
: definition(nullptr), signals(), valid(false) {
}
};
/**
* @brief Runtime CAN decoder using prebuilt decode database.
*/
class DbcDecoder {
public:
/**
* @brief Find frame definition by CAN ID.
* @param database Runtime decode database.
* @param canId Normalized CAN ID.
* @param isExtended true for extended frame.
* @return Pointer to frame definition or nullptr.
*/
const DecodeFrame *FindFrame(const DecodeDatabase &database,
std::uint32_t canId,
bool isExtended) const;
/**
* @brief Decode one raw CAN frame.
* @param database Runtime decode database.
* @param frame Raw CAN frame.
* @return Decoded frame value.
*/
DecodedFrameValue Decode(const DecodeDatabase &database,
const RawCanFrame &frame) const;
private:
static bool ExtractUnsigned(const std::vector<std::uint8_t> &data,
const DecodeSignal &signal,
std::uint64_t &value);
static bool ExtractIntel(const std::vector<std::uint8_t> &data,
std::uint32_t startBit,
std::uint32_t length,
std::uint64_t &value);
static bool ExtractMotorola(const std::vector<std::uint8_t> &data,
std::uint32_t startBit,
std::uint32_t length,
std::uint64_t &value);
static std::int64_t SignExtend(std::uint64_t value, std::uint32_t bitLength);
};
#endif /* DBC_DECODER_H */
+73
View File
@@ -0,0 +1,73 @@
/**
* @file dbc_parser.cpp
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#include "dbc_parser.h"
#include "dbc_statement_handler.h"
#include <cctype>
#include <fstream>
#include <stdexcept>
namespace {
/**
* @brief Remove leading and trailing spaces.
* @param text Input text.
* @return Trimmed text.
*/
std::string TrimText(const std::string &text) {
std::string::size_type begin = 0U;
while ((begin < text.size()) &&
std::isspace(static_cast<unsigned char>(text[begin])))
++begin;
std::string::size_type end = text.size();
while ((end > begin) &&
std::isspace(static_cast<unsigned char>(text[end - 1U])))
--end;
return text.substr(begin, end - begin);
}
}// namespace
DbcDatabase DbcParser::ParseFile(const std::string &filePath) const {
std::ifstream input(filePath.c_str());
if (!input.is_open())
throw std::runtime_error("Failed to open DBC file: " + filePath);
DbcDatabase database;
DbcParseContext context{database, nullptr};
const DbcStatementDispatcher dispatcher;
std::size_t lineNumber = 0U;
std::string line;
while (std::getline(input, line)) {
++lineNumber;
line = Trim(line);
if (line.empty())
continue;
try {
context.lineNumber = lineNumber;
dispatcher.Dispatch(line, context);
} catch (const std::exception &error) {
throw std::runtime_error(filePath + ":" + std::to_string(lineNumber) +
": " + error.what());
}
}
context.ResolveValueDescriptions(filePath);
context.ValidateMultiplexing(filePath);
return database;
}
std::string DbcParser::Trim(const std::string &text) {
return TrimText(text);
}
+6 -5
View File
@@ -24,14 +24,15 @@
* - SG_
* - CM_ BO_
* - CM_ SG_
* - VAL_ signal value descriptions
*
* Ignores:
* - attributes
* - multiplexing
* - value tables
* - named VAL_TABLE_ tables
*/
class DbcParser {
public:
public:
/**
* @brief Parse DBC file.
* @param filePath Path to input file.
@@ -39,10 +40,10 @@ class DbcParser {
* @throws std::runtime_error on file or parse errors.
* Line parse errors include the file path and one-based line number.
*/
DbcDatabase ParseFile (const std::string &filePath) const;
DbcDatabase ParseFile(const std::string &filePath) const;
private:
static std::string Trim (const std::string &text);
private:
static std::string Trim(const std::string &text);
};
#endif /* DBC_PARSER_H */
+495
View File
@@ -0,0 +1,495 @@
// SPDX-License-Identifier: MIT
#include "dbc_statement_handler.h"
#include <cctype>
#include <charconv>
#include <cmath>
#include <limits>
#include <regex>
#include <sstream>
#include <stdexcept>
namespace {
std::uint32_t ParseDecimal(const std::string &text,
std::uint32_t maximum,
const char *field) {
std::uint32_t value = 0U;
const auto parsed = std::from_chars(text.data(), text.data() + text.size(), value);
if (text.empty() || parsed.ec != std::errc() ||
parsed.ptr != text.data() + text.size() || value > maximum)
throw std::runtime_error(std::string("Invalid ") + field + ": " + text);
return value;
}
double ParsePhysicalValue(const std::string &text, const char *field) {
static const std::regex number(
R"(^[+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[eE][+-]?[0-9]+)?$)");
if (!std::regex_match(text, number))
throw std::runtime_error(std::string("Invalid ") + field + ": " + text);
std::size_t consumed = 0U;
double value;
try {
value = std::stod(text, &consumed);
} catch (const std::exception &) {
throw std::runtime_error(std::string("Invalid ") + field + ": " + text);
}
if (consumed != text.size() || !std::isfinite(value))
throw std::runtime_error(std::string("Invalid ") + field + ": " + text);
return value;
}
/**
* @brief Remove leading and trailing spaces.
* @param text Input text.
* @return Trimmed text.
*/
std::string TrimText(const std::string &text) {
std::string::size_type begin = 0U;
while ((begin < text.size()) &&
std::isspace(static_cast<unsigned char>(text[begin])))
++begin;
std::string::size_type end = text.size();
while ((end > begin) &&
std::isspace(static_cast<unsigned char>(text[end - 1U])))
--end;
return text.substr(begin, end - begin);
}
FrameInfo *FindFrameById(DbcDatabase &, std::uint32_t, bool);
SignalInfo *FindSignalByName(FrameInfo &, const std::string &);
}// namespace
namespace {
std::vector<std::string> SplitReceivers(const std::string &text) {
std::vector<std::string> receivers;
std::string token;
std::istringstream stream(text);
while (std::getline(stream, token, ',')) {
token = TrimText(token);
if (!token.empty())
receivers.push_back(token);
}
return receivers;
}
void NormalizeCanId(std::uint32_t rawCanId,
std::uint32_t &normalizedCanId,
bool &isExtended) {
/*
* DBC commonly stores extended identifiers with bit 31 set.
* Example:
* raw id = 0x80000000 | actual_29_bit_id
*/
if ((rawCanId & 0x80000000U) != 0U) {
isExtended = true;
normalizedCanId = (rawCanId & 0x1FFFFFFFU);
} else {
isExtended = (rawCanId > 0x7FFU);
normalizedCanId = rawCanId;
}
}
std::uint32_t TryExtractPgn(std::uint32_t canId, bool isExtended, bool &hasPgn) {
hasPgn = false;
if (!isExtended)
return 0U;
if ((canId & 0x1FFFFFFFU) != canId)
return 0U;
const std::uint32_t pf = (canId >> 16U) & 0xFFU;
const std::uint32_t ps = (canId >> 8U) & 0xFFU;
const std::uint32_t dp = (canId >> 24U) & 0x01U;
std::uint32_t pgn = 0U;
if (pf < 240U)
pgn = (dp << 16U) | (pf << 8U);
else
pgn = (dp << 16U) | (pf << 8U) | ps;
hasPgn = true;
return pgn;
}
}// namespace
FrameInfo DbcFrameHandler::ParseFrameLine(const std::string &line) {
/*
* Example:
* BO_ 256 EngineData: 8 EEC1
*/
std::istringstream stream(line);
std::string keyword;
std::string idText;
if (!(stream >> keyword >> idText) || keyword != "BO_")
throw std::runtime_error("Missing CAN ID in frame definition.");
const std::uint32_t rawCanId = ParseDecimal(
idText, std::numeric_limits<std::uint32_t>::max(), "CAN ID");
// Only bit 31 may accompany the actual 29-bit identifier.
if ((rawCanId & 0x60000000U) != 0U)
throw std::runtime_error("CAN ID exceeds the 29-bit identifier range.");
std::string nameText;
if (!std::getline(stream, nameText, ':') || stream.eof())
throw std::runtime_error("Missing ':' in frame definition.");
std::istringstream nameStream(nameText);
FrameInfo frame;
std::string extra;
if (!(nameStream >> frame.name) || (nameStream >> extra))
throw std::runtime_error("Missing or invalid frame name.");
std::string lengthText;
if (!(stream >> lengthText))
throw std::runtime_error("Missing payload length in frame definition.");
frame.dlc = static_cast<std::uint8_t>(ParseDecimal(
lengthText, std::numeric_limits<std::uint8_t>::max(), "payload length"));
if (!(stream >> frame.transmitter))
throw std::runtime_error("Missing transmitter in frame definition.");
if (stream >> extra)
throw std::runtime_error("Unexpected trailing field in frame definition: " + extra);
NormalizeCanId(rawCanId, frame.canId, frame.isExtended);
frame.pgn = TryExtractPgn(frame.canId, frame.isExtended, frame.hasPgn);
return frame;
}
SignalInfo DbcSignalHandler::ParseSignalLine(const std::string &line) {
// Match the complete statement before converting any numeric fields.
static const std::regex syntax(
R"dbc(^SG_[ \t]+([^:]+):[ \t]*([^| \t]+)[ \t]*\|[ \t]*([^@ \t]+)[ \t]*@[ \t]*([01])([+-])[ \t]*\([ \t]*([^, \t]+)[ \t]*,[ \t]*([^ )\t]+)[ \t]*\)[ \t]*\[[ \t]*([^| \t]+)[ \t]*\|[ \t]*([^\] \t]+)[ \t]*\][ \t]*"([^"\r\n]*)"[ \t]+([^ \t,]+(?:[ \t]*,[ \t]*[^ \t,]+)*)[ \t]*$)dbc");
std::smatch fields;
if (!std::regex_match(line, fields, syntax))
throw std::runtime_error("Malformed or unsupported SG_ signal definition.");
SignalInfo signal;
std::istringstream nameFields(fields[1].str());
std::string marker;
std::string extra;
nameFields >> signal.name >> marker;
if (signal.name.empty() || (nameFields >> extra))
throw std::runtime_error("Invalid signal name or multiplexing marker.");
if (marker == "M")
signal.multiplexing.role = MultiplexRole::Selector;
else if (!marker.empty()) {
if (marker[0] != 'm')
throw std::runtime_error("Unsupported multiplexing marker.");
const std::string value = marker.substr(1U);
const std::from_chars_result parsed = std::from_chars(
value.data(), value.data() + value.size(), signal.multiplexing.value);
if (value.empty() || parsed.ec != std::errc() || parsed.ptr != value.data() + value.size())
throw std::runtime_error("Invalid or unsupported multiplexing marker.");
signal.multiplexing.role = MultiplexRole::Branch;
}
signal.startBit = ParseDecimal(fields[2].str(),
std::numeric_limits<std::uint32_t>::max(), "signal start bit");
signal.length = ParseDecimal(fields[3].str(), 64U, "signal length");
if (signal.length == 0U)
throw std::runtime_error("Signal length must be within 1..64 bits.");
signal.isLittleEndian = fields[4].str() == "1";
signal.isSigned = fields[5].str() == "-";
signal.factor = ParsePhysicalValue(fields[6].str(), "signal factor");
signal.offset = ParsePhysicalValue(fields[7].str(), "signal offset");
signal.minimum = ParsePhysicalValue(fields[8].str(), "signal minimum");
signal.maximum = ParsePhysicalValue(fields[9].str(), "signal maximum");
if (signal.minimum > signal.maximum)
throw std::runtime_error("Signal minimum exceeds maximum.");
signal.unit = fields[10].str();
signal.receivers = SplitReceivers(fields[11].str());
return signal;
}
void DbcCommentHandler::ParseCommentLine(const std::string &line, DbcDatabase &database) {
/*
* Examples:
* CM_ BO_ 256 "Frame comment";
* CM_ SG_ 256 EngineSpeed "Signal comment";
*/
std::istringstream stream(line);
std::string token;
stream >> token;
if (token != "CM_")
return;
stream >> token;
if (token == "BO_") {
std::uint32_t rawCanId = 0U;
std::uint32_t canId = 0U;
bool isExtended = false;
stream >> rawCanId;
NormalizeCanId(rawCanId, canId, isExtended);
const std::string::size_type quoteBegin = line.find('"');
const std::string::size_type quoteEnd = line.rfind('"');
if ((quoteBegin == std::string::npos) ||
(quoteEnd == std::string::npos) ||
(quoteEnd <= quoteBegin))
return;
FrameInfo *frame = FindFrameById(database, canId, isExtended);
if (frame != nullptr)
frame->comment = line.substr(quoteBegin + 1U, quoteEnd - quoteBegin - 1U);
} else if (token == "SG_") {
std::uint32_t rawCanId = 0U;
std::uint32_t canId = 0U;
bool isExtended = false;
std::string signalName;
stream >> rawCanId;
stream >> signalName;
NormalizeCanId(rawCanId, canId, isExtended);
const std::string::size_type quoteBegin = line.find('"');
const std::string::size_type quoteEnd = line.rfind('"');
if ((quoteBegin == std::string::npos) ||
(quoteEnd == std::string::npos) ||
(quoteEnd <= quoteBegin))
return;
FrameInfo *frame = FindFrameById(database, canId, isExtended);
if (frame != nullptr) {
SignalInfo *signal = FindSignalByName(*frame, signalName);
if (signal != nullptr)
signal->comment = line.substr(quoteBegin + 1U, quoteEnd - quoteBegin - 1U);
}
}
}
namespace {
FrameInfo *FindFrameById(DbcDatabase &database,
std::uint32_t canId,
bool isExtended) {
for (std::size_t index = 0U; index < database.frames.size(); ++index) {
if ((database.frames[index].canId == canId) &&
(database.frames[index].isExtended == isExtended))
return &database.frames[index];
}
return nullptr;
}
SignalInfo *FindSignalByName(FrameInfo &frame, const std::string &signalName) {
for (std::size_t index = 0U; index < frame.signals.size(); ++index) {
if (frame.signals[index].name == signalName)
return &frame.signals[index];
}
return nullptr;
}
}// namespace
void DbcFrameHandler::Handle(const std::string &line, DbcParseContext &context) const {
context.database.frames.push_back(ParseFrameLine(line));
context.currentFrame = &context.database.frames.back();
context.signalLines.emplace_back();
}
void DbcSignalHandler::Handle(const std::string &line, DbcParseContext &context) const {
if (context.currentFrame == nullptr)
throw std::runtime_error("Signal found before any frame definition.");
SignalInfo signal = ParseSignalLine(line);
const std::uint64_t payloadBits = static_cast<std::uint64_t>(context.currentFrame->dlc) * 8U;
std::uint64_t bit = signal.startBit;
for (std::uint32_t index = 0U; index < signal.length; ++index) {
if (bit >= payloadBits)
throw std::runtime_error("Signal exceeds the frame payload length.");
if (signal.isLittleEndian)
++bit;
else
bit = (bit % 8U == 0U) ? bit + 15U : bit - 1U;
}
context.currentFrame->signals.push_back(std::move(signal));
context.signalLines.back().push_back(context.lineNumber);
}
void DbcCommentHandler::Handle(const std::string &line, DbcParseContext &context) const {
if (line.compare(0U, 4U, "CM_ ") == 0)
ParseCommentLine(line, context.database);
}
DbcStatementDispatcher::DbcStatementDispatcher() {
RegisterType<DbcUnsupportedMultiplexingHandler>("SG_MUL_VAL_");
RegisterType<DbcFrameHandler>("BO_");
RegisterType<DbcSignalHandler>("SG_");
RegisterType<DbcCommentHandler>("CM_");
RegisterType<DbcValueDescriptionHandler>("VAL_");
}
bool DbcStatementDispatcher::Dispatch(const std::string &line,
DbcParseContext &context) const {
std::istringstream stream(line);
std::string keyword;
stream >> keyword;
const auto handler = m_handlers.find(keyword);
if (handler == m_handlers.end())
return false;
handler->second->Handle(line, context);
return true;
}
void DbcValueDescriptionHandler::Handle(const std::string &line, DbcParseContext &context) const {
static const std::regex header(R"(^VAL_[ \t]+([^ \t]+)[ \t]+([^ \t;]+)[ \t]+(.*)$)");
static const std::regex pair(R"dbc(^([^ \t]+)[ \t]+"((?:[^"\\]|\\["\\])*)")dbc");
std::smatch fields;
if (!std::regex_match(line, fields, header))
throw std::runtime_error("Malformed or unsupported VAL_ statement.");
const auto rawId = ParseDecimal(fields[1].str(), std::numeric_limits<std::uint32_t>::max(), "VAL_ CAN ID");
if ((rawId & 0x60000000U) != 0U)
throw std::runtime_error("VAL_ CAN ID exceeds the 29-bit identifier range.");
PendingValueDescriptions pending;
NormalizeCanId(rawId, pending.canId, pending.isExtended);
pending.signalName = fields[2].str();
pending.lineNumber = context.lineNumber;
std::string rest = fields[3].str();
while (rest != ";") {
if (!std::regex_search(rest, fields, pair))
throw std::runtime_error("Malformed VAL_ value/description pair or missing semicolon.");
const std::string number = fields[1].str();
RawSignalValue key;
if (!number.empty() && number[0] == '-') {
std::int64_t value = 0;
const auto parsed = std::from_chars(number.data(), number.data() + number.size(), value);
if (parsed.ec != std::errc() || parsed.ptr != number.data() + number.size())
throw std::runtime_error("Invalid VAL_ integer: " + number);
key = NormalizeValueKey(RawSignalValue(value));
} else {
std::uint64_t value = 0;
const auto parsed = std::from_chars(number.data(), number.data() + number.size(), value);
if (number.empty() || parsed.ec != std::errc() || parsed.ptr != number.data() + number.size())
throw std::runtime_error("Invalid VAL_ integer: " + number);
key = value;
}
std::string description;
const std::string quoted = fields[2].str();
for (std::size_t i = 0; i < quoted.size(); ++i) {
if (quoted[i] == '\\')
++i;
description += quoted[i];
}
if (!pending.descriptions.emplace(key, description).second)
throw std::runtime_error("Duplicate VAL_ value key: " + number);
const auto consumed = static_cast<std::size_t>(fields.length());
rest.erase(0, consumed);
if (!rest.empty() && rest[0] != ';' && rest[0] != ' ' && rest[0] != '\t')
throw std::runtime_error("Missing whitespace between VAL_ pairs.");
rest = TrimText(rest);
}
if (pending.descriptions.empty())
throw std::runtime_error("VAL_ requires at least one value/description pair.");
context.pendingValues.push_back(std::move(pending));
}
void DbcParseContext::ResolveValueDescriptions(const std::string &filePath) {
for (const auto &pending: pendingValues) {
try {
FrameInfo *frame = nullptr;
for (auto &candidate: database.frames) {
if (candidate.canId == pending.canId && candidate.isExtended == pending.isExtended) {
if (frame)
throw std::runtime_error("Ambiguous VAL_ frame reference.");
frame = &candidate;
}
}
if (!frame)
throw std::runtime_error("Unresolved VAL_ frame reference.");
SignalInfo *signal = nullptr;
for (auto &candidate: frame->signals) {
if (candidate.name == pending.signalName) {
if (signal)
throw std::runtime_error("Ambiguous VAL_ signal reference: " + pending.signalName);
signal = &candidate;
}
}
if (!signal)
throw std::runtime_error("Unresolved VAL_ signal reference: " + pending.signalName);
for (const auto &entry: pending.descriptions) {
if (!signal->valueDescriptions.insert(entry).second)
throw std::runtime_error("Duplicate VAL_ value key for signal: " + pending.signalName);
}
} catch (const std::exception &error) {
throw std::runtime_error(filePath + ":" + std::to_string(pending.lineNumber) + ": " + error.what());
}
}
}
void DbcUnsupportedMultiplexingHandler::Handle(const std::string &, DbcParseContext &) const {
throw std::runtime_error("Extended and nested multiplexing are unsupported.");
}
namespace {
std::vector<std::uint64_t> SignalBits(const SignalInfo &signal) {
std::vector<std::uint64_t> bits;
std::uint64_t bit = signal.startBit;
for (std::uint32_t index = 0U; index < signal.length; ++index) {
bits.push_back(bit);
if (signal.isLittleEndian)
++bit;
else
bit = bit % 8U == 0U ? bit + 15U : bit - 1U;
}
return bits;
}
bool SignalsOverlap(const SignalInfo &first, const SignalInfo &second) {
const std::vector<std::uint64_t> firstBits = SignalBits(first);
const std::vector<std::uint64_t> secondBits = SignalBits(second);
for (const std::uint64_t firstBit : firstBits) {
for (const std::uint64_t secondBit : secondBits) {
if (firstBit == secondBit)
return true;
}
}
return false;
}
}
void DbcParseContext::ValidateMultiplexing(const std::string &filePath) const {
for (std::size_t frameIndex = 0U; frameIndex < database.frames.size(); ++frameIndex) {
const FrameInfo &frame = database.frames[frameIndex];
const SignalInfo *selector = nullptr;
for (std::size_t index = 0U; index < frame.signals.size(); ++index) {
const SignalInfo &signal = frame.signals[index];
if (signal.multiplexing.role != MultiplexRole::Selector)
continue;
if (selector != nullptr || signal.isSigned)
throw std::runtime_error(filePath + ":" + std::to_string(signalLines[frameIndex][index]) +
": Multiplexing requires one unsigned selector per frame.");
selector = &signal;
}
for (std::size_t index = 0U; index < frame.signals.size(); ++index) {
const SignalInfo &signal = frame.signals[index];
std::string error;
if (signal.multiplexing.role == MultiplexRole::Branch) {
if (selector == nullptr)
error = "Multiplexed branch has no selector.";
else if (selector->length < 64U && signal.multiplexing.value >= (std::uint64_t(1U) << selector->length))
error = "Branch value exceeds selector raw range.";
}
for (std::size_t previous = 0U; previous < index && error.empty(); ++previous) {
const SignalInfo &other = frame.signals[previous];
const bool exclusive = signal.multiplexing.role == MultiplexRole::Branch &&
other.multiplexing.role == MultiplexRole::Branch &&
signal.multiplexing.value != other.multiplexing.value;
if (!exclusive && SignalsOverlap(signal, other))
error = "Signals overlap without mutually exclusive multiplexing conditions.";
}
if (!error.empty())
throw std::runtime_error(filePath + ":" + std::to_string(signalLines[frameIndex][index]) + ": " + error);
}
}
}
+90
View File
@@ -0,0 +1,90 @@
// SPDX-License-Identifier: MIT
#ifndef DBC_STATEMENT_HANDLER_H
#define DBC_STATEMENT_HANDLER_H
#include "dbc_database.h"
#include "typefactory.h"
#include <string>
#include <unordered_map>
struct PendingValueDescriptions {
std::uint32_t canId;
bool isExtended;
std::string signalName;
ValueDescriptions descriptions;
std::size_t lineNumber;
};
/** Mutable state belonging to one file parse. Handlers do not retain it. */
struct DbcParseContext {
DbcDatabase &database;
FrameInfo *currentFrame = nullptr;
std::size_t lineNumber = 0U;
std::vector<PendingValueDescriptions> pendingValues = {};
std::vector<std::vector<std::size_t>> signalLines = {};
void ValidateMultiplexing(const std::string &filePath) const;
void ResolveValueDescriptions(const std::string &filePath);
};
class DbcStatementHandler {
public:
virtual ~DbcStatementHandler() = default;
virtual void Handle(const std::string &line, DbcParseContext &context) const = 0;
};
class DbcFrameHandler : public DbcStatementHandler {
public:
void Handle(const std::string &line, DbcParseContext &context) const override;
private:
static FrameInfo ParseFrameLine(const std::string &line);
};
class DbcSignalHandler : public DbcStatementHandler {
public:
void Handle(const std::string &line, DbcParseContext &context) const override;
private:
static SignalInfo ParseSignalLine(const std::string &line);
};
class DbcCommentHandler : public DbcStatementHandler {
public:
void Handle(const std::string &line, DbcParseContext &context) const override;
private:
static void ParseCommentLine(const std::string &line, DbcDatabase &database);
};
class DbcValueDescriptionHandler : public DbcStatementHandler {
public:
void Handle(const std::string &line, DbcParseContext &context) const override;
};
class DbcUnsupportedMultiplexingHandler : public DbcStatementHandler {
public:
void Handle(const std::string &line, DbcParseContext &context) const override;
};
/** Exact-key dispatch to handlers created once per registration via TypeFactory. */
class DbcStatementDispatcher {
public:
DbcStatementDispatcher();
template<class Handler>
void RegisterType(const std::string &keyword) {
m_factory.registerType<Handler>(keyword);
m_handlers.insert_or_assign(keyword, m_factory.create(keyword));
}
/** Returns false for an unregistered keyword; input must be trimmed. */
bool Dispatch(const std::string &line, DbcParseContext &context) const;
private:
TypeFactory<std::string, DbcStatementHandler> m_factory;
std::unordered_map<std::string, std::shared_ptr<DbcStatementHandler>> m_handlers;
};
#endif /* DBC_STATEMENT_HANDLER_H */
+31
View File
@@ -0,0 +1,31 @@
/**
* @file dbc_tree_builder.cpp
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#include "dbc_tree_builder.h"
std::unique_ptr<TreeNode> DbcTreeBuilder::Build(const DbcDatabase &database) const {
std::unique_ptr<TreeNode> root(new TreeNode());
for (std::size_t frameIndex = 0U; frameIndex < database.frames.size(); ++frameIndex) {
const FrameInfo &frame = database.frames[frameIndex];
std::unique_ptr<TreeNode> frameNode(new TreeNode(frame));
for (std::size_t signalIndex = 0U; signalIndex < frame.signals.size(); ++signalIndex) {
const SignalInfo &signal = frame.signals[signalIndex];
std::unique_ptr<TreeNode> signalNode(new TreeNode(signal));
frameNode->AddChild(std::move(signalNode));
}
root->AddChild(std::move(frameNode));
}
return root;
}
@@ -21,13 +21,13 @@
* @brief Builds a simple tree from parsed DBC database.
*/
class DbcTreeBuilder {
public:
public:
/**
* @brief Build tree representation of parsed DBC data.
* @param database Parsed database.
* @return Root node of the tree.
*/
std::unique_ptr<TreeNode> Build (const DbcDatabase &database) const;
std::unique_ptr<TreeNode> Build(const DbcDatabase &database) const;
};
#endif /* DBC_TREE_BUILDER_H */
+120
View File
@@ -0,0 +1,120 @@
/**
* @file decode_database.h
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#ifndef DECODE_DATABASE_H
#define DECODE_DATABASE_H
#include "value_descriptions.h"
#include "multiplexing.h"
#include <cstdint>
#include <string>
#include <unordered_map>
#include <vector>
/**
* @brief Signal byte order used for runtime decoding.
*/
enum class ByteOrder {
Intel,
Motorola
};
/**
* @brief Signal numeric type.
*/
enum class ValueType {
Unsigned,
Signed
};
/**
* @brief Runtime-ready signal definition.
*/
struct DecodeSignal {
Multiplexing multiplexing;
std::string name; /**< Signal name. */
std::uint32_t startBit; /**< DBC start bit. */
std::uint32_t length; /**< Signal length in bits. */
ByteOrder byteOrder; /**< Intel or Motorola. */
ValueType valueType; /**< Signed or unsigned. */
double factor; /**< Scaling factor. */
double offset; /**< Physical offset. */
double minimum; /**< Minimum physical value. */
double maximum; /**< Maximum physical value. */
std::string unit; /**< Physical unit. */
std::vector<std::string> receivers; /**< Receivers. */
ValueDescriptions valueDescriptions; /**< Raw integer state descriptions. */
std::string comment; /**< Comment. */
DecodeSignal()
: name(), startBit(0U), length(0U), byteOrder(ByteOrder::Intel), valueType(ValueType::Unsigned), factor(1.0), offset(0.0), minimum(0.0), maximum(0.0), unit(), receivers(), comment() {
}
};
/**
* @brief Runtime-ready frame definition.
*/
struct DecodeFrame {
std::string name; /**< Frame name. */
std::uint32_t canId; /**< Normalized CAN ID. */
bool isExtended; /**< true for extended frame. */
std::uint8_t dlc; /**< Payload length. */
std::uint32_t pgn; /**< PGN if available. */
bool hasPgn; /**< true if PGN is valid. */
std::string transmitter; /**< Transmitter ECU. */
std::string comment; /**< Frame comment. */
std::vector<DecodeSignal> signals; /**< Signal definitions. */
DecodeFrame()
: name(), canId(0U), isExtended(false), dlc(0U), pgn(0U), hasPgn(false), transmitter(), comment(), signals() {
}
};
/**
* @brief Key for fast frame lookup.
*/
struct FrameKey {
std::uint32_t canId;
bool isExtended;
FrameKey()
: canId(0U), isExtended(false) {
}
FrameKey(std::uint32_t id, bool extended)
: canId(id), isExtended(extended) {
}
bool operator==(const FrameKey &other) const {
return (canId == other.canId) && (isExtended == other.isExtended);
}
};
/**
* @brief Hasher for frame key.
*/
struct FrameKeyHasher {
std::size_t operator()(const FrameKey &key) const {
const std::size_t a = static_cast<std::size_t>(key.canId);
const std::size_t b = key.isExtended ? 1U : 0U;
return (a * 1315423911U) ^ b;
}
};
/**
* @brief Runtime decode database with fast lookup by CAN ID.
*/
struct DecodeDatabase {
std::vector<DecodeFrame> frames;
std::unordered_map<FrameKey, std::size_t, FrameKeyHasher> frameIndexByKey;
};
#endif /* DECODE_DATABASE_H */
+40
View File
@@ -0,0 +1,40 @@
/**
* @file frame_info.h
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#ifndef FRAME_INFO_H
#define FRAME_INFO_H
#include <cstdint>
#include <string>
#include <vector>
#include "signal_info.h"
/**
* @brief Describes one CAN frame from a DBC file.
*/
struct FrameInfo {
std::string name; /**< Frame name. */
std::uint32_t canId; /**< Normalized CAN identifier. */
bool isExtended; /**< true for extended frame. */
std::uint32_t pgn; /**< J1939 PGN if applicable. */
bool hasPgn; /**< true if PGN was derived. */
std::uint8_t dlc; /**< Frame payload length. */
std::string transmitter; /**< Transmitter ECU name. */
std::string comment; /**< Optional frame comment. */
std::vector<SignalInfo> signals; /**< Signals contained in the frame. */
FrameInfo()
: name(), canId(0U), isExtended(false), pgn(0U), hasPgn(false), dlc(0U), transmitter(), comment(), signals() {
}
};
#endif /* FRAME_INFO_H */
+19
View File
@@ -0,0 +1,19 @@
// SPDX-License-Identifier: MIT
#ifndef MULTIPLEXING_H
#define MULTIPLEXING_H
#include <cstdint>
enum class MultiplexRole {
Unconditional,
Selector,
Branch
};
/** Basic multiplexing: one unsigned selector per frame, one raw value per branch. */
struct Multiplexing {
MultiplexRole role = MultiplexRole::Unconditional;
std::uint64_t value = 0U;
};
#endif
+45
View File
@@ -0,0 +1,45 @@
/**
* @file signal_info.h
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#ifndef SIGNAL_INFO_H
#define SIGNAL_INFO_H
#include "value_descriptions.h"
#include "multiplexing.h"
#include <cstdint>
#include <string>
#include <vector>
/**
* @brief Describes one signal inside a DBC frame.
*/
struct SignalInfo {
Multiplexing multiplexing;
std::string name; /**< Signal name. */
std::uint32_t startBit; /**< Start bit in DBC notation. */
std::uint32_t length; /**< Signal length in bits. */
bool isLittleEndian; /**< true for Intel, false for Motorola. */
bool isSigned; /**< true if signal is signed. */
double factor; /**< Scaling factor. */
double offset; /**< Physical offset. */
double minimum; /**< Minimum physical value. */
double maximum; /**< Maximum physical value. */
std::string unit; /**< Physical unit. */
std::vector<std::string> receivers; /**< Signal receivers. */
ValueDescriptions valueDescriptions; /**< Raw integer state descriptions. */
std::string comment; /**< Optional signal comment. */
SignalInfo()
: name(), startBit(0U), length(0U), isLittleEndian(true), isSigned(false), factor(1.0), offset(0.0), minimum(0.0), maximum(0.0), unit(), receivers(), comment() {
}
};
#endif /* SIGNAL_INFO_H */
+74
View File
@@ -0,0 +1,74 @@
/**
* @file tree_node.cpp
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#include "tree_node.h"
TreeNode::TreeNode()
: m_type(NodeType::Root), m_name("dbc"), m_children(), m_frame(), m_signal() {
}
TreeNode::TreeNode(const FrameInfo &frame)
: m_type(NodeType::Frame), m_name(frame.name), m_children(), m_frame(new FrameInfo(frame)), m_signal() {
}
TreeNode::TreeNode(const SignalInfo &signal)
: m_type(NodeType::Signal), m_name(signal.name), m_children(), m_frame(), m_signal(new SignalInfo(signal)) {
}
void TreeNode::AddChild(std::unique_ptr<TreeNode> child) {
if (child) {
m_children.push_back(std::move(child));
m_children.back()->m_parent = this;
m_children.back()->m_row = m_children.size() - 1U;
}
}
std::size_t TreeNode::GetChildCount() const {
return m_children.size();
}
const TreeNode *TreeNode::GetChild(std::size_t index) const {
if (index >= m_children.size())
return nullptr;
return m_children[index].get();
}
TreeNode *TreeNode::GetChild(std::size_t index) {
if (index >= m_children.size())
return nullptr;
return m_children[index].get();
}
NodeType TreeNode::GetType() const {
return m_type;
}
const std::string &TreeNode::GetName() const {
return m_name;
}
const FrameInfo *TreeNode::GetFrame() const {
return m_frame.get();
}
const SignalInfo *TreeNode::GetSignal() const {
return m_signal.get();
}
const TreeNode *TreeNode::GetParent() const {
return m_parent;
}
std::size_t TreeNode::GetRow() const {
return m_row;
}
+22 -14
View File
@@ -12,10 +12,10 @@
#ifndef TREE_NODE_H
#define TREE_NODE_H
#include <cstddef>
#include <memory>
#include <string>
#include <vector>
#include <memory>
#include <cstddef>
#include "frame_info.h"
#include "signal_info.h"
@@ -33,7 +33,7 @@ enum class NodeType {
* @brief Tree node for later use in model/view or other hierarchy consumers.
*/
class TreeNode {
public:
public:
/**
* @brief Create root node.
*/
@@ -43,27 +43,33 @@ class TreeNode {
* @brief Create frame node.
* @param frame Frame payload.
*/
explicit TreeNode (const FrameInfo &frame);
explicit TreeNode(const FrameInfo &frame);
/**
* @brief Create signal node.
* @param signal Signal payload.
*/
explicit TreeNode (const SignalInfo &signal);
explicit TreeNode(const SignalInfo &signal);
~TreeNode() = default;
TreeNode (const TreeNode &) = delete;
TreeNode &operator= (const TreeNode &) = delete;
TreeNode(const TreeNode &) = delete;
TreeNode &operator=(const TreeNode &) = delete;
TreeNode (TreeNode &&) = default;
TreeNode &operator= (TreeNode &&) = default;
TreeNode(TreeNode &&) = delete;
TreeNode &operator=(TreeNode &&) = delete;
/**
* @brief Add child node.
* @param child Child node to add.
*/
void AddChild (std::unique_ptr<TreeNode> child);
void AddChild(std::unique_ptr<TreeNode> child);
/** Non-owning parent; nullptr for a detached node or the root. */
const TreeNode *GetParent() const;
/** Zero-based sibling position; zero for a detached node or the root. */
std::size_t GetRow() const;
/**
* @brief Get child count.
@@ -76,14 +82,14 @@ class TreeNode {
* @param index Child index.
* @return Child pointer or nullptr if index is invalid.
*/
const TreeNode *GetChild (std::size_t index) const;
const TreeNode *GetChild(std::size_t index) const;
/**
* @brief Get mutable child by index.
* @param index Child index.
* @return Child pointer or nullptr if index is invalid.
*/
TreeNode *GetChild (std::size_t index);
TreeNode *GetChild(std::size_t index);
/**
* @brief Get node type.
@@ -109,10 +115,12 @@ class TreeNode {
*/
const SignalInfo *GetSignal() const;
private:
private:
TreeNode *m_parent = nullptr;
std::size_t m_row = 0U;
NodeType m_type;
std::string m_name;
std::vector<std::unique_ptr<TreeNode> > m_children;
std::vector<std::unique_ptr<TreeNode>> m_children;
std::unique_ptr<FrameInfo> m_frame;
std::unique_ptr<SignalInfo> m_signal;
};
+9 -9
View File
@@ -7,7 +7,7 @@
#include <memory>
#include <type_traits>
#include <unordered_map>
#include <utility> // std::move
#include <utility>// std::move
/**
* @brief Registry-based factory for creating objects by runtime identifier.
@@ -55,7 +55,7 @@
* (void)b->get();
* @endcode
*/
template <class ClassId, class BaseClass, class... Args>
template<class ClassId, class BaseClass, class... Args>
class TypeFactory {
public:
using BasePtr = std::shared_ptr<BaseClass>;
@@ -72,8 +72,8 @@ public:
*
* Re-registering the same id overwrites the previous entry ("last wins").
*/
template <class Derived>
void registerType(const ClassId& id) {
template<class Derived>
void registerType(const ClassId &id) {
static_assert(std::is_base_of_v<BaseClass, Derived>,
"Derived must inherit from BaseClass");
static_assert(std::is_constructible_v<Derived, Args...>,
@@ -86,7 +86,7 @@ public:
* @brief Returns creator function for the given id.
* @throws std::out_of_range when id is not registered.
*/
[[nodiscard]] CreatorFn creator(const ClassId& id) const {
[[nodiscard]] CreatorFn creator(const ClassId &id) const {
return classes.at(id);
}
@@ -94,14 +94,14 @@ public:
* @brief Creates an instance for the given id using provided arguments.
* @throws std::out_of_range when id is not registered.
*/
[[nodiscard]] BasePtr create(const ClassId& id, Args... args) const {
[[nodiscard]] BasePtr create(const ClassId &id, Args... args) const {
return creator(id)(std::move(args)...);
}
/**
* @brief Checks whether an id is registered.
*/
[[nodiscard]] bool contains(const ClassId& id) const {
[[nodiscard]] bool contains(const ClassId &id) const {
return classes.find(id) != classes.end();
}
@@ -110,9 +110,9 @@ protected:
std::unordered_map<ClassId, CreatorFn> classes;
private:
template <class Derived>
template<class Derived>
static BasePtr instantiate(Args... args) {
return std::make_shared<Derived>(std::move(args)...);
}
};
#endif // TYPEFACTORY_H
#endif// TYPEFACTORY_H
+30
View File
@@ -0,0 +1,30 @@
// SPDX-License-Identifier: MIT
#ifndef VALUE_DESCRIPTIONS_H
#define VALUE_DESCRIPTIONS_H
#include <cstdint>
#include <map>
#include <string>
#include <variant>
using RawSignalValue = std::variant<std::int64_t, std::uint64_t>;
/** Canonical keys: negative int64_t, nonnegative uint64_t. */
inline RawSignalValue NormalizeValueKey(const RawSignalValue &value) {
if (const auto *number = std::get_if<std::int64_t>(&value)) {
if (*number >= 0)
return static_cast<std::uint64_t>(*number);
}
return value;
}
using ValueDescriptions = std::map<RawSignalValue, std::string>;
/** Returns a borrowed string, or nullptr; never converts integers to double. */
inline const std::string *FindValueDescription(const ValueDescriptions &descriptions,
const RawSignalValue &rawValue) {
const auto found = descriptions.find(NormalizeValueKey(rawValue));
return found == descriptions.end() ? nullptr : &found->second;
}
#endif
+12 -26
View File
@@ -1,26 +1,12 @@
TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
dbc_decode_builder.cpp \
dbc_decoder.cpp \
dbc_parser.cpp \
dbc_statement_handler.cpp \
dbc_tree_builder.cpp \
main.cpp \
tree_node.cpp
HEADERS += \
dbc_database.h \
dbc_decode_builder.h \
dbc_decoder.h \
dbc_parser.h \
dbc_statement_handler.h \
typefactory.h \
dbc_tree_builder.h \
decode_database.h \
frame_info.h \
signal_info.h \
tree_node.h
TEMPLATE = subdirs
SUBDIRS += core tests
core.subdir = core
tests.subdir = tests
tests.depends = core
contains(CONFIG, dbc_qt) {
SUBDIRS += qt model_tests
qt.subdir = qt
qt.depends = core
model_tests.file = tests/model_tests.pro
model_tests.depends = qt
}
-56
View File
@@ -1,56 +0,0 @@
/**
* @file dbc_decode_builder.cpp
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#include "dbc_decode_builder.h"
DecodeDatabase DbcDecodeBuilder::Build (const DbcDatabase &source) const {
DecodeDatabase result;
for (std::size_t frameIndex = 0U; frameIndex < source.frames.size(); ++frameIndex) {
const FrameInfo &sourceFrame = source.frames[frameIndex];
DecodeFrame targetFrame;
targetFrame.name = sourceFrame.name;
targetFrame.canId = sourceFrame.canId;
targetFrame.isExtended = sourceFrame.isExtended;
targetFrame.dlc = sourceFrame.dlc;
targetFrame.pgn = sourceFrame.pgn;
targetFrame.hasPgn = sourceFrame.hasPgn;
targetFrame.transmitter = sourceFrame.transmitter;
targetFrame.comment = sourceFrame.comment;
for (std::size_t signalIndex = 0U; signalIndex < sourceFrame.signals.size(); ++signalIndex) {
const SignalInfo &sourceSignal = sourceFrame.signals[signalIndex];
DecodeSignal targetSignal;
targetSignal.name = sourceSignal.name;
targetSignal.startBit = sourceSignal.startBit;
targetSignal.length = sourceSignal.length;
targetSignal.byteOrder = sourceSignal.isLittleEndian ? ByteOrder::Intel : ByteOrder::Motorola;
targetSignal.valueType = sourceSignal.isSigned ? ValueType::Signed : ValueType::Unsigned;
targetSignal.factor = sourceSignal.factor;
targetSignal.offset = sourceSignal.offset;
targetSignal.minimum = sourceSignal.minimum;
targetSignal.maximum = sourceSignal.maximum;
targetSignal.unit = sourceSignal.unit;
targetSignal.receivers = sourceSignal.receivers;
targetSignal.comment = sourceSignal.comment;
targetFrame.signals.push_back (targetSignal);
}
result.frames.push_back (targetFrame);
result.frameIndexByKey[FrameKey (targetFrame.canId, targetFrame.isExtended)] =
result.frames.size() - 1U;
}
return result;
}
-155
View File
@@ -1,155 +0,0 @@
/**
* @file dbc_decoder.cpp
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#include "dbc_decoder.h"
const DecodeFrame *DbcDecoder::FindFrame (const DecodeDatabase &database,
std::uint32_t canId,
bool isExtended) const {
const FrameKey key (canId, isExtended);
const std::unordered_map<FrameKey, std::size_t, FrameKeyHasher>::const_iterator it =
database.frameIndexByKey.find (key);
if (it == database.frameIndexByKey.end())
return nullptr;
const std::size_t index = it->second;
if (index >= database.frames.size())
return nullptr;
return &database.frames[index];
}
DecodedFrameValue DbcDecoder::Decode (const DecodeDatabase &database,
const RawCanFrame &frame) const {
DecodedFrameValue result;
const DecodeFrame *definition = FindFrame (database, frame.canId, frame.isExtended);
if (definition == nullptr)
return result;
result.definition = definition;
result.valid = true;
for (std::size_t signalIndex = 0U; signalIndex < definition->signals.size(); ++signalIndex) {
const DecodeSignal &signal = definition->signals[signalIndex];
DecodedSignalValue decoded;
std::uint64_t unsignedValue = 0U;
decoded.definition = &signal;
if (!ExtractUnsigned (frame.data, signal, unsignedValue)) {
decoded.valid = false;
result.signals.push_back (decoded);
continue;
}
if (signal.valueType == ValueType::Signed)
decoded.rawValue = SignExtend (unsignedValue, signal.length);
else
decoded.rawValue = unsignedValue;
decoded.physicalValue =
std::visit ([&signal] (auto rawValue) {
return (static_cast<double> (rawValue) * signal.factor) + signal.offset;
}, decoded.rawValue);
decoded.valid = true;
result.signals.push_back (decoded);
}
return result;
}
bool DbcDecoder::ExtractUnsigned (const std::vector<std::uint8_t> &data,
const DecodeSignal &signal,
std::uint64_t &value) {
if ((signal.length == 0U) || (signal.length > 64U))
return false;
if (signal.byteOrder == ByteOrder::Intel)
return ExtractIntel (data, signal.startBit, signal.length, value);
return ExtractMotorola (data, signal.startBit, signal.length, value);
}
bool DbcDecoder::ExtractIntel (const std::vector<std::uint8_t> &data,
std::uint32_t startBit,
std::uint32_t length,
std::uint64_t &value) {
value = 0U;
for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
const std::uint32_t absoluteBit = startBit + bitIndex;
const std::uint32_t byteIndex = absoluteBit / 8U;
const std::uint32_t bitInByte = absoluteBit % 8U;
if (byteIndex >= data.size())
return false;
const std::uint64_t bitValue =
(static_cast<std::uint64_t> ((data[byteIndex] >> bitInByte) & 0x01U) << bitIndex);
value |= bitValue;
}
return true;
}
bool DbcDecoder::ExtractMotorola (const std::vector<std::uint8_t> &data,
std::uint32_t startBit,
std::uint32_t length,
std::uint64_t &value) {
/*
* DBC Motorola bit numbering:
* - startBit points to the most significant bit of the signal
* - inside a byte, bit numbering goes 7..0
* - crossing byte boundary moves to the next byte, bit 7
* Example: a signal starting at 7 follows 7..0, 15..8, 23..16.
*/
value = 0U;
std::size_t byteIndex = startBit / 8U;
std::uint32_t bitInByte = startBit % 8U;
for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
if (byteIndex >= data.size())
return false;
value <<= 1U;
value |= static_cast<std::uint64_t> ((data[byteIndex] >> bitInByte) & 0x01U);
if (bitInByte == 0U) {
++byteIndex;
bitInByte = 7U;
} else
--bitInByte;
}
return true;
}
std::int64_t DbcDecoder::SignExtend (std::uint64_t value, std::uint32_t bitLength) {
if ((bitLength == 0U) || (bitLength > 64U))
return 0;
const std::uint64_t signMask = std::uint64_t (1U) << (bitLength - 1U);
const std::uint64_t valueMask = (bitLength == 64U)
? ~std::uint64_t (0U) : (std::uint64_t (1U) << bitLength) - 1U;
value &= valueMask;
if ((value & signMask) == 0U)
return static_cast<std::int64_t> (value);
// The complemented magnitude fits int64_t, including for INT64_MIN.
return -1 - static_cast<std::int64_t> ((~value) & valueMask);
}
-111
View File
@@ -1,111 +0,0 @@
/**
* @file dbc_decoder.h
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#ifndef DBC_DECODER_H
#define DBC_DECODER_H
#include <vector>
#include <cstdint>
#include <variant>
#include "decode_database.h"
/**
* @brief Raw CAN frame used for runtime or trace decoding.
*/
struct RawCanFrame {
std::uint32_t canId; /**< Normalized CAN ID. */
bool isExtended; /**< true for extended frame. */
std::vector<std::uint8_t> data; /**< Payload bytes. */
RawCanFrame()
: canId (0U)
, isExtended (false)
, data() {
}
};
/**
* @brief One decoded signal value.
*/
struct DecodedSignalValue {
const DecodeSignal *definition; /**< Signal definition. */
std::variant<std::int64_t, std::uint64_t> rawValue; /**< Exact signed or unsigned raw value. */
double physicalValue; /**< Converted physical value. */
bool valid; /**< true if decoding succeeded. */
DecodedSignalValue()
: definition (nullptr)
, rawValue (std::uint64_t (0U))
, physicalValue (0.0)
, valid (false) {
}
};
/**
* @brief Fully decoded frame.
*/
struct DecodedFrameValue {
const DecodeFrame *definition; /**< Frame definition. */
std::vector<DecodedSignalValue> signals; /**< Decoded signal values. */
bool valid; /**< true if frame was matched. */
DecodedFrameValue()
: definition (nullptr)
, signals()
, valid (false) {
}
};
/**
* @brief Runtime CAN decoder using prebuilt decode database.
*/
class DbcDecoder {
public:
/**
* @brief Find frame definition by CAN ID.
* @param database Runtime decode database.
* @param canId Normalized CAN ID.
* @param isExtended true for extended frame.
* @return Pointer to frame definition or nullptr.
*/
const DecodeFrame *FindFrame (const DecodeDatabase &database,
std::uint32_t canId,
bool isExtended) const;
/**
* @brief Decode one raw CAN frame.
* @param database Runtime decode database.
* @param frame Raw CAN frame.
* @return Decoded frame value.
*/
DecodedFrameValue Decode (const DecodeDatabase &database,
const RawCanFrame &frame) const;
private:
static bool ExtractUnsigned (const std::vector<std::uint8_t> &data,
const DecodeSignal &signal,
std::uint64_t &value);
static bool ExtractIntel (const std::vector<std::uint8_t> &data,
std::uint32_t startBit,
std::uint32_t length,
std::uint64_t &value);
static bool ExtractMotorola (const std::vector<std::uint8_t> &data,
std::uint32_t startBit,
std::uint32_t length,
std::uint64_t &value);
static std::int64_t SignExtend (std::uint64_t value, std::uint32_t bitLength);
};
#endif /* DBC_DECODER_H */
-70
View File
@@ -1,70 +0,0 @@
/**
* @file dbc_parser.cpp
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#include "dbc_parser.h"
#include "dbc_statement_handler.h"
#include <fstream>
#include <stdexcept>
#include <cctype>
namespace {
/**
* @brief Remove leading and trailing spaces.
* @param text Input text.
* @return Trimmed text.
*/
std::string TrimText (const std::string &text) {
std::string::size_type begin = 0U;
while ((begin < text.size()) &&
std::isspace (static_cast<unsigned char> (text[begin])))
++begin;
std::string::size_type end = text.size();
while ((end > begin) &&
std::isspace (static_cast<unsigned char> (text[end - 1U])))
--end;
return text.substr (begin, end - begin);
}
}
DbcDatabase DbcParser::ParseFile (const std::string &filePath) const {
std::ifstream input (filePath.c_str());
if (!input.is_open())
throw std::runtime_error ("Failed to open DBC file: " + filePath);
DbcDatabase database;
DbcParseContext context {database, nullptr};
const DbcStatementDispatcher dispatcher;
std::size_t lineNumber = 0U;
std::string line;
while (std::getline (input, line)) {
++lineNumber;
line = Trim (line);
if (line.empty())
continue;
try {
dispatcher.Dispatch (line, context);
} catch (const std::exception &error) {
throw std::runtime_error (filePath + ":" + std::to_string (lineNumber) +
": " + error.what());
}
}
return database;
}
std::string DbcParser::Trim (const std::string &text) {
return TrimText (text);
}
-358
View File
@@ -1,358 +0,0 @@
// SPDX-License-Identifier: MIT
#include "dbc_statement_handler.h"
#include <sstream>
#include <stdexcept>
#include <cctype>
#include <charconv>
#include <limits>
namespace {
std::uint32_t ParseDecimal (const std::string &text,
std::uint32_t maximum,
const char *field) {
std::uint32_t value = 0U;
const auto parsed = std::from_chars (text.data(), text.data() + text.size(), value);
if (text.empty() || parsed.ec != std::errc() ||
parsed.ptr != text.data() + text.size() || value > maximum)
throw std::runtime_error (std::string ("Invalid ") + field + ": " + text);
return value;
}
/**
* @brief Remove leading and trailing spaces.
* @param text Input text.
* @return Trimmed text.
*/
std::string TrimText (const std::string &text) {
std::string::size_type begin = 0U;
while ((begin < text.size()) &&
std::isspace (static_cast<unsigned char> (text[begin])))
++begin;
std::string::size_type end = text.size();
while ((end > begin) &&
std::isspace (static_cast<unsigned char> (text[end - 1U])))
--end;
return text.substr (begin, end - begin);
}
FrameInfo *FindFrameById (DbcDatabase &, std::uint32_t, bool);
SignalInfo *FindSignalByName (FrameInfo &, const std::string &);
}
namespace {
std::vector<std::string> SplitReceivers (const std::string &text) {
std::vector<std::string> receivers;
std::string token;
std::istringstream stream (text);
while (std::getline (stream, token, ',')) {
token = TrimText (token);
if (!token.empty())
receivers.push_back (token);
}
return receivers;
}
void NormalizeCanId (std::uint32_t rawCanId,
std::uint32_t &normalizedCanId,
bool &isExtended) {
/*
* DBC commonly stores extended identifiers with bit 31 set.
* Example:
* raw id = 0x80000000 | actual_29_bit_id
*/
if ((rawCanId & 0x80000000U) != 0U) {
isExtended = true;
normalizedCanId = (rawCanId & 0x1FFFFFFFU);
} else {
isExtended = (rawCanId > 0x7FFU);
normalizedCanId = rawCanId;
}
}
std::uint32_t TryExtractPgn (std::uint32_t canId, bool isExtended, bool &hasPgn) {
hasPgn = false;
if (!isExtended)
return 0U;
if ((canId & 0x1FFFFFFFU) != canId)
return 0U;
const std::uint32_t pf = (canId >> 16U) & 0xFFU;
const std::uint32_t ps = (canId >> 8U) & 0xFFU;
const std::uint32_t dp = (canId >> 24U) & 0x01U;
std::uint32_t pgn = 0U;
if (pf < 240U)
pgn = (dp << 16U) | (pf << 8U);
else
pgn = (dp << 16U) | (pf << 8U) | ps;
hasPgn = true;
return pgn;
}
}
FrameInfo DbcFrameHandler::ParseFrameLine (const std::string &line) {
/*
* Example:
* BO_ 256 EngineData: 8 EEC1
*/
std::istringstream stream (line);
std::string keyword;
std::string idText;
if (!(stream >> keyword >> idText) || keyword != "BO_")
throw std::runtime_error ("Missing CAN ID in frame definition.");
const std::uint32_t rawCanId = ParseDecimal (
idText, std::numeric_limits<std::uint32_t>::max(), "CAN ID");
// Only bit 31 may accompany the actual 29-bit identifier.
if ((rawCanId & 0x60000000U) != 0U)
throw std::runtime_error ("CAN ID exceeds the 29-bit identifier range.");
std::string nameText;
if (!std::getline (stream, nameText, ':') || stream.eof())
throw std::runtime_error ("Missing ':' in frame definition.");
std::istringstream nameStream (nameText);
FrameInfo frame;
std::string extra;
if (!(nameStream >> frame.name) || (nameStream >> extra))
throw std::runtime_error ("Missing or invalid frame name.");
std::string lengthText;
if (!(stream >> lengthText))
throw std::runtime_error ("Missing payload length in frame definition.");
frame.dlc = static_cast<std::uint8_t> (ParseDecimal (
lengthText, std::numeric_limits<std::uint8_t>::max(), "payload length"));
if (!(stream >> frame.transmitter))
throw std::runtime_error ("Missing transmitter in frame definition.");
if (stream >> extra)
throw std::runtime_error ("Unexpected trailing field in frame definition: " + extra);
NormalizeCanId (rawCanId, frame.canId, frame.isExtended);
frame.pgn = TryExtractPgn (frame.canId, frame.isExtended, frame.hasPgn);
return frame;
}
SignalInfo DbcSignalHandler::ParseSignalLine (const std::string &line) {
/*
* Example:
* SG_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] "rpm" ECU1,ECU2
*/
SignalInfo signal;
std::string work = TrimText (line);
if (work.compare (0U, 4U, "SG_ ") != 0)
throw std::runtime_error ("Invalid signal line: " + line);
work.erase (0U, 4U);
const std::string::size_type colonPos = work.find (':');
if (colonPos == std::string::npos)
throw std::runtime_error ("Signal line missing ':' : " + line);
signal.name = TrimText (work.substr (0U, colonPos));
std::string rest = TrimText (work.substr (colonPos + 1U));
const std::string::size_type pipePos = rest.find ('|');
const std::string::size_type atPos = rest.find ('@');
const std::string::size_type signPos = rest.find_first_of ("+-", atPos);
const std::string::size_type factorBegin = rest.find ('(');
const std::string::size_type factorComma = rest.find (',', factorBegin);
const std::string::size_type factorEnd = rest.find (')', factorComma);
const std::string::size_type rangeBegin = rest.find ('[');
const std::string::size_type rangeSep = rest.find ('|', rangeBegin);
const std::string::size_type rangeEnd = rest.find (']', rangeSep);
const std::string::size_type unitBegin = rest.find ('"', rangeEnd);
const std::string::size_type unitEnd = rest.find ('"', unitBegin + 1U);
if ((pipePos == std::string::npos) ||
(atPos == std::string::npos) ||
(signPos == std::string::npos) ||
(factorBegin == std::string::npos) ||
(factorComma == std::string::npos) ||
(factorEnd == std::string::npos) ||
(rangeBegin == std::string::npos) ||
(rangeSep == std::string::npos) ||
(rangeEnd == std::string::npos) ||
(unitBegin == std::string::npos) ||
(unitEnd == std::string::npos))
throw std::runtime_error ("Unsupported signal syntax: " + line);
signal.startBit = static_cast<std::uint32_t> (
std::stoul (TrimText (rest.substr (0U, pipePos)))
);
signal.length = static_cast<std::uint32_t> (
std::stoul (TrimText (rest.substr (pipePos + 1U, atPos - pipePos - 1U)))
);
{
if ((atPos + 1U) >= rest.size())
throw std::runtime_error ("Invalid endianness in signal: " + line);
const char endianChar = rest[atPos + 1U];
signal.isLittleEndian = (endianChar == '1');
}
{
const char signChar = rest[signPos];
signal.isSigned = (signChar == '-');
}
signal.factor = std::stod (
TrimText (rest.substr (factorBegin + 1U, factorComma - factorBegin - 1U))
);
signal.offset = std::stod (
TrimText (rest.substr (factorComma + 1U, factorEnd - factorComma - 1U))
);
signal.minimum = std::stod (
TrimText (rest.substr (rangeBegin + 1U, rangeSep - rangeBegin - 1U))
);
signal.maximum = std::stod (
TrimText (rest.substr (rangeSep + 1U, rangeEnd - rangeSep - 1U))
);
signal.unit = rest.substr (unitBegin + 1U, unitEnd - unitBegin - 1U);
{
const std::string receiversText = TrimText (rest.substr (unitEnd + 1U));
signal.receivers = SplitReceivers (receiversText);
}
return signal;
}
void DbcCommentHandler::ParseCommentLine (const std::string &line, DbcDatabase &database) {
/*
* Examples:
* CM_ BO_ 256 "Frame comment";
* CM_ SG_ 256 EngineSpeed "Signal comment";
*/
std::istringstream stream (line);
std::string token;
stream >> token;
if (token != "CM_")
return;
stream >> token;
if (token == "BO_") {
std::uint32_t rawCanId = 0U;
std::uint32_t canId = 0U;
bool isExtended = false;
stream >> rawCanId;
NormalizeCanId (rawCanId, canId, isExtended);
const std::string::size_type quoteBegin = line.find ('"');
const std::string::size_type quoteEnd = line.rfind ('"');
if ((quoteBegin == std::string::npos) ||
(quoteEnd == std::string::npos) ||
(quoteEnd <= quoteBegin))
return;
FrameInfo *frame = FindFrameById (database, canId, isExtended);
if (frame != nullptr)
frame->comment = line.substr (quoteBegin + 1U, quoteEnd - quoteBegin - 1U);
} else if (token == "SG_") {
std::uint32_t rawCanId = 0U;
std::uint32_t canId = 0U;
bool isExtended = false;
std::string signalName;
stream >> rawCanId;
stream >> signalName;
NormalizeCanId (rawCanId, canId, isExtended);
const std::string::size_type quoteBegin = line.find ('"');
const std::string::size_type quoteEnd = line.rfind ('"');
if ((quoteBegin == std::string::npos) ||
(quoteEnd == std::string::npos) ||
(quoteEnd <= quoteBegin))
return;
FrameInfo *frame = FindFrameById (database, canId, isExtended);
if (frame != nullptr) {
SignalInfo *signal = FindSignalByName (*frame, signalName);
if (signal != nullptr)
signal->comment = line.substr (quoteBegin + 1U, quoteEnd - quoteBegin - 1U);
}
}
}
namespace {
FrameInfo *FindFrameById (DbcDatabase &database,
std::uint32_t canId,
bool isExtended) {
for (std::size_t index = 0U; index < database.frames.size(); ++index) {
if ((database.frames[index].canId == canId) &&
(database.frames[index].isExtended == isExtended))
return &database.frames[index];
}
return nullptr;
}
SignalInfo *FindSignalByName (FrameInfo &frame, const std::string &signalName) {
for (std::size_t index = 0U; index < frame.signals.size(); ++index) {
if (frame.signals[index].name == signalName)
return &frame.signals[index];
}
return nullptr;
}
}
void DbcFrameHandler::Handle (const std::string &line, DbcParseContext &context) const {
context.database.frames.push_back (ParseFrameLine (line));
context.currentFrame = &context.database.frames.back();
}
void DbcSignalHandler::Handle (const std::string &line, DbcParseContext &context) const {
// Preserve the existing signal syntax policy during this refactor.
if (line.compare (0U, 4U, "SG_ ") != 0)
return;
if (context.currentFrame == nullptr)
throw std::runtime_error ("Signal found before any frame definition.");
context.currentFrame->signals.push_back (ParseSignalLine (line));
}
void DbcCommentHandler::Handle (const std::string &line, DbcParseContext &context) const {
if (line.compare (0U, 4U, "CM_ ") == 0)
ParseCommentLine (line, context.database);
}
DbcStatementDispatcher::DbcStatementDispatcher() {
RegisterType<DbcFrameHandler> ("BO_");
RegisterType<DbcSignalHandler> ("SG_");
RegisterType<DbcCommentHandler> ("CM_");
}
bool DbcStatementDispatcher::Dispatch (const std::string &line,
DbcParseContext &context) const {
std::istringstream stream (line);
std::string keyword;
stream >> keyword;
const auto handler = m_handlers.find (keyword);
if (handler == m_handlers.end())
return false;
handler->second->Handle (line, context);
return true;
}
-62
View File
@@ -1,62 +0,0 @@
// SPDX-License-Identifier: MIT
#ifndef DBC_STATEMENT_HANDLER_H
#define DBC_STATEMENT_HANDLER_H
#include "dbc_database.h"
#include "typefactory.h"
#include <string>
#include <unordered_map>
/** Mutable state belonging to one file parse. Handlers do not retain it. */
struct DbcParseContext {
DbcDatabase &database;
FrameInfo *currentFrame = nullptr;
};
class DbcStatementHandler {
public:
virtual ~DbcStatementHandler() = default;
virtual void Handle (const std::string &line, DbcParseContext &context) const = 0;
};
class DbcFrameHandler : public DbcStatementHandler {
public:
void Handle (const std::string &line, DbcParseContext &context) const override;
private:
static FrameInfo ParseFrameLine (const std::string &line);
};
class DbcSignalHandler : public DbcStatementHandler {
public:
void Handle (const std::string &line, DbcParseContext &context) const override;
private:
static SignalInfo ParseSignalLine (const std::string &line);
};
class DbcCommentHandler : public DbcStatementHandler {
public:
void Handle (const std::string &line, DbcParseContext &context) const override;
private:
static void ParseCommentLine (const std::string &line, DbcDatabase &database);
};
/** Exact-key dispatch to handlers created once per registration via TypeFactory. */
class DbcStatementDispatcher {
public:
DbcStatementDispatcher();
template <class Handler>
void RegisterType (const std::string &keyword) {
m_factory.registerType<Handler> (keyword);
m_handlers.insert_or_assign (keyword, m_factory.create (keyword));
}
/** Returns false for an unregistered keyword; input must be trimmed. */
bool Dispatch (const std::string &line, DbcParseContext &context) const;
private:
TypeFactory<std::string, DbcStatementHandler> m_factory;
std::unordered_map<std::string, std::shared_ptr<DbcStatementHandler> > m_handlers;
};
#endif /* DBC_STATEMENT_HANDLER_H */
-31
View File
@@ -1,31 +0,0 @@
/**
* @file dbc_tree_builder.cpp
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#include "dbc_tree_builder.h"
std::unique_ptr<TreeNode> DbcTreeBuilder::Build (const DbcDatabase &database) const {
std::unique_ptr<TreeNode> root (new TreeNode());
for (std::size_t frameIndex = 0U; frameIndex < database.frames.size(); ++frameIndex) {
const FrameInfo &frame = database.frames[frameIndex];
std::unique_ptr<TreeNode> frameNode (new TreeNode (frame));
for (std::size_t signalIndex = 0U; signalIndex < frame.signals.size(); ++signalIndex) {
const SignalInfo &signal = frame.signals[signalIndex];
std::unique_ptr<TreeNode> signalNode (new TreeNode (signal));
frameNode->AddChild (std::move (signalNode));
}
root->AddChild (std::move (frameNode));
}
return root;
}
-137
View File
@@ -1,137 +0,0 @@
/**
* @file decode_database.h
* @brief
*
* Created: 2026-03-13
* Author: Deeaitch (Dim. Himro)
*
* Licensed under the MIT License.
* See LICENSE file in the project root for full license text.
*/
#ifndef DECODE_DATABASE_H
#define DECODE_DATABASE_H
#include <string>
#include <vector>
#include <unordered_map>
#include <cstdint>
/**
* @brief Signal byte order used for runtime decoding.
*/
enum class ByteOrder {
Intel,
Motorola
};
/**
* @brief Signal numeric type.
*/
enum class ValueType {
Unsigned,
Signed
};
/**
* @brief Runtime-ready signal definition.
*/
struct DecodeSignal {
std::string name; /**< Signal name. */
std::uint32_t startBit; /**< DBC start bit. */
std::uint32_t length; /**< Signal length in bits. */
ByteOrder byteOrder; /**< Intel or Motorola. */
ValueType valueType; /**< Signed or unsigned. */
double factor; /**< Scaling factor. */
double offset; /**< Physical offset. */
double minimum; /**< Minimum physical value. */
double maximum; /**< Maximum physical value. */
std::string unit; /**< Physical unit. */
std::vector<std::string> receivers; /**< Receivers. */
std::string comment; /**< Comment. */
DecodeSignal()
: name()
, startBit (0U)
, length (0U)
, byteOrder (ByteOrder::Intel)
, valueType (ValueType::Unsigned)
, factor (1.0)
, offset (0.0)
, minimum (0.0)
, maximum (0.0)
, unit()
, receivers()
, comment() {
}
};
/**
* @brief Runtime-ready frame definition.
*/
struct DecodeFrame {
std::string name; /**< Frame name. */
std::uint32_t canId; /**< Normalized CAN ID. */
bool isExtended; /**< true for extended frame. */
std::uint8_t dlc; /**< Payload length. */
std::uint32_t pgn; /**< PGN if available. */
bool hasPgn; /**< true if PGN is valid. */
std::string transmitter; /**< Transmitter ECU. */
std::string comment; /**< Frame comment. */
std::vector<DecodeSignal> signals; /**< Signal definitions. */
DecodeFrame()
: name()
, canId (0U)
, isExtended (false)
, dlc (0U)
, pgn (0U)
, hasPgn (false)
, transmitter()
, comment()
, signals() {
}
};
/**
* @brief Key for fast frame lookup.
*/
struct FrameKey {
std::uint32_t canId;
bool isExtended;
FrameKey()
: canId (0U)
, isExtended (false) {
}
FrameKey (std::uint32_t id, bool extended)
: canId (id)
, isExtended (extended) {
}
bool operator== (const FrameKey &other) const {
return (canId == other.canId) && (isExtended == other.isExtended);
}
};
/**
* @brief Hasher for frame key.
*/
struct FrameKeyHasher {
std::size_t operator() (const FrameKey &key) const {
const std::size_t a = static_cast<std::size_t> (key.canId);
const std::size_t b = key.isExtended ? 1U : 0U;
return (a * 1315423911U) ^ b;
}
};
/**
* @brief Runtime decode database with fast lookup by CAN ID.
*/
struct DecodeDatabase {
std::vector<DecodeFrame> frames;
std::unordered_map<FrameKey, std::size_t, FrameKeyHasher> frameIndexByKey;
};
#endif /* DECODE_DATABASE_H */
+115 -41
View File
@@ -1,37 +1,37 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<tagfile doxygen_version="1.9.4">
<tagfile doxygen_version="1.9.8">
<compound kind="file">
<name>dbc_database.h</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>dbc__database_8h.html</filename>
<includes id="frame__info_8h" name="frame_info.h" local="yes" imported="no">frame_info.h</includes>
<includes id="frame__info_8h" name="frame_info.h" local="yes" import="no" module="no" objc="no">frame_info.h</includes>
<class kind="struct">DbcDatabase</class>
</compound>
<compound kind="file">
<name>dbc_decode_builder.cpp</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>dbc__decode__builder_8cpp.html</filename>
<includes id="dbc__decode__builder_8h" name="dbc_decode_builder.h" local="yes" imported="no">dbc_decode_builder.h</includes>
<includes id="dbc__decode__builder_8h" name="dbc_decode_builder.h" local="yes" import="no" module="no" objc="no">dbc_decode_builder.h</includes>
</compound>
<compound kind="file">
<name>dbc_decode_builder.h</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>dbc__decode__builder_8h.html</filename>
<includes id="dbc__database_8h" name="dbc_database.h" local="yes" imported="no">dbc_database.h</includes>
<includes id="decode__database_8h" name="decode_database.h" local="yes" imported="no">decode_database.h</includes>
<includes id="dbc__database_8h" name="dbc_database.h" local="yes" import="no" module="no" objc="no">dbc_database.h</includes>
<includes id="decode__database_8h" name="decode_database.h" local="yes" import="no" module="no" objc="no">decode_database.h</includes>
<class kind="class">DbcDecodeBuilder</class>
</compound>
<compound kind="file">
<name>dbc_decoder.cpp</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>dbc__decoder_8cpp.html</filename>
<includes id="dbc__decoder_8h" name="dbc_decoder.h" local="yes" imported="no">dbc_decoder.h</includes>
<includes id="dbc__decoder_8h" name="dbc_decoder.h" local="yes" import="no" module="no" objc="no">dbc_decoder.h</includes>
</compound>
<compound kind="file">
<name>dbc_decoder.h</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>dbc__decoder_8h.html</filename>
<includes id="decode__database_8h" name="decode_database.h" local="yes" imported="no">decode_database.h</includes>
<includes id="decode__database_8h" name="decode_database.h" local="yes" import="no" module="no" objc="no">decode_database.h</includes>
<class kind="struct">RawCanFrame</class>
<class kind="struct">DecodedSignalValue</class>
<class kind="struct">DecodedFrameValue</class>
@@ -39,34 +39,34 @@
</compound>
<compound kind="file">
<name>dbc_parser.cpp</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>dbc__parser_8cpp.html</filename>
<includes id="dbc__parser_8h" name="dbc_parser.h" local="yes" imported="no">dbc_parser.h</includes>
<includes id="dbc__parser_8h" name="dbc_parser.h" local="yes" import="no" module="no" objc="no">dbc_parser.h</includes>
</compound>
<compound kind="file">
<name>dbc_parser.h</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>dbc__parser_8h.html</filename>
<includes id="dbc__database_8h" name="dbc_database.h" local="yes" imported="no">dbc_database.h</includes>
<includes id="dbc__database_8h" name="dbc_database.h" local="yes" import="no" module="no" objc="no">dbc_database.h</includes>
<class kind="class">DbcParser</class>
</compound>
<compound kind="file">
<name>dbc_tree_builder.cpp</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>dbc__tree__builder_8cpp.html</filename>
<includes id="dbc__tree__builder_8h" name="dbc_tree_builder.h" local="yes" imported="no">dbc_tree_builder.h</includes>
<includes id="dbc__tree__builder_8h" name="dbc_tree_builder.h" local="yes" import="no" module="no" objc="no">dbc_tree_builder.h</includes>
</compound>
<compound kind="file">
<name>dbc_tree_builder.h</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>dbc__tree__builder_8h.html</filename>
<includes id="dbc__database_8h" name="dbc_database.h" local="yes" imported="no">dbc_database.h</includes>
<includes id="tree__node_8h" name="tree_node.h" local="yes" imported="no">tree_node.h</includes>
<includes id="dbc__database_8h" name="dbc_database.h" local="yes" import="no" module="no" objc="no">dbc_database.h</includes>
<includes id="tree__node_8h" name="tree_node.h" local="yes" import="no" module="no" objc="no">tree_node.h</includes>
<class kind="class">DbcTreeBuilder</class>
</compound>
<compound kind="file">
<name>decode_database.h</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>decode__database_8h.html</filename>
<class kind="struct">DecodeSignal</class>
<class kind="struct">DecodeFrame</class>
@@ -94,38 +94,29 @@
</compound>
<compound kind="file">
<name>frame_info.h</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>frame__info_8h.html</filename>
<includes id="signal__info_8h" name="signal_info.h" local="yes" imported="no">signal_info.h</includes>
<includes id="signal__info_8h" name="signal_info.h" local="yes" import="no" module="no" objc="no">signal_info.h</includes>
<class kind="struct">FrameInfo</class>
</compound>
<compound kind="file">
<name>main.cpp</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<filename>main_8cpp.html</filename>
<includes id="dbc__parser_8h" name="dbc_parser.h" local="yes" imported="no">dbc_parser.h</includes>
<includes id="dbc__tree__builder_8h" name="dbc_tree_builder.h" local="yes" imported="no">dbc_tree_builder.h</includes>
<includes id="dbc__decode__builder_8h" name="dbc_decode_builder.h" local="yes" imported="no">dbc_decode_builder.h</includes>
<includes id="dbc__decoder_8h" name="dbc_decoder.h" local="yes" imported="no">dbc_decoder.h</includes>
</compound>
<compound kind="file">
<name>signal_info.h</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>signal__info_8h.html</filename>
<class kind="struct">SignalInfo</class>
</compound>
<compound kind="file">
<name>tree_node.cpp</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>tree__node_8cpp.html</filename>
<includes id="tree__node_8h" name="tree_node.h" local="yes" imported="no">tree_node.h</includes>
<includes id="tree__node_8h" name="tree_node.h" local="yes" import="no" module="no" objc="no">tree_node.h</includes>
</compound>
<compound kind="file">
<name>tree_node.h</name>
<path>/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/</path>
<path>core/</path>
<filename>tree__node_8h.html</filename>
<includes id="frame__info_8h" name="frame_info.h" local="yes" imported="no">frame_info.h</includes>
<includes id="signal__info_8h" name="signal_info.h" local="yes" imported="no">signal_info.h</includes>
<includes id="frame__info_8h" name="frame_info.h" local="yes" import="no" module="no" objc="no">frame_info.h</includes>
<includes id="signal__info_8h" name="signal_info.h" local="yes" import="no" module="no" objc="no">signal_info.h</includes>
<class kind="class">TreeNode</class>
<member kind="enumeration">
<type></type>
@@ -138,6 +129,20 @@
<enumvalue file="tree__node_8h.html" anchor="acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398">Signal</enumvalue>
</member>
</compound>
<compound kind="file">
<name>examples/main.cpp</name>
<path>examples/</path>
<filename>examples_2main_8cpp.html</filename>
<includes id="dbc__decode__builder_8h" name="dbc_decode_builder.h" local="yes" import="no" module="no" objc="no">dbc_decode_builder.h</includes>
<includes id="dbc__decoder_8h" name="dbc_decoder.h" local="yes" import="no" module="no" objc="no">dbc_decoder.h</includes>
<includes id="dbc__parser_8h" name="dbc_parser.h" local="yes" import="no" module="no" objc="no">dbc_parser.h</includes>
<includes id="dbc__tree__builder_8h" name="dbc_tree_builder.h" local="yes" import="no" module="no" objc="no">dbc_tree_builder.h</includes>
</compound>
<compound kind="class">
<name>DbcCommentHandler</name>
<filename>classDbcCommentHandler.html</filename>
<base>DbcStatementHandler</base>
</compound>
<compound kind="struct">
<name>DbcDatabase</name>
<filename>structDbcDatabase.html</filename>
@@ -178,6 +183,15 @@
<arglist>(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</arglist>
</member>
</compound>
<compound kind="class">
<name>DbcFrameHandler</name>
<filename>classDbcFrameHandler.html</filename>
<base>DbcStatementHandler</base>
</compound>
<compound kind="struct">
<name>DbcParseContext</name>
<filename>structDbcParseContext.html</filename>
</compound>
<compound kind="class">
<name>DbcParser</name>
<filename>classDbcParser.html</filename>
@@ -189,6 +203,26 @@
<arglist>(const std::string &amp;filePath) const</arglist>
</member>
</compound>
<compound kind="class">
<name>DbcSignalHandler</name>
<filename>classDbcSignalHandler.html</filename>
<base>DbcStatementHandler</base>
</compound>
<compound kind="class">
<name>DbcStatementDispatcher</name>
<filename>classDbcStatementDispatcher.html</filename>
<member kind="function">
<type>bool</type>
<name>Dispatch</name>
<anchorfile>classDbcStatementDispatcher.html</anchorfile>
<anchor>a495c2d5c7ebb8103b1987cdd87c142ed</anchor>
<arglist>(const std::string &amp;line, DbcParseContext &amp;context) const</arglist>
</member>
</compound>
<compound kind="class">
<name>DbcStatementHandler</name>
<filename>classDbcStatementHandler.html</filename>
</compound>
<compound kind="class">
<name>DbcTreeBuilder</name>
<filename>classDbcTreeBuilder.html</filename>
@@ -240,10 +274,10 @@
<arglist></arglist>
</member>
<member kind="variable">
<type>std::int64_t</type>
<type>std::variant&lt; std::int64_t, std::uint64_t &gt;</type>
<name>rawValue</name>
<anchorfile>structDecodedSignalValue.html</anchorfile>
<anchor>a5138b825940e34689f7b3891627ee9ec</anchor>
<anchor>a95db4f7f93b5f311e8f272833e45055e</anchor>
<arglist></arglist>
</member>
<member kind="variable">
@@ -685,9 +719,49 @@
<arglist>() const</arglist>
</member>
</compound>
<compound kind="class">
<name>TypeFactory</name>
<filename>classTypeFactory.html</filename>
<templarg>class ClassId</templarg>
<templarg>class BaseClass</templarg>
<templarg>class... Args</templarg>
<member kind="function">
<type>void</type>
<name>registerType</name>
<anchorfile>classTypeFactory.html</anchorfile>
<anchor>ad6d85795285ee21193ac03e1b24762d3</anchor>
<arglist>(const ClassId &amp;id)</arglist>
</member>
<member kind="function">
<type>CreatorFn</type>
<name>creator</name>
<anchorfile>classTypeFactory.html</anchorfile>
<anchor>ad82f537569ece3d3a4a376523fa94473</anchor>
<arglist>(const ClassId &amp;id) const</arglist>
</member>
<member kind="function">
<type>BasePtr</type>
<name>create</name>
<anchorfile>classTypeFactory.html</anchorfile>
<anchor>a3f43b03d6e3a0fd503fdec01ecf62e9f</anchor>
<arglist>(const ClassId &amp;id, Args... args) const</arglist>
</member>
<member kind="function">
<type>bool</type>
<name>contains</name>
<anchorfile>classTypeFactory.html</anchorfile>
<anchor>a1a119ad2956abe146213c6ca124d8dd4</anchor>
<arglist>(const ClassId &amp;id) const</arglist>
</member>
</compound>
<compound kind="page">
<name>md_README</name>
<title>DBC Parser and Runtime Decode Module Documentation</title>
<filename>md_README.html</filename>
</compound>
<compound kind="page">
<name>md_tests_2README</name>
<title>QtTest regression tests</title>
<filename>md_tests_2README.html</filename>
</compound>
</tagfile>
+25 -10
View File
@@ -1,10 +1,25 @@
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/main.cpp:97: warning: Member main(int argc, char *argv[]) (function) of file main.cpp is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/decode_database.h:133: warning: Member frames (variable) of struct DecodeDatabase is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/decode_database.h:134: warning: Member frameIndexByKey (variable) of struct DecodeDatabase is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/decode_database.h:108: warning: Member FrameKey(std::uint32_t id, bool extended) (function) of struct FrameKey is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/decode_database.h:113: warning: Member operator==(const FrameKey &other) const (function) of struct FrameKey is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/decode_database.h:100: warning: Member canId (variable) of struct FrameKey is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/decode_database.h:101: warning: Member isExtended (variable) of struct FrameKey is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/decode_database.h:122: warning: Member operator()(const FrameKey &key) const (function) of struct FrameKeyHasher is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/tree_node.h:59: warning: Member TreeNode(TreeNode &&)=default (function) of class TreeNode is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/tree_node.h:60: warning: Member operator=(TreeNode &&)=default (function) of class TreeNode is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:38: warning: Compound DbcCommentHandler is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:22: warning: Compound DbcFrameHandler is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:30: warning: Compound DbcSignalHandler is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:16: warning: Compound DbcStatementHandler is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/examples/main.cpp:101: warning: Member main(int argc, char *argv[]) (function) of file examples/main.cpp is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:40: warning: Member Handle(const std::string &line, DbcParseContext &context) const override (function) of class DbcCommentHandler is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:24: warning: Member Handle(const std::string &line, DbcParseContext &context) const override (function) of class DbcFrameHandler is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:12: warning: Member database (variable) of struct DbcParseContext is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:13: warning: Member currentFrame (variable) of struct DbcParseContext is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:32: warning: Member Handle(const std::string &line, DbcParseContext &context) const override (function) of class DbcSignalHandler is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:52: warning: Member RegisterType(const std::string &keyword) (function) of class DbcStatementDispatcher is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:19: warning: Member Handle(const std::string &line, DbcParseContext &context) const =0 (function) of class DbcStatementHandler is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/decode_database.h:112: warning: Member frames (variable) of struct DecodeDatabase is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/decode_database.h:113: warning: Member frameIndexByKey (variable) of struct DecodeDatabase is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/decode_database.h:88: warning: Member FrameKey(std::uint32_t id, bool extended) (function) of struct FrameKey is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/decode_database.h:92: warning: Member operator==(const FrameKey &other) const (function) of struct FrameKey is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/decode_database.h:81: warning: Member canId (variable) of struct FrameKey is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/decode_database.h:82: warning: Member isExtended (variable) of struct FrameKey is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/decode_database.h:101: warning: Member operator()(const FrameKey &key) const (function) of struct FrameKeyHasher is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/tree_node.h:59: warning: Member TreeNode(TreeNode &&)=default (function) of class TreeNode is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/tree_node.h:60: warning: Member operator=(TreeNode &&)=default (function) of class TreeNode is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/typefactory.h:61: warning: Member BasePtr (typedef) of class TypeFactory is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/typefactory.h:62: warning: Member CreatorFn (typedef) of class TypeFactory is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/typefactory.h:110: warning: Member classes (variable) of class TypeFactory is not documented.
error: failed to run qhelpgenerator on index.qhp
+38 -24
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Class List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('annotated.html',''); initResizable();
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -88,22 +95,29 @@ $(document).ready(function(){initNavTree('annotated.html',''); initResizable();
<div class="contents">
<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
<table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDbcDatabase.html" target="_self">DbcDatabase</a></td><td class="desc">Parsed DBC content stored in a simple internal form </td></tr>
<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcDecodeBuilder.html" target="_self">DbcDecodeBuilder</a></td><td class="desc">Converts parsed DBC data into runtime decode database </td></tr>
<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcDecoder.html" target="_self">DbcDecoder</a></td><td class="desc">Runtime CAN decoder using prebuilt decode database </td></tr>
<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcParser.html" target="_self">DbcParser</a></td><td class="desc">Minimal DBC parser </td></tr>
<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcTreeBuilder.html" target="_self">DbcTreeBuilder</a></td><td class="desc">Builds a simple tree from parsed DBC database </td></tr>
<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodeDatabase.html" target="_self">DecodeDatabase</a></td><td class="desc">Runtime decode database with fast lookup by CAN ID </td></tr>
<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodedFrameValue.html" target="_self">DecodedFrameValue</a></td><td class="desc">Fully decoded frame </td></tr>
<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodedSignalValue.html" target="_self">DecodedSignalValue</a></td><td class="desc">One decoded signal value </td></tr>
<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodeFrame.html" target="_self">DecodeFrame</a></td><td class="desc">Runtime-ready frame definition </td></tr>
<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodeSignal.html" target="_self">DecodeSignal</a></td><td class="desc">Runtime-ready signal definition </td></tr>
<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structFrameInfo.html" target="_self">FrameInfo</a></td><td class="desc">Describes one CAN frame from a DBC file </td></tr>
<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structFrameKey.html" target="_self">FrameKey</a></td><td class="desc">Key for fast frame lookup </td></tr>
<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structFrameKeyHasher.html" target="_self">FrameKeyHasher</a></td><td class="desc">Hasher for frame key </td></tr>
<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structRawCanFrame.html" target="_self">RawCanFrame</a></td><td class="desc">Raw CAN frame used for runtime or trace decoding </td></tr>
<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structSignalInfo.html" target="_self">SignalInfo</a></td><td class="desc">Describes one signal inside a DBC frame </td></tr>
<tr id="row_15_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classTreeNode.html" target="_self">TreeNode</a></td><td class="desc">Tree node for later use in model/view or other hierarchy consumers </td></tr>
<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcCommentHandler.html" target="_self">DbcCommentHandler</a></td><td class="desc"></td></tr>
<tr id="row_1_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDbcDatabase.html" target="_self">DbcDatabase</a></td><td class="desc">Parsed DBC content stored in a simple internal form </td></tr>
<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcDecodeBuilder.html" target="_self">DbcDecodeBuilder</a></td><td class="desc">Converts parsed DBC data into runtime decode database </td></tr>
<tr id="row_3_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcDecoder.html" target="_self">DbcDecoder</a></td><td class="desc">Runtime CAN decoder using prebuilt decode database </td></tr>
<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcFrameHandler.html" target="_self">DbcFrameHandler</a></td><td class="desc"></td></tr>
<tr id="row_5_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDbcParseContext.html" target="_self">DbcParseContext</a></td><td class="desc"></td></tr>
<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcParser.html" target="_self">DbcParser</a></td><td class="desc">Minimal DBC parser </td></tr>
<tr id="row_7_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcSignalHandler.html" target="_self">DbcSignalHandler</a></td><td class="desc"></td></tr>
<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcStatementDispatcher.html" target="_self">DbcStatementDispatcher</a></td><td class="desc"></td></tr>
<tr id="row_9_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcStatementHandler.html" target="_self">DbcStatementHandler</a></td><td class="desc"></td></tr>
<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classDbcTreeBuilder.html" target="_self">DbcTreeBuilder</a></td><td class="desc">Builds a simple tree from parsed DBC database </td></tr>
<tr id="row_11_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodeDatabase.html" target="_self">DecodeDatabase</a></td><td class="desc">Runtime decode database with fast lookup by CAN ID </td></tr>
<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodedFrameValue.html" target="_self">DecodedFrameValue</a></td><td class="desc">Fully decoded frame </td></tr>
<tr id="row_13_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodedSignalValue.html" target="_self">DecodedSignalValue</a></td><td class="desc">One decoded signal value </td></tr>
<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodeFrame.html" target="_self">DecodeFrame</a></td><td class="desc">Runtime-ready frame definition </td></tr>
<tr id="row_15_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structDecodeSignal.html" target="_self">DecodeSignal</a></td><td class="desc">Runtime-ready signal definition </td></tr>
<tr id="row_16_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structFrameInfo.html" target="_self">FrameInfo</a></td><td class="desc">Describes one CAN frame from a DBC file </td></tr>
<tr id="row_17_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structFrameKey.html" target="_self">FrameKey</a></td><td class="desc">Key for fast frame lookup </td></tr>
<tr id="row_18_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structFrameKeyHasher.html" target="_self">FrameKeyHasher</a></td><td class="desc">Hasher for frame key </td></tr>
<tr id="row_19_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structRawCanFrame.html" target="_self">RawCanFrame</a></td><td class="desc">Raw CAN frame used for runtime or trace decoding </td></tr>
<tr id="row_20_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structSignalInfo.html" target="_self">SignalInfo</a></td><td class="desc">Describes one signal inside a DBC frame </td></tr>
<tr id="row_21_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classTreeNode.html" target="_self">TreeNode</a></td><td class="desc">Tree node for later use in model/view or other hierarchy consumers </td></tr>
<tr id="row_22_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classTypeFactory.html" target="_self">TypeFactory</a></td><td class="desc">Registry-based factory for creating objects by runtime identifier </td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
@@ -111,7 +125,7 @@ $(document).ready(function(){initNavTree('annotated.html',''); initResizable();
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+8 -1
View File
@@ -1,9 +1,15 @@
var annotated_dup =
[
[ "DbcCommentHandler", "classDbcCommentHandler.html", null ],
[ "DbcDatabase", "structDbcDatabase.html", "structDbcDatabase" ],
[ "DbcDecodeBuilder", "classDbcDecodeBuilder.html", "classDbcDecodeBuilder" ],
[ "DbcDecoder", "classDbcDecoder.html", "classDbcDecoder" ],
[ "DbcFrameHandler", "classDbcFrameHandler.html", null ],
[ "DbcParseContext", "structDbcParseContext.html", null ],
[ "DbcParser", "classDbcParser.html", "classDbcParser" ],
[ "DbcSignalHandler", "classDbcSignalHandler.html", null ],
[ "DbcStatementDispatcher", "classDbcStatementDispatcher.html", "classDbcStatementDispatcher" ],
[ "DbcStatementHandler", "classDbcStatementHandler.html", null ],
[ "DbcTreeBuilder", "classDbcTreeBuilder.html", "classDbcTreeBuilder" ],
[ "DecodeDatabase", "structDecodeDatabase.html", null ],
[ "DecodedFrameValue", "structDecodedFrameValue.html", "structDecodedFrameValue" ],
@@ -15,5 +21,6 @@ var annotated_dup =
[ "FrameKeyHasher", "structFrameKeyHasher.html", null ],
[ "RawCanFrame", "structRawCanFrame.html", "structRawCanFrame" ],
[ "SignalInfo", "structSignalInfo.html", "structSignalInfo" ],
[ "TreeNode", "classTreeNode.html", "classTreeNode" ]
[ "TreeNode", "classTreeNode.html", "classTreeNode" ],
[ "TypeFactory", "classTypeFactory.html", "classTypeFactory" ]
];
Binary file not shown.

After

Width:  |  Height:  |  Size: 635 B

@@ -0,0 +1,110 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcCommentHandler.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">DbcCommentHandler Member List</div></div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classDbcCommentHandler.html">DbcCommentHandler</a>, including all inherited members.</p>
<table class="directory">
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>Handle</b>(const std::string &amp;line, DbcParseContext &amp;context) const override (defined in <a class="el" href="classDbcCommentHandler.html">DbcCommentHandler</a>)</td><td class="entry"><a class="el" href="classDbcCommentHandler.html">DbcCommentHandler</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
<tr bgcolor="#f0f0f0" class="odd"><td class="entry"><b>~DbcStatementHandler</b>()=default (defined in <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>)</td><td class="entry"><a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
</table></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+170
View File
@@ -0,0 +1,170 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: DbcCommentHandler Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcCommentHandler.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classDbcCommentHandler-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">DbcCommentHandler Class Reference</div></div>
</div><!--header-->
<div class="contents">
<div id="dynsection-0" onclick="return toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;">
<img id="dynsection-0-trigger" src="closed.png" alt="+"/> Inheritance diagram for DbcCommentHandler:</div>
<div id="dynsection-0-summary" class="dynsummary" style="display:block;">
</div>
<div id="dynsection-0-content" class="dyncontent" style="display:none;">
<div class="center"><iframe scrolling="no" frameborder="0" src="classDbcCommentHandler__inherit__graph.svg" width="204" height="210"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:aa4fce77b585a441d251d8535ef7a51a6" id="r_aa4fce77b585a441d251d8535ef7a51a6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcCommentHandler.html#aa4fce77b585a441d251d8535ef7a51a6">Handle</a> (const std::string &amp;line, <a class="el" href="structDbcParseContext.html">DbcParseContext</a> &amp;context) const override</td></tr>
<tr class="separator:aa4fce77b585a441d251d8535ef7a51a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock">
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8h_source.html#l00038">38</a> of file <a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a>.</p>
</div><h2 class="groupheader">Member Function Documentation</h2>
<a id="aa4fce77b585a441d251d8535ef7a51a6" name="aa4fce77b585a441d251d8535ef7a51a6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa4fce77b585a441d251d8535ef7a51a6">&#9670;&#160;</a></span>Handle()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void DbcCommentHandler::Handle </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&#160;</td>
<td class="paramname"><em>line</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDbcParseContext.html">DbcParseContext</a> &amp;&#160;</td>
<td class="paramname"><em>context</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Implements <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00303">303</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li><a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a></li>
<li><a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classDbcCommentHandler.html">DbcCommentHandler</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
@@ -0,0 +1,5 @@
<map id="DbcCommentHandler" name="DbcCommentHandler">
<area shape="rect" id="Node000001" title=" " alt="" coords="25,139,179,204"/>
<area shape="rect" id="Node000002" href="$classDbcStatementHandler.html" title=" " alt="" coords="5,5,199,91"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="105,104,105,138,99,138,99,104"/>
</map>
@@ -0,0 +1 @@
031e88596ad00375d87ac04af33f405c
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: DbcCommentHandler Pages: 1 -->
<svg width="153pt" height="157pt"
viewBox="0.00 0.00 153.00 157.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg id="main" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" onload="init(evt)">
<style type="text/css"><![CDATA[
.node, .edge {opacity: 0.7;}
.node.selected, .edge.selected {opacity: 1;}
.edge:hover path { stroke: red; }
.edge:hover polygon { stroke: red; fill: red; }
]]></style>
<script type="application/ecmascript" xlink:href="svg.min.js"/>
<svg id="graph" class="graph">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 153)">
<title>DbcCommentHandler</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="transparent" points="130.5,-49 14.5,-49 14.5,0 130.5,0 130.5,-49"/>
<text text-anchor="start" x="19.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcCommentHandler</text>
<text text-anchor="start" x="70.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="31.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="57.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#666666" stroke="#666666" points="14.5,-31.5 14.5,-31.5 130.5,-31.5 130.5,-31.5 14.5,-31.5"/>
<polygon fill="#666666" stroke="#666666" points="14.5,-16.5 14.5,-16.5 130.5,-16.5 130.5,-16.5 14.5,-16.5"/>
<polygon fill="none" stroke="#666666" points="14.5,0 14.5,-49 130.5,-49 130.5,0 14.5,0"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="classDbcStatementHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="145,-149 0,-149 0,-85 145,-85 145,-149"/>
<text text-anchor="start" x="18.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">DbcStatementHandler</text>
<text text-anchor="start" x="71" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="4.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">~DbcStatementHandler()</text>
<text text-anchor="start" x="4.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-132 0.5,-132 145.5,-132 145.5,-132 0.5,-132"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-117 0.5,-117 145.5,-117 145.5,-117 0.5,-117"/>
<polygon fill="none" stroke="#bfbfbf" points="0,-85 0,-149 145,-149 145,-85 0,-85"/>
</a>
</g>
</g>
<!-- Node2&#45;&gt;Node1 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node2&#45;&gt;Node1</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M72.5,-74.77C72.5,-66.03 72.5,-57.09 72.5,-49.27"/>
<polygon fill="none" stroke="#63b8ff" points="69,-74.85 72.5,-84.86 76,-74.86 69,-74.85"/>
</a>
</g>
</g>
</g>
</svg>
</svg>
<style type='text/css'>
<![CDATA[
[data-mouse-over-selected='false'] { opacity: 0.7; }
[data-mouse-over-selected='true'] { opacity: 1.0; }
]]>
</style>
<script type="application/ecmascript"><![CDATA[
document.addEventListener('DOMContentLoaded', (event) => {
highlightEdges();
highlightAdjacentNodes();
});
]]></script>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: DbcCommentHandler Pages: 1 -->
<svg width="153pt" height="157pt"
viewBox="0.00 0.00 153.00 157.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 153)">
<title>DbcCommentHandler</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="transparent" points="130.5,-49 14.5,-49 14.5,0 130.5,0 130.5,-49"/>
<text text-anchor="start" x="19.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcCommentHandler</text>
<text text-anchor="start" x="70.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="31.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="57.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#666666" stroke="#666666" points="14.5,-31.5 14.5,-31.5 130.5,-31.5 130.5,-31.5 14.5,-31.5"/>
<polygon fill="#666666" stroke="#666666" points="14.5,-16.5 14.5,-16.5 130.5,-16.5 130.5,-16.5 14.5,-16.5"/>
<polygon fill="none" stroke="#666666" points="14.5,0 14.5,-49 130.5,-49 130.5,0 14.5,0"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="classDbcStatementHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="145,-149 0,-149 0,-85 145,-85 145,-149"/>
<text text-anchor="start" x="18.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">DbcStatementHandler</text>
<text text-anchor="start" x="71" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="4.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">~DbcStatementHandler()</text>
<text text-anchor="start" x="4.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-132 0.5,-132 145.5,-132 145.5,-132 0.5,-132"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-117 0.5,-117 145.5,-117 145.5,-117 0.5,-117"/>
<polygon fill="none" stroke="#bfbfbf" points="0,-85 0,-149 145,-149 145,-85 0,-85"/>
</a>
</g>
</g>
<!-- Node2&#45;&gt;Node1 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node2&#45;&gt;Node1</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M72.5,-74.77C72.5,-66.03 72.5,-57.09 72.5,-49.27"/>
<polygon fill="none" stroke="#63b8ff" points="69,-74.85 72.5,-84.86 76,-74.86 69,-74.85"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

+15 -8
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classDbcDecodeBuilder.html',''); initR
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -95,7 +102,7 @@ $(document).ready(function(){initNavTree('classDbcDecodeBuilder.html',''); initR
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+20 -13
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: DbcDecodeBuilder Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classDbcDecodeBuilder.html',''); initR
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -97,17 +104,17 @@ $(document).ready(function(){initNavTree('classDbcDecodeBuilder.html',''); initR
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a2bc6386dfb5e58976c42e22c19ec471b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structDecodeDatabase.html">DecodeDatabase</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a> (const <a class="el" href="structDbcDatabase.html">DbcDatabase</a> &amp;source) const</td></tr>
<tr class="memdesc:a2bc6386dfb5e58976c42e22c19ec471b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Build runtime decode database. <a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">More...</a><br /></td></tr>
<tr class="memitem:a2bc6386dfb5e58976c42e22c19ec471b" id="r_a2bc6386dfb5e58976c42e22c19ec471b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structDecodeDatabase.html">DecodeDatabase</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a> (const <a class="el" href="structDbcDatabase.html">DbcDatabase</a> &amp;source) const</td></tr>
<tr class="memdesc:a2bc6386dfb5e58976c42e22c19ec471b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Build runtime decode database. <br /></td></tr>
<tr class="separator:a2bc6386dfb5e58976c42e22c19ec471b"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Converts parsed DBC data into runtime decode database. </p>
<div class="textblock"><p>Converts parsed DBC data into runtime decode database. </p>
<p class="definition">Definition at line <a class="el" href="dbc__decode__builder_8h_source.html#l00021">21</a> of file <a class="el" href="dbc__decode__builder_8h_source.html">dbc_decode_builder.h</a>.</p>
</div><h2 class="groupheader">Member Function Documentation</h2>
<a id="a2bc6386dfb5e58976c42e22c19ec471b" name="a2bc6386dfb5e58976c42e22c19ec471b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2bc6386dfb5e58976c42e22c19ec471b">&#9670;&nbsp;</a></span>Build()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#a2bc6386dfb5e58976c42e22c19ec471b">&#9670;&#160;</a></span>Build()</h2>
<div class="memitem">
<div class="memproto">
@@ -133,7 +140,7 @@ Public Member Functions</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decode__builder_8cpp_source.html#l00014">14</a> of file <a class="el" href="dbc__decode__builder_8cpp_source.html">dbc_decode_builder.cpp</a>.</p>
<p class="reference">References <a class="el" href="decode__database_8h_source.html#l00043">DecodeSignal::byteOrder</a>, <a class="el" href="decode__database_8h_source.html#l00074">DecodeFrame::canId</a>, <a class="el" href="frame__info_8h_source.html#l00026">FrameInfo::canId</a>, <a class="el" href="decode__database_8h_source.html#l00080">DecodeFrame::comment</a>, <a class="el" href="frame__info_8h_source.html#l00032">FrameInfo::comment</a>, <a class="el" href="decode__database_8h_source.html#l00076">DecodeFrame::dlc</a>, <a class="el" href="frame__info_8h_source.html#l00030">FrameInfo::dlc</a>, <a class="el" href="dbc__database_8h_source.html#l00023">DbcDatabase::frames</a>, <a class="el" href="decode__database_8h_source.html#l00078">DecodeFrame::hasPgn</a>, <a class="el" href="frame__info_8h_source.html#l00029">FrameInfo::hasPgn</a>, <a class="el" href="decode__database_8h_source.html#l00075">DecodeFrame::isExtended</a>, <a class="el" href="frame__info_8h_source.html#l00027">FrameInfo::isExtended</a>, <a class="el" href="signal__info_8h_source.html#l00026">SignalInfo::isLittleEndian</a>, <a class="el" href="decode__database_8h_source.html#l00042">DecodeSignal::length</a>, <a class="el" href="signal__info_8h_source.html#l00025">SignalInfo::length</a>, <a class="el" href="decode__database_8h_source.html#l00040">DecodeSignal::name</a>, <a class="el" href="decode__database_8h_source.html#l00073">DecodeFrame::name</a>, <a class="el" href="frame__info_8h_source.html#l00025">FrameInfo::name</a>, <a class="el" href="signal__info_8h_source.html#l00023">SignalInfo::name</a>, <a class="el" href="decode__database_8h_source.html#l00077">DecodeFrame::pgn</a>, <a class="el" href="frame__info_8h_source.html#l00028">FrameInfo::pgn</a>, <a class="el" href="decode__database_8h_source.html#l00041">DecodeSignal::startBit</a>, <a class="el" href="signal__info_8h_source.html#l00024">SignalInfo::startBit</a>, <a class="el" href="decode__database_8h_source.html#l00079">DecodeFrame::transmitter</a>, and <a class="el" href="frame__info_8h_source.html#l00031">FrameInfo::transmitter</a>.</p>
<p class="reference">References <a class="el" href="decode__database_8h_source.html#l00043">DecodeSignal::byteOrder</a>, <a class="el" href="decode__database_8h_source.html#l00063">DecodeFrame::canId</a>, <a class="el" href="frame__info_8h_source.html#l00026">FrameInfo::canId</a>, <a class="el" href="decode__database_8h_source.html#l00051">DecodeSignal::comment</a>, <a class="el" href="decode__database_8h_source.html#l00069">DecodeFrame::comment</a>, <a class="el" href="frame__info_8h_source.html#l00032">FrameInfo::comment</a>, <a class="el" href="signal__info_8h_source.html#l00034">SignalInfo::comment</a>, <a class="el" href="decode__database_8h_source.html#l00065">DecodeFrame::dlc</a>, <a class="el" href="frame__info_8h_source.html#l00030">FrameInfo::dlc</a>, <a class="el" href="decode__database_8h_source.html#l00045">DecodeSignal::factor</a>, <a class="el" href="signal__info_8h_source.html#l00028">SignalInfo::factor</a>, <a class="el" href="dbc__database_8h_source.html#l00023">DbcDatabase::frames</a>, <a class="el" href="decode__database_8h_source.html#l00067">DecodeFrame::hasPgn</a>, <a class="el" href="frame__info_8h_source.html#l00029">FrameInfo::hasPgn</a>, <a class="el" href="decode__database_8h_source.html#l00064">DecodeFrame::isExtended</a>, <a class="el" href="frame__info_8h_source.html#l00027">FrameInfo::isExtended</a>, <a class="el" href="signal__info_8h_source.html#l00026">SignalInfo::isLittleEndian</a>, <a class="el" href="signal__info_8h_source.html#l00027">SignalInfo::isSigned</a>, <a class="el" href="decode__database_8h_source.html#l00042">DecodeSignal::length</a>, <a class="el" href="signal__info_8h_source.html#l00025">SignalInfo::length</a>, <a class="el" href="decode__database_8h_source.html#l00048">DecodeSignal::maximum</a>, <a class="el" href="signal__info_8h_source.html#l00031">SignalInfo::maximum</a>, <a class="el" href="decode__database_8h_source.html#l00047">DecodeSignal::minimum</a>, <a class="el" href="signal__info_8h_source.html#l00030">SignalInfo::minimum</a>, <a class="el" href="decode__database_8h_source.html#l00040">DecodeSignal::name</a>, <a class="el" href="decode__database_8h_source.html#l00062">DecodeFrame::name</a>, <a class="el" href="frame__info_8h_source.html#l00025">FrameInfo::name</a>, <a class="el" href="signal__info_8h_source.html#l00023">SignalInfo::name</a>, <a class="el" href="decode__database_8h_source.html#l00046">DecodeSignal::offset</a>, <a class="el" href="signal__info_8h_source.html#l00029">SignalInfo::offset</a>, <a class="el" href="decode__database_8h_source.html#l00066">DecodeFrame::pgn</a>, <a class="el" href="frame__info_8h_source.html#l00028">FrameInfo::pgn</a>, <a class="el" href="decode__database_8h_source.html#l00050">DecodeSignal::receivers</a>, <a class="el" href="signal__info_8h_source.html#l00033">SignalInfo::receivers</a>, <a class="el" href="decode__database_8h_source.html#l00041">DecodeSignal::startBit</a>, <a class="el" href="signal__info_8h_source.html#l00024">SignalInfo::startBit</a>, <a class="el" href="decode__database_8h_source.html#l00068">DecodeFrame::transmitter</a>, <a class="el" href="frame__info_8h_source.html#l00031">FrameInfo::transmitter</a>, <a class="el" href="decode__database_8h_source.html#l00049">DecodeSignal::unit</a>, <a class="el" href="signal__info_8h_source.html#l00032">SignalInfo::unit</a>, and <a class="el" href="decode__database_8h_source.html#l00044">DecodeSignal::valueType</a>.</p>
</div>
</div>
@@ -147,7 +154,7 @@ Public Member Functions</h2></td></tr>
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+15 -8
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classDbcDecoder.html',''); initResizab
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -96,7 +103,7 @@ $(document).ready(function(){initNavTree('classDbcDecoder.html',''); initResizab
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+24 -17
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: DbcDecoder Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classDbcDecoder.html',''); initResizab
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -97,20 +104,20 @@ $(document).ready(function(){initNavTree('classDbcDecoder.html',''); initResizab
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:ab2cfb2fb711c95d3a29365546b89f3da"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structDecodeFrame.html">DecodeFrame</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">FindFrame</a> (const <a class="el" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database, std::uint32_t canId, bool isExtended) const</td></tr>
<tr class="memdesc:ab2cfb2fb711c95d3a29365546b89f3da"><td class="mdescLeft">&#160;</td><td class="mdescRight">Find frame definition by CAN ID. <a href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">More...</a><br /></td></tr>
<tr class="memitem:ab2cfb2fb711c95d3a29365546b89f3da" id="r_ab2cfb2fb711c95d3a29365546b89f3da"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structDecodeFrame.html">DecodeFrame</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">FindFrame</a> (const <a class="el" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database, std::uint32_t canId, bool isExtended) const</td></tr>
<tr class="memdesc:ab2cfb2fb711c95d3a29365546b89f3da"><td class="mdescLeft">&#160;</td><td class="mdescRight">Find frame definition by CAN ID. <br /></td></tr>
<tr class="separator:ab2cfb2fb711c95d3a29365546b89f3da"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a345951ffe5d943a70d3a1ea1f39e74f7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structDecodedFrameValue.html">DecodedFrameValue</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a> (const <a class="el" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database, const <a class="el" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame) const</td></tr>
<tr class="memdesc:a345951ffe5d943a70d3a1ea1f39e74f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decode one raw CAN frame. <a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">More...</a><br /></td></tr>
<tr class="memitem:a345951ffe5d943a70d3a1ea1f39e74f7" id="r_a345951ffe5d943a70d3a1ea1f39e74f7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structDecodedFrameValue.html">DecodedFrameValue</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a> (const <a class="el" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database, const <a class="el" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame) const</td></tr>
<tr class="memdesc:a345951ffe5d943a70d3a1ea1f39e74f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decode one raw CAN frame. <br /></td></tr>
<tr class="separator:a345951ffe5d943a70d3a1ea1f39e74f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Runtime CAN decoder using prebuilt decode database. </p>
<div class="textblock"><p>Runtime CAN decoder using prebuilt decode database. </p>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00070">70</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00064">64</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
</div><h2 class="groupheader">Member Function Documentation</h2>
<a id="ab2cfb2fb711c95d3a29365546b89f3da" name="ab2cfb2fb711c95d3a29365546b89f3da"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab2cfb2fb711c95d3a29365546b89f3da">&#9670;&nbsp;</a></span>FindFrame()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#ab2cfb2fb711c95d3a29365546b89f3da">&#9670;&#160;</a></span>FindFrame()</h2>
<div class="memitem">
<div class="memproto">
@@ -159,7 +166,7 @@ Public Member Functions</h2></td></tr>
</div>
</div>
<a id="a345951ffe5d943a70d3a1ea1f39e74f7" name="a345951ffe5d943a70d3a1ea1f39e74f7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a345951ffe5d943a70d3a1ea1f39e74f7">&#9670;&nbsp;</a></span>Decode()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#a345951ffe5d943a70d3a1ea1f39e74f7">&#9670;&#160;</a></span>Decode()</h2>
<div class="memitem">
<div class="memproto">
@@ -196,7 +203,7 @@ Public Member Functions</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8cpp_source.html#l00031">31</a> of file <a class="el" href="dbc__decoder_8cpp_source.html">dbc_decoder.cpp</a>.</p>
<p class="reference">References <a class="el" href="dbc__decoder_8h_source.html#l00024">RawCanFrame::canId</a>, <a class="el" href="dbc__decoder_8h_source.html#l00026">RawCanFrame::data</a>, <a class="el" href="dbc__decoder_8h_source.html#l00039">DecodedSignalValue::definition</a>, <a class="el" href="dbc__decoder_8h_source.html#l00056">DecodedFrameValue::definition</a>, <a class="el" href="dbc__decoder_8cpp_source.html#l00014">FindFrame()</a>, <a class="el" href="dbc__decoder_8h_source.html#l00025">RawCanFrame::isExtended</a>, <a class="el" href="dbc__decoder_8h_source.html#l00042">DecodedSignalValue::valid</a>, <a class="el" href="dbc__decoder_8h_source.html#l00058">DecodedFrameValue::valid</a>, and <a class="el" href="decode__database_8h_source.html#l00044">DecodeSignal::valueType</a>.</p>
<p class="reference">References <a class="el" href="dbc__decoder_8h_source.html#l00025">RawCanFrame::canId</a>, <a class="el" href="dbc__decoder_8h_source.html#l00027">RawCanFrame::data</a>, <a class="el" href="dbc__decoder_8h_source.html#l00038">DecodedSignalValue::definition</a>, <a class="el" href="dbc__decoder_8h_source.html#l00052">DecodedFrameValue::definition</a>, <a class="el" href="decode__database_8h_source.html#l00045">DecodeSignal::factor</a>, <a class="el" href="dbc__decoder_8cpp_source.html#l00014">FindFrame()</a>, <a class="el" href="dbc__decoder_8h_source.html#l00026">RawCanFrame::isExtended</a>, <a class="el" href="decode__database_8h_source.html#l00042">DecodeSignal::length</a>, <a class="el" href="decode__database_8h_source.html#l00046">DecodeSignal::offset</a>, <a class="el" href="dbc__decoder_8h_source.html#l00040">DecodedSignalValue::physicalValue</a>, <a class="el" href="dbc__decoder_8h_source.html#l00039">DecodedSignalValue::rawValue</a>, <a class="el" href="dbc__decoder_8h_source.html#l00041">DecodedSignalValue::valid</a>, <a class="el" href="dbc__decoder_8h_source.html#l00054">DecodedFrameValue::valid</a>, and <a class="el" href="decode__database_8h_source.html#l00044">DecodeSignal::valueType</a>.</p>
</div>
</div>
@@ -210,7 +217,7 @@ Public Member Functions</h2></td></tr>
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classDbcDecoder.html">DbcDecoder</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+110
View File
@@ -0,0 +1,110 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcFrameHandler.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">DbcFrameHandler Member List</div></div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classDbcFrameHandler.html">DbcFrameHandler</a>, including all inherited members.</p>
<table class="directory">
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>Handle</b>(const std::string &amp;line, DbcParseContext &amp;context) const override (defined in <a class="el" href="classDbcFrameHandler.html">DbcFrameHandler</a>)</td><td class="entry"><a class="el" href="classDbcFrameHandler.html">DbcFrameHandler</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
<tr bgcolor="#f0f0f0" class="odd"><td class="entry"><b>~DbcStatementHandler</b>()=default (defined in <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>)</td><td class="entry"><a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
</table></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+170
View File
@@ -0,0 +1,170 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: DbcFrameHandler Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcFrameHandler.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classDbcFrameHandler-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">DbcFrameHandler Class Reference</div></div>
</div><!--header-->
<div class="contents">
<div id="dynsection-0" onclick="return toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;">
<img id="dynsection-0-trigger" src="closed.png" alt="+"/> Inheritance diagram for DbcFrameHandler:</div>
<div id="dynsection-0-summary" class="dynsummary" style="display:block;">
</div>
<div id="dynsection-0-content" class="dyncontent" style="display:none;">
<div class="center"><iframe scrolling="no" frameborder="0" src="classDbcFrameHandler__inherit__graph.svg" width="204" height="210"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a0d3f43bbcc5e191460bc31827e74ce89" id="r_a0d3f43bbcc5e191460bc31827e74ce89"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcFrameHandler.html#a0d3f43bbcc5e191460bc31827e74ce89">Handle</a> (const std::string &amp;line, <a class="el" href="structDbcParseContext.html">DbcParseContext</a> &amp;context) const override</td></tr>
<tr class="separator:a0d3f43bbcc5e191460bc31827e74ce89"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock">
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8h_source.html#l00022">22</a> of file <a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a>.</p>
</div><h2 class="groupheader">Member Function Documentation</h2>
<a id="a0d3f43bbcc5e191460bc31827e74ce89" name="a0d3f43bbcc5e191460bc31827e74ce89"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0d3f43bbcc5e191460bc31827e74ce89">&#9670;&#160;</a></span>Handle()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void DbcFrameHandler::Handle </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&#160;</td>
<td class="paramname"><em>line</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDbcParseContext.html">DbcParseContext</a> &amp;&#160;</td>
<td class="paramname"><em>context</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Implements <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00281">281</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li><a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a></li>
<li><a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classDbcFrameHandler.html">DbcFrameHandler</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
@@ -0,0 +1,5 @@
<map id="DbcFrameHandler" name="DbcFrameHandler">
<area shape="rect" id="Node000001" title=" " alt="" coords="37,139,167,204"/>
<area shape="rect" id="Node000002" href="$classDbcStatementHandler.html" title=" " alt="" coords="5,5,199,91"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="105,104,105,138,99,138,99,104"/>
</map>
@@ -0,0 +1 @@
e01f0e1a340a0e632ef160180de2de74
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: DbcFrameHandler Pages: 1 -->
<svg width="153pt" height="157pt"
viewBox="0.00 0.00 153.00 157.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg id="main" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" onload="init(evt)">
<style type="text/css"><![CDATA[
.node, .edge {opacity: 0.7;}
.node.selected, .edge.selected {opacity: 1;}
.edge:hover path { stroke: red; }
.edge:hover polygon { stroke: red; fill: red; }
]]></style>
<script type="application/ecmascript" xlink:href="svg.min.js"/>
<svg id="graph" class="graph">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 153)">
<title>DbcFrameHandler</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="transparent" points="121.5,-49 23.5,-49 23.5,0 121.5,0 121.5,-49"/>
<text text-anchor="start" x="28.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcFrameHandler</text>
<text text-anchor="start" x="70.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="36" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="57.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#666666" stroke="#666666" points="23.5,-31.5 23.5,-31.5 121.5,-31.5 121.5,-31.5 23.5,-31.5"/>
<polygon fill="#666666" stroke="#666666" points="23.5,-16.5 23.5,-16.5 121.5,-16.5 121.5,-16.5 23.5,-16.5"/>
<polygon fill="none" stroke="#666666" points="23.5,0 23.5,-49 121.5,-49 121.5,0 23.5,0"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="classDbcStatementHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="145,-149 0,-149 0,-85 145,-85 145,-149"/>
<text text-anchor="start" x="18.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">DbcStatementHandler</text>
<text text-anchor="start" x="71" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="4.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">~DbcStatementHandler()</text>
<text text-anchor="start" x="4.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-132 0.5,-132 145.5,-132 145.5,-132 0.5,-132"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-117 0.5,-117 145.5,-117 145.5,-117 0.5,-117"/>
<polygon fill="none" stroke="#bfbfbf" points="0,-85 0,-149 145,-149 145,-85 0,-85"/>
</a>
</g>
</g>
<!-- Node2&#45;&gt;Node1 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node2&#45;&gt;Node1</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M72.5,-74.77C72.5,-66.03 72.5,-57.09 72.5,-49.27"/>
<polygon fill="none" stroke="#63b8ff" points="69,-74.85 72.5,-84.86 76,-74.86 69,-74.85"/>
</a>
</g>
</g>
</g>
</svg>
</svg>
<style type='text/css'>
<![CDATA[
[data-mouse-over-selected='false'] { opacity: 0.7; }
[data-mouse-over-selected='true'] { opacity: 1.0; }
]]>
</style>
<script type="application/ecmascript"><![CDATA[
document.addEventListener('DOMContentLoaded', (event) => {
highlightEdges();
highlightAdjacentNodes();
});
]]></script>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: DbcFrameHandler Pages: 1 -->
<svg width="153pt" height="157pt"
viewBox="0.00 0.00 153.00 157.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 153)">
<title>DbcFrameHandler</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="transparent" points="121.5,-49 23.5,-49 23.5,0 121.5,0 121.5,-49"/>
<text text-anchor="start" x="28.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcFrameHandler</text>
<text text-anchor="start" x="70.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="36" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="57.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#666666" stroke="#666666" points="23.5,-31.5 23.5,-31.5 121.5,-31.5 121.5,-31.5 23.5,-31.5"/>
<polygon fill="#666666" stroke="#666666" points="23.5,-16.5 23.5,-16.5 121.5,-16.5 121.5,-16.5 23.5,-16.5"/>
<polygon fill="none" stroke="#666666" points="23.5,0 23.5,-49 121.5,-49 121.5,0 23.5,0"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="classDbcStatementHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="145,-149 0,-149 0,-85 145,-85 145,-149"/>
<text text-anchor="start" x="18.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">DbcStatementHandler</text>
<text text-anchor="start" x="71" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="4.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">~DbcStatementHandler()</text>
<text text-anchor="start" x="4.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-132 0.5,-132 145.5,-132 145.5,-132 0.5,-132"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-117 0.5,-117 145.5,-117 145.5,-117 0.5,-117"/>
<polygon fill="none" stroke="#bfbfbf" points="0,-85 0,-149 145,-149 145,-85 0,-85"/>
</a>
</g>
</g>
<!-- Node2&#45;&gt;Node1 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node2&#45;&gt;Node1</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M72.5,-74.77C72.5,-66.03 72.5,-57.09 72.5,-49.27"/>
<polygon fill="none" stroke="#63b8ff" points="69,-74.85 72.5,-84.86 76,-74.86 69,-74.85"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

+15 -8
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classDbcParser.html',''); initResizabl
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -95,7 +102,7 @@ $(document).ready(function(){initNavTree('classDbcParser.html',''); initResizabl
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+24 -17
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: DbcParser Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classDbcParser.html',''); initResizabl
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -97,28 +104,28 @@ $(document).ready(function(){initNavTree('classDbcParser.html',''); initResizabl
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:aef72826942c9095d653fafa435855e56"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structDbcDatabase.html">DbcDatabase</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a> (const std::string &amp;filePath) const</td></tr>
<tr class="memdesc:aef72826942c9095d653fafa435855e56"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parse DBC file. <a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">More...</a><br /></td></tr>
<tr class="memitem:aef72826942c9095d653fafa435855e56" id="r_aef72826942c9095d653fafa435855e56"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structDbcDatabase.html">DbcDatabase</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a> (const std::string &amp;filePath) const</td></tr>
<tr class="memdesc:aef72826942c9095d653fafa435855e56"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parse DBC file. <br /></td></tr>
<tr class="separator:aef72826942c9095d653fafa435855e56"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Minimal DBC parser. </p>
<p >Supports:</p><ul>
<div class="textblock"><p>Minimal DBC parser. </p>
<p>Supports:</p><ul>
<li>BO_</li>
<li>SG_</li>
<li>CM_ BO_</li>
<li>CM_ SG_</li>
</ul>
<p >Ignores:</p><ul>
<p>Ignores:</p><ul>
<li>attributes</li>
<li>multiplexing</li>
<li>value tables </li>
</ul>
<p class="definition">Definition at line <a class="el" href="dbc__parser_8h_source.html#l00035">35</a> of file <a class="el" href="dbc__parser_8h_source.html">dbc_parser.h</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__parser_8h_source.html#l00033">33</a> of file <a class="el" href="dbc__parser_8h_source.html">dbc_parser.h</a>.</p>
</div><h2 class="groupheader">Member Function Documentation</h2>
<a id="aef72826942c9095d653fafa435855e56" name="aef72826942c9095d653fafa435855e56"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aef72826942c9095d653fafa435855e56">&#9670;&nbsp;</a></span>ParseFile()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#aef72826942c9095d653fafa435855e56">&#9670;&#160;</a></span>ParseFile()</h2>
<div class="memitem">
<div class="memproto">
@@ -143,14 +150,14 @@ Public Member Functions</h2></td></tr>
<dl class="section return"><dt>Returns</dt><dd>Parsed database. </dd></dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">std::runtime_error</td><td>on file or parse errors. </td></tr>
<tr><td class="paramname">std::runtime_error</td><td>on file or parse errors. Line parse errors include the file path and one-based line number. </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="dbc__parser_8cpp_source.html#l00040">40</a> of file <a class="el" href="dbc__parser_8cpp_source.html">dbc_parser.cpp</a>.</p>
<p class="reference">References <a class="el" href="dbc__database_8h_source.html#l00023">DbcDatabase::frames</a>.</p>
<p class="reference">References <a class="el" href="dbc__statement__handler_8cpp_source.html#l00314">DbcStatementDispatcher::Dispatch()</a>.</p>
</div>
</div>
@@ -164,7 +171,7 @@ Public Member Functions</h2></td></tr>
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classDbcParser.html">DbcParser</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
@@ -0,0 +1,110 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcSignalHandler.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">DbcSignalHandler Member List</div></div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classDbcSignalHandler.html">DbcSignalHandler</a>, including all inherited members.</p>
<table class="directory">
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>Handle</b>(const std::string &amp;line, DbcParseContext &amp;context) const override (defined in <a class="el" href="classDbcSignalHandler.html">DbcSignalHandler</a>)</td><td class="entry"><a class="el" href="classDbcSignalHandler.html">DbcSignalHandler</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
<tr bgcolor="#f0f0f0" class="odd"><td class="entry"><b>~DbcStatementHandler</b>()=default (defined in <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>)</td><td class="entry"><a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
</table></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+170
View File
@@ -0,0 +1,170 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: DbcSignalHandler Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcSignalHandler.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classDbcSignalHandler-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">DbcSignalHandler Class Reference</div></div>
</div><!--header-->
<div class="contents">
<div id="dynsection-0" onclick="return toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;">
<img id="dynsection-0-trigger" src="closed.png" alt="+"/> Inheritance diagram for DbcSignalHandler:</div>
<div id="dynsection-0-summary" class="dynsummary" style="display:block;">
</div>
<div id="dynsection-0-content" class="dyncontent" style="display:none;">
<div class="center"><iframe scrolling="no" frameborder="0" src="classDbcSignalHandler__inherit__graph.svg" width="204" height="210"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:ad7d891ec1414fb645f85ccd410f2737b" id="r_ad7d891ec1414fb645f85ccd410f2737b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcSignalHandler.html#ad7d891ec1414fb645f85ccd410f2737b">Handle</a> (const std::string &amp;line, <a class="el" href="structDbcParseContext.html">DbcParseContext</a> &amp;context) const override</td></tr>
<tr class="separator:ad7d891ec1414fb645f85ccd410f2737b"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock">
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8h_source.html#l00030">30</a> of file <a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a>.</p>
</div><h2 class="groupheader">Member Function Documentation</h2>
<a id="ad7d891ec1414fb645f85ccd410f2737b" name="ad7d891ec1414fb645f85ccd410f2737b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad7d891ec1414fb645f85ccd410f2737b">&#9670;&#160;</a></span>Handle()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void DbcSignalHandler::Handle </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&#160;</td>
<td class="paramname"><em>line</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDbcParseContext.html">DbcParseContext</a> &amp;&#160;</td>
<td class="paramname"><em>context</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Implements <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00286">286</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li><a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a></li>
<li><a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classDbcSignalHandler.html">DbcSignalHandler</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
@@ -0,0 +1,5 @@
<map id="DbcSignalHandler" name="DbcSignalHandler">
<area shape="rect" id="Node000001" title=" " alt="" coords="37,139,167,204"/>
<area shape="rect" id="Node000002" href="$classDbcStatementHandler.html" title=" " alt="" coords="5,5,199,91"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="105,104,105,138,99,138,99,104"/>
</map>
@@ -0,0 +1 @@
9f75986e6e276d126dcdd20bd25bc7f7
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: DbcSignalHandler Pages: 1 -->
<svg width="153pt" height="157pt"
viewBox="0.00 0.00 153.00 157.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg id="main" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" onload="init(evt)">
<style type="text/css"><![CDATA[
.node, .edge {opacity: 0.7;}
.node.selected, .edge.selected {opacity: 1;}
.edge:hover path { stroke: red; }
.edge:hover polygon { stroke: red; fill: red; }
]]></style>
<script type="application/ecmascript" xlink:href="svg.min.js"/>
<svg id="graph" class="graph">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 153)">
<title>DbcSignalHandler</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="transparent" points="121.5,-49 23.5,-49 23.5,0 121.5,0 121.5,-49"/>
<text text-anchor="start" x="28.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcSignalHandler</text>
<text text-anchor="start" x="70.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="36" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="57.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#666666" stroke="#666666" points="23.5,-31.5 23.5,-31.5 121.5,-31.5 121.5,-31.5 23.5,-31.5"/>
<polygon fill="#666666" stroke="#666666" points="23.5,-16.5 23.5,-16.5 121.5,-16.5 121.5,-16.5 23.5,-16.5"/>
<polygon fill="none" stroke="#666666" points="23.5,0 23.5,-49 121.5,-49 121.5,0 23.5,0"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="classDbcStatementHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="145,-149 0,-149 0,-85 145,-85 145,-149"/>
<text text-anchor="start" x="18.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">DbcStatementHandler</text>
<text text-anchor="start" x="71" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="4.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">~DbcStatementHandler()</text>
<text text-anchor="start" x="4.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-132 0.5,-132 145.5,-132 145.5,-132 0.5,-132"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-117 0.5,-117 145.5,-117 145.5,-117 0.5,-117"/>
<polygon fill="none" stroke="#bfbfbf" points="0,-85 0,-149 145,-149 145,-85 0,-85"/>
</a>
</g>
</g>
<!-- Node2&#45;&gt;Node1 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node2&#45;&gt;Node1</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M72.5,-74.77C72.5,-66.03 72.5,-57.09 72.5,-49.27"/>
<polygon fill="none" stroke="#63b8ff" points="69,-74.85 72.5,-84.86 76,-74.86 69,-74.85"/>
</a>
</g>
</g>
</g>
</svg>
</svg>
<style type='text/css'>
<![CDATA[
[data-mouse-over-selected='false'] { opacity: 0.7; }
[data-mouse-over-selected='true'] { opacity: 1.0; }
]]>
</style>
<script type="application/ecmascript"><![CDATA[
document.addEventListener('DOMContentLoaded', (event) => {
highlightEdges();
highlightAdjacentNodes();
});
]]></script>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: DbcSignalHandler Pages: 1 -->
<svg width="153pt" height="157pt"
viewBox="0.00 0.00 153.00 157.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 153)">
<title>DbcSignalHandler</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="transparent" points="121.5,-49 23.5,-49 23.5,0 121.5,0 121.5,-49"/>
<text text-anchor="start" x="28.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcSignalHandler</text>
<text text-anchor="start" x="70.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="36" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="57.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#666666" stroke="#666666" points="23.5,-31.5 23.5,-31.5 121.5,-31.5 121.5,-31.5 23.5,-31.5"/>
<polygon fill="#666666" stroke="#666666" points="23.5,-16.5 23.5,-16.5 121.5,-16.5 121.5,-16.5 23.5,-16.5"/>
<polygon fill="none" stroke="#666666" points="23.5,0 23.5,-49 121.5,-49 121.5,0 23.5,0"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="classDbcStatementHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="145,-149 0,-149 0,-85 145,-85 145,-149"/>
<text text-anchor="start" x="18.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">DbcStatementHandler</text>
<text text-anchor="start" x="71" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="4.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00">~DbcStatementHandler()</text>
<text text-anchor="start" x="4.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-92" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-132 0.5,-132 145.5,-132 145.5,-132 0.5,-132"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-117 0.5,-117 145.5,-117 145.5,-117 0.5,-117"/>
<polygon fill="none" stroke="#bfbfbf" points="0,-85 0,-149 145,-149 145,-85 0,-85"/>
</a>
</g>
</g>
<!-- Node2&#45;&gt;Node1 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node2&#45;&gt;Node1</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M72.5,-74.77C72.5,-66.03 72.5,-57.09 72.5,-49.27"/>
<polygon fill="none" stroke="#63b8ff" points="69,-74.85 72.5,-84.86 76,-74.86 69,-74.85"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

@@ -0,0 +1,111 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcStatementDispatcher.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">DbcStatementDispatcher Member List</div></div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a>, including all inherited members.</p>
<table class="directory">
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DbcStatementDispatcher</b>() (defined in <a class="el" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a>)</td><td class="entry"><a class="el" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(const std::string &amp;line, DbcParseContext &amp;context) const</td><td class="entry"><a class="el" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></td><td class="entry"></td></tr>
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RegisterType</b>(const std::string &amp;keyword) (defined in <a class="el" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a>)</td><td class="entry"><a class="el" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
</table></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+212
View File
@@ -0,0 +1,212 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: DbcStatementDispatcher Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcStatementDispatcher.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classDbcStatementDispatcher-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">DbcStatementDispatcher Class Reference</div></div>
</div><!--header-->
<div class="contents">
<p><code>#include &lt;<a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a>&gt;</code></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a2c6e9a614ed747275d43bcccc50d0b2d" id="r_a2c6e9a614ed747275d43bcccc50d0b2d"><td class="memTemplParams" colspan="2">template&lt;class Handler &gt; </td></tr>
<tr class="memitem:a2c6e9a614ed747275d43bcccc50d0b2d"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classDbcStatementDispatcher.html#a2c6e9a614ed747275d43bcccc50d0b2d">RegisterType</a> (const std::string &amp;keyword)</td></tr>
<tr class="separator:a2c6e9a614ed747275d43bcccc50d0b2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a495c2d5c7ebb8103b1987cdd87c142ed" id="r_a495c2d5c7ebb8103b1987cdd87c142ed"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a> (const std::string &amp;line, <a class="el" href="structDbcParseContext.html">DbcParseContext</a> &amp;context) const</td></tr>
<tr class="separator:a495c2d5c7ebb8103b1987cdd87c142ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Exact-key dispatch to handlers created once per registration via <a class="el" href="classTypeFactory.html" title="Registry-based factory for creating objects by runtime identifier.">TypeFactory</a>. </p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8h_source.html#l00047">47</a> of file <a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a2f064359b59d8644b8a8196653d47482" name="a2f064359b59d8644b8a8196653d47482"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2f064359b59d8644b8a8196653d47482">&#9670;&#160;</a></span>DbcStatementDispatcher()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">DbcStatementDispatcher::DbcStatementDispatcher </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00308">308</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a2c6e9a614ed747275d43bcccc50d0b2d" name="a2c6e9a614ed747275d43bcccc50d0b2d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2c6e9a614ed747275d43bcccc50d0b2d">&#9670;&#160;</a></span>RegisterType()</h2>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class Handler &gt; </div>
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void DbcStatementDispatcher::RegisterType </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&#160;</td>
<td class="paramname"><em>keyword</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8h_source.html#l00052">52</a> of file <a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a>.</p>
</div>
</div>
<a id="a495c2d5c7ebb8103b1987cdd87c142ed" name="a495c2d5c7ebb8103b1987cdd87c142ed"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a495c2d5c7ebb8103b1987cdd87c142ed">&#9670;&#160;</a></span>Dispatch()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool DbcStatementDispatcher::Dispatch </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&#160;</td>
<td class="paramname"><em>line</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDbcParseContext.html">DbcParseContext</a> &amp;&#160;</td>
<td class="paramname"><em>context</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p>Returns false for an unregistered keyword; input must be trimmed. </p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00314">314</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__parser_8cpp_source.html#l00040">DbcParser::ParseFile()</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li><a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a></li>
<li><a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+4
View File
@@ -0,0 +1,4 @@
var classDbcStatementDispatcher =
[
[ "Dispatch", "classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed", null ]
];
@@ -0,0 +1,110 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcStatementHandler.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">DbcStatementHandler Member List</div></div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>, including all inherited members.</p>
<table class="directory">
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>Handle</b>(const std::string &amp;line, DbcParseContext &amp;context) const =0 (defined in <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>)</td><td class="entry"><a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
<tr bgcolor="#f0f0f0" class="odd"><td class="entry"><b>~DbcStatementHandler</b>()=default (defined in <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>)</td><td class="entry"><a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
</table></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+129
View File
@@ -0,0 +1,129 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: DbcStatementHandler Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classDbcStatementHandler.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classDbcStatementHandler-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">DbcStatementHandler Class Reference<span class="mlabels"><span class="mlabel">abstract</span></span></div></div>
</div><!--header-->
<div class="contents">
<div id="dynsection-0" onclick="return toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;">
<img id="dynsection-0-trigger" src="closed.png" alt="+"/> Inheritance diagram for DbcStatementHandler:</div>
<div id="dynsection-0-summary" class="dynsummary" style="display:block;">
</div>
<div id="dynsection-0-content" class="dyncontent" style="display:none;">
<div class="center"><iframe scrolling="no" frameborder="0" src="classDbcStatementHandler__inherit__graph.svg" width="648" height="250"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a3de86e1e27e9bcb0fe6f1460a8ba5739" id="r_a3de86e1e27e9bcb0fe6f1460a8ba5739"><td class="memItemLeft" align="right" valign="top"><a id="a3de86e1e27e9bcb0fe6f1460a8ba5739" name="a3de86e1e27e9bcb0fe6f1460a8ba5739"></a>
virtual void&#160;</td><td class="memItemRight" valign="bottom"><b>Handle</b> (const std::string &amp;line, <a class="el" href="structDbcParseContext.html">DbcParseContext</a> &amp;context) const =0</td></tr>
<tr class="separator:a3de86e1e27e9bcb0fe6f1460a8ba5739"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock">
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8h_source.html#l00016">16</a> of file <a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a>.</p>
</div><hr/>The documentation for this class was generated from the following file:<ul>
<li><a class="el" href="dbc__statement__handler_8h_source.html">dbc_statement_handler.h</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
@@ -0,0 +1,11 @@
<map id="DbcStatementHandler" name="DbcStatementHandler">
<area shape="rect" id="Node000001" title=" " alt="" coords="241,5,435,91"/>
<area shape="rect" id="Node000002" title=" " alt="" coords="5,139,153,244"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="245,99,167,141,155,148,152,143,165,136,243,95"/>
<area shape="rect" id="Node000003" href="$classDbcCommentHandler.html" title=" " alt="" coords="178,159,333,224"/>
<area shape="poly" id="edge2_Node000001_Node000003" title=" " alt="" coords="309,104,276,160,272,157,304,101"/>
<area shape="rect" id="Node000004" href="$classDbcFrameHandler.html" title=" " alt="" coords="357,159,487,224"/>
<area shape="poly" id="edge3_Node000001_Node000004" title=" " alt="" coords="372,101,405,157,401,160,367,104"/>
<area shape="rect" id="Node000005" href="$classDbcSignalHandler.html" title=" " alt="" coords="511,159,642,224"/>
<area shape="poly" id="edge4_Node000001_Node000005" title=" " alt="" coords="429,95,501,136,532,156,529,161,498,141,427,100"/>
</map>
@@ -0,0 +1 @@
318e71b72eb76e120faf9a4f760373e7
@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: DbcStatementHandler Pages: 1 -->
<svg width="486pt" height="187pt"
viewBox="0.00 0.00 485.50 187.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg id="main" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" onload="init(evt)">
<style type="text/css"><![CDATA[
.node, .edge {opacity: 0.7;}
.node.selected, .edge.selected {opacity: 1;}
.edge:hover path { stroke: red; }
.edge:hover polygon { stroke: red; fill: red; }
]]></style>
<script type="application/ecmascript" xlink:href="svg.min.js"/>
<svg id="graph" class="graph">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 183)">
<title>DbcStatementHandler</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="transparent" points="322,-179 177,-179 177,-115 322,-115 322,-179"/>
<text text-anchor="start" x="195.5" y="-167" font-family="Helvetica,sans-Serif" font-size="10.00">DbcStatementHandler</text>
<text text-anchor="start" x="248" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="181.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="194.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">~DbcStatementHandler()</text>
<text text-anchor="start" x="181.5" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="194.5" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#666666" stroke="#666666" points="177.5,-162 177.5,-162 322.5,-162 322.5,-162 177.5,-162"/>
<polygon fill="#666666" stroke="#666666" points="177.5,-147 177.5,-147 322.5,-147 322.5,-147 177.5,-147"/>
<polygon fill="none" stroke="#666666" points="177,-115 177,-179 322,-179 322,-115 177,-115"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:title=" ">
<polygon fill="white" stroke="transparent" points="111,-79 0,-79 0,0 111,0 111,-79"/>
<text text-anchor="start" x="15" y="-66.5" font-family="Helvetica,sans-Serif" font-size="10.00">CountingHandler</text>
<text text-anchor="start" x="4.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">instances</text>
<text text-anchor="start" x="4.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">calls</text>
<text text-anchor="start" x="4.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">CountingHandler()</text>
<text text-anchor="start" x="4.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-61.5 0.5,-61.5 111.5,-61.5 111.5,-61.5 0.5,-61.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-31.5 0.5,-31.5 15.5,-31.5 15.5,-31.5 0.5,-31.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="15.5,-31.5 15.5,-31.5 111.5,-31.5 111.5,-31.5 15.5,-31.5"/>
<polygon fill="none" stroke="#bfbfbf" points="0,0 0,-79 111,-79 111,0 0,0"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node2 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node1&#45;&gt;Node2</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M179.14,-110.36C160,-100.42 139.36,-89.47 120.5,-79 117.4,-77.28 114.24,-75.5 111.05,-73.68"/>
<polygon fill="none" stroke="#63b8ff" points="177.61,-113.51 188.1,-115 180.83,-107.29 177.61,-113.51"/>
</a>
</g>
</g>
<!-- Node3 -->
<g id="Node000003" class="node">
<title>Node3</title>
<g id="a_Node000003"><a xlink:href="classDbcCommentHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="245.5,-64 129.5,-64 129.5,-15 245.5,-15 245.5,-64"/>
<text text-anchor="start" x="134.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcCommentHandler</text>
<text text-anchor="start" x="185.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="146.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="172.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="129.5,-46.5 129.5,-46.5 245.5,-46.5 245.5,-46.5 129.5,-46.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="129.5,-31.5 129.5,-31.5 245.5,-31.5 245.5,-31.5 129.5,-31.5"/>
<polygon fill="none" stroke="#bfbfbf" points="129.5,-15 129.5,-64 245.5,-64 245.5,-15 129.5,-15"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node3 -->
<g id="edge2_Node000001_Node000003" class="edge">
<title>Node1&#45;&gt;Node3</title>
<g id="a_edge2_Node000001_Node000003"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M225.95,-105.93C217.71,-91.9 208.72,-76.61 201.51,-64.33"/>
<polygon fill="none" stroke="#63b8ff" points="223.15,-108.07 231.23,-114.92 229.18,-104.52 223.15,-108.07"/>
</a>
</g>
</g>
<!-- Node4 -->
<g id="Node000004" class="node">
<title>Node4</title>
<g id="a_Node000004"><a xlink:href="classDbcFrameHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="361.5,-64 263.5,-64 263.5,-15 361.5,-15 361.5,-64"/>
<text text-anchor="start" x="268.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcFrameHandler</text>
<text text-anchor="start" x="310.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="276" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="297.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="263.5,-46.5 263.5,-46.5 361.5,-46.5 361.5,-46.5 263.5,-46.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="263.5,-31.5 263.5,-31.5 361.5,-31.5 361.5,-31.5 263.5,-31.5"/>
<polygon fill="none" stroke="#bfbfbf" points="263.5,-15 263.5,-64 361.5,-64 361.5,-15 263.5,-15"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node4 -->
<g id="edge3_Node000001_Node000004" class="edge">
<title>Node1&#45;&gt;Node4</title>
<g id="a_edge3_Node000001_Node000004"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M273.19,-106.33C281.63,-92.19 290.87,-76.72 298.27,-64.33"/>
<polygon fill="none" stroke="#63b8ff" points="270.18,-104.54 268.06,-114.92 276.19,-108.13 270.18,-104.54"/>
</a>
</g>
</g>
<!-- Node5 -->
<g id="Node000005" class="node">
<title>Node5</title>
<g id="a_Node000005"><a xlink:href="classDbcSignalHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="477.5,-64 379.5,-64 379.5,-15 477.5,-15 477.5,-64"/>
<text text-anchor="start" x="384.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcSignalHandler</text>
<text text-anchor="start" x="426.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="392" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="413.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="379.5,-46.5 379.5,-46.5 477.5,-46.5 477.5,-46.5 379.5,-46.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="379.5,-31.5 379.5,-31.5 477.5,-31.5 477.5,-31.5 379.5,-31.5"/>
<polygon fill="none" stroke="#bfbfbf" points="379.5,-15 379.5,-64 477.5,-64 477.5,-15 379.5,-15"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node5 -->
<g id="edge4_Node000001_Node000005" class="edge">
<title>Node1&#45;&gt;Node5</title>
<g id="a_edge4_Node000001_Node000005"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M316.97,-109.9C334.55,-100.14 353.37,-89.4 370.5,-79 378.14,-74.36 386.22,-69.18 393.83,-64.17"/>
<polygon fill="none" stroke="#63b8ff" points="314.96,-107 307.9,-114.9 318.34,-113.13 314.96,-107"/>
</a>
</g>
</g>
</g>
</svg>
</svg>
<style type='text/css'>
<![CDATA[
[data-mouse-over-selected='false'] { opacity: 0.7; }
[data-mouse-over-selected='true'] { opacity: 1.0; }
]]>
</style>
<script type="application/ecmascript"><![CDATA[
document.addEventListener('DOMContentLoaded', (event) => {
highlightEdges();
highlightAdjacentNodes();
});
]]></script>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: DbcStatementHandler Pages: 1 -->
<svg width="486pt" height="187pt"
viewBox="0.00 0.00 485.50 187.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 183)">
<title>DbcStatementHandler</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="transparent" points="322,-179 177,-179 177,-115 322,-115 322,-179"/>
<text text-anchor="start" x="195.5" y="-167" font-family="Helvetica,sans-Serif" font-size="10.00">DbcStatementHandler</text>
<text text-anchor="start" x="248" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="181.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="194.5" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00">~DbcStatementHandler()</text>
<text text-anchor="start" x="181.5" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="194.5" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#666666" stroke="#666666" points="177.5,-162 177.5,-162 322.5,-162 322.5,-162 177.5,-162"/>
<polygon fill="#666666" stroke="#666666" points="177.5,-147 177.5,-147 322.5,-147 322.5,-147 177.5,-147"/>
<polygon fill="none" stroke="#666666" points="177,-115 177,-179 322,-179 322,-115 177,-115"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:title=" ">
<polygon fill="white" stroke="transparent" points="111,-79 0,-79 0,0 111,0 111,-79"/>
<text text-anchor="start" x="15" y="-66.5" font-family="Helvetica,sans-Serif" font-size="10.00">CountingHandler</text>
<text text-anchor="start" x="4.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">instances</text>
<text text-anchor="start" x="4.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00">calls</text>
<text text-anchor="start" x="4.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">CountingHandler()</text>
<text text-anchor="start" x="4.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="17.5" y="-6.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-61.5 0.5,-61.5 111.5,-61.5 111.5,-61.5 0.5,-61.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="0.5,-31.5 0.5,-31.5 15.5,-31.5 15.5,-31.5 0.5,-31.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="15.5,-31.5 15.5,-31.5 111.5,-31.5 111.5,-31.5 15.5,-31.5"/>
<polygon fill="none" stroke="#bfbfbf" points="0,0 0,-79 111,-79 111,0 0,0"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node2 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node1&#45;&gt;Node2</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M179.14,-110.36C160,-100.42 139.36,-89.47 120.5,-79 117.4,-77.28 114.24,-75.5 111.05,-73.68"/>
<polygon fill="none" stroke="#63b8ff" points="177.61,-113.51 188.1,-115 180.83,-107.29 177.61,-113.51"/>
</a>
</g>
</g>
<!-- Node3 -->
<g id="Node000003" class="node">
<title>Node3</title>
<g id="a_Node000003"><a xlink:href="classDbcCommentHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="245.5,-64 129.5,-64 129.5,-15 245.5,-15 245.5,-64"/>
<text text-anchor="start" x="134.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcCommentHandler</text>
<text text-anchor="start" x="185.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="146.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="172.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="129.5,-46.5 129.5,-46.5 245.5,-46.5 245.5,-46.5 129.5,-46.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="129.5,-31.5 129.5,-31.5 245.5,-31.5 245.5,-31.5 129.5,-31.5"/>
<polygon fill="none" stroke="#bfbfbf" points="129.5,-15 129.5,-64 245.5,-64 245.5,-15 129.5,-15"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node3 -->
<g id="edge2_Node000001_Node000003" class="edge">
<title>Node1&#45;&gt;Node3</title>
<g id="a_edge2_Node000001_Node000003"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M225.95,-105.93C217.71,-91.9 208.72,-76.61 201.51,-64.33"/>
<polygon fill="none" stroke="#63b8ff" points="223.15,-108.07 231.23,-114.92 229.18,-104.52 223.15,-108.07"/>
</a>
</g>
</g>
<!-- Node4 -->
<g id="Node000004" class="node">
<title>Node4</title>
<g id="a_Node000004"><a xlink:href="classDbcFrameHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="361.5,-64 263.5,-64 263.5,-15 361.5,-15 361.5,-64"/>
<text text-anchor="start" x="268.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcFrameHandler</text>
<text text-anchor="start" x="310.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="276" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="297.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="263.5,-46.5 263.5,-46.5 361.5,-46.5 361.5,-46.5 263.5,-46.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="263.5,-31.5 263.5,-31.5 361.5,-31.5 361.5,-31.5 263.5,-31.5"/>
<polygon fill="none" stroke="#bfbfbf" points="263.5,-15 263.5,-64 361.5,-64 361.5,-15 263.5,-15"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node4 -->
<g id="edge3_Node000001_Node000004" class="edge">
<title>Node1&#45;&gt;Node4</title>
<g id="a_edge3_Node000001_Node000004"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M273.19,-106.33C281.63,-92.19 290.87,-76.72 298.27,-64.33"/>
<polygon fill="none" stroke="#63b8ff" points="270.18,-104.54 268.06,-114.92 276.19,-108.13 270.18,-104.54"/>
</a>
</g>
</g>
<!-- Node5 -->
<g id="Node000005" class="node">
<title>Node5</title>
<g id="a_Node000005"><a xlink:href="classDbcSignalHandler.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="477.5,-64 379.5,-64 379.5,-15 477.5,-15 477.5,-64"/>
<text text-anchor="start" x="384.5" y="-51.5" font-family="Helvetica,sans-Serif" font-size="10.00">DbcSignalHandler</text>
<text text-anchor="start" x="426.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00"> </text>
<text text-anchor="start" x="392" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="413.5" y="-21.5" font-family="Helvetica,sans-Serif" font-size="10.00">Handle()</text>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="379.5,-46.5 379.5,-46.5 477.5,-46.5 477.5,-46.5 379.5,-46.5"/>
<polygon fill="#bfbfbf" stroke="#bfbfbf" points="379.5,-31.5 379.5,-31.5 477.5,-31.5 477.5,-31.5 379.5,-31.5"/>
<polygon fill="none" stroke="#bfbfbf" points="379.5,-15 379.5,-64 477.5,-64 477.5,-15 379.5,-15"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node5 -->
<g id="edge4_Node000001_Node000005" class="edge">
<title>Node1&#45;&gt;Node5</title>
<g id="a_edge4_Node000001_Node000005"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M316.97,-109.9C334.55,-100.14 353.37,-89.4 370.5,-79 378.14,-74.36 386.22,-69.18 393.83,-64.17"/>
<polygon fill="none" stroke="#63b8ff" points="314.96,-107 307.9,-114.9 318.34,-113.13 314.96,-107"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

+15 -8
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classDbcTreeBuilder.html',''); initRes
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -95,7 +102,7 @@ $(document).ready(function(){initNavTree('classDbcTreeBuilder.html',''); initRes
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+19 -12
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: DbcTreeBuilder Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classDbcTreeBuilder.html',''); initRes
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -97,17 +104,17 @@ $(document).ready(function(){initNavTree('classDbcTreeBuilder.html',''); initRes
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a7e57d067d831b14b383947fd125edd4b"><td class="memItemLeft" align="right" valign="top">std::unique_ptr&lt; <a class="el" href="classTreeNode.html">TreeNode</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">Build</a> (const <a class="el" href="structDbcDatabase.html">DbcDatabase</a> &amp;database) const</td></tr>
<tr class="memdesc:a7e57d067d831b14b383947fd125edd4b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Build tree representation of parsed DBC data. <a href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">More...</a><br /></td></tr>
<tr class="memitem:a7e57d067d831b14b383947fd125edd4b" id="r_a7e57d067d831b14b383947fd125edd4b"><td class="memItemLeft" align="right" valign="top">std::unique_ptr&lt; <a class="el" href="classTreeNode.html">TreeNode</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">Build</a> (const <a class="el" href="structDbcDatabase.html">DbcDatabase</a> &amp;database) const</td></tr>
<tr class="memdesc:a7e57d067d831b14b383947fd125edd4b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Build tree representation of parsed DBC data. <br /></td></tr>
<tr class="separator:a7e57d067d831b14b383947fd125edd4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Builds a simple tree from parsed DBC database. </p>
<div class="textblock"><p>Builds a simple tree from parsed DBC database. </p>
<p class="definition">Definition at line <a class="el" href="dbc__tree__builder_8h_source.html#l00023">23</a> of file <a class="el" href="dbc__tree__builder_8h_source.html">dbc_tree_builder.h</a>.</p>
</div><h2 class="groupheader">Member Function Documentation</h2>
<a id="a7e57d067d831b14b383947fd125edd4b" name="a7e57d067d831b14b383947fd125edd4b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7e57d067d831b14b383947fd125edd4b">&#9670;&nbsp;</a></span>Build()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#a7e57d067d831b14b383947fd125edd4b">&#9670;&#160;</a></span>Build()</h2>
<div class="memitem">
<div class="memproto">
@@ -147,7 +154,7 @@ Public Member Functions</h2></td></tr>
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classDbcTreeBuilder.html">DbcTreeBuilder</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+15 -8
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classTreeNode.html',''); initResizable
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -110,7 +117,7 @@ $(document).ready(function(){initNavTree('classTreeNode.html',''); initResizable
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+63 -56
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: TreeNode Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classTreeNode.html',''); initResizable
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -97,59 +104,59 @@ $(document).ready(function(){initNavTree('classTreeNode.html',''); initResizable
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a984a98d5ccf7ef1f5a18094c6821f35d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a984a98d5ccf7ef1f5a18094c6821f35d">TreeNode</a> ()</td></tr>
<tr class="memdesc:a984a98d5ccf7ef1f5a18094c6821f35d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create root node. <a href="classTreeNode.html#a984a98d5ccf7ef1f5a18094c6821f35d">More...</a><br /></td></tr>
<tr class="memitem:a984a98d5ccf7ef1f5a18094c6821f35d" id="r_a984a98d5ccf7ef1f5a18094c6821f35d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a984a98d5ccf7ef1f5a18094c6821f35d">TreeNode</a> ()</td></tr>
<tr class="memdesc:a984a98d5ccf7ef1f5a18094c6821f35d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create root node. <br /></td></tr>
<tr class="separator:a984a98d5ccf7ef1f5a18094c6821f35d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8e38dd591d8801d7ee3a7dbad90c67fc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a8e38dd591d8801d7ee3a7dbad90c67fc">TreeNode</a> (const <a class="el" href="structFrameInfo.html">FrameInfo</a> &amp;frame)</td></tr>
<tr class="memdesc:a8e38dd591d8801d7ee3a7dbad90c67fc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create frame node. <a href="classTreeNode.html#a8e38dd591d8801d7ee3a7dbad90c67fc">More...</a><br /></td></tr>
<tr class="memitem:a8e38dd591d8801d7ee3a7dbad90c67fc" id="r_a8e38dd591d8801d7ee3a7dbad90c67fc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a8e38dd591d8801d7ee3a7dbad90c67fc">TreeNode</a> (const <a class="el" href="structFrameInfo.html">FrameInfo</a> &amp;frame)</td></tr>
<tr class="memdesc:a8e38dd591d8801d7ee3a7dbad90c67fc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create frame node. <br /></td></tr>
<tr class="separator:a8e38dd591d8801d7ee3a7dbad90c67fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab9f00f5253d56461bb2d420fd639c5ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#ab9f00f5253d56461bb2d420fd639c5ae">TreeNode</a> (const <a class="el" href="structSignalInfo.html">SignalInfo</a> &amp;signal)</td></tr>
<tr class="memdesc:ab9f00f5253d56461bb2d420fd639c5ae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create signal node. <a href="classTreeNode.html#ab9f00f5253d56461bb2d420fd639c5ae">More...</a><br /></td></tr>
<tr class="memitem:ab9f00f5253d56461bb2d420fd639c5ae" id="r_ab9f00f5253d56461bb2d420fd639c5ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#ab9f00f5253d56461bb2d420fd639c5ae">TreeNode</a> (const <a class="el" href="structSignalInfo.html">SignalInfo</a> &amp;signal)</td></tr>
<tr class="memdesc:ab9f00f5253d56461bb2d420fd639c5ae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create signal node. <br /></td></tr>
<tr class="separator:ab9f00f5253d56461bb2d420fd639c5ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4d3054a033accf3e38ea132002fc35ff"><td class="memItemLeft" align="right" valign="top"><a id="a4d3054a033accf3e38ea132002fc35ff" name="a4d3054a033accf3e38ea132002fc35ff"></a>
<tr class="memitem:a4d3054a033accf3e38ea132002fc35ff" id="r_a4d3054a033accf3e38ea132002fc35ff"><td class="memItemLeft" align="right" valign="top"><a id="a4d3054a033accf3e38ea132002fc35ff" name="a4d3054a033accf3e38ea132002fc35ff"></a>
&#160;</td><td class="memItemRight" valign="bottom"><b>TreeNode</b> (const <a class="el" href="classTreeNode.html">TreeNode</a> &amp;)=delete</td></tr>
<tr class="separator:a4d3054a033accf3e38ea132002fc35ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad6ce97dcf532b452d520452b6d000daa"><td class="memItemLeft" align="right" valign="top"><a id="ad6ce97dcf532b452d520452b6d000daa" name="ad6ce97dcf532b452d520452b6d000daa"></a>
<tr class="memitem:ad6ce97dcf532b452d520452b6d000daa" id="r_ad6ce97dcf532b452d520452b6d000daa"><td class="memItemLeft" align="right" valign="top"><a id="ad6ce97dcf532b452d520452b6d000daa" name="ad6ce97dcf532b452d520452b6d000daa"></a>
<a class="el" href="classTreeNode.html">TreeNode</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="classTreeNode.html">TreeNode</a> &amp;)=delete</td></tr>
<tr class="separator:ad6ce97dcf532b452d520452b6d000daa"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a35724af755b5d0c43de40a723ef81ec1"><td class="memItemLeft" align="right" valign="top"><a id="a35724af755b5d0c43de40a723ef81ec1" name="a35724af755b5d0c43de40a723ef81ec1"></a>
<tr class="memitem:a35724af755b5d0c43de40a723ef81ec1" id="r_a35724af755b5d0c43de40a723ef81ec1"><td class="memItemLeft" align="right" valign="top"><a id="a35724af755b5d0c43de40a723ef81ec1" name="a35724af755b5d0c43de40a723ef81ec1"></a>
&#160;</td><td class="memItemRight" valign="bottom"><b>TreeNode</b> (<a class="el" href="classTreeNode.html">TreeNode</a> &amp;&amp;)=default</td></tr>
<tr class="separator:a35724af755b5d0c43de40a723ef81ec1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a88fbcbec9c64d888b19c5edb95059a95"><td class="memItemLeft" align="right" valign="top"><a id="a88fbcbec9c64d888b19c5edb95059a95" name="a88fbcbec9c64d888b19c5edb95059a95"></a>
<tr class="memitem:a88fbcbec9c64d888b19c5edb95059a95" id="r_a88fbcbec9c64d888b19c5edb95059a95"><td class="memItemLeft" align="right" valign="top"><a id="a88fbcbec9c64d888b19c5edb95059a95" name="a88fbcbec9c64d888b19c5edb95059a95"></a>
<a class="el" href="classTreeNode.html">TreeNode</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><b>operator=</b> (<a class="el" href="classTreeNode.html">TreeNode</a> &amp;&amp;)=default</td></tr>
<tr class="separator:a88fbcbec9c64d888b19c5edb95059a95"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6161f2ebb92184eab4215d121870e788"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a6161f2ebb92184eab4215d121870e788">AddChild</a> (std::unique_ptr&lt; <a class="el" href="classTreeNode.html">TreeNode</a> &gt; child)</td></tr>
<tr class="memdesc:a6161f2ebb92184eab4215d121870e788"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add child node. <a href="classTreeNode.html#a6161f2ebb92184eab4215d121870e788">More...</a><br /></td></tr>
<tr class="memitem:a6161f2ebb92184eab4215d121870e788" id="r_a6161f2ebb92184eab4215d121870e788"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a6161f2ebb92184eab4215d121870e788">AddChild</a> (std::unique_ptr&lt; <a class="el" href="classTreeNode.html">TreeNode</a> &gt; child)</td></tr>
<tr class="memdesc:a6161f2ebb92184eab4215d121870e788"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add child node. <br /></td></tr>
<tr class="separator:a6161f2ebb92184eab4215d121870e788"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abdd82460187dca8d3e5d66f5d5c529ea"><td class="memItemLeft" align="right" valign="top">std::size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#abdd82460187dca8d3e5d66f5d5c529ea">GetChildCount</a> () const</td></tr>
<tr class="memdesc:abdd82460187dca8d3e5d66f5d5c529ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get child count. <a href="classTreeNode.html#abdd82460187dca8d3e5d66f5d5c529ea">More...</a><br /></td></tr>
<tr class="memitem:abdd82460187dca8d3e5d66f5d5c529ea" id="r_abdd82460187dca8d3e5d66f5d5c529ea"><td class="memItemLeft" align="right" valign="top">std::size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#abdd82460187dca8d3e5d66f5d5c529ea">GetChildCount</a> () const</td></tr>
<tr class="memdesc:abdd82460187dca8d3e5d66f5d5c529ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get child count. <br /></td></tr>
<tr class="separator:abdd82460187dca8d3e5d66f5d5c529ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4727ff801a2d1b9323c5ae50a35457a6"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classTreeNode.html">TreeNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6">GetChild</a> (std::size_t index) const</td></tr>
<tr class="memdesc:a4727ff801a2d1b9323c5ae50a35457a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get child by index. <a href="classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6">More...</a><br /></td></tr>
<tr class="memitem:a4727ff801a2d1b9323c5ae50a35457a6" id="r_a4727ff801a2d1b9323c5ae50a35457a6"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classTreeNode.html">TreeNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6">GetChild</a> (std::size_t index) const</td></tr>
<tr class="memdesc:a4727ff801a2d1b9323c5ae50a35457a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get child by index. <br /></td></tr>
<tr class="separator:a4727ff801a2d1b9323c5ae50a35457a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a81047bd7d2a4cc96b9ef5e20d0d63b5f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classTreeNode.html">TreeNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a81047bd7d2a4cc96b9ef5e20d0d63b5f">GetChild</a> (std::size_t index)</td></tr>
<tr class="memdesc:a81047bd7d2a4cc96b9ef5e20d0d63b5f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get mutable child by index. <a href="classTreeNode.html#a81047bd7d2a4cc96b9ef5e20d0d63b5f">More...</a><br /></td></tr>
<tr class="memitem:a81047bd7d2a4cc96b9ef5e20d0d63b5f" id="r_a81047bd7d2a4cc96b9ef5e20d0d63b5f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classTreeNode.html">TreeNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a81047bd7d2a4cc96b9ef5e20d0d63b5f">GetChild</a> (std::size_t index)</td></tr>
<tr class="memdesc:a81047bd7d2a4cc96b9ef5e20d0d63b5f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get mutable child by index. <br /></td></tr>
<tr class="separator:a81047bd7d2a4cc96b9ef5e20d0d63b5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afa2f4b0aafa12d3d41ed00df8e0250c9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16">NodeType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#afa2f4b0aafa12d3d41ed00df8e0250c9">GetType</a> () const</td></tr>
<tr class="memdesc:afa2f4b0aafa12d3d41ed00df8e0250c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get node type. <a href="classTreeNode.html#afa2f4b0aafa12d3d41ed00df8e0250c9">More...</a><br /></td></tr>
<tr class="memitem:afa2f4b0aafa12d3d41ed00df8e0250c9" id="r_afa2f4b0aafa12d3d41ed00df8e0250c9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16">NodeType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#afa2f4b0aafa12d3d41ed00df8e0250c9">GetType</a> () const</td></tr>
<tr class="memdesc:afa2f4b0aafa12d3d41ed00df8e0250c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get node type. <br /></td></tr>
<tr class="separator:afa2f4b0aafa12d3d41ed00df8e0250c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaac5b8d9dc9e5ae1f367d1adbcf20e18"><td class="memItemLeft" align="right" valign="top">const std::string &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#aaac5b8d9dc9e5ae1f367d1adbcf20e18">GetName</a> () const</td></tr>
<tr class="memdesc:aaac5b8d9dc9e5ae1f367d1adbcf20e18"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get display name. <a href="classTreeNode.html#aaac5b8d9dc9e5ae1f367d1adbcf20e18">More...</a><br /></td></tr>
<tr class="memitem:aaac5b8d9dc9e5ae1f367d1adbcf20e18" id="r_aaac5b8d9dc9e5ae1f367d1adbcf20e18"><td class="memItemLeft" align="right" valign="top">const std::string &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#aaac5b8d9dc9e5ae1f367d1adbcf20e18">GetName</a> () const</td></tr>
<tr class="memdesc:aaac5b8d9dc9e5ae1f367d1adbcf20e18"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get display name. <br /></td></tr>
<tr class="separator:aaac5b8d9dc9e5ae1f367d1adbcf20e18"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afc503b40004764163605d6dbdb4ef811"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structFrameInfo.html">FrameInfo</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#afc503b40004764163605d6dbdb4ef811">GetFrame</a> () const</td></tr>
<tr class="memdesc:afc503b40004764163605d6dbdb4ef811"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get frame payload if node is frame. <a href="classTreeNode.html#afc503b40004764163605d6dbdb4ef811">More...</a><br /></td></tr>
<tr class="memitem:afc503b40004764163605d6dbdb4ef811" id="r_afc503b40004764163605d6dbdb4ef811"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structFrameInfo.html">FrameInfo</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#afc503b40004764163605d6dbdb4ef811">GetFrame</a> () const</td></tr>
<tr class="memdesc:afc503b40004764163605d6dbdb4ef811"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get frame payload if node is frame. <br /></td></tr>
<tr class="separator:afc503b40004764163605d6dbdb4ef811"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a226518612d0d00b5988a2c44fc21d3f1"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structSignalInfo.html">SignalInfo</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a226518612d0d00b5988a2c44fc21d3f1">GetSignal</a> () const</td></tr>
<tr class="memdesc:a226518612d0d00b5988a2c44fc21d3f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get signal payload if node is signal. <a href="classTreeNode.html#a226518612d0d00b5988a2c44fc21d3f1">More...</a><br /></td></tr>
<tr class="memitem:a226518612d0d00b5988a2c44fc21d3f1" id="r_a226518612d0d00b5988a2c44fc21d3f1"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structSignalInfo.html">SignalInfo</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTreeNode.html#a226518612d0d00b5988a2c44fc21d3f1">GetSignal</a> () const</td></tr>
<tr class="memdesc:a226518612d0d00b5988a2c44fc21d3f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get signal payload if node is signal. <br /></td></tr>
<tr class="separator:a226518612d0d00b5988a2c44fc21d3f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Tree node for later use in model/view or other hierarchy consumers. </p>
<div class="textblock"><p>Tree node for later use in model/view or other hierarchy consumers. </p>
<p class="definition">Definition at line <a class="el" href="tree__node_8h_source.html#l00035">35</a> of file <a class="el" href="tree__node_8h_source.html">tree_node.h</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a984a98d5ccf7ef1f5a18094c6821f35d" name="a984a98d5ccf7ef1f5a18094c6821f35d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a984a98d5ccf7ef1f5a18094c6821f35d">&#9670;&nbsp;</a></span>TreeNode() <span class="overload">[1/3]</span></h2>
<h2 class="memtitle"><span class="permalink"><a href="#a984a98d5ccf7ef1f5a18094c6821f35d">&#9670;&#160;</a></span>TreeNode() <span class="overload">[1/3]</span></h2>
<div class="memitem">
<div class="memproto">
@@ -170,7 +177,7 @@ Public Member Functions</h2></td></tr>
</div>
</div>
<a id="a8e38dd591d8801d7ee3a7dbad90c67fc" name="a8e38dd591d8801d7ee3a7dbad90c67fc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8e38dd591d8801d7ee3a7dbad90c67fc">&#9670;&nbsp;</a></span>TreeNode() <span class="overload">[2/3]</span></h2>
<h2 class="memtitle"><span class="permalink"><a href="#a8e38dd591d8801d7ee3a7dbad90c67fc">&#9670;&#160;</a></span>TreeNode() <span class="overload">[2/3]</span></h2>
<div class="memitem">
<div class="memproto">
@@ -201,12 +208,12 @@ Public Member Functions</h2></td></tr>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00022">22</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00018">18</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
<a id="ab9f00f5253d56461bb2d420fd639c5ae" name="ab9f00f5253d56461bb2d420fd639c5ae"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab9f00f5253d56461bb2d420fd639c5ae">&#9670;&nbsp;</a></span>TreeNode() <span class="overload">[3/3]</span></h2>
<h2 class="memtitle"><span class="permalink"><a href="#ab9f00f5253d56461bb2d420fd639c5ae">&#9670;&#160;</a></span>TreeNode() <span class="overload">[3/3]</span></h2>
<div class="memitem">
<div class="memproto">
@@ -237,13 +244,13 @@ Public Member Functions</h2></td></tr>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00030">30</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00022">22</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a6161f2ebb92184eab4215d121870e788" name="a6161f2ebb92184eab4215d121870e788"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6161f2ebb92184eab4215d121870e788">&#9670;&nbsp;</a></span>AddChild()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#a6161f2ebb92184eab4215d121870e788">&#9670;&#160;</a></span>AddChild()</h2>
<div class="memitem">
<div class="memproto">
@@ -266,12 +273,12 @@ Public Member Functions</h2></td></tr>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00038">38</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00026">26</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
<a id="abdd82460187dca8d3e5d66f5d5c529ea" name="abdd82460187dca8d3e5d66f5d5c529ea"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abdd82460187dca8d3e5d66f5d5c529ea">&#9670;&nbsp;</a></span>GetChildCount()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#abdd82460187dca8d3e5d66f5d5c529ea">&#9670;&#160;</a></span>GetChildCount()</h2>
<div class="memitem">
<div class="memproto">
@@ -288,12 +295,12 @@ Public Member Functions</h2></td></tr>
<p>Get child count. </p>
<dl class="section return"><dt>Returns</dt><dd>Number of children. </dd></dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00043">43</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00031">31</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
<a id="a4727ff801a2d1b9323c5ae50a35457a6" name="a4727ff801a2d1b9323c5ae50a35457a6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4727ff801a2d1b9323c5ae50a35457a6">&#9670;&nbsp;</a></span>GetChild() <span class="overload">[1/2]</span></h2>
<h2 class="memtitle"><span class="permalink"><a href="#a4727ff801a2d1b9323c5ae50a35457a6">&#9670;&#160;</a></span>GetChild() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
@@ -317,12 +324,12 @@ Public Member Functions</h2></td></tr>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Child pointer or nullptr if index is invalid. </dd></dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00047">47</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00035">35</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
<a id="a81047bd7d2a4cc96b9ef5e20d0d63b5f" name="a81047bd7d2a4cc96b9ef5e20d0d63b5f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a81047bd7d2a4cc96b9ef5e20d0d63b5f">&#9670;&nbsp;</a></span>GetChild() <span class="overload">[2/2]</span></h2>
<h2 class="memtitle"><span class="permalink"><a href="#a81047bd7d2a4cc96b9ef5e20d0d63b5f">&#9670;&#160;</a></span>GetChild() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
@@ -346,12 +353,12 @@ Public Member Functions</h2></td></tr>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Child pointer or nullptr if index is invalid. </dd></dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00054">54</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00042">42</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
<a id="afa2f4b0aafa12d3d41ed00df8e0250c9" name="afa2f4b0aafa12d3d41ed00df8e0250c9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afa2f4b0aafa12d3d41ed00df8e0250c9">&#9670;&nbsp;</a></span>GetType()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#afa2f4b0aafa12d3d41ed00df8e0250c9">&#9670;&#160;</a></span>GetType()</h2>
<div class="memitem">
<div class="memproto">
@@ -368,12 +375,12 @@ Public Member Functions</h2></td></tr>
<p>Get node type. </p>
<dl class="section return"><dt>Returns</dt><dd>Node type. </dd></dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00061">61</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00049">49</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
<a id="aaac5b8d9dc9e5ae1f367d1adbcf20e18" name="aaac5b8d9dc9e5ae1f367d1adbcf20e18"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaac5b8d9dc9e5ae1f367d1adbcf20e18">&#9670;&nbsp;</a></span>GetName()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#aaac5b8d9dc9e5ae1f367d1adbcf20e18">&#9670;&#160;</a></span>GetName()</h2>
<div class="memitem">
<div class="memproto">
@@ -390,12 +397,12 @@ Public Member Functions</h2></td></tr>
<p>Get display name. </p>
<dl class="section return"><dt>Returns</dt><dd>Node name. </dd></dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00065">65</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00053">53</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
<a id="afc503b40004764163605d6dbdb4ef811" name="afc503b40004764163605d6dbdb4ef811"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afc503b40004764163605d6dbdb4ef811">&#9670;&nbsp;</a></span>GetFrame()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#afc503b40004764163605d6dbdb4ef811">&#9670;&#160;</a></span>GetFrame()</h2>
<div class="memitem">
<div class="memproto">
@@ -412,12 +419,12 @@ Public Member Functions</h2></td></tr>
<p>Get frame payload if node is frame. </p>
<dl class="section return"><dt>Returns</dt><dd>Pointer to frame info or nullptr. </dd></dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00069">69</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00057">57</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
<a id="a226518612d0d00b5988a2c44fc21d3f1" name="a226518612d0d00b5988a2c44fc21d3f1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a226518612d0d00b5988a2c44fc21d3f1">&#9670;&nbsp;</a></span>GetSignal()</h2>
<h2 class="memtitle"><span class="permalink"><a href="#a226518612d0d00b5988a2c44fc21d3f1">&#9670;&#160;</a></span>GetSignal()</h2>
<div class="memitem">
<div class="memproto">
@@ -434,7 +441,7 @@ Public Member Functions</h2></td></tr>
<p>Get signal payload if node is signal. </p>
<dl class="section return"><dt>Returns</dt><dd>Pointer to signal info or nullptr. </dd></dl>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00073">73</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="tree__node_8cpp_source.html#l00061">61</a> of file <a class="el" href="tree__node_8cpp_source.html">tree_node.cpp</a>.</p>
</div>
</div>
@@ -448,7 +455,7 @@ Public Member Functions</h2></td></tr>
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classTreeNode.html">TreeNode</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+116
View File
@@ -0,0 +1,116 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classTypeFactory.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">TypeFactory&lt; ClassId, BaseClass, Args &gt; Member List</div></div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a>, including all inherited members.</p>
<table class="directory">
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>BasePtr</b> typedef (defined in <a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a>)</td><td class="entry"><a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></td><td class="entry"></td></tr>
<tr bgcolor="#f0f0f0" class="odd"><td class="entry"><b>classes</b> (defined in <a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a>)</td><td class="entry"><a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classTypeFactory.html#a1a119ad2956abe146213c6ca124d8dd4">contains</a>(const ClassId &amp;id) const</td><td class="entry"><a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classTypeFactory.html#a3f43b03d6e3a0fd503fdec01ecf62e9f">create</a>(const ClassId &amp;id, Args... args) const</td><td class="entry"><a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classTypeFactory.html#ad82f537569ece3d3a4a376523fa94473">creator</a>(const ClassId &amp;id) const</td><td class="entry"><a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr bgcolor="#f0f0f0" class="odd"><td class="entry"><b>CreatorFn</b> typedef (defined in <a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a>)</td><td class="entry"><a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classTypeFactory.html#ad6d85795285ee21193ac03e1b24762d3">registerType</a>(const ClassId &amp;id)</td><td class="entry"><a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr bgcolor="#f0f0f0" class="odd"><td class="entry"><b>TypeFactory</b>()=default (defined in <a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a>)</td><td class="entry"><a class="el" href="classTypeFactory.html">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></td><td class="entry"></td></tr>
</table></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+432
View File
@@ -0,0 +1,432 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: TypeFactory&lt; ClassId, BaseClass, Args &gt; Class Template Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classTypeFactory.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-types">Public Types</a> &#124;
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pro-attribs">Protected Attributes</a> &#124;
<a href="classTypeFactory-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">TypeFactory&lt; ClassId, BaseClass, Args &gt; Class Template Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Registry-based factory for creating objects by runtime identifier.
<a href="classTypeFactory.html#details">More...</a></p>
<p><code>#include &lt;<a class="el" href="typefactory_8h_source.html">typefactory.h</a>&gt;</code></p>
<div id="dynsection-0" onclick="return toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;">
<img id="dynsection-0-trigger" src="closed.png" alt="+"/> Inheritance diagram for TypeFactory&lt; ClassId, BaseClass, Args &gt;:</div>
<div id="dynsection-0-summary" class="dynsummary" style="display:block;">
</div>
<div id="dynsection-0-content" class="dyncontent" style="display:none;">
<div class="center"><iframe scrolling="no" frameborder="0" src="classTypeFactory__inherit__graph.svg" width="286" height="408"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-types" name="pub-types"></a>
Public Types</h2></td></tr>
<tr class="memitem:a33b404da3e19ea7e1245b8a4975721bf" id="r_a33b404da3e19ea7e1245b8a4975721bf"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTypeFactory.html#a33b404da3e19ea7e1245b8a4975721bf">BasePtr</a> = std::shared_ptr&lt; BaseClass &gt;</td></tr>
<tr class="separator:a33b404da3e19ea7e1245b8a4975721bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a650022aac1e2f30af5bc554a5663939f" id="r_a650022aac1e2f30af5bc554a5663939f"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTypeFactory.html#a650022aac1e2f30af5bc554a5663939f">CreatorFn</a> = BasePtr(*)(Args...)</td></tr>
<tr class="separator:a650022aac1e2f30af5bc554a5663939f"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:ad6d85795285ee21193ac03e1b24762d3" id="r_ad6d85795285ee21193ac03e1b24762d3"><td class="memTemplParams" colspan="2">template&lt;class Derived &gt; </td></tr>
<tr class="memitem:ad6d85795285ee21193ac03e1b24762d3"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classTypeFactory.html#ad6d85795285ee21193ac03e1b24762d3">registerType</a> (const ClassId &amp;id)</td></tr>
<tr class="memdesc:ad6d85795285ee21193ac03e1b24762d3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Registers a Derived type under the given id. <br /></td></tr>
<tr class="separator:ad6d85795285ee21193ac03e1b24762d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad82f537569ece3d3a4a376523fa94473" id="r_ad82f537569ece3d3a4a376523fa94473"><td class="memItemLeft" align="right" valign="top">CreatorFn&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTypeFactory.html#ad82f537569ece3d3a4a376523fa94473">creator</a> (const ClassId &amp;id) const</td></tr>
<tr class="memdesc:ad82f537569ece3d3a4a376523fa94473"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns creator function for the given id. <br /></td></tr>
<tr class="separator:ad82f537569ece3d3a4a376523fa94473"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3f43b03d6e3a0fd503fdec01ecf62e9f" id="r_a3f43b03d6e3a0fd503fdec01ecf62e9f"><td class="memItemLeft" align="right" valign="top">BasePtr&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTypeFactory.html#a3f43b03d6e3a0fd503fdec01ecf62e9f">create</a> (const ClassId &amp;id, Args... args) const</td></tr>
<tr class="memdesc:a3f43b03d6e3a0fd503fdec01ecf62e9f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates an instance for the given id using provided arguments. <br /></td></tr>
<tr class="separator:a3f43b03d6e3a0fd503fdec01ecf62e9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1a119ad2956abe146213c6ca124d8dd4" id="r_a1a119ad2956abe146213c6ca124d8dd4"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTypeFactory.html#a1a119ad2956abe146213c6ca124d8dd4">contains</a> (const ClassId &amp;id) const</td></tr>
<tr class="memdesc:a1a119ad2956abe146213c6ca124d8dd4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks whether an id is registered. <br /></td></tr>
<tr class="separator:a1a119ad2956abe146213c6ca124d8dd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-attribs" name="pro-attribs"></a>
Protected Attributes</h2></td></tr>
<tr class="memitem:a5f119fe61c1cb9f4725ce746e4a047b3" id="r_a5f119fe61c1cb9f4725ce746e4a047b3"><td class="memItemLeft" align="right" valign="top">std::unordered_map&lt; ClassId, CreatorFn &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTypeFactory.html#a5f119fe61c1cb9f4725ce746e4a047b3">classes</a></td></tr>
<tr class="separator:a5f119fe61c1cb9f4725ce746e4a047b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><div class="compoundTemplParams">template&lt;class ClassId, class BaseClass, class... Args&gt;<br />
class TypeFactory&lt; ClassId, BaseClass, Args &gt;</div><p>Registry-based factory for creating objects by runtime identifier. </p>
<p>Allows registering derived types and instantiating them using a ClassId key.</p>
<p>Notes:</p><ul>
<li>Not thread-safe. Register types during initialization phase only.</li>
<li>Re-registering the same id overwrites the previous entry ("last wins").</li>
<li>ClassId must be hashable (std::hash&lt;ClassId&gt; specialization must exist).</li>
</ul>
<dl class="tparams"><dt>Template Parameters</dt><dd>
<table class="tparams">
<tr><td class="paramname">ClassId</td><td>-Unique class identifier type (e.g. std::string, int, enum). </td></tr>
<tr><td class="paramname">BaseClass</td><td>-Base type for all created objects. </td></tr>
<tr><td class="paramname">Arg</td><td>- Constructor arguments forwarded to registered derived types (by value).</td></tr>
</table>
</dd>
</dl>
<p>Usage example: </p><div class="fragment"><div class="line"><span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"> </div>
<div class="line"><span class="keyword">struct </span>Base {</div>
<div class="line"> <span class="keyword">virtual</span> ~Base() = <span class="keywordflow">default</span>;</div>
<div class="line"> <span class="keyword">virtual</span> <span class="keywordtype">int</span> get() = 0;</div>
<div class="line">};</div>
<div class="line"> </div>
<div class="line"><span class="keyword">struct </span>Derived1 : Base {</div>
<div class="line"> <span class="keyword">explicit</span> Derived1(<span class="keywordtype">int</span> start) : m_start(start) {}</div>
<div class="line"> <span class="keywordtype">int</span> get()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> m_start + 1; }</div>
<div class="line"> <span class="keywordtype">int</span> m_start = 0;</div>
<div class="line">};</div>
<div class="line"> </div>
<div class="line"><span class="keyword">struct </span>Derived2 : Base {</div>
<div class="line"> <span class="keyword">explicit</span> Derived2(<span class="keywordtype">int</span> start) : m_start(start) {}</div>
<div class="line"> <span class="keywordtype">int</span> get()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> m_start + 2; }</div>
<div class="line"> <span class="keywordtype">int</span> m_start = 0;</div>
<div class="line">};</div>
<div class="line"> </div>
<div class="line"><a class="code hl_class" href="classTypeFactory.html">TypeFactory&lt;std::string, Base, int&gt;</a> factory;</div>
<div class="line">factory.<a class="code hl_function" href="classTypeFactory.html#ad6d85795285ee21193ac03e1b24762d3">registerType</a>&lt;Derived1&gt;(<span class="stringliteral">&quot;one&quot;</span>);</div>
<div class="line">factory.<a class="code hl_function" href="classTypeFactory.html#ad6d85795285ee21193ac03e1b24762d3">registerType</a>&lt;Derived2&gt;(<span class="stringliteral">&quot;two&quot;</span>);</div>
<div class="line"> </div>
<div class="line"><span class="keyword">auto</span> a = factory.<a class="code hl_function" href="classTypeFactory.html#a3f43b03d6e3a0fd503fdec01ecf62e9f">create</a>(<span class="stringliteral">&quot;one&quot;</span>, 10);</div>
<div class="line"><span class="keyword">auto</span> b = factory.<a class="code hl_function" href="classTypeFactory.html#ad82f537569ece3d3a4a376523fa94473">creator</a>(<span class="stringliteral">&quot;two&quot;</span>)(10); <span class="comment">// advanced API: get creator function</span></div>
<div class="line"> </div>
<div class="line">(void)a-&gt;get();</div>
<div class="line">(void)b-&gt;get();</div>
<div class="ttc" id="aclassTypeFactory_html"><div class="ttname"><a href="classTypeFactory.html">TypeFactory</a></div><div class="ttdoc">Registry-based factory for creating objects by runtime identifier.</div><div class="ttdef"><b>Definition</b> <a href="typefactory_8h_source.html#l00059">typefactory.h:59</a></div></div>
<div class="ttc" id="aclassTypeFactory_html_a3f43b03d6e3a0fd503fdec01ecf62e9f"><div class="ttname"><a href="classTypeFactory.html#a3f43b03d6e3a0fd503fdec01ecf62e9f">TypeFactory::create</a></div><div class="ttdeci">BasePtr create(const ClassId &amp;id, Args... args) const</div><div class="ttdoc">Creates an instance for the given id using provided arguments.</div><div class="ttdef"><b>Definition</b> <a href="typefactory_8h_source.html#l00097">typefactory.h:97</a></div></div>
<div class="ttc" id="aclassTypeFactory_html_ad6d85795285ee21193ac03e1b24762d3"><div class="ttname"><a href="classTypeFactory.html#ad6d85795285ee21193ac03e1b24762d3">TypeFactory::registerType</a></div><div class="ttdeci">void registerType(const ClassId &amp;id)</div><div class="ttdoc">Registers a Derived type under the given id.</div><div class="ttdef"><b>Definition</b> <a href="typefactory_8h_source.html#l00076">typefactory.h:76</a></div></div>
<div class="ttc" id="aclassTypeFactory_html_ad82f537569ece3d3a4a376523fa94473"><div class="ttname"><a href="classTypeFactory.html#ad82f537569ece3d3a4a376523fa94473">TypeFactory::creator</a></div><div class="ttdeci">CreatorFn creator(const ClassId &amp;id) const</div><div class="ttdoc">Returns creator function for the given id.</div><div class="ttdef"><b>Definition</b> <a href="typefactory_8h_source.html#l00089">typefactory.h:89</a></div></div>
</div><!-- fragment -->
<p class="definition">Definition at line <a class="el" href="typefactory_8h_source.html#l00059">59</a> of file <a class="el" href="typefactory_8h_source.html">typefactory.h</a>.</p>
</div><h2 class="groupheader">Member Typedef Documentation</h2>
<a id="a33b404da3e19ea7e1245b8a4975721bf" name="a33b404da3e19ea7e1245b8a4975721bf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a33b404da3e19ea7e1245b8a4975721bf">&#9670;&#160;</a></span>BasePtr</h2>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class ClassId , class BaseClass , class... Args&gt; </div>
<table class="memname">
<tr>
<td class="memname">using <a class="el" href="classTypeFactory.html">TypeFactory</a>&lt; ClassId, BaseClass, Args &gt;::BasePtr = std::shared_ptr&lt;BaseClass&gt;</td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="typefactory_8h_source.html#l00061">61</a> of file <a class="el" href="typefactory_8h_source.html">typefactory.h</a>.</p>
</div>
</div>
<a id="a650022aac1e2f30af5bc554a5663939f" name="a650022aac1e2f30af5bc554a5663939f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a650022aac1e2f30af5bc554a5663939f">&#9670;&#160;</a></span>CreatorFn</h2>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class ClassId , class BaseClass , class... Args&gt; </div>
<table class="memname">
<tr>
<td class="memname">using <a class="el" href="classTypeFactory.html">TypeFactory</a>&lt; ClassId, BaseClass, Args &gt;::CreatorFn = BasePtr (*)(Args...)</td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="typefactory_8h_source.html#l00062">62</a> of file <a class="el" href="typefactory_8h_source.html">typefactory.h</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="ad6d85795285ee21193ac03e1b24762d3" name="ad6d85795285ee21193ac03e1b24762d3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad6d85795285ee21193ac03e1b24762d3">&#9670;&#160;</a></span>registerType()</h2>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class ClassId , class BaseClass , class... Args&gt; </div>
<div class="memtemplate">
template&lt;class Derived &gt; </div>
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="classTypeFactory.html">TypeFactory</a>&lt; ClassId, BaseClass, Args &gt;::registerType </td>
<td>(</td>
<td class="paramtype">const ClassId &amp;&#160;</td>
<td class="paramname"><em>id</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Registers a Derived type under the given id. </p>
<p>Requirements (checked at compile-time):</p><ul>
<li>Derived must inherit from BaseClass</li>
<li>Derived must be constructible from Args...</li>
</ul>
<p>Re-registering the same id overwrites the previous entry ("last wins"). </p>
<p class="definition">Definition at line <a class="el" href="typefactory_8h_source.html#l00076">76</a> of file <a class="el" href="typefactory_8h_source.html">typefactory.h</a>.</p>
</div>
</div>
<a id="ad82f537569ece3d3a4a376523fa94473" name="ad82f537569ece3d3a4a376523fa94473"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad82f537569ece3d3a4a376523fa94473">&#9670;&#160;</a></span>creator()</h2>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class ClassId , class BaseClass , class... Args&gt; </div>
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">CreatorFn <a class="el" href="classTypeFactory.html">TypeFactory</a>&lt; ClassId, BaseClass, Args &gt;::creator </td>
<td>(</td>
<td class="paramtype">const ClassId &amp;&#160;</td>
<td class="paramname"><em>id</em></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Returns creator function for the given id. </p>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">std::out_of_range</td><td>when id is not registered. </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="typefactory_8h_source.html#l00089">89</a> of file <a class="el" href="typefactory_8h_source.html">typefactory.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="typefactory_8h_source.html#l00097">TypeFactory&lt; ClassId, BaseClass, Args &gt;::create()</a>.</p>
</div>
</div>
<a id="a3f43b03d6e3a0fd503fdec01ecf62e9f" name="a3f43b03d6e3a0fd503fdec01ecf62e9f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3f43b03d6e3a0fd503fdec01ecf62e9f">&#9670;&#160;</a></span>create()</h2>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class ClassId , class BaseClass , class... Args&gt; </div>
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">BasePtr <a class="el" href="classTypeFactory.html">TypeFactory</a>&lt; ClassId, BaseClass, Args &gt;::create </td>
<td>(</td>
<td class="paramtype">const ClassId &amp;&#160;</td>
<td class="paramname"><em>id</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">Args...&#160;</td>
<td class="paramname"><em>args</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Creates an instance for the given id using provided arguments. </p>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">std::out_of_range</td><td>when id is not registered. </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="typefactory_8h_source.html#l00097">97</a> of file <a class="el" href="typefactory_8h_source.html">typefactory.h</a>.</p>
<p class="reference">References <a class="el" href="typefactory_8h_source.html#l00089">TypeFactory&lt; ClassId, BaseClass, Args &gt;::creator()</a>.</p>
</div>
</div>
<a id="a1a119ad2956abe146213c6ca124d8dd4" name="a1a119ad2956abe146213c6ca124d8dd4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1a119ad2956abe146213c6ca124d8dd4">&#9670;&#160;</a></span>contains()</h2>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class ClassId , class BaseClass , class... Args&gt; </div>
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">bool <a class="el" href="classTypeFactory.html">TypeFactory</a>&lt; ClassId, BaseClass, Args &gt;::contains </td>
<td>(</td>
<td class="paramtype">const ClassId &amp;&#160;</td>
<td class="paramname"><em>id</em></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Checks whether an id is registered. </p>
<p class="definition">Definition at line <a class="el" href="typefactory_8h_source.html#l00104">104</a> of file <a class="el" href="typefactory_8h_source.html">typefactory.h</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Data Documentation</h2>
<a id="a5f119fe61c1cb9f4725ce746e4a047b3" name="a5f119fe61c1cb9f4725ce746e4a047b3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5f119fe61c1cb9f4725ce746e4a047b3">&#9670;&#160;</a></span>classes</h2>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class ClassId , class BaseClass , class... Args&gt; </div>
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">std::unordered_map&lt;ClassId, CreatorFn&gt; <a class="el" href="classTypeFactory.html">TypeFactory</a>&lt; ClassId, BaseClass, Args &gt;::classes</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="typefactory_8h_source.html#l00110">110</a> of file <a class="el" href="typefactory_8h_source.html">typefactory.h</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li><a class="el" href="typefactory_8h_source.html">typefactory.h</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classTypeFactory.html">TypeFactory</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+7
View File
@@ -0,0 +1,7 @@
var classTypeFactory =
[
[ "registerType", "classTypeFactory.html#ad6d85795285ee21193ac03e1b24762d3", null ],
[ "creator", "classTypeFactory.html#ad82f537569ece3d3a4a376523fa94473", null ],
[ "create", "classTypeFactory.html#a3f43b03d6e3a0fd503fdec01ecf62e9f", null ],
[ "contains", "classTypeFactory.html#a1a119ad2956abe146213c6ca124d8dd4", null ]
];
@@ -0,0 +1,5 @@
<map id="TypeFactory&lt; ClassId, BaseClass, Args &gt;" name="TypeFactory&lt; ClassId, BaseClass, Args &gt;">
<area shape="rect" id="Node000001" title="Registry&#45;based factory for creating objects by runtime identifier." alt="" coords="15,5,173,165"/>
<area shape="rect" id="Node000002" href="$classTypeFactory.html" title=" " alt="" coords="5,243,183,403"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="97,179,97,242,91,242,91,179"/>
</map>
@@ -0,0 +1 @@
2bdf782ef56b34458cf192f8210c073e
@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: TypeFactory&lt; ClassId, BaseClass, Args &gt; Pages: 1 -->
<svg width="214pt" height="306pt"
viewBox="0.00 0.00 213.50 306.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg id="main" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" onload="init(evt)">
<style type="text/css"><![CDATA[
.node, .edge {opacity: 0.7;}
.node.selected, .edge.selected {opacity: 1;}
.edge:hover path { stroke: red; }
.edge:hover polygon { stroke: red; fill: red; }
]]></style>
<script type="application/ecmascript" xlink:href="svg.min.js"/>
<svg id="graph" class="graph">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 302)">
<title>TypeFactory&lt; ClassId, BaseClass, Args &gt;</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title="Registry&#45;based factory for creating objects by runtime identifier.">
<polygon fill="#999999" stroke="transparent" points="125.5,-298 7.5,-298 7.5,-178 125.5,-178 125.5,-298"/>
<text text-anchor="start" x="12.5" y="-286" font-family="Helvetica,sans-Serif" font-size="10.00">TypeFactory&lt; ClassId,</text>
<text text-anchor="start" x="20" y="-275" font-family="Helvetica,sans-Serif" font-size="10.00"> BaseClass, Args &gt;</text>
<text text-anchor="start" x="18.5" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">#</text>
<text text-anchor="start" x="38.5" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">classes</text>
<text text-anchor="start" x="18.5" y="-245" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-245" font-family="Helvetica,sans-Serif" font-size="10.00">TypeFactory()</text>
<text text-anchor="start" x="18.5" y="-230" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-230" font-family="Helvetica,sans-Serif" font-size="10.00">registerType()</text>
<text text-anchor="start" x="18.5" y="-215" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-215" font-family="Helvetica,sans-Serif" font-size="10.00">creator()</text>
<text text-anchor="start" x="18.5" y="-200" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-200" font-family="Helvetica,sans-Serif" font-size="10.00">create()</text>
<text text-anchor="start" x="18.5" y="-185" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-185" font-family="Helvetica,sans-Serif" font-size="10.00">contains()</text>
<polygon fill="#666666" stroke="#666666" points="7.5,-270 7.5,-270 125.5,-270 125.5,-270 7.5,-270"/>
<polygon fill="#666666" stroke="#666666" points="7.5,-255 7.5,-255 36.5,-255 36.5,-255 7.5,-255"/>
<polygon fill="#666666" stroke="#666666" points="36.5,-255 36.5,-255 125.5,-255 125.5,-255 36.5,-255"/>
<polygon fill="none" stroke="#666666" points="7.5,-178 7.5,-298 125.5,-298 125.5,-178 7.5,-178"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="classTypeFactory.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="133,-120 0,-120 0,0 133,0 133,-120"/>
<text text-anchor="start" x="5.5" y="-108" font-family="Helvetica,sans-Serif" font-size="10.00">TypeFactory&lt; std::string,</text>
<text text-anchor="start" x="5.5" y="-97" font-family="Helvetica,sans-Serif" font-size="10.00"> DbcStatementHandler &gt;</text>
<text text-anchor="start" x="15.5" y="-82" font-family="Helvetica,sans-Serif" font-size="10.00">#</text>
<text text-anchor="start" x="39.5" y="-82" font-family="Helvetica,sans-Serif" font-size="10.00">classes</text>
<text text-anchor="start" x="15.5" y="-67" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-67" font-family="Helvetica,sans-Serif" font-size="10.00">TypeFactory()</text>
<text text-anchor="start" x="15.5" y="-52" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-52" font-family="Helvetica,sans-Serif" font-size="10.00">registerType()</text>
<text text-anchor="start" x="15.5" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00">creator()</text>
<text text-anchor="start" x="15.5" y="-22" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-22" font-family="Helvetica,sans-Serif" font-size="10.00">create()</text>
<text text-anchor="start" x="15.5" y="-7" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-7" font-family="Helvetica,sans-Serif" font-size="10.00">contains()</text>
<polygon fill="#666666" stroke="#666666" points="0.5,-92 0.5,-92 133.5,-92 133.5,-92 0.5,-92"/>
<polygon fill="#666666" stroke="#666666" points="0.5,-77 0.5,-77 37.5,-77 37.5,-77 0.5,-77"/>
<polygon fill="#666666" stroke="#666666" points="37.5,-77 37.5,-77 133.5,-77 133.5,-77 37.5,-77"/>
<polygon fill="none" stroke="#666666" points="0,0 0,-120 133,-120 133,0 0,0"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node2 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node1&#45;&gt;Node2</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="orange" d="M66.5,-167.73C66.5,-152.02 66.5,-135.48 66.5,-120.24"/>
<polygon fill="orange" stroke="orange" points="63,-167.9 66.5,-177.9 70,-167.9 63,-167.9"/>
</a>
</g>
<text text-anchor="start" x="66.5" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00" fill="grey"> &lt; std::string, DbcStatement</text>
<text text-anchor="middle" x="136" y="-141" font-family="Helvetica,sans-Serif" font-size="10.00" fill="grey">Handler &gt;</text>
</g>
</g>
</svg>
</svg>
<style type='text/css'>
<![CDATA[
[data-mouse-over-selected='false'] { opacity: 0.7; }
[data-mouse-over-selected='true'] { opacity: 1.0; }
]]>
</style>
<script type="application/ecmascript"><![CDATA[
document.addEventListener('DOMContentLoaded', (event) => {
highlightEdges();
highlightAdjacentNodes();
});
]]></script>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: TypeFactory&lt; ClassId, BaseClass, Args &gt; Pages: 1 -->
<svg width="214pt" height="306pt"
viewBox="0.00 0.00 213.50 306.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 302)">
<title>TypeFactory&lt; ClassId, BaseClass, Args &gt;</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title="Registry&#45;based factory for creating objects by runtime identifier.">
<polygon fill="#999999" stroke="transparent" points="125.5,-298 7.5,-298 7.5,-178 125.5,-178 125.5,-298"/>
<text text-anchor="start" x="12.5" y="-286" font-family="Helvetica,sans-Serif" font-size="10.00">TypeFactory&lt; ClassId,</text>
<text text-anchor="start" x="20" y="-275" font-family="Helvetica,sans-Serif" font-size="10.00"> BaseClass, Args &gt;</text>
<text text-anchor="start" x="18.5" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">#</text>
<text text-anchor="start" x="38.5" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">classes</text>
<text text-anchor="start" x="18.5" y="-245" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-245" font-family="Helvetica,sans-Serif" font-size="10.00">TypeFactory()</text>
<text text-anchor="start" x="18.5" y="-230" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-230" font-family="Helvetica,sans-Serif" font-size="10.00">registerType()</text>
<text text-anchor="start" x="18.5" y="-215" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-215" font-family="Helvetica,sans-Serif" font-size="10.00">creator()</text>
<text text-anchor="start" x="18.5" y="-200" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-200" font-family="Helvetica,sans-Serif" font-size="10.00">create()</text>
<text text-anchor="start" x="18.5" y="-185" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="38.5" y="-185" font-family="Helvetica,sans-Serif" font-size="10.00">contains()</text>
<polygon fill="#666666" stroke="#666666" points="7.5,-270 7.5,-270 125.5,-270 125.5,-270 7.5,-270"/>
<polygon fill="#666666" stroke="#666666" points="7.5,-255 7.5,-255 36.5,-255 36.5,-255 7.5,-255"/>
<polygon fill="#666666" stroke="#666666" points="36.5,-255 36.5,-255 125.5,-255 125.5,-255 36.5,-255"/>
<polygon fill="none" stroke="#666666" points="7.5,-178 7.5,-298 125.5,-298 125.5,-178 7.5,-178"/>
</a>
</g>
</g>
<!-- Node2 -->
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="classTypeFactory.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="transparent" points="133,-120 0,-120 0,0 133,0 133,-120"/>
<text text-anchor="start" x="5.5" y="-108" font-family="Helvetica,sans-Serif" font-size="10.00">TypeFactory&lt; std::string,</text>
<text text-anchor="start" x="5.5" y="-97" font-family="Helvetica,sans-Serif" font-size="10.00"> DbcStatementHandler &gt;</text>
<text text-anchor="start" x="15.5" y="-82" font-family="Helvetica,sans-Serif" font-size="10.00">#</text>
<text text-anchor="start" x="39.5" y="-82" font-family="Helvetica,sans-Serif" font-size="10.00">classes</text>
<text text-anchor="start" x="15.5" y="-67" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-67" font-family="Helvetica,sans-Serif" font-size="10.00">TypeFactory()</text>
<text text-anchor="start" x="15.5" y="-52" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-52" font-family="Helvetica,sans-Serif" font-size="10.00">registerType()</text>
<text text-anchor="start" x="15.5" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00">creator()</text>
<text text-anchor="start" x="15.5" y="-22" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-22" font-family="Helvetica,sans-Serif" font-size="10.00">create()</text>
<text text-anchor="start" x="15.5" y="-7" font-family="Helvetica,sans-Serif" font-size="10.00">+</text>
<text text-anchor="start" x="39.5" y="-7" font-family="Helvetica,sans-Serif" font-size="10.00">contains()</text>
<polygon fill="#666666" stroke="#666666" points="0.5,-92 0.5,-92 133.5,-92 133.5,-92 0.5,-92"/>
<polygon fill="#666666" stroke="#666666" points="0.5,-77 0.5,-77 37.5,-77 37.5,-77 0.5,-77"/>
<polygon fill="#666666" stroke="#666666" points="37.5,-77 37.5,-77 133.5,-77 133.5,-77 37.5,-77"/>
<polygon fill="none" stroke="#666666" points="0,0 0,-120 133,-120 133,0 0,0"/>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node2 -->
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node1&#45;&gt;Node2</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="orange" d="M66.5,-167.73C66.5,-152.02 66.5,-135.48 66.5,-120.24"/>
<polygon fill="orange" stroke="orange" points="63,-167.9 66.5,-177.9 70,-167.9 63,-167.9"/>
</a>
</g>
<text text-anchor="start" x="66.5" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00" fill="grey"> &lt; std::string, DbcStatement</text>
<text text-anchor="middle" x="136" y="-141" font-family="Helvetica,sans-Serif" font-size="10.00" fill="grey">Handler &gt;</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

+17 -10
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: Class Index</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('classes.html',''); initResizable(); })
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -90,7 +97,7 @@ $(document).ready(function(){initNavTree('classes.html',''); initResizable(); })
<div class="classindex">
<dl class="classindex even">
<dt class="alphachar"><a id="letter_D" name="letter_D">D</a></dt>
<dd><a class="el" href="structDbcDatabase.html">DbcDatabase</a></dd><dd><a class="el" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></dd><dd><a class="el" href="classDbcDecoder.html">DbcDecoder</a></dd><dd><a class="el" href="classDbcParser.html">DbcParser</a></dd><dd><a class="el" href="classDbcTreeBuilder.html">DbcTreeBuilder</a></dd><dd><a class="el" href="structDecodeDatabase.html">DecodeDatabase</a></dd><dd><a class="el" href="structDecodedFrameValue.html">DecodedFrameValue</a></dd><dd><a class="el" href="structDecodedSignalValue.html">DecodedSignalValue</a></dd><dd><a class="el" href="structDecodeFrame.html">DecodeFrame</a></dd><dd><a class="el" href="structDecodeSignal.html">DecodeSignal</a></dd></dl>
<dd><a class="el" href="classDbcCommentHandler.html">DbcCommentHandler</a></dd><dd><a class="el" href="structDbcDatabase.html">DbcDatabase</a></dd><dd><a class="el" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></dd><dd><a class="el" href="classDbcDecoder.html">DbcDecoder</a></dd><dd><a class="el" href="classDbcFrameHandler.html">DbcFrameHandler</a></dd><dd><a class="el" href="structDbcParseContext.html">DbcParseContext</a></dd><dd><a class="el" href="classDbcParser.html">DbcParser</a></dd><dd><a class="el" href="classDbcSignalHandler.html">DbcSignalHandler</a></dd><dd><a class="el" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></dd><dd><a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a></dd><dd><a class="el" href="classDbcTreeBuilder.html">DbcTreeBuilder</a></dd><dd><a class="el" href="structDecodeDatabase.html">DecodeDatabase</a></dd><dd><a class="el" href="structDecodedFrameValue.html">DecodedFrameValue</a></dd><dd><a class="el" href="structDecodedSignalValue.html">DecodedSignalValue</a></dd><dd><a class="el" href="structDecodeFrame.html">DecodeFrame</a></dd><dd><a class="el" href="structDecodeSignal.html">DecodeSignal</a></dd></dl>
<dl class="classindex odd">
<dt class="alphachar"><a id="letter_F" name="letter_F">F</a></dt>
<dd><a class="el" href="structFrameInfo.html">FrameInfo</a></dd><dd><a class="el" href="structFrameKey.html">FrameKey</a></dd><dd><a class="el" href="structFrameKeyHasher.html">FrameKeyHasher</a></dd></dl>
@@ -102,14 +109,14 @@ $(document).ready(function(){initNavTree('classes.html',''); initResizable(); })
<dd><a class="el" href="structSignalInfo.html">SignalInfo</a></dd></dl>
<dl class="classindex even">
<dt class="alphachar"><a id="letter_T" name="letter_T">T</a></dt>
<dd><a class="el" href="classTreeNode.html">TreeNode</a></dd></dl>
<dd><a class="el" href="classTreeNode.html">TreeNode</a></dd><dd><a class="el" href="classTypeFactory.html">TypeFactory</a></dd></dl>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+18 -11
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_database.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('dbc__database_8h.html',''); initResiza
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -103,8 +110,8 @@ Classes</h2></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p >Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<div class="textblock"><p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p>Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<p class="definition">Definition in file <a class="el" href="dbc__database_8h_source.html">dbc_database.h</a>.</p>
</div></div><!-- contents -->
@@ -112,8 +119,8 @@ Classes</h2></td></tr>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__database_8h.html">dbc_database.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__database_8h.html">dbc_database.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+25 -11
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_database.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -51,6 +51,11 @@ $(function() {
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
@@ -77,9 +82,16 @@ $(document).ready(function(){initNavTree('dbc__database_8h_source.html',''); ini
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -94,21 +106,23 @@ $(document).ready(function(){initNavTree('dbc__database_8h_source.html',''); ini
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &quot;<a class="code" href="frame__info_8h.html">frame_info.h</a>&quot;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
<div class="foldopen" id="foldopen00022" data-start="{" data-end="};">
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"><a class="line" href="structDbcDatabase.html"> 22</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> {</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"><a class="line" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b"> 23</a></span> std::vector&lt;FrameInfo&gt; <a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>; </div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span>};</div>
</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#endif </span><span class="comment">/* DBC_DATABASE_H */</span><span class="preprocessor"></span></div>
<div class="ttc" id="aframe__info_8h_html"><div class="ttname"><a href="frame__info_8h.html">frame_info.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcDatabase_html_a2cade5d0234ee816132127542f8c612b"><div class="ttname"><a href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">DbcDatabase::frames</a></div><div class="ttdeci">std::vector&lt; FrameInfo &gt; frames</div><div class="ttdef"><b>Definition:</b> <a href="dbc__database_8h_source.html#l00023">dbc_database.h:23</a></div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcDatabase_html_a2cade5d0234ee816132127542f8c612b"><div class="ttname"><a href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">DbcDatabase::frames</a></div><div class="ttdeci">std::vector&lt; FrameInfo &gt; frames</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00023">dbc_database.h:23</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__database_8h.html">dbc_database.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__database_8h.html">dbc_database.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+18 -11
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_decode_builder.cpp File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8cpp.html',''); i
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -93,8 +100,8 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8cpp.html',''); i
</div>
<p><a href="dbc__decode__builder_8cpp_source.html">Go to the source code of this file.</a></p>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p >Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<div class="textblock"><p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p>Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<p class="definition">Definition in file <a class="el" href="dbc__decode__builder_8cpp_source.html">dbc_decode_builder.cpp</a>.</p>
</div></div><!-- contents -->
@@ -102,8 +109,8 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8cpp.html',''); i
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__decode__builder_8cpp.html">dbc_decode_builder.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__decode__builder_8cpp.html">dbc_decode_builder.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+76 -62
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_decode_builder.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -51,6 +51,11 @@ $(function() {
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
@@ -77,9 +82,16 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8cpp_source.html'
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -89,7 +101,8 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8cpp_source.html'
<a href="dbc__decode__builder_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a>&quot;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"><a class="line" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b"> 14</a></span><a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> <a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a> (<span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> &amp;source)<span class="keyword"> const </span>{</div>
<div class="foldopen" id="foldopen00014" data-start="{" data-end="}">
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"><a class="line" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b"> 14</a></span><a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> <a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> &amp;source)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> result;</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> <span class="keywordflow">for</span> (std::size_t frameIndex = 0U; frameIndex &lt; source.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++frameIndex) {</div>
@@ -122,73 +135,74 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8cpp_source.html'
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> targetSignal.<a class="code hl_variable" href="structDecodeSignal.html#abdbae62a64d2df716bf60c6b67b30eaa">receivers</a> = sourceSignal.<a class="code hl_variable" href="structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3">receivers</a>;</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> targetSignal.<a class="code hl_variable" href="structDecodeSignal.html#ae28c905d4a2bc86419c2a8361bfea473">comment</a> = sourceSignal.<a class="code hl_variable" href="structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5">comment</a>;</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> </div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> targetFrame.signals.push_back (targetSignal);</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> targetFrame.signals.push_back(targetSignal);</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> }</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> </div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> result.frames.push_back (targetFrame);</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> result.frameIndexByKey[<a class="code hl_struct" href="structFrameKey.html">FrameKey</a> (targetFrame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a>, targetFrame.<a class="code hl_variable" href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">isExtended</a>)] =</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> result.frames.push_back(targetFrame);</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> result.frameIndexByKey[<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(targetFrame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a>, targetFrame.<a class="code hl_variable" href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">isExtended</a>)] =</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> result.frames.size() - 1U;</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> }</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> </div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span>}</div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decode__builder_8cpp_source.html#l00014">dbc_decode_builder.cpp:14</a></div></div>
</div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8cpp_source.html#l00014">dbc_decode_builder.cpp:14</a></div></div>
<div class="ttc" id="adbc__decode__builder_8h_html"><div class="ttname"><a href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcDatabase_html_a2cade5d0234ee816132127542f8c612b"><div class="ttname"><a href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">DbcDatabase::frames</a></div><div class="ttdeci">std::vector&lt; FrameInfo &gt; frames</div><div class="ttdef"><b>Definition:</b> <a href="dbc__database_8h_source.html#l00023">dbc_database.h:23</a></div></div>
<div class="ttc" id="astructDecodeDatabase_html"><div class="ttname"><a href="structDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Runtime decode database with fast lookup by CAN ID.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00132">decode_database.h:132</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00072">decode_database.h:72</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a1d3c54055c0cbceb73adf551f7067f23"><div class="ttname"><a href="structDecodeFrame.html#a1d3c54055c0cbceb73adf551f7067f23">DecodeFrame::pgn</a></div><div class="ttdeci">std::uint32_t pgn</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00077">decode_database.h:77</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a2551102670c4a540fced4c71da0b369d"><div class="ttname"><a href="structDecodeFrame.html#a2551102670c4a540fced4c71da0b369d">DecodeFrame::hasPgn</a></div><div class="ttdeci">bool hasPgn</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00078">decode_database.h:78</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a25819ef907a32391af5c9f7cae9cdb22"><div class="ttname"><a href="structDecodeFrame.html#a25819ef907a32391af5c9f7cae9cdb22">DecodeFrame::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00080">decode_database.h:80</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a3ee2348d781f8f15aaf87e8dcf57ec41"><div class="ttname"><a href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">DecodeFrame::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00075">decode_database.h:75</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a51111ac13988be372d5673d12cf3e060"><div class="ttname"><a href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">DecodeFrame::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00076">decode_database.h:76</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a52e10215388db7df8b541b9d9909edcf"><div class="ttname"><a href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">DecodeFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00074">decode_database.h:74</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_aa0a7f8fd5bfde2148dfd0d838328f579"><div class="ttname"><a href="structDecodeFrame.html#aa0a7f8fd5bfde2148dfd0d838328f579">DecodeFrame::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00073">decode_database.h:73</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_ad78241dc40c793aabb8495b6989b81a9"><div class="ttname"><a href="structDecodeFrame.html#ad78241dc40c793aabb8495b6989b81a9">DecodeFrame::transmitter</a></div><div class="ttdeci">std::string transmitter</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00079">decode_database.h:79</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00039">decode_database.h:39</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a0fb84e19a0ab3bd50b6f65c1075ebc25"><div class="ttname"><a href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">DecodeSignal::minimum</a></div><div class="ttdeci">double minimum</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00047">decode_database.h:47</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a38eed9ca7581423fd8bfbedcffc12092"><div class="ttname"><a href="structDecodeSignal.html#a38eed9ca7581423fd8bfbedcffc12092">DecodeSignal::unit</a></div><div class="ttdeci">std::string unit</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00049">decode_database.h:49</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a428c39913a366a8476dd291061354391"><div class="ttname"><a href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">DecodeSignal::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00045">decode_database.h:45</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a4a6ba87142a9badbf0ca830e9e709cb7"><div class="ttname"><a href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">DecodeSignal::maximum</a></div><div class="ttdeci">double maximum</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00048">decode_database.h:48</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a58cf5844f2272a23dcb9687d912e4780"><div class="ttname"><a href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">DecodeSignal::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00040">decode_database.h:40</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a92db637af4e224a0ae70173050dc3f74"><div class="ttname"><a href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">DecodeSignal::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00046">decode_database.h:46</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a9d37638129263b8902ba5be59baf39a8"><div class="ttname"><a href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">DecodeSignal::valueType</a></div><div class="ttdeci">ValueType valueType</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00044">decode_database.h:44</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_aaf5d7527ddf65b6355c2b4f3626df22d"><div class="ttname"><a href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">DecodeSignal::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00041">decode_database.h:41</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_abdbae62a64d2df716bf60c6b67b30eaa"><div class="ttname"><a href="structDecodeSignal.html#abdbae62a64d2df716bf60c6b67b30eaa">DecodeSignal::receivers</a></div><div class="ttdeci">std::vector&lt; std::string &gt; receivers</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00050">decode_database.h:50</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_abdc4c4bb4a67a6d61d6ca81e8a52833d"><div class="ttname"><a href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">DecodeSignal::byteOrder</a></div><div class="ttdeci">ByteOrder byteOrder</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00043">decode_database.h:43</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_acd4ef5ee30421d117b5756854302debb"><div class="ttname"><a href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">DecodeSignal::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00042">decode_database.h:42</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_ae28c905d4a2bc86419c2a8361bfea473"><div class="ttname"><a href="structDecodeSignal.html#ae28c905d4a2bc86419c2a8361bfea473">DecodeSignal::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00051">decode_database.h:51</a></div></div>
<div class="ttc" id="astructFrameInfo_html"><div class="ttname"><a href="structFrameInfo.html">FrameInfo</a></div><div class="ttdoc">Describes one CAN frame from a DBC file.</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00024">frame_info.h:24</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a34b726afaad2ac5c697fdb2ac070cdaf"><div class="ttname"><a href="structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf">FrameInfo::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00027">frame_info.h:27</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a4737a5420213ad4304724e39f3a4e55d"><div class="ttname"><a href="structFrameInfo.html#a4737a5420213ad4304724e39f3a4e55d">FrameInfo::hasPgn</a></div><div class="ttdeci">bool hasPgn</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00029">frame_info.h:29</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a92749ec3798d4211a505860fb389a9e8"><div class="ttname"><a href="structFrameInfo.html#a92749ec3798d4211a505860fb389a9e8">FrameInfo::transmitter</a></div><div class="ttdeci">std::string transmitter</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00031">frame_info.h:31</a></div></div>
<div class="ttc" id="astructFrameInfo_html_aa2b198ea0f55e560c123d35e7b3ecab9"><div class="ttname"><a href="structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9">FrameInfo::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00030">frame_info.h:30</a></div></div>
<div class="ttc" id="astructFrameInfo_html_abb53a7f93ed7abc0ea1ae4a8ccafcdcb"><div class="ttname"><a href="structFrameInfo.html#abb53a7f93ed7abc0ea1ae4a8ccafcdcb">FrameInfo::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00025">frame_info.h:25</a></div></div>
<div class="ttc" id="astructFrameInfo_html_ace75121294f9d89b762080ab5643293c"><div class="ttname"><a href="structFrameInfo.html#ace75121294f9d89b762080ab5643293c">FrameInfo::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00032">frame_info.h:32</a></div></div>
<div class="ttc" id="astructFrameInfo_html_aee518b33f1000bf0b7f6e4a87474c943"><div class="ttname"><a href="structFrameInfo.html#aee518b33f1000bf0b7f6e4a87474c943">FrameInfo::pgn</a></div><div class="ttdeci">std::uint32_t pgn</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00028">frame_info.h:28</a></div></div>
<div class="ttc" id="astructFrameInfo_html_af470b0742c05bfbffc31c51a68f5c05e"><div class="ttname"><a href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">FrameInfo::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00026">frame_info.h:26</a></div></div>
<div class="ttc" id="astructFrameKey_html"><div class="ttname"><a href="structFrameKey.html">FrameKey</a></div><div class="ttdoc">Key for fast frame lookup.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00099">decode_database.h:99</a></div></div>
<div class="ttc" id="astructSignalInfo_html"><div class="ttname"><a href="structSignalInfo.html">SignalInfo</a></div><div class="ttdoc">Describes one signal inside a DBC frame.</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00022">signal_info.h:22</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a1008b5201f71848177217bd52fb84baa"><div class="ttname"><a href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">SignalInfo::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00025">signal_info.h:25</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a1f214f03e94ef5794de2d3367bfcbd01"><div class="ttname"><a href="structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01">SignalInfo::unit</a></div><div class="ttdeci">std::string unit</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00032">signal_info.h:32</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a2c95562fd0b29327a7fd7b1e6feee7f3"><div class="ttname"><a href="structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3">SignalInfo::receivers</a></div><div class="ttdeci">std::vector&lt; std::string &gt; receivers</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00033">signal_info.h:33</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a379e422a00cad56f896cacf60455b088"><div class="ttname"><a href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">SignalInfo::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00023">signal_info.h:23</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a52a52b320eef92fbcb4626307f9a498f"><div class="ttname"><a href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">SignalInfo::isSigned</a></div><div class="ttdeci">bool isSigned</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00027">signal_info.h:27</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ab7d0769f47aa540656b22e4e49db517e"><div class="ttname"><a href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">SignalInfo::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00029">signal_info.h:29</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ac99ba7563a5dad01e39c4257216953f5"><div class="ttname"><a href="structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5">SignalInfo::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00034">signal_info.h:34</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ace290724f9801521609aedaa946d61f1"><div class="ttname"><a href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">SignalInfo::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00024">signal_info.h:24</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ada7bf94fbeaa26bd08c73982b5af255b"><div class="ttname"><a href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">SignalInfo::minimum</a></div><div class="ttdeci">double minimum</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00030">signal_info.h:30</a></div></div>
<div class="ttc" id="astructSignalInfo_html_adf1c4331b9eabced0d7fdda40ff0eb52"><div class="ttname"><a href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">SignalInfo::maximum</a></div><div class="ttdeci">double maximum</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00031">signal_info.h:31</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ae4f78d99a2750aa564d7eba860171499"><div class="ttname"><a href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">SignalInfo::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00028">signal_info.h:28</a></div></div>
<div class="ttc" id="astructSignalInfo_html_af363b1563fb4c7cc8973f9a80c06846c"><div class="ttname"><a href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">SignalInfo::isLittleEndian</a></div><div class="ttdeci">bool isLittleEndian</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00026">signal_info.h:26</a></div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcDatabase_html_a2cade5d0234ee816132127542f8c612b"><div class="ttname"><a href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">DbcDatabase::frames</a></div><div class="ttdeci">std::vector&lt; FrameInfo &gt; frames</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00023">dbc_database.h:23</a></div></div>
<div class="ttc" id="astructDecodeDatabase_html"><div class="ttname"><a href="structDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Runtime decode database with fast lookup by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00111">decode_database.h:111</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00061">decode_database.h:61</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a1d3c54055c0cbceb73adf551f7067f23"><div class="ttname"><a href="structDecodeFrame.html#a1d3c54055c0cbceb73adf551f7067f23">DecodeFrame::pgn</a></div><div class="ttdeci">std::uint32_t pgn</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00066">decode_database.h:66</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a2551102670c4a540fced4c71da0b369d"><div class="ttname"><a href="structDecodeFrame.html#a2551102670c4a540fced4c71da0b369d">DecodeFrame::hasPgn</a></div><div class="ttdeci">bool hasPgn</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00067">decode_database.h:67</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a25819ef907a32391af5c9f7cae9cdb22"><div class="ttname"><a href="structDecodeFrame.html#a25819ef907a32391af5c9f7cae9cdb22">DecodeFrame::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00069">decode_database.h:69</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a3ee2348d781f8f15aaf87e8dcf57ec41"><div class="ttname"><a href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">DecodeFrame::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00064">decode_database.h:64</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a51111ac13988be372d5673d12cf3e060"><div class="ttname"><a href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">DecodeFrame::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00065">decode_database.h:65</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a52e10215388db7df8b541b9d9909edcf"><div class="ttname"><a href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">DecodeFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00063">decode_database.h:63</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_aa0a7f8fd5bfde2148dfd0d838328f579"><div class="ttname"><a href="structDecodeFrame.html#aa0a7f8fd5bfde2148dfd0d838328f579">DecodeFrame::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00062">decode_database.h:62</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_ad78241dc40c793aabb8495b6989b81a9"><div class="ttname"><a href="structDecodeFrame.html#ad78241dc40c793aabb8495b6989b81a9">DecodeFrame::transmitter</a></div><div class="ttdeci">std::string transmitter</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00068">decode_database.h:68</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00039">decode_database.h:39</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a0fb84e19a0ab3bd50b6f65c1075ebc25"><div class="ttname"><a href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">DecodeSignal::minimum</a></div><div class="ttdeci">double minimum</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00047">decode_database.h:47</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a38eed9ca7581423fd8bfbedcffc12092"><div class="ttname"><a href="structDecodeSignal.html#a38eed9ca7581423fd8bfbedcffc12092">DecodeSignal::unit</a></div><div class="ttdeci">std::string unit</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00049">decode_database.h:49</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a428c39913a366a8476dd291061354391"><div class="ttname"><a href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">DecodeSignal::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00045">decode_database.h:45</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a4a6ba87142a9badbf0ca830e9e709cb7"><div class="ttname"><a href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">DecodeSignal::maximum</a></div><div class="ttdeci">double maximum</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00048">decode_database.h:48</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a58cf5844f2272a23dcb9687d912e4780"><div class="ttname"><a href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">DecodeSignal::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00040">decode_database.h:40</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a92db637af4e224a0ae70173050dc3f74"><div class="ttname"><a href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">DecodeSignal::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00046">decode_database.h:46</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a9d37638129263b8902ba5be59baf39a8"><div class="ttname"><a href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">DecodeSignal::valueType</a></div><div class="ttdeci">ValueType valueType</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00044">decode_database.h:44</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_aaf5d7527ddf65b6355c2b4f3626df22d"><div class="ttname"><a href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">DecodeSignal::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00041">decode_database.h:41</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_abdbae62a64d2df716bf60c6b67b30eaa"><div class="ttname"><a href="structDecodeSignal.html#abdbae62a64d2df716bf60c6b67b30eaa">DecodeSignal::receivers</a></div><div class="ttdeci">std::vector&lt; std::string &gt; receivers</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00050">decode_database.h:50</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_abdc4c4bb4a67a6d61d6ca81e8a52833d"><div class="ttname"><a href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">DecodeSignal::byteOrder</a></div><div class="ttdeci">ByteOrder byteOrder</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00043">decode_database.h:43</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_acd4ef5ee30421d117b5756854302debb"><div class="ttname"><a href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">DecodeSignal::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00042">decode_database.h:42</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_ae28c905d4a2bc86419c2a8361bfea473"><div class="ttname"><a href="structDecodeSignal.html#ae28c905d4a2bc86419c2a8361bfea473">DecodeSignal::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00051">decode_database.h:51</a></div></div>
<div class="ttc" id="astructFrameInfo_html"><div class="ttname"><a href="structFrameInfo.html">FrameInfo</a></div><div class="ttdoc">Describes one CAN frame from a DBC file.</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00024">frame_info.h:24</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a34b726afaad2ac5c697fdb2ac070cdaf"><div class="ttname"><a href="structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf">FrameInfo::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00027">frame_info.h:27</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a4737a5420213ad4304724e39f3a4e55d"><div class="ttname"><a href="structFrameInfo.html#a4737a5420213ad4304724e39f3a4e55d">FrameInfo::hasPgn</a></div><div class="ttdeci">bool hasPgn</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00029">frame_info.h:29</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a92749ec3798d4211a505860fb389a9e8"><div class="ttname"><a href="structFrameInfo.html#a92749ec3798d4211a505860fb389a9e8">FrameInfo::transmitter</a></div><div class="ttdeci">std::string transmitter</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00031">frame_info.h:31</a></div></div>
<div class="ttc" id="astructFrameInfo_html_aa2b198ea0f55e560c123d35e7b3ecab9"><div class="ttname"><a href="structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9">FrameInfo::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00030">frame_info.h:30</a></div></div>
<div class="ttc" id="astructFrameInfo_html_abb53a7f93ed7abc0ea1ae4a8ccafcdcb"><div class="ttname"><a href="structFrameInfo.html#abb53a7f93ed7abc0ea1ae4a8ccafcdcb">FrameInfo::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00025">frame_info.h:25</a></div></div>
<div class="ttc" id="astructFrameInfo_html_ace75121294f9d89b762080ab5643293c"><div class="ttname"><a href="structFrameInfo.html#ace75121294f9d89b762080ab5643293c">FrameInfo::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00032">frame_info.h:32</a></div></div>
<div class="ttc" id="astructFrameInfo_html_aee518b33f1000bf0b7f6e4a87474c943"><div class="ttname"><a href="structFrameInfo.html#aee518b33f1000bf0b7f6e4a87474c943">FrameInfo::pgn</a></div><div class="ttdeci">std::uint32_t pgn</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00028">frame_info.h:28</a></div></div>
<div class="ttc" id="astructFrameInfo_html_af470b0742c05bfbffc31c51a68f5c05e"><div class="ttname"><a href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">FrameInfo::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00026">frame_info.h:26</a></div></div>
<div class="ttc" id="astructFrameKey_html"><div class="ttname"><a href="structFrameKey.html">FrameKey</a></div><div class="ttdoc">Key for fast frame lookup.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00080">decode_database.h:80</a></div></div>
<div class="ttc" id="astructSignalInfo_html"><div class="ttname"><a href="structSignalInfo.html">SignalInfo</a></div><div class="ttdoc">Describes one signal inside a DBC frame.</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00022">signal_info.h:22</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a1008b5201f71848177217bd52fb84baa"><div class="ttname"><a href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">SignalInfo::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00025">signal_info.h:25</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a1f214f03e94ef5794de2d3367bfcbd01"><div class="ttname"><a href="structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01">SignalInfo::unit</a></div><div class="ttdeci">std::string unit</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00032">signal_info.h:32</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a2c95562fd0b29327a7fd7b1e6feee7f3"><div class="ttname"><a href="structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3">SignalInfo::receivers</a></div><div class="ttdeci">std::vector&lt; std::string &gt; receivers</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00033">signal_info.h:33</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a379e422a00cad56f896cacf60455b088"><div class="ttname"><a href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">SignalInfo::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00023">signal_info.h:23</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a52a52b320eef92fbcb4626307f9a498f"><div class="ttname"><a href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">SignalInfo::isSigned</a></div><div class="ttdeci">bool isSigned</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00027">signal_info.h:27</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ab7d0769f47aa540656b22e4e49db517e"><div class="ttname"><a href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">SignalInfo::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00029">signal_info.h:29</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ac99ba7563a5dad01e39c4257216953f5"><div class="ttname"><a href="structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5">SignalInfo::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00034">signal_info.h:34</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ace290724f9801521609aedaa946d61f1"><div class="ttname"><a href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">SignalInfo::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00024">signal_info.h:24</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ada7bf94fbeaa26bd08c73982b5af255b"><div class="ttname"><a href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">SignalInfo::minimum</a></div><div class="ttdeci">double minimum</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00030">signal_info.h:30</a></div></div>
<div class="ttc" id="astructSignalInfo_html_adf1c4331b9eabced0d7fdda40ff0eb52"><div class="ttname"><a href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">SignalInfo::maximum</a></div><div class="ttdeci">double maximum</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00031">signal_info.h:31</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ae4f78d99a2750aa564d7eba860171499"><div class="ttname"><a href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">SignalInfo::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00028">signal_info.h:28</a></div></div>
<div class="ttc" id="astructSignalInfo_html_af363b1563fb4c7cc8973f9a80c06846c"><div class="ttname"><a href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">SignalInfo::isLittleEndian</a></div><div class="ttdeci">bool isLittleEndian</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00026">signal_info.h:26</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__decode__builder_8cpp.html">dbc_decode_builder.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__decode__builder_8cpp.html">dbc_decode_builder.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+18 -11
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_decode_builder.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8h.html',''); ini
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -103,8 +110,8 @@ Classes</h2></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p >Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<div class="textblock"><p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p>Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<p class="definition">Definition in file <a class="el" href="dbc__decode__builder_8h_source.html">dbc_decode_builder.h</a>.</p>
</div></div><!-- contents -->
@@ -112,8 +119,8 @@ Classes</h2></td></tr>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+29 -15
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_decode_builder.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -51,6 +51,11 @@ $(function() {
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
@@ -77,9 +82,16 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8h_source.html','
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -93,25 +105,27 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8h_source.html','
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__database_8h.html">dbc_database.h</a>&quot;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &quot;<a class="code" href="decode__database_8h.html">decode_database.h</a>&quot;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> </div>
<div class="foldopen" id="foldopen00021" data-start="{" data-end="};">
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"><a class="line" href="classDbcDecodeBuilder.html"> 21</a></span><span class="keyword">class </span><a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a> {</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> <a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a> (<span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> &amp;source) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> <a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> &amp;source) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span>};</div>
</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#endif </span><span class="comment">/* DBC_DECODE_BUILDER_H */</span><span class="preprocessor"></span></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html"><div class="ttname"><a href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></div><div class="ttdoc">Converts parsed DBC data into runtime decode database.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decode__builder_8h_source.html#l00021">dbc_decode_builder.h:21</a></div></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decode__builder_8cpp_source.html#l00014">dbc_decode_builder.cpp:14</a></div></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html"><div class="ttname"><a href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></div><div class="ttdoc">Converts parsed DBC data into runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8h_source.html#l00021">dbc_decode_builder.h:21</a></div></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8cpp_source.html#l00014">dbc_decode_builder.cpp:14</a></div></div>
<div class="ttc" id="adbc__database_8h_html"><div class="ttname"><a href="dbc__database_8h.html">dbc_database.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adecode__database_8h_html"><div class="ttname"><a href="decode__database_8h.html">decode_database.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDecodeDatabase_html"><div class="ttname"><a href="structDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Runtime decode database with fast lookup by CAN ID.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00132">decode_database.h:132</a></div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDecodeDatabase_html"><div class="ttname"><a href="structDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Runtime decode database with fast lookup by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00111">decode_database.h:111</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+18 -11
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_decoder.cpp File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('dbc__decoder_8cpp.html',''); initResiz
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -93,8 +100,8 @@ $(document).ready(function(){initNavTree('dbc__decoder_8cpp.html',''); initResiz
</div>
<p><a href="dbc__decoder_8cpp_source.html">Go to the source code of this file.</a></p>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p >Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<div class="textblock"><p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p>Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<p class="definition">Definition in file <a class="el" href="dbc__decoder_8cpp_source.html">dbc_decoder.cpp</a>.</p>
</div></div><!-- contents -->
@@ -102,8 +109,8 @@ $(document).ready(function(){initNavTree('dbc__decoder_8cpp.html',''); initResiz
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__decoder_8cpp.html">dbc_decoder.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__decoder_8cpp.html">dbc_decoder.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+153 -136
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_decoder.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -51,6 +51,11 @@ $(function() {
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
@@ -77,9 +82,16 @@ $(document).ready(function(){initNavTree('dbc__decoder_8cpp_source.html',''); in
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -89,12 +101,13 @@ $(document).ready(function(){initNavTree('dbc__decoder_8cpp_source.html',''); in
<a href="dbc__decoder_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__decoder_8h.html">dbc_decoder.h</a>&quot;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"><a class="line" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da"> 14</a></span><span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> *<a class="code hl_function" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">DbcDecoder::FindFrame</a> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="foldopen" id="foldopen00014" data-start="{" data-end="}">
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"><a class="line" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da"> 14</a></span><span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> *<a class="code hl_function" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">DbcDecoder::FindFrame</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> std::uint32_t canId,</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> <span class="keywordtype">bool</span> isExtended)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> <span class="keyword">const</span> <a class="code hl_struct" href="structFrameKey.html">FrameKey</a> key (canId, isExtended);</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> <span class="keyword">const</span> <a class="code hl_struct" href="structFrameKey.html">FrameKey</a> key(canId, isExtended);</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">const</span> std::unordered_map&lt;FrameKey, std::size_t, FrameKeyHasher&gt;::const_iterator it =</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> database.frameIndexByKey.find (key);</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> database.frameIndexByKey.find(key);</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> <span class="keywordflow">if</span> (it == database.frameIndexByKey.end())</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
@@ -105,11 +118,13 @@ $(document).ready(function(){initNavTree('dbc__decoder_8cpp_source.html',''); in
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordflow">return</span> &amp;database.frames[index];</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span>}</div>
</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"><a class="line" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7"> 31</a></span><a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> <a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="foldopen" id="foldopen00031" data-start="{" data-end="}">
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"><a class="line" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7"> 31</a></span><a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> <a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keyword">const</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result;</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> *definition = <a class="code hl_function" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">FindFrame</a> (database, frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a>, frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a>);</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> *definition = <a class="code hl_function" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">FindFrame</a>(database, frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a>, frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a>);</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordflow">if</span> (definition == <span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="keywordflow">return</span> result;</div>
@@ -124,147 +139,149 @@ $(document).ready(function(){initNavTree('dbc__decoder_8cpp_source.html',''); in
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> </div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7">definition</a> = &amp;signal;</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> </div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordflow">if</span> (!ExtractUnsigned (frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>, signal, unsignedValue)) {</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordflow">if</span> (!ExtractUnsigned(frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>, signal, unsignedValue)) {</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> result.signals.push_back (decoded);</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> result.signals.push_back(decoded);</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> }</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> </div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> == ValueType::Signed)</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec">rawValue</a> = SignExtend (unsignedValue, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>);</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a95db4f7f93b5f311e8f272833e45055e">rawValue</a> = SignExtend(unsignedValue, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>);</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec">rawValue</a> = <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span> (unsignedValue);</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a95db4f7f93b5f311e8f272833e45055e">rawValue</a> = unsignedValue;</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a> =</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> (<span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span> (decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec">rawValue</a>) * signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a>) + signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a>;</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> </div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> result.signals.push_back (decoded);</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> }</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span>}</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> </div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span><span class="keywordtype">bool</span> DbcDecoder::ExtractUnsigned (<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal,</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keywordflow">if</span> ((signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> == 0U) || (signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> &gt; 64U))</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> </div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> == ByteOrder::Intel)</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordflow">return</span> ExtractIntel (data, signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>, value);</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> </div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordflow">return</span> ExtractMotorola (data, signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>, value);</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span>}</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> </div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="keywordtype">bool</span> DbcDecoder::ExtractIntel (<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> std::uint32_t length,</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> value = 0U;</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <span class="keywordflow">for</span> (std::uint32_t bitIndex = 0U; bitIndex &lt; length; ++bitIndex) {</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="keyword">const</span> std::uint32_t absoluteBit = startBit + bitIndex;</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="keyword">const</span> std::uint32_t byteIndex = absoluteBit / 8U;</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <span class="keyword">const</span> std::uint32_t bitInByte = absoluteBit % 8U;</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> </div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keywordflow">if</span> (byteIndex &gt;= data.size())</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> </div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="keyword">const</span> std::uint64_t bitValue =</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> (<span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span> ((data[byteIndex] &gt;&gt; bitInByte) &amp; 0x01U) &lt;&lt; bitIndex);</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> </div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> value |= bitValue;</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> }</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span>}</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> </div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span><span class="keywordtype">bool</span> DbcDecoder::ExtractMotorola (<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> std::uint32_t length,</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="comment">/*</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span><span class="comment"> * DBC Motorola bit numbering:</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="comment"> * - startBit points to the most significant bit of the signal</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span><span class="comment"> * - inside a byte, bit numbering goes 7..0</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span><span class="comment"> * - crossing byte boundary moves to the next byte, bit 7</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span><span class="comment"> */</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> </div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> value = 0U;</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> </div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> std::int32_t currentBit = <span class="keyword">static_cast&lt;</span>std::int32_t<span class="keyword">&gt;</span> (startBit);</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keywordflow">for</span> (std::uint32_t bitIndex = 0U; bitIndex &lt; length; ++bitIndex) {</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keywordflow">if</span> (currentBit &lt; 0)</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> </div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keyword">const</span> std::uint32_t absoluteBit = <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span> (currentBit);</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keyword">const</span> std::uint32_t byteIndex = absoluteBit / 8U;</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keyword">const</span> std::uint32_t bitFromMsb = absoluteBit % 8U;</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keyword">const</span> std::uint32_t bitInByte = 7U - bitFromMsb;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> </div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keywordflow">if</span> (byteIndex &gt;= data.size())</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> </div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> value &lt;&lt;= 1U;</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> value |= <span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span> ((data[byteIndex] &gt;&gt; bitInByte) &amp; 0x01U);</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> </div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keywordflow">if</span> ((absoluteBit % 8U) == 7U)</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> currentBit = <span class="keyword">static_cast&lt;</span>std::int32_t<span class="keyword">&gt;</span> ((byteIndex + 1U) * 8U);</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> --currentBit;</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> }</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> </div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span>}</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> </div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span>std::int64_t DbcDecoder::SignExtend (std::uint64_t value, std::uint32_t bitLength) {</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">if</span> ((bitLength == 0U) || (bitLength &gt;= 64U))</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span> (value);</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keyword">const</span> std::uint64_t signMask = (<span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span> (1U) &lt;&lt; (bitLength - 1U));</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keyword">const</span> std::uint64_t valueMask = (<span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span> (1U) &lt;&lt; bitLength) - 1U;</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keywordtype">double</span> numericValue;</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <span class="keyword">auto</span> *signedValue = std::get_if&lt;std::int64_t&gt;(&amp;decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a95db4f7f93b5f311e8f272833e45055e">rawValue</a>))</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> numericValue = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(*signedValue);</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> numericValue = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(std::get&lt;std::uint64_t&gt;(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a95db4f7f93b5f311e8f272833e45055e">rawValue</a>));</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a> = numericValue * signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a>;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> result.signals.push_back(decoded);</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> }</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span>}</div>
</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><span class="keywordtype">bool</span> DbcDecoder::ExtractUnsigned(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal,</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordflow">if</span> ((signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> == 0U) || (signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> &gt; 64U))</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> </div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> == ByteOrder::Intel)</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordflow">return</span> ExtractIntel(data, signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>, value);</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> </div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keywordflow">return</span> ExtractMotorola(data, signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>, value);</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span>}</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span><span class="keywordtype">bool</span> DbcDecoder::ExtractIntel(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> std::uint32_t length,</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> value = 0U;</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keywordflow">for</span> (std::uint32_t bitIndex = 0U; bitIndex &lt; length; ++bitIndex) {</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keyword">const</span> std::uint32_t absoluteBit = startBit + bitIndex;</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <span class="keyword">const</span> std::uint32_t byteIndex = absoluteBit / 8U;</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keyword">const</span> std::uint32_t bitInByte = absoluteBit % 8U;</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> </div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">if</span> (byteIndex &gt;= data.size())</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> </div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> <span class="keyword">const</span> std::uint64_t bitValue =</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> (<span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span>((data[byteIndex] &gt;&gt; bitInByte) &amp; 0x01U) &lt;&lt; bitIndex);</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> </div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> value |= bitValue;</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> }</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> </div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span>}</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> </div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="keywordtype">bool</span> DbcDecoder::ExtractMotorola(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> std::uint32_t length,</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="comment">/*</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span><span class="comment"> * DBC Motorola bit numbering:</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span><span class="comment"> * - startBit points to the most significant bit of the signal</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span><span class="comment"> * - inside a byte, bit numbering goes 7..0</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span><span class="comment"> * - crossing byte boundary moves to the next byte, bit 7</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span><span class="comment"> * Example: a signal starting at 7 follows 7..0, 15..8, 23..16.</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span><span class="comment"> */</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> value = 0U;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> </div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> std::size_t byteIndex = startBit / 8U;</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> std::uint32_t bitInByte = startBit % 8U;</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> </div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keywordflow">for</span> (std::uint32_t bitIndex = 0U; bitIndex &lt; length; ++bitIndex) {</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keywordflow">if</span> (byteIndex &gt;= data.size())</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> </div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> value &lt;&lt;= 1U;</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> value |= <span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span>((data[byteIndex] &gt;&gt; bitInByte) &amp; 0x01U);</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> </div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="keywordflow">if</span> (bitInByte == 0U) {</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> ++byteIndex;</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> bitInByte = 7U;</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> } <span class="keywordflow">else</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> --bitInByte;</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> }</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> </div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span>}</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> </div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span>std::int64_t DbcDecoder::SignExtend(std::uint64_t value, std::uint32_t bitLength) {</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordflow">if</span> ((bitLength == 0U) || (bitLength &gt; 64U))</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> </div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keyword">const</span> std::uint64_t signMask = std::uint64_t(1U) &lt;&lt; (bitLength - 1U);</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keyword">const</span> std::uint64_t valueMask = (bitLength == 64U)</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> ? ~std::uint64_t(0U)</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> : (std::uint64_t(1U) &lt;&lt; bitLength) - 1U;</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> value &amp;= valueMask;</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> </div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <span class="keywordflow">if</span> ((value &amp; signMask) == 0U)</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span> (value);</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span>(value);</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span> (value | (~valueMask));</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span>}</div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8cpp_source.html#l00031">dbc_decoder.cpp:31</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_ab2cfb2fb711c95d3a29365546b89f3da"><div class="ttname"><a href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">DbcDecoder::FindFrame</a></div><div class="ttdeci">const DecodeFrame * FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8cpp_source.html#l00014">dbc_decoder.cpp:14</a></div></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="comment">// The complemented magnitude fits int64_t, including for INT64_MIN.</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keywordflow">return</span> -1 - <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span>((~value) &amp; valueMask);</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span>}</div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00031">dbc_decoder.cpp:31</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_ab2cfb2fb711c95d3a29365546b89f3da"><div class="ttname"><a href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">DbcDecoder::FindFrame</a></div><div class="ttdeci">const DecodeFrame * FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00014">dbc_decoder.cpp:14</a></div></div>
<div class="ttc" id="adbc__decoder_8h_html"><div class="ttname"><a href="dbc__decoder_8h.html">dbc_decoder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDecodeDatabase_html"><div class="ttname"><a href="structDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Runtime decode database with fast lookup by CAN ID.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00132">decode_database.h:132</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00072">decode_database.h:72</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00039">decode_database.h:39</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a428c39913a366a8476dd291061354391"><div class="ttname"><a href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">DecodeSignal::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00045">decode_database.h:45</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a92db637af4e224a0ae70173050dc3f74"><div class="ttname"><a href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">DecodeSignal::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00046">decode_database.h:46</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a9d37638129263b8902ba5be59baf39a8"><div class="ttname"><a href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">DecodeSignal::valueType</a></div><div class="ttdeci">ValueType valueType</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00044">decode_database.h:44</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_aaf5d7527ddf65b6355c2b4f3626df22d"><div class="ttname"><a href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">DecodeSignal::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00041">decode_database.h:41</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_abdc4c4bb4a67a6d61d6ca81e8a52833d"><div class="ttname"><a href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">DecodeSignal::byteOrder</a></div><div class="ttdeci">ByteOrder byteOrder</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00043">decode_database.h:43</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_acd4ef5ee30421d117b5756854302debb"><div class="ttname"><a href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">DecodeSignal::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00042">decode_database.h:42</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html"><div class="ttname"><a href="structDecodedFrameValue.html">DecodedFrameValue</a></div><div class="ttdoc">Fully decoded frame.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00055">dbc_decoder.h:55</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a4f51c31110dba1f73a763c596372beb0"><div class="ttname"><a href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">DecodedFrameValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00058">dbc_decoder.h:58</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a60dda1cc352d2c8087f0bdbc81dd266c"><div class="ttname"><a href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">DecodedFrameValue::definition</a></div><div class="ttdeci">const DecodeFrame * definition</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00056">dbc_decoder.h:56</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html"><div class="ttname"><a href="structDecodedSignalValue.html">DecodedSignalValue</a></div><div class="ttdoc">One decoded signal value.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00038">dbc_decoder.h:38</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_a5138b825940e34689f7b3891627ee9ec"><div class="ttname"><a href="structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec">DecodedSignalValue::rawValue</a></div><div class="ttdeci">std::int64_t rawValue</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00040">dbc_decoder.h:40</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_a6847d05b3cb00d5e0f6c611968f57978"><div class="ttname"><a href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">DecodedSignalValue::physicalValue</a></div><div class="ttdeci">double physicalValue</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00041">dbc_decoder.h:41</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_aac0ed361af545cde48d0e6f41a859686"><div class="ttname"><a href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">DecodedSignalValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00042">dbc_decoder.h:42</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_acadc3b3bb21dd6b0412d342c7e6b20d7"><div class="ttname"><a href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7">DecodedSignalValue::definition</a></div><div class="ttdeci">const DecodeSignal * definition</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00039">dbc_decoder.h:39</a></div></div>
<div class="ttc" id="astructFrameKey_html"><div class="ttname"><a href="structFrameKey.html">FrameKey</a></div><div class="ttdoc">Key for fast frame lookup.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00099">decode_database.h:99</a></div></div>
<div class="ttc" id="astructRawCanFrame_html"><div class="ttname"><a href="structRawCanFrame.html">RawCanFrame</a></div><div class="ttdoc">Raw CAN frame used for runtime or trace decoding.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00023">dbc_decoder.h:23</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a0acb487612104c99c9907344c035df83"><div class="ttname"><a href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">RawCanFrame::data</a></div><div class="ttdeci">std::vector&lt; std::uint8_t &gt; data</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00026">dbc_decoder.h:26</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a2d0e7fa0e3d5c20bbed55ed8f7888ff4"><div class="ttname"><a href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">RawCanFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00024">dbc_decoder.h:24</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a462193d275adc1dba8bd18ffa0e36bb7"><div class="ttname"><a href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">RawCanFrame::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00025">dbc_decoder.h:25</a></div></div>
<div class="ttc" id="astructDecodeDatabase_html"><div class="ttname"><a href="structDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Runtime decode database with fast lookup by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00111">decode_database.h:111</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00061">decode_database.h:61</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00039">decode_database.h:39</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a428c39913a366a8476dd291061354391"><div class="ttname"><a href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">DecodeSignal::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00045">decode_database.h:45</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a92db637af4e224a0ae70173050dc3f74"><div class="ttname"><a href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">DecodeSignal::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00046">decode_database.h:46</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a9d37638129263b8902ba5be59baf39a8"><div class="ttname"><a href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">DecodeSignal::valueType</a></div><div class="ttdeci">ValueType valueType</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00044">decode_database.h:44</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_aaf5d7527ddf65b6355c2b4f3626df22d"><div class="ttname"><a href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">DecodeSignal::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00041">decode_database.h:41</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_abdc4c4bb4a67a6d61d6ca81e8a52833d"><div class="ttname"><a href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">DecodeSignal::byteOrder</a></div><div class="ttdeci">ByteOrder byteOrder</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00043">decode_database.h:43</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_acd4ef5ee30421d117b5756854302debb"><div class="ttname"><a href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">DecodeSignal::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00042">decode_database.h:42</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html"><div class="ttname"><a href="structDecodedFrameValue.html">DecodedFrameValue</a></div><div class="ttdoc">Fully decoded frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00051">dbc_decoder.h:51</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a4f51c31110dba1f73a763c596372beb0"><div class="ttname"><a href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">DecodedFrameValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00054">dbc_decoder.h:54</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a60dda1cc352d2c8087f0bdbc81dd266c"><div class="ttname"><a href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">DecodedFrameValue::definition</a></div><div class="ttdeci">const DecodeFrame * definition</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00052">dbc_decoder.h:52</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html"><div class="ttname"><a href="structDecodedSignalValue.html">DecodedSignalValue</a></div><div class="ttdoc">One decoded signal value.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00037">dbc_decoder.h:37</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_a6847d05b3cb00d5e0f6c611968f57978"><div class="ttname"><a href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">DecodedSignalValue::physicalValue</a></div><div class="ttdeci">double physicalValue</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00040">dbc_decoder.h:40</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_a95db4f7f93b5f311e8f272833e45055e"><div class="ttname"><a href="structDecodedSignalValue.html#a95db4f7f93b5f311e8f272833e45055e">DecodedSignalValue::rawValue</a></div><div class="ttdeci">std::variant&lt; std::int64_t, std::uint64_t &gt; rawValue</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00039">dbc_decoder.h:39</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_aac0ed361af545cde48d0e6f41a859686"><div class="ttname"><a href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">DecodedSignalValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00041">dbc_decoder.h:41</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_acadc3b3bb21dd6b0412d342c7e6b20d7"><div class="ttname"><a href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7">DecodedSignalValue::definition</a></div><div class="ttdeci">const DecodeSignal * definition</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00038">dbc_decoder.h:38</a></div></div>
<div class="ttc" id="astructFrameKey_html"><div class="ttname"><a href="structFrameKey.html">FrameKey</a></div><div class="ttdoc">Key for fast frame lookup.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00080">decode_database.h:80</a></div></div>
<div class="ttc" id="astructRawCanFrame_html"><div class="ttname"><a href="structRawCanFrame.html">RawCanFrame</a></div><div class="ttdoc">Raw CAN frame used for runtime or trace decoding.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00024">dbc_decoder.h:24</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a0acb487612104c99c9907344c035df83"><div class="ttname"><a href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">RawCanFrame::data</a></div><div class="ttdeci">std::vector&lt; std::uint8_t &gt; data</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00027">dbc_decoder.h:27</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a2d0e7fa0e3d5c20bbed55ed8f7888ff4"><div class="ttname"><a href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">RawCanFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00025">dbc_decoder.h:25</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a462193d275adc1dba8bd18ffa0e36bb7"><div class="ttname"><a href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">RawCanFrame::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00026">dbc_decoder.h:26</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__decoder_8cpp.html">dbc_decoder.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__decoder_8cpp.html">dbc_decoder.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+21 -13
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_decoder.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('dbc__decoder_8h.html',''); initResizab
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -91,8 +98,9 @@ $(document).ready(function(){initNavTree('dbc__decoder_8h.html',''); initResizab
<p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;vector&gt;</code><br />
<code>#include &lt;cstdint&gt;</code><br />
<div class="textblock"><code>#include &lt;cstdint&gt;</code><br />
<code>#include &lt;variant&gt;</code><br />
<code>#include &lt;vector&gt;</code><br />
<code>#include &quot;<a class="el" href="decode__database_8h_source.html">decode_database.h</a>&quot;</code><br />
</div>
<p><a href="dbc__decoder_8h_source.html">Go to the source code of this file.</a></p>
@@ -113,8 +121,8 @@ Classes</h2></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p >Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<div class="textblock"><p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p>Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<p class="definition">Definition in file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
</div></div><!-- contents -->
@@ -122,8 +130,8 @@ Classes</h2></td></tr>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__decoder_8h.html">dbc_decoder.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__decoder_8h.html">dbc_decoder.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+109 -95
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_decoder.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -51,6 +51,11 @@ $(function() {
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
@@ -77,9 +82,16 @@ $(document).ready(function(){initNavTree('dbc__decoder_8h_source.html',''); init
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -90,100 +102,102 @@ $(document).ready(function(){initNavTree('dbc__decoder_8h_source.html',''); init
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#ifndef DBC_DECODER_H</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#define DBC_DECODER_H</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> </div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &quot;<a class="code" href="decode__database_8h.html">decode_database.h</a>&quot;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"><a class="line" href="structRawCanFrame.html"> 23</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> {</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"><a class="line" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4"> 24</a></span> std::uint32_t <a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a>; </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"><a class="line" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7"> 25</a></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a>; </div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"><a class="line" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83"> 26</a></span> std::vector&lt;std::uint8_t&gt; <a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>; </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a>()</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> : <a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> (0U)</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> , <a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a> (false)</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> , <a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>() {</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> }</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span>};</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html"> 38</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> {</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7"> 39</a></span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> *<a class="code hl_variable" href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7">definition</a>; </div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec"> 40</a></span> std::int64_t <a class="code hl_variable" href="structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec">rawValue</a>; </div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978"> 41</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>; </div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686"> 42</a></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>; </div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a>()</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> : <a class="code hl_variable" href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7">definition</a> (nullptr)</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> , <a class="code hl_variable" href="structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec">rawValue</a> (0)</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> , <a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a> (0.0)</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> , <a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> (false) {</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> }</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span>};</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"><a class="line" href="structDecodedFrameValue.html"> 55</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> {</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"><a class="line" href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c"> 56</a></span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> *<a class="code hl_variable" href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">definition</a>; </div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"><a class="line" href="structDecodedFrameValue.html#adae123ac7fbb4a5c314b64b01109f4a8"> 57</a></span> std::vector&lt;DecodedSignalValue&gt; signals; </div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"><a class="line" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0"> 58</a></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>; </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a>()</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> : <a class="code hl_variable" href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">definition</a> (nullptr)</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> , signals()</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> , <a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> (false) {</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> }</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span>};</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"><a class="line" href="classDbcDecoder.html"> 70</a></span><span class="keyword">class </span><a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a> {</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> *<a class="code hl_function" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">FindFrame</a> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> std::uint32_t canId,</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordtype">bool</span> isExtended) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> </div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> <a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="keyword">const</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keyword">private</span>:</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> ExtractUnsigned (<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal,</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> std::uint64_t &amp;value);</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> </div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> ExtractIntel (<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> std::uint32_t length,</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> std::uint64_t &amp;value);</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> ExtractMotorola (<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> std::uint32_t length,</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> std::uint64_t &amp;value);</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> </div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="keyword">static</span> std::int64_t SignExtend (std::uint64_t value, std::uint32_t bitLength);</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span>};</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> </div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span><span class="preprocessor">#endif </span><span class="comment">/* DBC_DECODER_H */</span><span class="preprocessor"></span></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00070">dbc_decoder.h:70</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8cpp_source.html#l00031">dbc_decoder.cpp:31</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_ab2cfb2fb711c95d3a29365546b89f3da"><div class="ttname"><a href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">DbcDecoder::FindFrame</a></div><div class="ttdeci">const DecodeFrame * FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8cpp_source.html#l00014">dbc_decoder.cpp:14</a></div></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;variant&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &quot;<a class="code" href="decode__database_8h.html">decode_database.h</a>&quot;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
<div class="foldopen" id="foldopen00024" data-start="{" data-end="};">
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"><a class="line" href="structRawCanFrame.html"> 24</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> {</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"><a class="line" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4"> 25</a></span> std::uint32_t <a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a>; </div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"><a class="line" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7"> 26</a></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a>; </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"><a class="line" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83"> 27</a></span> std::vector&lt;std::uint8_t&gt; <a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>; </div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a>()</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> : <a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a>(0U), <a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a>(false), <a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>() {</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> }</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span>};</div>
</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> </div>
<div class="foldopen" id="foldopen00037" data-start="{" data-end="};">
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html"> 37</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> {</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7"> 38</a></span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> *<a class="code hl_variable" href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7">definition</a>; </div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html#a95db4f7f93b5f311e8f272833e45055e"> 39</a></span> std::variant&lt;std::int64_t, std::uint64_t&gt; <a class="code hl_variable" href="structDecodedSignalValue.html#a95db4f7f93b5f311e8f272833e45055e">rawValue</a>; </div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978"> 40</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>; </div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"><a class="line" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686"> 41</a></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>; </div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a>()</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> : <a class="code hl_variable" href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7">definition</a>(nullptr), <a class="code hl_variable" href="structDecodedSignalValue.html#a95db4f7f93b5f311e8f272833e45055e">rawValue</a>(std::uint64_t(0U)), <a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>(0.0), <a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>(false) {</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> }</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span>};</div>
</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> </div>
<div class="foldopen" id="foldopen00051" data-start="{" data-end="};">
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"><a class="line" href="structDecodedFrameValue.html"> 51</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> {</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"><a class="line" href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c"> 52</a></span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> *<a class="code hl_variable" href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">definition</a>; </div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"><a class="line" href="structDecodedFrameValue.html#adae123ac7fbb4a5c314b64b01109f4a8"> 53</a></span> std::vector&lt;DecodedSignalValue&gt; signals; </div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"><a class="line" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0"> 54</a></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>; </div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a>()</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> : <a class="code hl_variable" href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">definition</a>(nullptr), signals(), <a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>(false) {</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> }</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span>};</div>
</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
<div class="foldopen" id="foldopen00064" data-start="{" data-end="};">
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"><a class="line" href="classDbcDecoder.html"> 64</a></span><span class="keyword">class </span><a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a> {</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> *<a class="code hl_function" href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">FindFrame</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> std::uint32_t canId,</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keywordtype">bool</span> isExtended) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> <a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <span class="keyword">const</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> ExtractUnsigned(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal,</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> std::uint64_t &amp;value);</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> </div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> ExtractIntel(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> std::uint32_t length,</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> std::uint64_t &amp;value);</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> </div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> ExtractMotorola(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> std::uint32_t length,</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> std::uint64_t &amp;value);</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> </div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="keyword">static</span> std::int64_t SignExtend(std::uint64_t value, std::uint32_t bitLength);</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span>};</div>
</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> </div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span><span class="preprocessor">#endif </span><span class="comment">/* DBC_DECODER_H */</span><span class="preprocessor"></span></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00064">dbc_decoder.h:64</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00031">dbc_decoder.cpp:31</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_ab2cfb2fb711c95d3a29365546b89f3da"><div class="ttname"><a href="classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da">DbcDecoder::FindFrame</a></div><div class="ttdeci">const DecodeFrame * FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00014">dbc_decoder.cpp:14</a></div></div>
<div class="ttc" id="adecode__database_8h_html"><div class="ttname"><a href="decode__database_8h.html">decode_database.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDecodeDatabase_html"><div class="ttname"><a href="structDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Runtime decode database with fast lookup by CAN ID.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00132">decode_database.h:132</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00072">decode_database.h:72</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition:</b> <a href="decode__database_8h_source.html#l00039">decode_database.h:39</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html"><div class="ttname"><a href="structDecodedFrameValue.html">DecodedFrameValue</a></div><div class="ttdoc">Fully decoded frame.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00055">dbc_decoder.h:55</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a4f51c31110dba1f73a763c596372beb0"><div class="ttname"><a href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">DecodedFrameValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00058">dbc_decoder.h:58</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a60dda1cc352d2c8087f0bdbc81dd266c"><div class="ttname"><a href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">DecodedFrameValue::definition</a></div><div class="ttdeci">const DecodeFrame * definition</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00056">dbc_decoder.h:56</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html"><div class="ttname"><a href="structDecodedSignalValue.html">DecodedSignalValue</a></div><div class="ttdoc">One decoded signal value.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00038">dbc_decoder.h:38</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_a5138b825940e34689f7b3891627ee9ec"><div class="ttname"><a href="structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec">DecodedSignalValue::rawValue</a></div><div class="ttdeci">std::int64_t rawValue</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00040">dbc_decoder.h:40</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_a6847d05b3cb00d5e0f6c611968f57978"><div class="ttname"><a href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">DecodedSignalValue::physicalValue</a></div><div class="ttdeci">double physicalValue</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00041">dbc_decoder.h:41</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_aac0ed361af545cde48d0e6f41a859686"><div class="ttname"><a href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">DecodedSignalValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00042">dbc_decoder.h:42</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_acadc3b3bb21dd6b0412d342c7e6b20d7"><div class="ttname"><a href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7">DecodedSignalValue::definition</a></div><div class="ttdeci">const DecodeSignal * definition</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00039">dbc_decoder.h:39</a></div></div>
<div class="ttc" id="astructRawCanFrame_html"><div class="ttname"><a href="structRawCanFrame.html">RawCanFrame</a></div><div class="ttdoc">Raw CAN frame used for runtime or trace decoding.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00023">dbc_decoder.h:23</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a0acb487612104c99c9907344c035df83"><div class="ttname"><a href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">RawCanFrame::data</a></div><div class="ttdeci">std::vector&lt; std::uint8_t &gt; data</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00026">dbc_decoder.h:26</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a2d0e7fa0e3d5c20bbed55ed8f7888ff4"><div class="ttname"><a href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">RawCanFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00024">dbc_decoder.h:24</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a462193d275adc1dba8bd18ffa0e36bb7"><div class="ttname"><a href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">RawCanFrame::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition:</b> <a href="dbc__decoder_8h_source.html#l00025">dbc_decoder.h:25</a></div></div>
<div class="ttc" id="astructDecodeDatabase_html"><div class="ttname"><a href="structDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Runtime decode database with fast lookup by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00111">decode_database.h:111</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00061">decode_database.h:61</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00039">decode_database.h:39</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html"><div class="ttname"><a href="structDecodedFrameValue.html">DecodedFrameValue</a></div><div class="ttdoc">Fully decoded frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00051">dbc_decoder.h:51</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a4f51c31110dba1f73a763c596372beb0"><div class="ttname"><a href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">DecodedFrameValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00054">dbc_decoder.h:54</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a60dda1cc352d2c8087f0bdbc81dd266c"><div class="ttname"><a href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">DecodedFrameValue::definition</a></div><div class="ttdeci">const DecodeFrame * definition</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00052">dbc_decoder.h:52</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html"><div class="ttname"><a href="structDecodedSignalValue.html">DecodedSignalValue</a></div><div class="ttdoc">One decoded signal value.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00037">dbc_decoder.h:37</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_a6847d05b3cb00d5e0f6c611968f57978"><div class="ttname"><a href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">DecodedSignalValue::physicalValue</a></div><div class="ttdeci">double physicalValue</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00040">dbc_decoder.h:40</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_a95db4f7f93b5f311e8f272833e45055e"><div class="ttname"><a href="structDecodedSignalValue.html#a95db4f7f93b5f311e8f272833e45055e">DecodedSignalValue::rawValue</a></div><div class="ttdeci">std::variant&lt; std::int64_t, std::uint64_t &gt; rawValue</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00039">dbc_decoder.h:39</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_aac0ed361af545cde48d0e6f41a859686"><div class="ttname"><a href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">DecodedSignalValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00041">dbc_decoder.h:41</a></div></div>
<div class="ttc" id="astructDecodedSignalValue_html_acadc3b3bb21dd6b0412d342c7e6b20d7"><div class="ttname"><a href="structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7">DecodedSignalValue::definition</a></div><div class="ttdeci">const DecodeSignal * definition</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00038">dbc_decoder.h:38</a></div></div>
<div class="ttc" id="astructRawCanFrame_html"><div class="ttname"><a href="structRawCanFrame.html">RawCanFrame</a></div><div class="ttdoc">Raw CAN frame used for runtime or trace decoding.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00024">dbc_decoder.h:24</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a0acb487612104c99c9907344c035df83"><div class="ttname"><a href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">RawCanFrame::data</a></div><div class="ttdeci">std::vector&lt; std::uint8_t &gt; data</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00027">dbc_decoder.h:27</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a2d0e7fa0e3d5c20bbed55ed8f7888ff4"><div class="ttname"><a href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">RawCanFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00025">dbc_decoder.h:25</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a462193d275adc1dba8bd18ffa0e36bb7"><div class="ttname"><a href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">RawCanFrame::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00026">dbc_decoder.h:26</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__decoder_8h.html">dbc_decoder.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__decoder_8h.html">dbc_decoder.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
@@ -0,0 +1,290 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_decoder_test.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('dbc__decoder__test_8cpp_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">dbc_decoder_test.cpp</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__decoder_8h.html">dbc_decoder.h</a>&quot;</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span> </div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="preprocessor">#include &lt;QtTest&gt;</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &lt;sstream&gt;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span> </div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="keyword">struct </span>DecodeCase {</div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *name;</div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span> <a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> byteOrder;</div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span> std::uint32_t startBit;</div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> std::uint32_t length;</div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span> <a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a> valueType;</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> std::vector&lt;std::uint8_t&gt; data;</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> <span class="keywordtype">bool</span> valid;</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> std::int64_t rawValue;</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> <span class="keywordtype">double</span> factor;</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> <span class="keywordtype">double</span> offset;</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keywordtype">double</span> physicalValue;</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span>};</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span>Q_DECLARE_METATYPE(DecodeCase)</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="keyword">class </span>DbcDecoderTest : <span class="keyword">public</span> QObject {</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> Q_OBJECT</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="keyword">private</span> Q_SLOTS:</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> <span class="keywordtype">void</span> decode_data();</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> <span class="keywordtype">void</span> decode();</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordtype">void</span> boundaries();</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span>};</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="keywordtype">void</span> DbcDecoderTest::decode_data() {</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> QTest::addColumn&lt;DecodeCase&gt;(<span class="stringliteral">&quot;test&quot;</span>);</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> <span class="keyword">const</span> DecodeCase cases[] = {</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> {<span class="stringliteral">&quot;Motorola reproduction&quot;</span>, ByteOrder::Motorola, 7U, 16U, ValueType::Unsigned, {0x12, 0x34}, <span class="keyword">true</span>, 0x1234, 1.0, 0.0, 4660.0},</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> {<span class="stringliteral">&quot;Motorola within byte&quot;</span>, ByteOrder::Motorola, 5U, 4U, ValueType::Unsigned, {0xAC}, <span class="keyword">true</span>, 11, 1.0, 0.0, 11.0},</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> {<span class="stringliteral">&quot;Motorola unaligned crossing&quot;</span>, ByteOrder::Motorola, 3U, 12U, ValueType::Unsigned, {0xAB, 0xCD}, <span class="keyword">true</span>, 0xBCD, 1.0, 0.0, 3021.0},</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> {<span class="stringliteral">&quot;Motorola starts at bit zero&quot;</span>, ByteOrder::Motorola, 0U, 2U, ValueType::Unsigned, {0x01, 0x80}, <span class="keyword">true</span>, 3, 1.0, 0.0, 3.0},</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> {<span class="stringliteral">&quot;Motorola second byte&quot;</span>, ByteOrder::Motorola, 15U, 16U, ValueType::Unsigned, {0xFF, 0x12, 0x34}, <span class="keyword">true</span>, 0x1234, 1.0, 0.0, 4660.0},</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> {<span class="stringliteral">&quot;Motorola signed scaled&quot;</span>, ByteOrder::Motorola, 7U, 16U, ValueType::Signed, {0xFF, 0xFE}, <span class="keyword">true</span>, -2, 0.5, 10.0, 9.0},</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> {<span class="stringliteral">&quot;Motorola 64 bits&quot;</span>, ByteOrder::Motorola, 7U, 64U, ValueType::Unsigned, {0, 0, 0, 0, 0, 0, 0x12, 0x34}, <span class="keyword">true</span>, 0x1234, 1.0, 0.0, 4660.0},</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> {<span class="stringliteral">&quot;Motorola 64 bits high bit&quot;</span>, ByteOrder::Motorola, 7U, 64U, ValueType::Unsigned, {0x40, 0, 0, 0, 0, 0, 0, 0}, <span class="keyword">true</span>, 0x4000000000000000LL, 1.0, 0.0, 4611686018427387904.0},</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> {<span class="stringliteral">&quot;Motorola short payload&quot;</span>, ByteOrder::Motorola, 7U, 16U, ValueType::Unsigned, {0x12}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> {<span class="stringliteral">&quot;Motorola empty payload&quot;</span>, ByteOrder::Motorola, 7U, 8U, ValueType::Unsigned, {}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> {<span class="stringliteral">&quot;Motorola large start&quot;</span>, ByteOrder::Motorola, std::numeric_limits&lt;std::uint32_t&gt;::max(), 8U, ValueType::Unsigned, {0xFF}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> {<span class="stringliteral">&quot;Motorola zero length&quot;</span>, ByteOrder::Motorola, 7U, 0U, ValueType::Unsigned, {0xFF}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> {<span class="stringliteral">&quot;Motorola excessive length&quot;</span>, ByteOrder::Motorola, 7U, 65U, ValueType::Unsigned,</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> std::vector&lt;std::uint8_t&gt;(9U, 0xFF), <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> {<span class="stringliteral">&quot;Intel regression&quot;</span>, ByteOrder::Intel, 0U, 16U, ValueType::Unsigned, {0x12, 0x34}, <span class="keyword">true</span>, 0x3412, 1.0, 0.0, 13330.0},</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> {<span class="stringliteral">&quot;Intel signed regression&quot;</span>, ByteOrder::Intel, 0U, 16U, ValueType::Signed, {0xFE, 0xFF}, <span class="keyword">true</span>, -2, 0.5, 10.0, 9.0},</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> {<span class="stringliteral">&quot;Intel short payload&quot;</span>, ByteOrder::Intel, 0U, 16U, ValueType::Unsigned, {0x12}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0}};</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &amp;test: cases)</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> QTest::newRow(test.name) &lt;&lt; test;</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span>}</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> </div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="keywordtype">void</span> DbcDecoderTest::decode() {</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> QFETCH(DecodeCase, test);</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = test.name;</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = test.byteOrder;</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = test.startBit;</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = test.length;</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = test.valueType;</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = test.factor;</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = test.offset;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x123U;</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(test.data.size());</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> database;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> database.frames.push_back(definition);</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> database.frameIndexByKey.emplace(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(definition.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a>, <span class="keyword">false</span>), 0U);</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> </div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = definition.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a>;</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = test.data;</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, frame);</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> passed = result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp;</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> (result.<a class="code hl_variable" href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">definition</a> == &amp;database.frames[0]) &amp;&amp;</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> (result.signals.size() == 1U) &amp;&amp;</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> (result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">definition</a> == &amp;database.frames[0].signals[0]) &amp;&amp;</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> (result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> == test.valid) &amp;&amp;</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> (!test.valid || (((test.valueType == ValueType::Signed)</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> ? (std::get_if&lt;std::int64_t&gt;(&amp;result.signals[0].rawValue) &amp;&amp;</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> std::get&lt;std::int64_t&gt;(result.signals[0].rawValue) == test.rawValue)</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> : (std::get_if&lt;std::uint64_t&gt;(&amp;result.signals[0].rawValue) &amp;&amp;</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> std::get&lt;std::uint64_t&gt;(result.signals[0].rawValue) ==</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> static_cast&lt;std::uint64_t&gt;(test.rawValue))) &amp;&amp;</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> (result.signals[0].physicalValue == test.physicalValue)));</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> QVERIFY2(passed, test.name);</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span>}</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> </div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span><span class="keywordtype">void</span> DbcDecoderTest::boundaries() {</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> order: {ByteOrder::Intel, ByteOrder::Motorola}) {</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a> type: {ValueType::Unsigned, ValueType::Signed}) {</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">for</span> (std::uint64_t bits: {std::uint64_t(0U), std::uint64_t(0x7FFFFFFFFFFFFFFFULL),</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> std::uint64_t(0x8000000000000000ULL),</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> std::uint64_t(0x8000000000000001ULL),</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> std::uint64_t(0xFFFFFFFFFFFFFFFFULL)}) {</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <a class="code hl_struct" href="structDecodeDatabase.html">DecodeDatabase</a> database;</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = order == ByteOrder::Intel ? 0U : 7U;</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 64U;</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = order;</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = type;</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = 0.5;</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = 10.0;</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> database.frames.push_back(definition);</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> database.frameIndexByKey.emplace(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(0U, <span class="keyword">false</span>), 0U);</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0U; <span class="keywordtype">byte</span> &lt; 8U; ++byte) {</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> shift = (order == ByteOrder::Intel ? byte : 7U - byte) * 8U;</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.push_back(<span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(bits &gt;&gt; shift));</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> }</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="keyword">const</span> <span class="keyword">auto</span> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, frame);</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keyword">const</span> std::int64_t signedExpected = bits &lt;= 0x7FFFFFFFFFFFFFFFULL</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> ? <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span>(bits)</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> : std::numeric_limits&lt;std::int64_t&gt;::min() +</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> static_cast&lt;std::int64_t&gt;(bits - 0x8000000000000000ULL);</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="keyword">const</span> <span class="keyword">auto</span> &amp;decoded = result.signals.at(0U);</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keyword">const</span> <span class="keyword">auto</span> expected = type == ValueType::Unsigned</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> ? std::variant&lt;std::int64_t, std::uint64_t&gt;(bits)</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> : std::variant&lt;std::int64_t, std::uint64_t&gt;(signedExpected);</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keyword">const</span> <span class="keywordtype">double</span> physical = (type == ValueType::Unsigned</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> ? <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(bits)</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> : static_cast&lt;double&gt;(signedExpected)) *</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> 0.5 +</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> 10.0;</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> std::ostringstream actualText;</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> std::ostringstream expectedText;</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <span class="keyword">auto</span> *signedValue = std::get_if&lt;std::int64_t&gt;(&amp;decoded.rawValue))</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> actualText &lt;&lt; *signedValue;</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> actualText &lt;&lt; std::get&lt;std::uint64_t&gt;(decoded.rawValue);</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keywordflow">if</span> (type == ValueType::Unsigned)</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> expectedText &lt;&lt; bits;</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> expectedText &lt;&lt; signedExpected;</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> QVERIFY2(decoded.valid &amp;&amp; decoded.rawValue == expected &amp;&amp;</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> decoded.physicalValue == physical &amp;&amp; actualText.str() == expectedText.str(),</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> expectedText.str().c_str());</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> }</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> }</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> }</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span>}</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span><span class="keywordtype">int</span> RunDecoderTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> DbcDecoderTest tests;</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keywordflow">return</span> QTest::qExec(&amp;tests, argc, argv);</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span>}</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> </div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span><span class="preprocessor">#include &quot;dbc_decoder_test.moc&quot;</span></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00064">dbc_decoder.h:64</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00031">dbc_decoder.cpp:31</a></div></div>
<div class="ttc" id="adbc__decoder_8h_html"><div class="ttname"><a href="dbc__decoder_8h.html">dbc_decoder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adecode__database_8h_html_aaeb92d42f5a6e27b8ba19f18d69d142b"><div class="ttname"><a href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a></div><div class="ttdeci">ByteOrder</div><div class="ttdoc">Signal byte order used for runtime decoding.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00023">decode_database.h:23</a></div></div>
<div class="ttc" id="adecode__database_8h_html_ad9971b6ef33e02ba2c75d19c1d2518a1"><div class="ttname"><a href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a></div><div class="ttdeci">ValueType</div><div class="ttdoc">Signal numeric type.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00031">decode_database.h:31</a></div></div>
<div class="ttc" id="astructDecodeDatabase_html"><div class="ttname"><a href="structDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Runtime decode database with fast lookup by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00111">decode_database.h:111</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00061">decode_database.h:61</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a51111ac13988be372d5673d12cf3e060"><div class="ttname"><a href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">DecodeFrame::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00065">decode_database.h:65</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a52e10215388db7df8b541b9d9909edcf"><div class="ttname"><a href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">DecodeFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00063">decode_database.h:63</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00039">decode_database.h:39</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a428c39913a366a8476dd291061354391"><div class="ttname"><a href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">DecodeSignal::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00045">decode_database.h:45</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a58cf5844f2272a23dcb9687d912e4780"><div class="ttname"><a href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">DecodeSignal::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00040">decode_database.h:40</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a92db637af4e224a0ae70173050dc3f74"><div class="ttname"><a href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">DecodeSignal::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00046">decode_database.h:46</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a9d37638129263b8902ba5be59baf39a8"><div class="ttname"><a href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">DecodeSignal::valueType</a></div><div class="ttdeci">ValueType valueType</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00044">decode_database.h:44</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_aaf5d7527ddf65b6355c2b4f3626df22d"><div class="ttname"><a href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">DecodeSignal::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00041">decode_database.h:41</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_abdc4c4bb4a67a6d61d6ca81e8a52833d"><div class="ttname"><a href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">DecodeSignal::byteOrder</a></div><div class="ttdeci">ByteOrder byteOrder</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00043">decode_database.h:43</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_acd4ef5ee30421d117b5756854302debb"><div class="ttname"><a href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">DecodeSignal::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00042">decode_database.h:42</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html"><div class="ttname"><a href="structDecodedFrameValue.html">DecodedFrameValue</a></div><div class="ttdoc">Fully decoded frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00051">dbc_decoder.h:51</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a4f51c31110dba1f73a763c596372beb0"><div class="ttname"><a href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">DecodedFrameValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00054">dbc_decoder.h:54</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a60dda1cc352d2c8087f0bdbc81dd266c"><div class="ttname"><a href="structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c">DecodedFrameValue::definition</a></div><div class="ttdeci">const DecodeFrame * definition</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00052">dbc_decoder.h:52</a></div></div>
<div class="ttc" id="astructFrameKey_html"><div class="ttname"><a href="structFrameKey.html">FrameKey</a></div><div class="ttdoc">Key for fast frame lookup.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00080">decode_database.h:80</a></div></div>
<div class="ttc" id="astructRawCanFrame_html"><div class="ttname"><a href="structRawCanFrame.html">RawCanFrame</a></div><div class="ttdoc">Raw CAN frame used for runtime or trace decoding.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00024">dbc_decoder.h:24</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a0acb487612104c99c9907344c035df83"><div class="ttname"><a href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">RawCanFrame::data</a></div><div class="ttdeci">std::vector&lt; std::uint8_t &gt; data</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00027">dbc_decoder.h:27</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a2d0e7fa0e3d5c20bbed55ed8f7888ff4"><div class="ttname"><a href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">RawCanFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00025">dbc_decoder.h:25</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_59425e443f801f1f2fd8bbe4959a3ccf.html">tests</a></li><li class="navelem"><b>dbc_decoder_test.cpp</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+21 -14
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_parser.cpp File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('dbc__parser_8cpp.html',''); initResiza
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -90,15 +97,15 @@ $(document).ready(function(){initNavTree('dbc__parser_8cpp.html',''); initResiza
<p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &quot;<a class="el" href="dbc__parser_8h_source.html">dbc_parser.h</a>&quot;</code><br />
<code>#include &lt;fstream&gt;</code><br />
<code>#include &lt;sstream&gt;</code><br />
<code>#include &lt;stdexcept&gt;</code><br />
<code>#include &quot;dbc_statement_handler.h&quot;</code><br />
<code>#include &lt;cctype&gt;</code><br />
<code>#include &lt;fstream&gt;</code><br />
<code>#include &lt;stdexcept&gt;</code><br />
</div>
<p><a href="dbc__parser_8cpp_source.html">Go to the source code of this file.</a></p>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p >Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<div class="textblock"><p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p>Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<p class="definition">Definition in file <a class="el" href="dbc__parser_8cpp_source.html">dbc_parser.cpp</a>.</p>
</div></div><!-- contents -->
@@ -106,8 +113,8 @@ $(document).ready(function(){initNavTree('dbc__parser_8cpp.html',''); initResiza
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__parser_8cpp.html">dbc_parser.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__parser_8cpp.html">dbc_parser.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+65 -357
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_parser.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -51,6 +51,11 @@ $(function() {
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
@@ -77,9 +82,16 @@ $(document).ready(function(){initNavTree('dbc__parser_8cpp_source.html',''); ini
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -88,378 +100,74 @@ $(document).ready(function(){initNavTree('dbc__parser_8cpp_source.html',''); ini
<div class="contents">
<a href="dbc__parser_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__parser_8h.html">dbc_parser.h</a>&quot;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;fstream&gt;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;sstream&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;stdexcept&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;cctype&gt;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include &quot;dbc_statement_handler.h&quot;</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> </div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;cctype&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;fstream&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;stdexcept&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="keyword">namespace </span>{</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> std::string TrimText (<span class="keyword">const</span> std::string &amp;text) {</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> std::string TrimText(<span class="keyword">const</span> std::string &amp;text) {</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> std::string::size_type begin = 0U;</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> <span class="keywordflow">while</span> ((begin &lt; text.size()) &amp;&amp;</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> std::isspace (<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span> (text[begin])))</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> std::isspace(<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span>(text[begin])))</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> ++begin;</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> std::string::size_type end = text.size();</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keywordflow">while</span> ((end &gt; begin) &amp;&amp;</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> std::isspace (<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span> (text[end - 1U])))</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> std::isspace(<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span>(text[end - 1U])))</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> --end;</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordflow">return</span> text.substr (begin, end - begin);</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordflow">return</span> text.substr(begin, end - begin);</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> }</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span>}</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span>}<span class="comment">// namespace</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> </div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"><a class="line" href="classDbcParser.html#aef72826942c9095d653fafa435855e56"> 40</a></span><a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> <a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a> (<span class="keyword">const</span> std::string &amp;filePath)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> std::ifstream input (filePath.c_str());</div>
<div class="foldopen" id="foldopen00040" data-start="{" data-end="}">
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"><a class="line" href="classDbcParser.html#aef72826942c9095d653fafa435855e56"> 40</a></span><a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> <a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a>(<span class="keyword">const</span> std::string &amp;filePath)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> std::ifstream input(filePath.c_str());</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> <span class="keywordflow">if</span> (!input.is_open())</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="keywordflow">throw</span> std::runtime_error (<span class="stringliteral">&quot;Failed to open DBC file: &quot;</span> + filePath);</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;Failed to open DBC file: &quot;</span> + filePath);</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> database;</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *currentFrame = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> </div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> std::string line;</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordflow">while</span> (std::getline (input, line)) {</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> line = Trim (line);</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keywordflow">if</span> (line.empty())</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> </div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keywordflow">if</span> (IsFrameLine (line)) {</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> frame = ParseFrameLine (line);</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.push_back (frame);</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> currentFrame = &amp;database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.back();</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (IsSignalLine (line)) {</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keywordflow">if</span> (currentFrame == <span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keywordflow">throw</span> std::runtime_error (<span class="stringliteral">&quot;Signal found before any frame definition.&quot;</span>);</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> signal = ParseSignalLine (line);</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> currentFrame-&gt;signals.push_back (signal);</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (IsCommentLine (line))</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> ParseCommentLine (line, database);</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> }</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> context{database, <span class="keyword">nullptr</span>};</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a> dispatcher;</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> </div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> std::size_t lineNumber = 0U;</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> std::string line;</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keywordflow">while</span> (std::getline(input, line)) {</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> ++lineNumber;</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> line = Trim(line);</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keywordflow">if</span> (line.empty())</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> </div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(line, context);</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) {</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keywordflow">throw</span> std::runtime_error(filePath + <span class="stringliteral">&quot;:&quot;</span> + std::to_string(lineNumber) +</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="stringliteral">&quot;: &quot;</span> + error.what());</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> }</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> }</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keywordflow">return</span> database;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span>}</div>
</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="keywordflow">return</span> database;</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span>}</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span><span class="keywordtype">bool</span> DbcParser::IsFrameLine (<span class="keyword">const</span> std::string &amp;line) {</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keywordflow">return</span> (line.size() &gt;= 4U) &amp;&amp; (line.compare (0U, 4U, <span class="stringliteral">&quot;BO_ &quot;</span>) == 0);</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span>}</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> </div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span><span class="keywordtype">bool</span> DbcParser::IsSignalLine (<span class="keyword">const</span> std::string &amp;line) {</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keywordflow">return</span> (line.size() &gt;= 4U) &amp;&amp; (line.compare (0U, 4U, <span class="stringliteral">&quot;SG_ &quot;</span>) == 0);</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span>}</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> </div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span><span class="keywordtype">bool</span> DbcParser::IsCommentLine (<span class="keyword">const</span> std::string &amp;line) {</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="keywordflow">return</span> (line.size() &gt;= 4U) &amp;&amp; (line.compare (0U, 4U, <span class="stringliteral">&quot;CM_ &quot;</span>) == 0);</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span>}</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> </div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span>std::string DbcParser::Trim (<span class="keyword">const</span> std::string &amp;text) {</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <span class="keywordflow">return</span> TrimText (text);</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span>}</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> </div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span>std::vector&lt;std::string&gt; DbcParser::SplitReceivers (<span class="keyword">const</span> std::string &amp;text) {</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> std::vector&lt;std::string&gt; receivers;</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> std::string token;</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> std::istringstream stream (text);</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keywordflow">while</span> (std::getline (stream, token, <span class="charliteral">&#39;,&#39;</span>)) {</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> token = TrimText (token);</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <span class="keywordflow">if</span> (!token.empty())</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> receivers.push_back (token);</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> }</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> </div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keywordflow">return</span> receivers;</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span>}</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> </div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span><span class="keywordtype">void</span> DbcParser::NormalizeCanId (std::uint32_t rawCanId,</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> std::uint32_t &amp;normalizedCanId,</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="keywordtype">bool</span> &amp;isExtended) {</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="comment">/*</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span><span class="comment"> * DBC commonly stores extended identifiers with bit 31 set.</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span><span class="comment"> * Example:</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span><span class="comment"> * raw id = 0x80000000 | actual_29_bit_id</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span><span class="comment"> */</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordflow">if</span> ((rawCanId &amp; 0x80000000U) != 0U) {</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> isExtended = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> normalizedCanId = (rawCanId &amp; 0x1FFFFFFFU);</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> isExtended = (rawCanId &gt; 0x7FFU);</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> normalizedCanId = rawCanId;</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> }</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span>}</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> </div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span>std::uint32_t DbcParser::TryExtractPgn (std::uint32_t canId, <span class="keywordtype">bool</span> isExtended, <span class="keywordtype">bool</span> &amp;hasPgn) {</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> hasPgn = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keywordflow">if</span> (!isExtended)</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keywordflow">return</span> 0U;</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> </div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keywordflow">if</span> ((canId &amp; 0x1FFFFFFFU) != canId)</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordflow">return</span> 0U;</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> </div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keyword">const</span> std::uint32_t pf = (canId &gt;&gt; 16U) &amp; 0xFFU;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keyword">const</span> std::uint32_t ps = (canId &gt;&gt; 8U) &amp; 0xFFU;</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keyword">const</span> std::uint32_t dp = (canId &gt;&gt; 24U) &amp; 0x01U;</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> </div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> std::uint32_t pgn = 0U;</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> </div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="keywordflow">if</span> (pf &lt; 240U)</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> pgn = (dp &lt;&lt; 16U) | (pf &lt;&lt; 8U);</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> pgn = (dp &lt;&lt; 16U) | (pf &lt;&lt; 8U) | ps;</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> </div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> hasPgn = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keywordflow">return</span> pgn;</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span>}</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span><a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> DbcParser::ParseFrameLine (<span class="keyword">const</span> std::string &amp;line) {</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="comment">/*</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span><span class="comment"> * Example:</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span><span class="comment"> * BO_ 256 EngineData: 8 EEC1</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span><span class="comment"> */</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> std::istringstream stream (line);</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> std::string token;</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> frame;</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> std::uint32_t rawCanId = 0U;</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> </div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> stream &gt;&gt; token;</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keywordflow">if</span> (token != <span class="stringliteral">&quot;BO_&quot;</span>)</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordflow">throw</span> std::runtime_error (<span class="stringliteral">&quot;Invalid frame line: &quot;</span> + line);</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> </div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> stream &gt;&gt; rawCanId;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> NormalizeCanId (rawCanId, frame.<a class="code hl_variable" href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">canId</a>, frame.<a class="code hl_variable" href="structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf">isExtended</a>);</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> </div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> stream &gt;&gt; token;</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="keywordflow">if</span> (token.empty())</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keywordflow">throw</span> std::runtime_error (<span class="stringliteral">&quot;Missing frame name: &quot;</span> + line);</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> </div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keywordflow">if</span> (token[token.size() - 1U] == <span class="charliteral">&#39;:&#39;</span>)</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> token.erase (token.size() - 1U, 1U);</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> frame.<a class="code hl_variable" href="structFrameInfo.html#abb53a7f93ed7abc0ea1ae4a8ccafcdcb">name</a> = token;</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> </div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> {</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dlcValue = 0U;</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> stream &gt;&gt; dlcValue;</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> frame.<a class="code hl_variable" href="structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9">dlc</a> = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span> (dlcValue);</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> }</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> </div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> stream &gt;&gt; frame.<a class="code hl_variable" href="structFrameInfo.html#a92749ec3798d4211a505860fb389a9e8">transmitter</a>;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> frame.<a class="code hl_variable" href="structFrameInfo.html#aee518b33f1000bf0b7f6e4a87474c943">pgn</a> = TryExtractPgn (frame.<a class="code hl_variable" href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">canId</a>, frame.<a class="code hl_variable" href="structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf">isExtended</a>, frame.<a class="code hl_variable" href="structFrameInfo.html#a4737a5420213ad4304724e39f3a4e55d">hasPgn</a>);</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="keywordflow">return</span> frame;</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span>}</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> </div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span><a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> DbcParser::ParseSignalLine (<span class="keyword">const</span> std::string &amp;line) {</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <span class="comment">/*</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span><span class="comment"> * Example:</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span><span class="comment"> * SG_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] &quot;rpm&quot; ECU1,ECU2</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span><span class="comment"> */</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> </div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> signal;</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> </div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> std::string work = TrimText (line);</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="keywordflow">if</span> (work.compare (0U, 4U, <span class="stringliteral">&quot;SG_ &quot;</span>) != 0)</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keywordflow">throw</span> std::runtime_error (<span class="stringliteral">&quot;Invalid signal line: &quot;</span> + line);</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> </div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> work.erase (0U, 4U);</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> </div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="keyword">const</span> std::string::size_type colonPos = work.find (<span class="charliteral">&#39;:&#39;</span>);</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="keywordflow">if</span> (colonPos == std::string::npos)</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keywordflow">throw</span> std::runtime_error (<span class="stringliteral">&quot;Signal line missing &#39;:&#39; : &quot;</span> + line);</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> </div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> signal.<a class="code hl_variable" href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">name</a> = TrimText (work.substr (0U, colonPos));</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> std::string rest = TrimText (work.substr (colonPos + 1U));</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> </div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keyword">const</span> std::string::size_type pipePos = rest.find (<span class="charliteral">&#39;|&#39;</span>);</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="keyword">const</span> std::string::size_type atPos = rest.find (<span class="charliteral">&#39;@&#39;</span>);</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keyword">const</span> std::string::size_type signPos = rest.find_first_of (<span class="stringliteral">&quot;+-&quot;</span>, atPos);</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keyword">const</span> std::string::size_type factorBegin = rest.find (<span class="charliteral">&#39;(&#39;</span>);</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keyword">const</span> std::string::size_type factorComma = rest.find (<span class="charliteral">&#39;,&#39;</span>, factorBegin);</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="keyword">const</span> std::string::size_type factorEnd = rest.find (<span class="charliteral">&#39;)&#39;</span>, factorComma);</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keyword">const</span> std::string::size_type rangeBegin = rest.find (<span class="charliteral">&#39;[&#39;</span>);</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keyword">const</span> std::string::size_type rangeSep = rest.find (<span class="charliteral">&#39;|&#39;</span>, rangeBegin);</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keyword">const</span> std::string::size_type rangeEnd = rest.find (<span class="charliteral">&#39;]&#39;</span>, rangeSep);</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="keyword">const</span> std::string::size_type unitBegin = rest.find (<span class="charliteral">&#39;&quot;&#39;</span>, rangeEnd);</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <span class="keyword">const</span> std::string::size_type unitEnd = rest.find (<span class="charliteral">&#39;&quot;&#39;</span>, unitBegin + 1U);</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> </div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <span class="keywordflow">if</span> ((pipePos == std::string::npos) ||</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> (atPos == std::string::npos) ||</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> (signPos == std::string::npos) ||</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> (factorBegin == std::string::npos) ||</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> (factorComma == std::string::npos) ||</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> (factorEnd == std::string::npos) ||</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> (rangeBegin == std::string::npos) ||</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> (rangeSep == std::string::npos) ||</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> (rangeEnd == std::string::npos) ||</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> (unitBegin == std::string::npos) ||</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> (unitEnd == std::string::npos))</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keywordflow">throw</span> std::runtime_error (<span class="stringliteral">&quot;Unsupported signal syntax: &quot;</span> + line);</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> </div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> signal.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a> = <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span> (</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> std::stoul (TrimText (rest.substr (0U, pipePos)))</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> );</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> </div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> signal.<a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a> = <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span> (</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> std::stoul (TrimText (rest.substr (pipePos + 1U, atPos - pipePos - 1U)))</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> );</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> </div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> {</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keywordflow">if</span> ((atPos + 1U) &gt;= rest.size())</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="keywordflow">throw</span> std::runtime_error (<span class="stringliteral">&quot;Invalid endianness in signal: &quot;</span> + line);</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> </div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="keyword">const</span> <span class="keywordtype">char</span> endianChar = rest[atPos + 1U];</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> signal.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a> = (endianChar == <span class="charliteral">&#39;1&#39;</span>);</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> }</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> </div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> {</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="keyword">const</span> <span class="keywordtype">char</span> signChar = rest[signPos];</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> signal.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a> = (signChar == <span class="charliteral">&#39;-&#39;</span>);</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> }</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> </div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> signal.<a class="code hl_variable" href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">factor</a> = std::stod (</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> TrimText (rest.substr (factorBegin + 1U, factorComma - factorBegin - 1U))</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> );</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> </div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> signal.<a class="code hl_variable" href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">offset</a> = std::stod (</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> TrimText (rest.substr (factorComma + 1U, factorEnd - factorComma - 1U))</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> );</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> </div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> signal.<a class="code hl_variable" href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">minimum</a> = std::stod (</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> TrimText (rest.substr (rangeBegin + 1U, rangeSep - rangeBegin - 1U))</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> );</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> </div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> signal.<a class="code hl_variable" href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">maximum</a> = std::stod (</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> TrimText (rest.substr (rangeSep + 1U, rangeEnd - rangeSep - 1U))</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> );</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> </div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> signal.<a class="code hl_variable" href="structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01">unit</a> = rest.substr (unitBegin + 1U, unitEnd - unitBegin - 1U);</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> </div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> {</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keyword">const</span> std::string receiversText = TrimText (rest.substr (unitEnd + 1U));</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> signal.<a class="code hl_variable" href="structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3">receivers</a> = SplitReceivers (receiversText);</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> }</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> </div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> <span class="keywordflow">return</span> signal;</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span>}</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> </div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span><span class="keywordtype">void</span> DbcParser::ParseCommentLine (<span class="keyword">const</span> std::string &amp;line, <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> &amp;database) {</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="comment">/*</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span><span class="comment"> * Examples:</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span><span class="comment"> * CM_ BO_ 256 &quot;Frame comment&quot;;</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span><span class="comment"> * CM_ SG_ 256 EngineSpeed &quot;Signal comment&quot;;</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span><span class="comment"> */</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> </div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> std::istringstream stream (line);</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> std::string token;</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> stream &gt;&gt; token;</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> </div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keywordflow">if</span> (token != <span class="stringliteral">&quot;CM_&quot;</span>)</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> </div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> stream &gt;&gt; token;</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> </div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> <span class="keywordflow">if</span> (token == <span class="stringliteral">&quot;BO_&quot;</span>) {</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> std::uint32_t rawCanId = 0U;</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> std::uint32_t canId = 0U;</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> <span class="keywordtype">bool</span> isExtended = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> </div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> stream &gt;&gt; rawCanId;</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> NormalizeCanId (rawCanId, canId, isExtended);</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> </div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> <span class="keyword">const</span> std::string::size_type quoteBegin = line.find (<span class="charliteral">&#39;&quot;&#39;</span>);</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> <span class="keyword">const</span> std::string::size_type quoteEnd = line.rfind (<span class="charliteral">&#39;&quot;&#39;</span>);</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> </div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> <span class="keywordflow">if</span> ((quoteBegin == std::string::npos) ||</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> (quoteEnd == std::string::npos) ||</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> (quoteEnd &lt;= quoteBegin))</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> </div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *frame = FindFrameById (database, canId, isExtended);</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> <span class="keywordflow">if</span> (frame != <span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> frame-&gt;<a class="code hl_variable" href="structFrameInfo.html#ace75121294f9d89b762080ab5643293c">comment</a> = line.substr (quoteBegin + 1U, quoteEnd - quoteBegin - 1U);</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (token == <span class="stringliteral">&quot;SG_&quot;</span>) {</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> std::uint32_t rawCanId = 0U;</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> std::uint32_t canId = 0U;</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <span class="keywordtype">bool</span> isExtended = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> std::string signalName;</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> </div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> stream &gt;&gt; rawCanId;</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> stream &gt;&gt; signalName;</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> </div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> NormalizeCanId (rawCanId, canId, isExtended);</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> </div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="keyword">const</span> std::string::size_type quoteBegin = line.find (<span class="charliteral">&#39;&quot;&#39;</span>);</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <span class="keyword">const</span> std::string::size_type quoteEnd = line.rfind (<span class="charliteral">&#39;&quot;&#39;</span>);</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> </div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="keywordflow">if</span> ((quoteBegin == std::string::npos) ||</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> (quoteEnd == std::string::npos) ||</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> (quoteEnd &lt;= quoteBegin))</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> </div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *frame = FindFrameById (database, canId, isExtended);</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> <span class="keywordflow">if</span> (frame != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *signal = FindSignalByName (*frame, signalName);</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="keywordflow">if</span> (signal != <span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> signal-&gt;<a class="code hl_variable" href="structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5">comment</a> = line.substr (quoteBegin + 1U, quoteEnd - quoteBegin - 1U);</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> }</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> }</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span>}</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> </div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span><a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *DbcParser::FindFrameById (<a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> &amp;database,</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> std::uint32_t canId,</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> <span class="keywordtype">bool</span> isExtended) {</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index &lt; database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++index) {</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> <span class="keywordflow">if</span> ((database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].canId == canId) &amp;&amp;</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> (database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].isExtended == isExtended))</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> <span class="keywordflow">return</span> &amp;database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index];</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> }</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> </div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span>}</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> </div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span><a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *DbcParser::FindSignalByName (<a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> &amp;frame, <span class="keyword">const</span> std::string &amp;signalName) {</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index &lt; frame.signals.size(); ++index) {</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <span class="keywordflow">if</span> (frame.signals[index].<a class="code hl_variable" href="structFrameInfo.html#abb53a7f93ed7abc0ea1ae4a8ccafcdcb">name</a> == signalName)</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <span class="keywordflow">return</span> &amp;frame.signals[index];</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> }</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> </div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span>}</div>
<div class="ttc" id="aclassDbcParser_html_aef72826942c9095d653fafa435855e56"><div class="ttname"><a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a></div><div class="ttdeci">DbcDatabase ParseFile(const std::string &amp;filePath) const</div><div class="ttdoc">Parse DBC file.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__parser_8cpp_source.html#l00040">dbc_parser.cpp:40</a></div></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span>std::string DbcParser::Trim(<span class="keyword">const</span> std::string &amp;text) {</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keywordflow">return</span> TrimText(text);</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span>}</div>
<div class="ttc" id="aclassDbcParser_html_aef72826942c9095d653fafa435855e56"><div class="ttname"><a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a></div><div class="ttdeci">DbcDatabase ParseFile(const std::string &amp;filePath) const</div><div class="ttdoc">Parse DBC file.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00040">dbc_parser.cpp:40</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html"><div class="ttname"><a href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00047">dbc_statement_handler.h:47</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00314">dbc_statement_handler.cpp:314</a></div></div>
<div class="ttc" id="adbc__parser_8h_html"><div class="ttname"><a href="dbc__parser_8h.html">dbc_parser.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcDatabase_html_a2cade5d0234ee816132127542f8c612b"><div class="ttname"><a href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">DbcDatabase::frames</a></div><div class="ttdeci">std::vector&lt; FrameInfo &gt; frames</div><div class="ttdef"><b>Definition:</b> <a href="dbc__database_8h_source.html#l00023">dbc_database.h:23</a></div></div>
<div class="ttc" id="astructFrameInfo_html"><div class="ttname"><a href="structFrameInfo.html">FrameInfo</a></div><div class="ttdoc">Describes one CAN frame from a DBC file.</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00024">frame_info.h:24</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a34b726afaad2ac5c697fdb2ac070cdaf"><div class="ttname"><a href="structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf">FrameInfo::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00027">frame_info.h:27</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a4737a5420213ad4304724e39f3a4e55d"><div class="ttname"><a href="structFrameInfo.html#a4737a5420213ad4304724e39f3a4e55d">FrameInfo::hasPgn</a></div><div class="ttdeci">bool hasPgn</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00029">frame_info.h:29</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a92749ec3798d4211a505860fb389a9e8"><div class="ttname"><a href="structFrameInfo.html#a92749ec3798d4211a505860fb389a9e8">FrameInfo::transmitter</a></div><div class="ttdeci">std::string transmitter</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00031">frame_info.h:31</a></div></div>
<div class="ttc" id="astructFrameInfo_html_aa2b198ea0f55e560c123d35e7b3ecab9"><div class="ttname"><a href="structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9">FrameInfo::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00030">frame_info.h:30</a></div></div>
<div class="ttc" id="astructFrameInfo_html_abb53a7f93ed7abc0ea1ae4a8ccafcdcb"><div class="ttname"><a href="structFrameInfo.html#abb53a7f93ed7abc0ea1ae4a8ccafcdcb">FrameInfo::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00025">frame_info.h:25</a></div></div>
<div class="ttc" id="astructFrameInfo_html_ace75121294f9d89b762080ab5643293c"><div class="ttname"><a href="structFrameInfo.html#ace75121294f9d89b762080ab5643293c">FrameInfo::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00032">frame_info.h:32</a></div></div>
<div class="ttc" id="astructFrameInfo_html_aee518b33f1000bf0b7f6e4a87474c943"><div class="ttname"><a href="structFrameInfo.html#aee518b33f1000bf0b7f6e4a87474c943">FrameInfo::pgn</a></div><div class="ttdeci">std::uint32_t pgn</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00028">frame_info.h:28</a></div></div>
<div class="ttc" id="astructFrameInfo_html_af470b0742c05bfbffc31c51a68f5c05e"><div class="ttname"><a href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">FrameInfo::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00026">frame_info.h:26</a></div></div>
<div class="ttc" id="astructSignalInfo_html"><div class="ttname"><a href="structSignalInfo.html">SignalInfo</a></div><div class="ttdoc">Describes one signal inside a DBC frame.</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00022">signal_info.h:22</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a1008b5201f71848177217bd52fb84baa"><div class="ttname"><a href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">SignalInfo::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00025">signal_info.h:25</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a1f214f03e94ef5794de2d3367bfcbd01"><div class="ttname"><a href="structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01">SignalInfo::unit</a></div><div class="ttdeci">std::string unit</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00032">signal_info.h:32</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a2c95562fd0b29327a7fd7b1e6feee7f3"><div class="ttname"><a href="structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3">SignalInfo::receivers</a></div><div class="ttdeci">std::vector&lt; std::string &gt; receivers</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00033">signal_info.h:33</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a379e422a00cad56f896cacf60455b088"><div class="ttname"><a href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">SignalInfo::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00023">signal_info.h:23</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a52a52b320eef92fbcb4626307f9a498f"><div class="ttname"><a href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">SignalInfo::isSigned</a></div><div class="ttdeci">bool isSigned</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00027">signal_info.h:27</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ab7d0769f47aa540656b22e4e49db517e"><div class="ttname"><a href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">SignalInfo::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00029">signal_info.h:29</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ac99ba7563a5dad01e39c4257216953f5"><div class="ttname"><a href="structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5">SignalInfo::comment</a></div><div class="ttdeci">std::string comment</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00034">signal_info.h:34</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ace290724f9801521609aedaa946d61f1"><div class="ttname"><a href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">SignalInfo::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00024">signal_info.h:24</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ada7bf94fbeaa26bd08c73982b5af255b"><div class="ttname"><a href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">SignalInfo::minimum</a></div><div class="ttdeci">double minimum</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00030">signal_info.h:30</a></div></div>
<div class="ttc" id="astructSignalInfo_html_adf1c4331b9eabced0d7fdda40ff0eb52"><div class="ttname"><a href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">SignalInfo::maximum</a></div><div class="ttdeci">double maximum</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00031">signal_info.h:31</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ae4f78d99a2750aa564d7eba860171499"><div class="ttname"><a href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">SignalInfo::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00028">signal_info.h:28</a></div></div>
<div class="ttc" id="astructSignalInfo_html_af363b1563fb4c7cc8973f9a80c06846c"><div class="ttname"><a href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">SignalInfo::isLittleEndian</a></div><div class="ttdeci">bool isLittleEndian</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00026">signal_info.h:26</a></div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcParseContext_html"><div class="ttname"><a href="structDbcParseContext.html">DbcParseContext</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00011">dbc_statement_handler.h:11</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__parser_8cpp.html">dbc_parser.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__parser_8cpp.html">dbc_parser.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+18 -13
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_parser.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,16 @@ $(document).ready(function(){initNavTree('dbc__parser_8h.html',''); initResizabl
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -92,8 +99,6 @@ $(document).ready(function(){initNavTree('dbc__parser_8h.html',''); initResizabl
<p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;string&gt;</code><br />
<code>#include &lt;vector&gt;</code><br />
<code>#include &lt;cstdint&gt;</code><br />
<code>#include &quot;<a class="el" href="dbc__database_8h_source.html">dbc_database.h</a>&quot;</code><br />
</div>
<p><a href="dbc__parser_8h_source.html">Go to the source code of this file.</a></p>
@@ -105,8 +110,8 @@ Classes</h2></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p >Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<div class="textblock"><p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </p>
<p>Licensed under the MIT License. See LICENSE file in the project root for full license text. </p>
<p class="definition">Definition in file <a class="el" href="dbc__parser_8h_source.html">dbc_parser.h</a>.</p>
</div></div><!-- contents -->
@@ -114,8 +119,8 @@ Classes</h2></td></tr>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__parser_8h.html">dbc_parser.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__parser_8h.html">dbc_parser.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
+37 -47
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_parser.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -34,10 +34,10 @@
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
@@ -51,6 +51,11 @@ $(function() {
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
@@ -77,9 +82,16 @@ $(document).ready(function(){initNavTree('dbc__parser_8h_source.html',''); initR
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
@@ -91,53 +103,31 @@ $(document).ready(function(){initNavTree('dbc__parser_8h_source.html',''); initR
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#define DBC_PARSER_H</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> </div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__database_8h.html">dbc_database.h</a>&quot;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__database_8h.html">dbc_database.h</a>&quot;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"><a class="line" href="classDbcParser.html"> 35</a></span><span class="keyword">class </span><a class="code hl_class" href="classDbcParser.html">DbcParser</a> {</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> <a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a> (<span class="keyword">const</span> std::string &amp;filePath) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <span class="keyword">private</span>:</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> IsFrameLine (<span class="keyword">const</span> std::string &amp;line);</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> IsSignalLine (<span class="keyword">const</span> std::string &amp;line);</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> IsCommentLine (<span class="keyword">const</span> std::string &amp;line);</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keyword">static</span> std::string Trim (<span class="keyword">const</span> std::string &amp;text);</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> <span class="keyword">static</span> std::vector&lt;std::string&gt; SplitReceivers (<span class="keyword">const</span> std::string &amp;text);</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keyword">static</span> std::uint32_t TryExtractPgn (std::uint32_t canId, <span class="keywordtype">bool</span> isExtended, <span class="keywordtype">bool</span> &amp;hasPgn);</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keyword">static</span> <span class="keywordtype">void</span> NormalizeCanId (std::uint32_t rawCanId,</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> std::uint32_t &amp;normalizedCanId,</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keywordtype">bool</span> &amp;isExtended);</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> </div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keyword">static</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> ParseFrameLine (<span class="keyword">const</span> std::string &amp;line);</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keyword">static</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> ParseSignalLine (<span class="keyword">const</span> std::string &amp;line);</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">static</span> <span class="keywordtype">void</span> ParseCommentLine (<span class="keyword">const</span> std::string &amp;line, <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> &amp;database);</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keyword">static</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *FindFrameById (<a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> &amp;database,</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> std::uint32_t canId,</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> <span class="keywordtype">bool</span> isExtended);</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keyword">static</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *FindSignalByName (<a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> &amp;frame, <span class="keyword">const</span> std::string &amp;signalName);</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span>};</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> </div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="preprocessor">#endif </span><span class="comment">/* DBC_PARSER_H */</span><span class="preprocessor"></span></div>
<div class="ttc" id="aclassDbcParser_html"><div class="ttname"><a href="classDbcParser.html">DbcParser</a></div><div class="ttdoc">Minimal DBC parser.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__parser_8h_source.html#l00035">dbc_parser.h:35</a></div></div>
<div class="ttc" id="aclassDbcParser_html_aef72826942c9095d653fafa435855e56"><div class="ttname"><a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a></div><div class="ttdeci">DbcDatabase ParseFile(const std::string &amp;filePath) const</div><div class="ttdoc">Parse DBC file.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__parser_8cpp_source.html#l00040">dbc_parser.cpp:40</a></div></div>
<div class="foldopen" id="foldopen00033" data-start="{" data-end="};">
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"><a class="line" href="classDbcParser.html"> 33</a></span><span class="keyword">class </span><a class="code hl_class" href="classDbcParser.html">DbcParser</a> {</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> <a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(<span class="keyword">const</span> std::string &amp;filePath) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> </div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <span class="keyword">static</span> std::string Trim(<span class="keyword">const</span> std::string &amp;text);</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span>};</div>
</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> </div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="preprocessor">#endif </span><span class="comment">/* DBC_PARSER_H */</span><span class="preprocessor"></span></div>
<div class="ttc" id="aclassDbcParser_html"><div class="ttname"><a href="classDbcParser.html">DbcParser</a></div><div class="ttdoc">Minimal DBC parser.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8h_source.html#l00033">dbc_parser.h:33</a></div></div>
<div class="ttc" id="aclassDbcParser_html_aef72826942c9095d653fafa435855e56"><div class="ttname"><a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a></div><div class="ttdeci">DbcDatabase ParseFile(const std::string &amp;filePath) const</div><div class="ttdoc">Parse DBC file.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00040">dbc_parser.cpp:40</a></div></div>
<div class="ttc" id="adbc__database_8h_html"><div class="ttname"><a href="dbc__database_8h.html">dbc_database.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition:</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructFrameInfo_html"><div class="ttname"><a href="structFrameInfo.html">FrameInfo</a></div><div class="ttdoc">Describes one CAN frame from a DBC file.</div><div class="ttdef"><b>Definition:</b> <a href="frame__info_8h_source.html#l00024">frame_info.h:24</a></div></div>
<div class="ttc" id="astructSignalInfo_html"><div class="ttname"><a href="structSignalInfo.html">SignalInfo</a></div><div class="ttdoc">Describes one signal inside a DBC frame.</div><div class="ttdef"><b>Definition:</b> <a href="signal__info_8h_source.html#l00022">signal_info.h:22</a></div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dbc__parser_8h.html">dbc_parser.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><a class="el" href="dbc__parser_8h.html">dbc_parser.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
@@ -0,0 +1,409 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_parser_test.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('dbc__parser__test_8cpp_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">dbc_parser_test.cpp</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__parser_8h.html">dbc_parser.h</a>&quot;</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="preprocessor">#include &quot;dbc_statement_handler.h&quot;</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span> </div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include &lt;QtTest&gt;</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &lt;chrono&gt;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;filesystem&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &lt;fstream&gt;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span> </div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#define CHECK(condition, name) QVERIFY2((condition), std::string(name).c_str())</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#include &lt;stdexcept&gt;</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="keyword">struct </span>Fixture {</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> std::filesystem::path path = std::filesystem::temp_directory_path() /</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> (<span class="stringliteral">&quot;dbc_parser_test_&quot;</span> + std::to_string(std::chrono::steady_clock::now().time_since_epoch().count()) + <span class="stringliteral">&quot;.dbc&quot;</span>);</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> ~Fixture() {</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> std::error_code error;</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> std::filesystem::remove(path, error);</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> }</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> <span class="keywordtype">void</span> Write(<span class="keyword">const</span> std::string &amp;text)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> std::ofstream output(path);</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> output &lt;&lt; text;</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> <span class="keywordflow">if</span> (!output)</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;Cannot write test fixture.&quot;</span>);</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> }</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span>};</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="keyword">class </span>CountingHandler : <span class="keyword">public</span> <a class="code hl_class" href="classDbcStatementHandler.html">DbcStatementHandler</a> {</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">int</span> instances = 0;</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">int</span> calls = 0;</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> CountingHandler() { ++instances; }</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keywordtype">void</span> Handle(<span class="keyword">const</span> std::string &amp;, <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &amp;context)<span class="keyword"> const override </span>{</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> ++calls;</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> context.database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.emplace_back();</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> }</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span>};</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span>std::string SignalLine(<span class="keyword">const</span> std::string &amp;start, <span class="keyword">const</span> std::string &amp;length,</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keyword">const</span> std::string &amp;order, <span class="keyword">const</span> std::string &amp;factor,</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <span class="keyword">const</span> std::string &amp;offset, <span class="keyword">const</span> std::string &amp;minimum,</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <span class="keyword">const</span> std::string &amp;maximum) {</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;SG_ Value : &quot;</span> + start + <span class="stringliteral">&quot;|&quot;</span> + length + <span class="stringliteral">&quot;@&quot;</span> + order +</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="stringliteral">&quot; (&quot;</span> + factor + <span class="stringliteral">&quot;,&quot;</span> + offset + <span class="stringliteral">&quot;) [&quot;</span> + minimum + <span class="stringliteral">&quot;|&quot;</span> + maximum + <span class="stringliteral">&quot;] \&quot;\&quot; ECU&quot;</span>;</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span>}</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> </div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="keyword">class </span>DbcParserTest : <span class="keyword">public</span> QObject {</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> Q_OBJECT</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordtype">void</span> RejectSignal(<span class="keyword">const</span> Fixture &amp;fixture, <span class="keyword">const</span> std::string &amp;line, <span class="keywordtype">unsigned</span> payload = 8U) {</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: &quot;</span> + std::to_string(payload) + <span class="stringliteral">&quot; ECU\n\n&quot;</span> + line + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Reject &quot;</span> + line);</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keyword">const</span> std::string prefix = fixture.path.string() + <span class="stringliteral">&quot;:3: &quot;</span>;</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> CHECK(std::string(error.what()).find(prefix) == 0U &amp;&amp;</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> std::string(error.what()).size() &gt; prefix.size(),</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="stringliteral">&quot;Reject &quot;</span> + line);</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> }</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> }</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="keyword">private</span> Q_SLOTS:</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordtype">void</span> validFrames();</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keywordtype">void</span> invalidFrames();</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> <span class="keywordtype">void</span> integration();</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keywordtype">void</span> invalidSignals();</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keywordtype">void</span> validSignals();</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keywordtype">void</span> dispatch();</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="keywordtype">void</span> independentSessions();</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span>};</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span><span class="keywordtype">void</span> DbcParserTest::validFrames() {</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> Fixture fixture;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keyword">struct </span>ValidCase {</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *line;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> std::uint32_t id;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keywordtype">bool</span> extended;</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordtype">unsigned</span> length;</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> };</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keyword">const</span> ValidCase valid[] = {</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> {<span class="stringliteral">&quot;BO_ 0 Frame: 0 ECU&quot;</span>, 0U, <span class="keyword">false</span>, 0U},</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> {<span class="stringliteral">&quot;BO_ 2047 Frame: 8 ECU&quot;</span>, 2047U, <span class="keyword">false</span>, 8U},</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> {<span class="stringliteral">&quot;BO_ 2048 Frame: 64 ECU&quot;</span>, 2048U, <span class="keyword">true</span>, 64U},</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> {<span class="stringliteral">&quot;BO_ 536870911 Frame: 255 ECU&quot;</span>, 0x1FFFFFFFU, <span class="keyword">true</span>, 255U},</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> {<span class="stringliteral">&quot;BO_ 2147483649 Frame: 8 ECU&quot;</span>, 1U, <span class="keyword">true</span>, 8U},</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> {<span class="stringliteral">&quot;BO_ 2684354559 Frame: 8 ECU&quot;</span>, 0x1FFFFFFFU, <span class="keyword">true</span>, 8U},</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> {<span class="stringliteral">&quot; BO_\t256\tFrame :\t8\tECU \r&quot;</span>, 256U, <span class="keyword">false</span>, 8U}};</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &amp;test: valid) {</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> fixture.Write(std::string(test.line) + <span class="charliteral">&#39;\n&#39;</span>);</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="keyword">const</span> <span class="keyword">auto</span> database = <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> CHECK(database.frames.size() == 1U &amp;&amp; database.frames[0].name == <span class="stringliteral">&quot;Frame&quot;</span> &amp;&amp;</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> database.frames[0].canId == test.id &amp;&amp;</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> database.frames[0].isExtended == test.extended &amp;&amp;</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> database.frames[0].dlc == test.length &amp;&amp;</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> database.frames[0].transmitter == <span class="stringliteral">&quot;ECU&quot;</span>,</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> test.line);</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> }</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span>}</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> </div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span><span class="keywordtype">void</span> DbcParserTest::invalidFrames() {</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> Fixture fixture;</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *invalid[] = {</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="stringliteral">&quot;BO_ invalid&quot;</span>, <span class="stringliteral">&quot;BO_&quot;</span>, <span class="stringliteral">&quot;BO_ 1&quot;</span>, <span class="stringliteral">&quot;BO_ 1 : 8 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ 1 Frame 8 ECU&quot;</span>,</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="stringliteral">&quot;BO_ 1 Frame:&quot;</span>, <span class="stringliteral">&quot;BO_ 1 Frame: 8&quot;</span>, <span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU extra&quot;</span>,</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <span class="stringliteral">&quot;BO_ 1 Two Names: 8 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ -1 Frame: 8 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ +1 Frame: 8 ECU&quot;</span>,</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="stringliteral">&quot;BO_ 1x Frame: 8 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ 0x123 Frame: 8 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ 1.5 Frame: 8 ECU&quot;</span>,</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="stringliteral">&quot;BO_ 4294967296 Frame: 8 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ 999999999999999999999 Frame: 8 ECU&quot;</span>,</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="stringliteral">&quot;BO_ 536870912 Frame: 8 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ 1073741824 Frame: 8 ECU&quot;</span>,</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="stringliteral">&quot;BO_ 2684354560 Frame: 8 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ 4294967295 Frame: 8 ECU&quot;</span>,</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> <span class="stringliteral">&quot;BO_ 1 Frame: -1 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ 1 Frame: +8 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ 1 Frame: 8x ECU&quot;</span>,</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="stringliteral">&quot;BO_ 1 Frame: 8.5 ECU&quot;</span>, <span class="stringliteral">&quot;BO_ 1 Frame: 256 ECU&quot;</span>,</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="stringliteral">&quot;BO_ 1 Frame: 4294967296 ECU&quot;</span>, <span class="stringliteral">&quot;BO_\tinvalid&quot;</span>};</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> *line: invalid) {</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> fixture.Write(std::string(<span class="stringliteral">&quot;VERSION \&quot;test\&quot;\n\n&quot;</span>) + line + <span class="charliteral">&#39;\n&#39;</span>);</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> CHECK(<span class="keyword">false</span>, line);</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keyword">const</span> std::string prefix = fixture.path.string() + <span class="stringliteral">&quot;:3: &quot;</span>;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> CHECK(std::string(error.what()).find(prefix) == 0U &amp;&amp;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> std::string(error.what()).size() &gt; prefix.size(),</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> line);</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> }</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> }</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span>}</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> </div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span><span class="keywordtype">void</span> DbcParserTest::integration() {</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> Fixture fixture;</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> fixture.Write(</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="stringliteral">&quot;BO_TX_BU_ 256 : ECU;\nBO_ 256 Frame: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="stringliteral">&quot; SG_ Speed : 0|16@1+ (0.5,1) [0|100] \&quot;rpm\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="stringliteral">&quot;CM_ BO_ 256 \&quot;Frame comment\&quot;;\nCM_ SG_ 256 Speed \&quot;Signal comment\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="stringliteral">&quot;BO_ 257 Second: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keyword">const</span> <span class="keyword">auto</span> database = <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> CHECK(database.frames.size() == 2U &amp;&amp; database.frames[0].signals.size() == 1U &amp;&amp;</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> database.frames[0].comment == <span class="stringliteral">&quot;Frame comment&quot;</span> &amp;&amp;</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> database.frames[0].signals[0].comment == <span class="stringliteral">&quot;Signal comment&quot;</span>,</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="stringliteral">&quot;Integration&quot;</span>);</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> fixture.Write(<span class="stringliteral">&quot;\nSG_ Speed : invalid\n&quot;</span>);</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Signal error location&quot;</span>);</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:2: &quot;</span>) == 0U,</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="stringliteral">&quot;Signal error location&quot;</span>);</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> }</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span>}</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span><span class="keywordtype">void</span> DbcParserTest::invalidSignals() {</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> Fixture fixture;</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keyword">const</span> std::string ordinary = SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>);</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;+1&quot;</span>, <span class="stringliteral">&quot;0junk&quot;</span>, <span class="stringliteral">&quot;0x10&quot;</span>, <span class="stringliteral">&quot;1.5&quot;</span>,</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="stringliteral">&quot;4294967296&quot;</span>, <span class="stringliteral">&quot;999999999999999999999&quot;</span>}) {</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> RejectSignal(fixture, SignalLine(value, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> }</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string length: {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;65&quot;</span>})</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, length, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string order: {<span class="stringliteral">&quot;2+&quot;</span>, <span class="stringliteral">&quot;9-&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1x&quot;</span>, <span class="stringliteral">&quot;1++&quot;</span>, <span class="stringliteral">&quot;01+&quot;</span>})</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, order, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;1junk&quot;</span>, <span class="stringliteral">&quot;nan&quot;</span>, <span class="stringliteral">&quot;NaN&quot;</span>, <span class="stringliteral">&quot;inf&quot;</span>, <span class="stringliteral">&quot;-inf&quot;</span>, <span class="stringliteral">&quot;1e999&quot;</span>, <span class="stringliteral">&quot;1e-999&quot;</span>, <span class="stringliteral">&quot;0x1p2&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;1e&quot;</span>, <span class="stringliteral">&quot;1.2.3&quot;</span>}) {</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value));</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> }</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string name: {<span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;Two Names&quot;</span>, <span class="stringliteral">&quot;Value M&quot;</span>, <span class="stringliteral">&quot;Value m1&quot;</span>, <span class="stringliteral">&quot;Value m1M&quot;</span>}) {</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> std::string line = ordinary;</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> line.replace(4U, 5U, name);</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> }</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string broken: {</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <span class="stringliteral">&quot;SG_&quot;</span>, <span class="stringliteral">&quot;SG_ Value&quot;</span>, <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] ECU&quot;</span>,</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot;&quot;</span>,</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU,&quot;</span>,</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU extra&quot;</span>})</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> RejectSignal(fixture, broken);</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;4294967295&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> RejectSignal(fixture, ordinary, 0U);</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span> delimiter: {<span class="charliteral">&#39;|&#39;</span>, <span class="charliteral">&#39;@&#39;</span>, <span class="charliteral">&#39;(&#39;</span>, <span class="charliteral">&#39;)&#39;</span>, <span class="charliteral">&#39;[&#39;</span>, <span class="charliteral">&#39;]&#39;</span>, <span class="charliteral">&#39;&quot;&#39;</span>}) {</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> std::string line = ordinary;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> line.erase(line.find(delimiter), 1U);</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> }</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span>}</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> </div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span><span class="keywordtype">void</span> DbcParserTest::validSignals() {</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> Fixture fixture;</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> signalParser;</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span> +</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span> +</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> SignalLine(<span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1-&quot;</span>, <span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;-255&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keyword">const</span> <span class="keyword">auto</span> factors = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> CHECK(factors.frames[0].signals.size() == 2U &amp;&amp;</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> factors.frames[0].signals[0].factor == 0.0 &amp;&amp;</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> factors.frames[0].signals[1].factor == -1.0,</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="stringliteral">&quot;Zero and negative factors and equal range boundaries&quot;</span>);</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> </div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keyword">struct </span>SignalCase {</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *start;</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *length;</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *order;</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keywordtype">unsigned</span> payload;</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> };</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keyword">const</span> SignalCase validSignals[] = {</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 1U},</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 1U},</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 8U},</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> {<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> {<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 8U},</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> {<span class="stringliteral">&quot;3&quot;</span>, <span class="stringliteral">&quot;12&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 2U},</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> {<span class="stringliteral">&quot;2039&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 255U}};</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &amp;test: validSignals) {</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: &quot;</span> + std::to_string(test.payload) + <span class="stringliteral">&quot; ECU\n&quot;</span> +</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> SignalLine(test.start, test.length, test.order, <span class="stringliteral">&quot;.5e+1&quot;</span>, <span class="stringliteral">&quot;-2.5E-1&quot;</span>, <span class="stringliteral">&quot;-1.&quot;</span>, <span class="stringliteral">&quot;+2e2&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keyword">const</span> <span class="keyword">auto</span> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <span class="keyword">const</span> <span class="keyword">auto</span> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> CHECK(signal.startBit == std::stoul(test.start) &amp;&amp;</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> signal.length == std::stoul(test.length) &amp;&amp;</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> signal.isLittleEndian == (test.order[0] == <span class="charliteral">&#39;1&#39;</span>) &amp;&amp;</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> signal.isSigned == (test.order[1] == <span class="charliteral">&#39;-&#39;</span>) &amp;&amp;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> signal.factor == 5.0 &amp;&amp; signal.offset == -0.25 &amp;&amp;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> signal.minimum == -1.0 &amp;&amp; signal.maximum == 200.0,</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="stringliteral">&quot;Valid signal boundary and numeric metadata&quot;</span>);</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> }</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="stringliteral">&quot;SG_\tValue\t:\t0 | 8 @1+ ( 1 , 0 ) [ 0 | 255 ] \&quot;rpm\&quot; ECU1,\tECU2\n&quot;</span>);</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="keyword">const</span> <span class="keyword">auto</span> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keyword">const</span> <span class="keyword">auto</span> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> CHECK(signal.name == <span class="stringliteral">&quot;Value&quot;</span> &amp;&amp; signal.unit == <span class="stringliteral">&quot;rpm&quot;</span> &amp;&amp;</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> signal.receivers == std::vector&lt;std::string&gt;({<span class="stringliteral">&quot;ECU1&quot;</span>, <span class="stringliteral">&quot;ECU2&quot;</span>}),</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <span class="stringliteral">&quot;Signal tabs, spaces, and receiver list&quot;</span>);</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span>}</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> </div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span><span class="keywordtype">void</span> DbcParserTest::dispatch() {</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> CountingHandler::instances = 0;</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> CountingHandler::calls = 0;</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> dispatchDatabase;</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> context{dispatchDatabase, <span class="keyword">nullptr</span>};</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> <a class="code hl_class" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a> dispatcher;</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> dispatcher.RegisterType&lt;CountingHandler&gt;(<span class="stringliteral">&quot;TEST_&quot;</span>);</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> CHECK(dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ first&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ second&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> CountingHandler::instances == 1 &amp;&amp; CountingHandler::calls == 2 &amp;&amp;</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> dispatchDatabase.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 2U,</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="stringliteral">&quot;Factory dispatch and handler reuse&quot;</span>);</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> CHECK(!dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_OTHER data&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;BO_TX_BU_ 1 : ECU;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;VAL_ 1 Speed 0 \&quot;Stopped\&quot;;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> CountingHandler::calls == 2,</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> <span class="stringliteral">&quot;Exact and unknown keyword dispatch&quot;</span>);</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span>}</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> </div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span><span class="keywordtype">void</span> DbcParserTest::independentSessions() {</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> Fixture fixture;</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> parser;</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 First: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> CHECK(parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string()).<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 1U, <span class="stringliteral">&quot;First parse&quot;</span>);</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> fixture.Write(<span class="stringliteral">&quot;SG_ Speed : invalid\n&quot;</span>);</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> CHECK(std::string(error.what()).find(<span class="stringliteral">&quot;Signal found before any frame&quot;</span>) !=</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> std::string::npos,</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> }</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> fixture.Write(<span class="stringliteral">&quot;BO_ 2 Second: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="keyword">const</span> <span class="keyword">auto</span> recovered = parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> CHECK(recovered.frames.size() == 1U &amp;&amp; recovered.frames[0].canId == 2U,</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="stringliteral">&quot;Fresh parse after error&quot;</span>);</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span>}</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> </div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span><span class="keywordtype">int</span> RunParserTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> DbcParserTest tests;</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> <span class="keywordflow">return</span> QTest::qExec(&amp;tests, argc, argv);</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span>}</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> </div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span><span class="preprocessor">#include &quot;dbc_parser_test.moc&quot;</span></div>
<div class="ttc" id="aclassDbcParser_html"><div class="ttname"><a href="classDbcParser.html">DbcParser</a></div><div class="ttdoc">Minimal DBC parser.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8h_source.html#l00033">dbc_parser.h:33</a></div></div>
<div class="ttc" id="aclassDbcParser_html_aef72826942c9095d653fafa435855e56"><div class="ttname"><a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a></div><div class="ttdeci">DbcDatabase ParseFile(const std::string &amp;filePath) const</div><div class="ttdoc">Parse DBC file.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00040">dbc_parser.cpp:40</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html"><div class="ttname"><a href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00047">dbc_statement_handler.h:47</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00314">dbc_statement_handler.cpp:314</a></div></div>
<div class="ttc" id="aclassDbcStatementHandler_html"><div class="ttname"><a href="classDbcStatementHandler.html">DbcStatementHandler</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00016">dbc_statement_handler.h:16</a></div></div>
<div class="ttc" id="adbc__parser_8h_html"><div class="ttname"><a href="dbc__parser_8h.html">dbc_parser.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcDatabase_html_a2cade5d0234ee816132127542f8c612b"><div class="ttname"><a href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">DbcDatabase::frames</a></div><div class="ttdeci">std::vector&lt; FrameInfo &gt; frames</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00023">dbc_database.h:23</a></div></div>
<div class="ttc" id="astructDbcParseContext_html"><div class="ttname"><a href="structDbcParseContext.html">DbcParseContext</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00011">dbc_statement_handler.h:11</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_59425e443f801f1f2fd8bbe4959a3ccf.html">tests</a></li><li class="navelem"><b>dbc_parser_test.cpp</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
Loaded 100 of 353 files, more files were not shown because too many files have changed in this diff. Show more