23static void PrintTree(
const TreeNode *node,
int indent) {
27 for (
int i = 0; i < indent; ++i)
32 std::cout <<
"[root] " << node->
GetName() <<
"\n";
35 case NodeType::Frame: {
37 std::cout <<
"[frame] " << node->
GetName();
39 if (frame !=
nullptr) {
40 std::cout <<
" id=0x" << std::hex << frame->
canId << std::dec
41 <<
" ext=" << (frame->
isExtended ?
"yes" :
"no")
42 <<
" dlc=" <<
static_cast<unsigned int>(frame->
dlc);
45 std::cout <<
" pgn=" << frame->
pgn;
52 case NodeType::Signal: {
54 std::cout <<
"[signal] " << node->
GetName();
56 if (signal !=
nullptr) {
57 std::cout <<
" start=" << signal->
startBit
58 <<
" len=" << signal->
length
59 <<
" unit=" << signal->
unit;
67 std::cout <<
"[unknown]\n";
72 PrintTree(node->
GetChild(i), indent + 1);
77 std::cout <<
"No frame definition found.\n";
81 std::cout <<
"Decoded frame: " << decoded.
definition->name <<
"\n";
85 if ((signal.definition ==
nullptr) || !signal.valid)
88 std::cout <<
" " << signal.definition->
name
90 if (
const std::int64_t *signedValue = std::get_if<std::int64_t>(&signal.rawValue))
91 std::cout << *signedValue;
93 std::cout << std::get<std::uint64_t>(signal.rawValue);
94 std::cout <<
" physical=" << signal.physicalValue
95 <<
" " << signal.definition->
unit
101int main(
int argc,
char *argv[]) {
103 std::cerr <<
"Usage: dbc_demo <file.dbc>\n";
112 std::unique_ptr<TreeNode> root = treeBuilder.
Build(database);
114 std::cout <<
"=== Parsed tree ===\n";
115 PrintTree(root.get(), 0);
127 rawFrame.
data.resize(8U, 0U);
132 std::cout <<
"\n=== Decoded frame ===\n";
133 PrintDecodedFrame(decoded);
134 }
catch (
const std::exception &ex) {
135 std::cerr <<
"Error: " << ex.what() <<
"\n";
Converts parsed DBC data into runtime decode database.
DecodeDatabase Build(const DbcDatabase &source) const
Build runtime decode database.
Runtime CAN decoder using prebuilt decode database.
DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
Decode one raw CAN frame.
DbcDatabase ParseFile(const std::string &filePath) const
Parse DBC file.
Builds a simple tree from parsed DBC database.
std::unique_ptr< TreeNode > Build(const DbcDatabase &database) const
Build tree representation of parsed DBC data.
Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...
const std::vector< DecodeFrame > & GetFrames() const
Tree node for later use in model/view or other hierarchy consumers.
const SignalInfo * GetSignal() const
Get signal payload if node is signal.
const TreeNode * GetChild(std::size_t index) const
Get child by index.
const std::string & GetName() const
Get display name.
std::size_t GetChildCount() const
Get child count.
NodeType GetType() const
Get node type.
const FrameInfo * GetFrame() const
Get frame payload if node is frame.
Runtime decode database builder.
CAN frame decoding API and result types.
DBC file parser and interpretation options.
int main(int argc, char *argv[])
Parse a DBC file and demonstrate metadata lookup and CAN decoding.
Parsed DBC content stored in a simple internal form.
std::shared_ptr< const DecodeFrame > definition
One decoded signal value.
Describes one CAN frame from a DBC file.
Raw CAN frame used for runtime or trace decoding.
std::vector< std::uint8_t > data
Describes one signal inside a DBC frame.