From 38ce043ae083fccd352d4ea3c75c690bd4ef77b8 Mon Sep 17 00:00:00 2001 From: deeaitch Date: Sun, 14 Jun 2026 21:05:20 -0400 Subject: [PATCH] updated documentation --- docs/dbcframework.tag | 693 +++++++++++++++ docs/doxygen_warnings.log | 10 + docs/html/annotated.html | 83 +- docs/html/annotated_dup.js | 19 + docs/html/classDbcDecodeBuilder-members.html | 83 +- docs/html/classDbcDecodeBuilder.html | 88 +- docs/html/classDbcDecodeBuilder.js | 4 + docs/html/classDbcDecoder-members.html | 89 +- docs/html/classDbcDecoder.html | 332 ++------ docs/html/classDbcDecoder.js | 5 + docs/html/classDbcParser-members.html | 97 ++- docs/html/classDbcParser.html | 558 ++---------- docs/html/classDbcParser.js | 4 + docs/html/classDbcTreeBuilder-members.html | 83 +- docs/html/classDbcTreeBuilder.html | 88 +- docs/html/classDbcTreeBuilder.js | 4 + docs/html/classTreeNode-members.html | 104 ++- docs/html/classTreeNode.html | 514 +++-------- docs/html/classTreeNode.js | 14 + docs/html/classes.html | 83 +- docs/html/dbc.qch | Bin 446464 -> 495616 bytes docs/html/dbc__database_8h.html | 83 +- docs/html/dbc__database_8h.js | 4 + docs/html/dbc__database_8h_source.html | 102 ++- docs/html/dbc__decode__builder_8cpp.html | 83 +- .../dbc__decode__builder_8cpp_source.html | 119 ++- docs/html/dbc__decode__builder_8h.html | 83 +- docs/html/dbc__decode__builder_8h.js | 4 + docs/html/dbc__decode__builder_8h_source.html | 107 ++- docs/html/dbc__decoder_8cpp.html | 83 +- docs/html/dbc__decoder_8cpp_source.html | 141 +-- docs/html/dbc__decoder_8h.html | 83 +- docs/html/dbc__decoder_8h.js | 7 + docs/html/dbc__decoder_8h_source.html | 179 ++-- docs/html/dbc__parser_8cpp.html | 98 ++- docs/html/dbc__parser_8cpp_source.html | 204 ++--- docs/html/dbc__parser_8h.html | 83 +- docs/html/dbc__parser_8h.js | 4 + docs/html/dbc__parser_8h_source.html | 155 ++-- docs/html/dbc__tree__builder_8cpp.html | 83 +- docs/html/dbc__tree__builder_8cpp_source.html | 100 ++- docs/html/dbc__tree__builder_8h.html | 83 +- docs/html/dbc__tree__builder_8h.js | 4 + docs/html/dbc__tree__builder_8h_source.html | 107 ++- docs/html/decode__database_8h.html | 99 ++- docs/html/decode__database_8h.js | 16 + docs/html/decode__database_8h_source.html | 237 +++--- docs/html/files.html | 84 +- docs/html/files_dup.js | 18 + docs/html/frame__info_8h.html | 83 +- docs/html/frame__info_8h.js | 4 + docs/html/frame__info_8h_source.html | 125 +-- docs/html/functions.html | 166 ++-- docs/html/functions_func.html | 192 ++--- docs/html/functions_vars.html | 124 +-- docs/html/globals.html | 94 +- docs/html/globals_enum.html | 89 +- docs/html/graph_legend.html | 158 ++++ docs/html/graph_legend.md5 | 1 + docs/html/graph_legend.svg | 117 +++ docs/html/index.html | 78 +- docs/html/index.qhp | 340 +++----- docs/html/main_8cpp.html | 163 ++-- docs/html/main_8cpp_source.html | 129 +-- docs/html/md_README.html | 76 +- docs/html/menu.js | 135 +++ docs/html/menudata.js | 26 +- docs/html/navtree.css | 147 ++++ docs/html/navtree.js | 549 ++++++++++++ docs/html/navtreedata.js | 121 +++ docs/html/navtreeindex0.js | 200 +++++ docs/html/pages.html | 76 +- docs/html/resize.js | 150 ++++ docs/html/search/all_0.html | 37 + docs/html/search/all_0.js | 4 + docs/html/search/all_1.html | 37 + docs/html/search/all_1.js | 6 + docs/html/search/all_10.html | 37 + docs/html/search/all_10.js | 4 + docs/html/search/all_11.html | 37 + docs/html/search/all_11.js | 6 + docs/html/search/all_2.html | 37 + docs/html/search/all_2.js | 5 + docs/html/search/all_3.html | 37 + docs/html/search/all_3.js | 28 + docs/html/search/all_4.html | 37 + docs/html/search/all_4.js | 10 + docs/html/search/all_5.html | 37 + docs/html/search/all_5.js | 9 + docs/html/search/all_6.html | 37 + docs/html/search/all_6.js | 4 + docs/html/search/all_7.html | 37 + docs/html/search/all_7.js | 6 + docs/html/search/all_8.html | 37 + docs/html/search/all_8.js | 4 + docs/html/search/all_9.html | 37 + docs/html/search/all_9.js | 6 + docs/html/search/all_a.html | 37 + docs/html/search/all_a.js | 5 + docs/html/search/all_b.html | 37 + docs/html/search/all_b.js | 4 + docs/html/search/all_c.html | 37 + docs/html/search/all_c.js | 7 + docs/html/search/all_d.html | 37 + docs/html/search/all_d.js | 6 + docs/html/search/all_e.html | 37 + docs/html/search/all_e.js | 6 + docs/html/search/all_f.html | 37 + docs/html/search/all_f.js | 7 + docs/html/search/classes_0.html | 37 + docs/html/search/classes_0.js | 13 + docs/html/search/classes_1.html | 37 + docs/html/search/classes_1.js | 6 + docs/html/search/classes_2.html | 37 + docs/html/search/classes_2.js | 4 + docs/html/search/classes_3.html | 37 + docs/html/search/classes_3.js | 4 + docs/html/search/classes_4.html | 37 + docs/html/search/classes_4.js | 4 + docs/html/search/close.svg | 31 + docs/html/search/enums_0.html | 37 + docs/html/search/enums_0.js | 4 + docs/html/search/enums_1.html | 37 + docs/html/search/enums_1.js | 4 + docs/html/search/enums_2.html | 37 + docs/html/search/enums_2.js | 4 + docs/html/search/files_0.html | 37 + docs/html/search/files_0.js | 13 + docs/html/search/files_1.html | 37 + docs/html/search/files_1.js | 4 + docs/html/search/files_2.html | 37 + docs/html/search/files_2.js | 4 + docs/html/search/files_3.html | 37 + docs/html/search/files_3.js | 4 + docs/html/search/files_4.html | 37 + docs/html/search/files_4.js | 5 + docs/html/search/functions_0.html | 37 + docs/html/search/functions_0.js | 4 + docs/html/search/functions_1.html | 37 + docs/html/search/functions_1.js | 4 + docs/html/search/functions_2.html | 37 + docs/html/search/functions_2.js | 4 + docs/html/search/functions_3.html | 37 + docs/html/search/functions_3.js | 4 + docs/html/search/functions_4.html | 37 + docs/html/search/functions_4.js | 9 + docs/html/search/functions_5.html | 37 + docs/html/search/functions_5.js | 4 + docs/html/search/functions_6.html | 37 + docs/html/search/functions_6.js | 4 + docs/html/search/mag_sel.svg | 74 ++ docs/html/search/nomatches.html | 13 + docs/html/search/pages_0.html | 37 + docs/html/search/pages_0.js | 4 + docs/html/search/search.css | 263 ++++++ docs/html/search/search.js | 802 ++++++++++++++++++ docs/html/search/search_l.png | Bin 0 -> 567 bytes docs/html/search/search_m.png | Bin 0 -> 158 bytes docs/html/search/search_r.png | Bin 0 -> 553 bytes docs/html/search/searchdata.js | 33 + docs/html/search/variables_0.html | 37 + docs/html/search/variables_0.js | 4 + docs/html/search/variables_1.html | 37 + docs/html/search/variables_1.js | 5 + docs/html/search/variables_2.html | 37 + docs/html/search/variables_2.js | 6 + docs/html/search/variables_3.html | 37 + docs/html/search/variables_3.js | 5 + docs/html/search/variables_4.html | 37 + docs/html/search/variables_4.js | 4 + docs/html/search/variables_5.html | 37 + docs/html/search/variables_5.js | 6 + docs/html/search/variables_6.html | 37 + docs/html/search/variables_6.js | 4 + docs/html/search/variables_7.html | 37 + docs/html/search/variables_7.js | 5 + docs/html/search/variables_8.html | 37 + docs/html/search/variables_8.js | 4 + docs/html/search/variables_9.html | 37 + docs/html/search/variables_9.js | 4 + docs/html/search/variables_a.html | 37 + docs/html/search/variables_a.js | 6 + docs/html/search/variables_b.html | 37 + docs/html/search/variables_b.js | 5 + docs/html/search/variables_c.html | 37 + docs/html/search/variables_c.js | 4 + docs/html/search/variables_d.html | 37 + docs/html/search/variables_d.js | 4 + docs/html/search/variables_e.html | 37 + docs/html/search/variables_e.js | 4 + docs/html/search/variables_f.html | 37 + docs/html/search/variables_f.js | 5 + docs/html/signal__info_8h.html | 83 +- docs/html/signal__info_8h.js | 4 + docs/html/signal__info_8h_source.html | 128 +-- docs/html/structDbcDatabase-members.html | 83 +- docs/html/structDbcDatabase.html | 86 +- docs/html/structDbcDatabase.js | 4 + docs/html/structDecodeDatabase-members.html | 87 +- docs/html/structDecodeDatabase.html | 118 ++- docs/html/structDecodeFrame-members.html | 87 +- docs/html/structDecodeFrame.html | 230 ++--- docs/html/structDecodeFrame.js | 12 + docs/html/structDecodeSignal-members.html | 85 +- docs/html/structDecodeSignal.html | 396 +++++---- docs/html/structDecodeSignal.js | 15 + .../html/structDecodedFrameValue-members.html | 87 +- docs/html/structDecodedFrameValue.html | 106 ++- docs/html/structDecodedFrameValue.js | 6 + .../structDecodedSignalValue-members.html | 85 +- docs/html/structDecodedSignalValue.html | 130 +-- docs/html/structDecodedSignalValue.js | 7 + docs/html/structFrameInfo-members.html | 87 +- docs/html/structFrameInfo.html | 264 +++--- docs/html/structFrameInfo.js | 12 + docs/html/structFrameKey-members.html | 93 +- docs/html/structFrameKey.html | 92 +- docs/html/structFrameKeyHasher-members.html | 85 +- docs/html/structFrameKeyHasher.html | 86 +- docs/html/structRawCanFrame-members.html | 85 +- docs/html/structRawCanFrame.html | 132 +-- docs/html/structRawCanFrame.js | 6 + docs/html/structSignalInfo-members.html | 85 +- docs/html/structSignalInfo.html | 422 ++++----- docs/html/structSignalInfo.js | 15 + docs/html/svgpan.js | 323 +++++++ docs/html/tabs.css | 62 +- docs/html/tree__node_8cpp.html | 83 +- docs/html/tree__node_8cpp_source.html | 129 +-- docs/html/tree__node_8h.html | 94 +- docs/html/tree__node_8h.js | 9 + docs/html/tree__node_8h_source.html | 210 ++--- 232 files changed, 11959 insertions(+), 4568 deletions(-) create mode 100644 docs/dbcframework.tag create mode 100644 docs/doxygen_warnings.log create mode 100644 docs/html/annotated_dup.js create mode 100644 docs/html/classDbcDecodeBuilder.js create mode 100644 docs/html/classDbcDecoder.js create mode 100644 docs/html/classDbcParser.js create mode 100644 docs/html/classDbcTreeBuilder.js create mode 100644 docs/html/classTreeNode.js create mode 100644 docs/html/dbc__database_8h.js create mode 100644 docs/html/dbc__decode__builder_8h.js create mode 100644 docs/html/dbc__decoder_8h.js create mode 100644 docs/html/dbc__parser_8h.js create mode 100644 docs/html/dbc__tree__builder_8h.js create mode 100644 docs/html/decode__database_8h.js create mode 100644 docs/html/files_dup.js create mode 100644 docs/html/frame__info_8h.js create mode 100644 docs/html/graph_legend.html create mode 100644 docs/html/graph_legend.md5 create mode 100644 docs/html/graph_legend.svg create mode 100644 docs/html/menu.js create mode 100644 docs/html/navtree.css create mode 100644 docs/html/navtree.js create mode 100644 docs/html/navtreedata.js create mode 100644 docs/html/navtreeindex0.js create mode 100644 docs/html/resize.js create mode 100644 docs/html/search/all_0.html create mode 100644 docs/html/search/all_0.js create mode 100644 docs/html/search/all_1.html create mode 100644 docs/html/search/all_1.js create mode 100644 docs/html/search/all_10.html create mode 100644 docs/html/search/all_10.js create mode 100644 docs/html/search/all_11.html create mode 100644 docs/html/search/all_11.js create mode 100644 docs/html/search/all_2.html create mode 100644 docs/html/search/all_2.js create mode 100644 docs/html/search/all_3.html create mode 100644 docs/html/search/all_3.js create mode 100644 docs/html/search/all_4.html create mode 100644 docs/html/search/all_4.js create mode 100644 docs/html/search/all_5.html create mode 100644 docs/html/search/all_5.js create mode 100644 docs/html/search/all_6.html create mode 100644 docs/html/search/all_6.js create mode 100644 docs/html/search/all_7.html create mode 100644 docs/html/search/all_7.js create mode 100644 docs/html/search/all_8.html create mode 100644 docs/html/search/all_8.js create mode 100644 docs/html/search/all_9.html create mode 100644 docs/html/search/all_9.js create mode 100644 docs/html/search/all_a.html create mode 100644 docs/html/search/all_a.js create mode 100644 docs/html/search/all_b.html create mode 100644 docs/html/search/all_b.js create mode 100644 docs/html/search/all_c.html create mode 100644 docs/html/search/all_c.js create mode 100644 docs/html/search/all_d.html create mode 100644 docs/html/search/all_d.js create mode 100644 docs/html/search/all_e.html create mode 100644 docs/html/search/all_e.js create mode 100644 docs/html/search/all_f.html create mode 100644 docs/html/search/all_f.js create mode 100644 docs/html/search/classes_0.html create mode 100644 docs/html/search/classes_0.js create mode 100644 docs/html/search/classes_1.html create mode 100644 docs/html/search/classes_1.js create mode 100644 docs/html/search/classes_2.html create mode 100644 docs/html/search/classes_2.js create mode 100644 docs/html/search/classes_3.html create mode 100644 docs/html/search/classes_3.js create mode 100644 docs/html/search/classes_4.html create mode 100644 docs/html/search/classes_4.js create mode 100644 docs/html/search/close.svg create mode 100644 docs/html/search/enums_0.html create mode 100644 docs/html/search/enums_0.js create mode 100644 docs/html/search/enums_1.html create mode 100644 docs/html/search/enums_1.js create mode 100644 docs/html/search/enums_2.html create mode 100644 docs/html/search/enums_2.js create mode 100644 docs/html/search/files_0.html create mode 100644 docs/html/search/files_0.js create mode 100644 docs/html/search/files_1.html create mode 100644 docs/html/search/files_1.js create mode 100644 docs/html/search/files_2.html create mode 100644 docs/html/search/files_2.js create mode 100644 docs/html/search/files_3.html create mode 100644 docs/html/search/files_3.js create mode 100644 docs/html/search/files_4.html create mode 100644 docs/html/search/files_4.js create mode 100644 docs/html/search/functions_0.html create mode 100644 docs/html/search/functions_0.js create mode 100644 docs/html/search/functions_1.html create mode 100644 docs/html/search/functions_1.js create mode 100644 docs/html/search/functions_2.html create mode 100644 docs/html/search/functions_2.js create mode 100644 docs/html/search/functions_3.html create mode 100644 docs/html/search/functions_3.js create mode 100644 docs/html/search/functions_4.html create mode 100644 docs/html/search/functions_4.js create mode 100644 docs/html/search/functions_5.html create mode 100644 docs/html/search/functions_5.js create mode 100644 docs/html/search/functions_6.html create mode 100644 docs/html/search/functions_6.js create mode 100644 docs/html/search/mag_sel.svg create mode 100644 docs/html/search/nomatches.html create mode 100644 docs/html/search/pages_0.html create mode 100644 docs/html/search/pages_0.js create mode 100644 docs/html/search/search.css create mode 100644 docs/html/search/search.js create mode 100644 docs/html/search/search_l.png create mode 100644 docs/html/search/search_m.png create mode 100644 docs/html/search/search_r.png create mode 100644 docs/html/search/searchdata.js create mode 100644 docs/html/search/variables_0.html create mode 100644 docs/html/search/variables_0.js create mode 100644 docs/html/search/variables_1.html create mode 100644 docs/html/search/variables_1.js create mode 100644 docs/html/search/variables_2.html create mode 100644 docs/html/search/variables_2.js create mode 100644 docs/html/search/variables_3.html create mode 100644 docs/html/search/variables_3.js create mode 100644 docs/html/search/variables_4.html create mode 100644 docs/html/search/variables_4.js create mode 100644 docs/html/search/variables_5.html create mode 100644 docs/html/search/variables_5.js create mode 100644 docs/html/search/variables_6.html create mode 100644 docs/html/search/variables_6.js create mode 100644 docs/html/search/variables_7.html create mode 100644 docs/html/search/variables_7.js create mode 100644 docs/html/search/variables_8.html create mode 100644 docs/html/search/variables_8.js create mode 100644 docs/html/search/variables_9.html create mode 100644 docs/html/search/variables_9.js create mode 100644 docs/html/search/variables_a.html create mode 100644 docs/html/search/variables_a.js create mode 100644 docs/html/search/variables_b.html create mode 100644 docs/html/search/variables_b.js create mode 100644 docs/html/search/variables_c.html create mode 100644 docs/html/search/variables_c.js create mode 100644 docs/html/search/variables_d.html create mode 100644 docs/html/search/variables_d.js create mode 100644 docs/html/search/variables_e.html create mode 100644 docs/html/search/variables_e.js create mode 100644 docs/html/search/variables_f.html create mode 100644 docs/html/search/variables_f.js create mode 100644 docs/html/signal__info_8h.js create mode 100644 docs/html/structDbcDatabase.js create mode 100644 docs/html/structDecodeFrame.js create mode 100644 docs/html/structDecodeSignal.js create mode 100644 docs/html/structDecodedFrameValue.js create mode 100644 docs/html/structDecodedSignalValue.js create mode 100644 docs/html/structFrameInfo.js create mode 100644 docs/html/structRawCanFrame.js create mode 100644 docs/html/structSignalInfo.js create mode 100644 docs/html/svgpan.js create mode 100644 docs/html/tree__node_8h.js diff --git a/docs/dbcframework.tag b/docs/dbcframework.tag new file mode 100644 index 0000000..7d60b80 --- /dev/null +++ b/docs/dbcframework.tag @@ -0,0 +1,693 @@ + + + + dbc_database.h + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + dbc__database_8h.html + frame_info.h + DbcDatabase + + + dbc_decode_builder.cpp + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + dbc__decode__builder_8cpp.html + dbc_decode_builder.h + + + dbc_decode_builder.h + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + dbc__decode__builder_8h.html + dbc_database.h + decode_database.h + DbcDecodeBuilder + + + dbc_decoder.cpp + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + dbc__decoder_8cpp.html + dbc_decoder.h + + + dbc_decoder.h + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + dbc__decoder_8h.html + decode_database.h + RawCanFrame + DecodedSignalValue + DecodedFrameValue + DbcDecoder + + + dbc_parser.cpp + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + dbc__parser_8cpp.html + dbc_parser.h + + + dbc_parser.h + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + dbc__parser_8h.html + dbc_database.h + DbcParser + + + dbc_tree_builder.cpp + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + dbc__tree__builder_8cpp.html + dbc_tree_builder.h + + + dbc_tree_builder.h + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + dbc__tree__builder_8h.html + dbc_database.h + tree_node.h + DbcTreeBuilder + + + decode_database.h + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + decode__database_8h.html + DecodeSignal + DecodeFrame + FrameKey + FrameKeyHasher + DecodeDatabase + + + ByteOrder + decode__database_8h.html + aaeb92d42f5a6e27b8ba19f18d69d142b + + Intel + Motorola + + + + ValueType + decode__database_8h.html + ad9971b6ef33e02ba2c75d19c1d2518a1 + + Unsigned + Signed + + + + frame_info.h + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + frame__info_8h.html + signal_info.h + FrameInfo + + + main.cpp + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + main_8cpp.html + dbc_parser.h + dbc_tree_builder.h + dbc_decode_builder.h + dbc_decoder.h + + + signal_info.h + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + signal__info_8h.html + SignalInfo + + + tree_node.cpp + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + tree__node_8cpp.html + tree_node.h + + + tree_node.h + /home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/ + tree__node_8h.html + frame_info.h + signal_info.h + TreeNode + + + NodeType + tree__node_8h.html + acac9cbaeea226ed297804c012dc12b16 + + Root + Frame + Signal + + + + DbcDatabase + structDbcDatabase.html + + std::vector< FrameInfo > + frames + structDbcDatabase.html + a2cade5d0234ee816132127542f8c612b + + + + + DbcDecodeBuilder + classDbcDecodeBuilder.html + + DecodeDatabase + Build + classDbcDecodeBuilder.html + a2bc6386dfb5e58976c42e22c19ec471b + (const DbcDatabase &source) const + + + + DbcDecoder + classDbcDecoder.html + + const DecodeFrame * + FindFrame + classDbcDecoder.html + ab2cfb2fb711c95d3a29365546b89f3da + (const DecodeDatabase &database, std::uint32_t canId, bool isExtended) const + + + DecodedFrameValue + Decode + classDbcDecoder.html + a345951ffe5d943a70d3a1ea1f39e74f7 + (const DecodeDatabase &database, const RawCanFrame &frame) const + + + + DbcParser + classDbcParser.html + + DbcDatabase + ParseFile + classDbcParser.html + aef72826942c9095d653fafa435855e56 + (const std::string &filePath) const + + + + DbcTreeBuilder + classDbcTreeBuilder.html + + std::unique_ptr< TreeNode > + Build + classDbcTreeBuilder.html + a7e57d067d831b14b383947fd125edd4b + (const DbcDatabase &database) const + + + + DecodeDatabase + structDecodeDatabase.html + + + DecodedFrameValue + structDecodedFrameValue.html + + const DecodeFrame * + definition + structDecodedFrameValue.html + a60dda1cc352d2c8087f0bdbc81dd266c + + + + std::vector< DecodedSignalValue > + public + structDecodedFrameValue.html + adae123ac7fbb4a5c314b64b01109f4a8 + + + + bool + valid + structDecodedFrameValue.html + a4f51c31110dba1f73a763c596372beb0 + + + + + DecodedSignalValue + structDecodedSignalValue.html + + const DecodeSignal * + definition + structDecodedSignalValue.html + acadc3b3bb21dd6b0412d342c7e6b20d7 + + + + std::int64_t + rawValue + structDecodedSignalValue.html + a5138b825940e34689f7b3891627ee9ec + + + + double + physicalValue + structDecodedSignalValue.html + a6847d05b3cb00d5e0f6c611968f57978 + + + + bool + valid + structDecodedSignalValue.html + aac0ed361af545cde48d0e6f41a859686 + + + + + DecodeFrame + structDecodeFrame.html + + std::string + name + structDecodeFrame.html + aa0a7f8fd5bfde2148dfd0d838328f579 + + + + std::uint32_t + canId + structDecodeFrame.html + a52e10215388db7df8b541b9d9909edcf + + + + bool + isExtended + structDecodeFrame.html + a3ee2348d781f8f15aaf87e8dcf57ec41 + + + + std::uint8_t + dlc + structDecodeFrame.html + a51111ac13988be372d5673d12cf3e060 + + + + std::uint32_t + pgn + structDecodeFrame.html + a1d3c54055c0cbceb73adf551f7067f23 + + + + bool + hasPgn + structDecodeFrame.html + a2551102670c4a540fced4c71da0b369d + + + + std::string + transmitter + structDecodeFrame.html + ad78241dc40c793aabb8495b6989b81a9 + + + + std::string + comment + structDecodeFrame.html + a25819ef907a32391af5c9f7cae9cdb22 + + + + std::vector< DecodeSignal > + public + structDecodeFrame.html + a7f4e71bbdec3f424b625e724e3dfbf14 + + + + + DecodeSignal + structDecodeSignal.html + + std::string + name + structDecodeSignal.html + a58cf5844f2272a23dcb9687d912e4780 + + + + std::uint32_t + startBit + structDecodeSignal.html + aaf5d7527ddf65b6355c2b4f3626df22d + + + + std::uint32_t + length + structDecodeSignal.html + acd4ef5ee30421d117b5756854302debb + + + + ByteOrder + byteOrder + structDecodeSignal.html + abdc4c4bb4a67a6d61d6ca81e8a52833d + + + + ValueType + valueType + structDecodeSignal.html + a9d37638129263b8902ba5be59baf39a8 + + + + double + factor + structDecodeSignal.html + a428c39913a366a8476dd291061354391 + + + + double + offset + structDecodeSignal.html + a92db637af4e224a0ae70173050dc3f74 + + + + double + minimum + structDecodeSignal.html + a0fb84e19a0ab3bd50b6f65c1075ebc25 + + + + double + maximum + structDecodeSignal.html + a4a6ba87142a9badbf0ca830e9e709cb7 + + + + std::string + unit + structDecodeSignal.html + a38eed9ca7581423fd8bfbedcffc12092 + + + + std::vector< std::string > + receivers + structDecodeSignal.html + abdbae62a64d2df716bf60c6b67b30eaa + + + + std::string + comment + structDecodeSignal.html + ae28c905d4a2bc86419c2a8361bfea473 + + + + + FrameInfo + structFrameInfo.html + + std::string + name + structFrameInfo.html + abb53a7f93ed7abc0ea1ae4a8ccafcdcb + + + + std::uint32_t + canId + structFrameInfo.html + af470b0742c05bfbffc31c51a68f5c05e + + + + bool + isExtended + structFrameInfo.html + a34b726afaad2ac5c697fdb2ac070cdaf + + + + std::uint32_t + pgn + structFrameInfo.html + aee518b33f1000bf0b7f6e4a87474c943 + + + + bool + hasPgn + structFrameInfo.html + a4737a5420213ad4304724e39f3a4e55d + + + + std::uint8_t + dlc + structFrameInfo.html + aa2b198ea0f55e560c123d35e7b3ecab9 + + + + std::string + transmitter + structFrameInfo.html + a92749ec3798d4211a505860fb389a9e8 + + + + std::string + comment + structFrameInfo.html + ace75121294f9d89b762080ab5643293c + + + + std::vector< SignalInfo > + public + structFrameInfo.html + a3f7e25d67ddae22f2ed50823a5a26084 + + + + + FrameKey + structFrameKey.html + + + FrameKeyHasher + structFrameKeyHasher.html + + + RawCanFrame + structRawCanFrame.html + + std::uint32_t + canId + structRawCanFrame.html + a2d0e7fa0e3d5c20bbed55ed8f7888ff4 + + + + bool + isExtended + structRawCanFrame.html + a462193d275adc1dba8bd18ffa0e36bb7 + + + + std::vector< std::uint8_t > + data + structRawCanFrame.html + a0acb487612104c99c9907344c035df83 + + + + + SignalInfo + structSignalInfo.html + + std::string + name + structSignalInfo.html + a379e422a00cad56f896cacf60455b088 + + + + std::uint32_t + startBit + structSignalInfo.html + ace290724f9801521609aedaa946d61f1 + + + + std::uint32_t + length + structSignalInfo.html + a1008b5201f71848177217bd52fb84baa + + + + bool + isLittleEndian + structSignalInfo.html + af363b1563fb4c7cc8973f9a80c06846c + + + + bool + isSigned + structSignalInfo.html + a52a52b320eef92fbcb4626307f9a498f + + + + double + factor + structSignalInfo.html + ae4f78d99a2750aa564d7eba860171499 + + + + double + offset + structSignalInfo.html + ab7d0769f47aa540656b22e4e49db517e + + + + double + minimum + structSignalInfo.html + ada7bf94fbeaa26bd08c73982b5af255b + + + + double + maximum + structSignalInfo.html + adf1c4331b9eabced0d7fdda40ff0eb52 + + + + std::string + unit + structSignalInfo.html + a1f214f03e94ef5794de2d3367bfcbd01 + + + + std::vector< std::string > + receivers + structSignalInfo.html + a2c95562fd0b29327a7fd7b1e6feee7f3 + + + + std::string + comment + structSignalInfo.html + ac99ba7563a5dad01e39c4257216953f5 + + + + + TreeNode + classTreeNode.html + + + TreeNode + classTreeNode.html + a984a98d5ccf7ef1f5a18094c6821f35d + () + + + + TreeNode + classTreeNode.html + a8e38dd591d8801d7ee3a7dbad90c67fc + (const FrameInfo &frame) + + + + TreeNode + classTreeNode.html + ab9f00f5253d56461bb2d420fd639c5ae + (const SignalInfo &signal) + + + void + AddChild + classTreeNode.html + a6161f2ebb92184eab4215d121870e788 + (std::unique_ptr< TreeNode > child) + + + std::size_t + GetChildCount + classTreeNode.html + abdd82460187dca8d3e5d66f5d5c529ea + () const + + + const TreeNode * + GetChild + classTreeNode.html + a4727ff801a2d1b9323c5ae50a35457a6 + (std::size_t index) const + + + TreeNode * + GetChild + classTreeNode.html + a81047bd7d2a4cc96b9ef5e20d0d63b5f + (std::size_t index) + + + NodeType + GetType + classTreeNode.html + afa2f4b0aafa12d3d41ed00df8e0250c9 + () const + + + const std::string & + GetName + classTreeNode.html + aaac5b8d9dc9e5ae1f367d1adbcf20e18 + () const + + + const FrameInfo * + GetFrame + classTreeNode.html + afc503b40004764163605d6dbdb4ef811 + () const + + + const SignalInfo * + GetSignal + classTreeNode.html + a226518612d0d00b5988a2c44fc21d3f1 + () const + + + + md_README + DBC Parser and Runtime Decode Module Documentation + md_README.html + + diff --git a/docs/doxygen_warnings.log b/docs/doxygen_warnings.log new file mode 100644 index 0000000..4fab2c9 --- /dev/null +++ b/docs/doxygen_warnings.log @@ -0,0 +1,10 @@ +/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. diff --git a/docs/html/annotated.html b/docs/html/annotated.html index bfbb64b..f42465c 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -5,10 +5,17 @@ -DBC framework: Class List +DBC Framework: Class List + + + + + + + @@ -18,8 +25,9 @@ -
DBC framework +
DBC Framework
+
DBC parsing and CAN signal decoding framework
@@ -27,23 +35,53 @@
- - + + + + + +
+ +
+
+
+ +
+ +
+
+ + +
+ +
+
Class List
@@ -69,9 +107,12 @@
+ - + diff --git a/docs/html/annotated_dup.js b/docs/html/annotated_dup.js new file mode 100644 index 0000000..54910e2 --- /dev/null +++ b/docs/html/annotated_dup.js @@ -0,0 +1,19 @@ +var annotated_dup = +[ + [ "DbcDatabase", "structDbcDatabase.html", "structDbcDatabase" ], + [ "DbcDecodeBuilder", "classDbcDecodeBuilder.html", "classDbcDecodeBuilder" ], + [ "DbcDecoder", "classDbcDecoder.html", "classDbcDecoder" ], + [ "DbcParser", "classDbcParser.html", "classDbcParser" ], + [ "DbcTreeBuilder", "classDbcTreeBuilder.html", "classDbcTreeBuilder" ], + [ "DecodeDatabase", "structDecodeDatabase.html", null ], + [ "DecodedFrameValue", "structDecodedFrameValue.html", "structDecodedFrameValue" ], + [ "DecodedSignalValue", "structDecodedSignalValue.html", "structDecodedSignalValue" ], + [ "DecodeFrame", "structDecodeFrame.html", "structDecodeFrame" ], + [ "DecodeSignal", "structDecodeSignal.html", "structDecodeSignal" ], + [ "FrameInfo", "structFrameInfo.html", "structFrameInfo" ], + [ "FrameKey", "structFrameKey.html", null ], + [ "FrameKeyHasher", "structFrameKeyHasher.html", null ], + [ "RawCanFrame", "structRawCanFrame.html", "structRawCanFrame" ], + [ "SignalInfo", "structSignalInfo.html", "structSignalInfo" ], + [ "TreeNode", "classTreeNode.html", "classTreeNode" ] +]; \ No newline at end of file diff --git a/docs/html/classDbcDecodeBuilder-members.html b/docs/html/classDbcDecodeBuilder-members.html index 79f5a08..5bf2363 100644 --- a/docs/html/classDbcDecodeBuilder-members.html +++ b/docs/html/classDbcDecodeBuilder-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
DBC framework +
DBC Framework
+
DBC parsing and CAN signal decoding framework
@@ -27,23 +35,53 @@
- - + + + + + +
+ +
+
+
+ +
+ +
+
+ + +
+ +
+
DbcDecodeBuilder Member List
@@ -53,9 +91,12 @@
Build(const DbcDatabase &source) constDbcDecodeBuilder
+ - + diff --git a/docs/html/classDbcDecodeBuilder.html b/docs/html/classDbcDecodeBuilder.html index c69d60b..41cda74 100644 --- a/docs/html/classDbcDecodeBuilder.html +++ b/docs/html/classDbcDecodeBuilder.html @@ -5,10 +5,17 @@ -DBC framework: DbcDecodeBuilder Class Reference +DBC Framework: DbcDecodeBuilder Class Reference + + + + + + + @@ -18,8 +25,9 @@ -
DBC framework +
DBC Framework
+
DBC parsing and CAN signal decoding framework
@@ -27,23 +35,53 @@
- - + + + + + +
+ +
+
+
+ +
+ +
+
+ + +
+ +
+
Public Member Functions | @@ -95,9 +133,7 @@ Public Member Functions

Definition at line 14 of file dbc_decode_builder.cpp.

-

References DecodeSignal::byteOrder, DecodeFrame::canId, FrameInfo::canId, DecodeSignal::comment, DecodeFrame::comment, FrameInfo::comment, SignalInfo::comment, DecodeFrame::dlc, FrameInfo::dlc, DecodeSignal::factor, SignalInfo::factor, DecodeDatabase::frameIndexByKey, DbcDatabase::frames, DecodeDatabase::frames, DecodeFrame::hasPgn, FrameInfo::hasPgn, Intel, DecodeFrame::isExtended, FrameInfo::isExtended, SignalInfo::isLittleEndian, SignalInfo::isSigned, DecodeSignal::length, SignalInfo::length, DecodeSignal::maximum, SignalInfo::maximum, DecodeSignal::minimum, SignalInfo::minimum, Motorola, DecodeSignal::name, DecodeFrame::name, FrameInfo::name, SignalInfo::name, DecodeSignal::offset, SignalInfo::offset, DecodeFrame::pgn, FrameInfo::pgn, DecodeSignal::receivers, SignalInfo::receivers, DecodeFrame::signals, FrameInfo::signals, Signed, DecodeSignal::startBit, SignalInfo::startBit, DecodeFrame::transmitter, FrameInfo::transmitter, DecodeSignal::unit, SignalInfo::unit, Unsigned, and DecodeSignal::valueType.

- -

Referenced by main().

+

References DecodeSignal::byteOrder, DecodeFrame::canId, FrameInfo::canId, DecodeFrame::comment, FrameInfo::comment, DecodeFrame::dlc, FrameInfo::dlc, DbcDatabase::frames, DecodeFrame::hasPgn, FrameInfo::hasPgn, DecodeFrame::isExtended, FrameInfo::isExtended, SignalInfo::isLittleEndian, DecodeSignal::length, SignalInfo::length, DecodeSignal::name, DecodeFrame::name, FrameInfo::name, SignalInfo::name, DecodeFrame::pgn, FrameInfo::pgn, DecodeSignal::startBit, SignalInfo::startBit, DecodeFrame::transmitter, and FrameInfo::transmitter.

@@ -106,9 +142,13 @@ Public Member Functions
  • dbc_decode_builder.cpp
  • + - + diff --git a/docs/html/classDbcDecodeBuilder.js b/docs/html/classDbcDecodeBuilder.js new file mode 100644 index 0000000..bd3ef09 --- /dev/null +++ b/docs/html/classDbcDecodeBuilder.js @@ -0,0 +1,4 @@ +var classDbcDecodeBuilder = +[ + [ "Build", "classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b", null ] +]; \ No newline at end of file diff --git a/docs/html/classDbcDecoder-members.html b/docs/html/classDbcDecoder-members.html index 550ff86..250d9a8 100644 --- a/docs/html/classDbcDecoder-members.html +++ b/docs/html/classDbcDecoder-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DbcDecoder Member List
    @@ -52,15 +90,14 @@

    This is the complete list of members for DbcDecoder, including all inherited members.

    - - - - - +
    Decode(const DecodeDatabase &database, const RawCanFrame &frame) constDbcDecoder
    ExtractIntel(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)DbcDecoderprivatestatic
    ExtractMotorola(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)DbcDecoderprivatestatic
    ExtractUnsigned(const std::vector< std::uint8_t > &data, const DecodeSignal &signal, std::uint64_t &value)DbcDecoderprivatestatic
    FindFrame(const DecodeDatabase &database, std::uint32_t canId, bool isExtended) constDbcDecoder
    SignExtend(std::uint64_t value, std::uint32_t bitLength)DbcDecoderprivatestatic
    FindFrame(const DecodeDatabase &database, std::uint32_t canId, bool isExtended) constDbcDecoder
    + - + diff --git a/docs/html/classDbcDecoder.html b/docs/html/classDbcDecoder.html index 7c48056..c748da7 100644 --- a/docs/html/classDbcDecoder.html +++ b/docs/html/classDbcDecoder.html @@ -5,10 +5,17 @@ -DBC framework: DbcDecoder Class Reference +DBC Framework: DbcDecoder Class Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,27 +35,56 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + @@ -66,219 +103,12 @@ Public Member Functions DecodedFrameValue Decode (const DecodeDatabase &database, const RawCanFrame &frame) const  Decode one raw CAN frame. More...
      - - - - - - - - - -

    -Static Private Member Functions

    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)
     

    Detailed Description

    Runtime CAN decoder using prebuilt decode database.

    Definition at line 70 of file dbc_decoder.h.

    Member Function Documentation

    - -

    ◆ Decode()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    DecodedFrameValue DbcDecoder::Decode (const DecodeDatabasedatabase,
    const RawCanFrameframe 
    ) const
    -
    -
    - -

    ◆ ExtractIntel()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    bool DbcDecoder::ExtractIntel (const std::vector< std::uint8_t > & data,
    std::uint32_t startBit,
    std::uint32_t length,
    std::uint64_t & value 
    )
    -
    -staticprivate
    -
    - -

    Definition at line 82 of file dbc_decoder.cpp.

    - -

    Referenced by ExtractUnsigned().

    - -
    -
    - -

    ◆ ExtractMotorola()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    bool DbcDecoder::ExtractMotorola (const std::vector< std::uint8_t > & data,
    std::uint32_t startBit,
    std::uint32_t length,
    std::uint64_t & value 
    )
    -
    -staticprivate
    -
    - -

    Definition at line 105 of file dbc_decoder.cpp.

    - -

    Referenced by ExtractUnsigned().

    - -
    -
    - -

    ◆ ExtractUnsigned()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    bool DbcDecoder::ExtractUnsigned (const std::vector< std::uint8_t > & data,
    const DecodeSignalsignal,
    std::uint64_t & value 
    )
    -
    -staticprivate
    -
    - -

    Definition at line 70 of file dbc_decoder.cpp.

    - -

    References DecodeSignal::byteOrder, ExtractIntel(), ExtractMotorola(), Intel, DecodeSignal::length, and DecodeSignal::startBit.

    - -

    Referenced by Decode().

    - -
    -

    ◆ FindFrame()

    @@ -324,49 +154,49 @@ Static Private Member Functions

    Definition at line 14 of file dbc_decoder.cpp.

    -

    References DecodeDatabase::frameIndexByKey, and DecodeDatabase::frames.

    -

    Referenced by Decode().

    - -

    ◆ SignExtend()

    + +

    ◆ Decode()

    - - - - - -
    - + - - + + - - + + - +
    std::int64_t DbcDecoder::SignExtend DecodedFrameValue DbcDecoder::Decode (std::uint64_t value, const DecodeDatabasedatabase,
    std::uint32_t bitLength const RawCanFrameframe 
    ) const
    -
    -staticprivate
    -

    Definition at line 144 of file dbc_decoder.cpp.

    +

    Decode one raw CAN frame.

    +
    Parameters
    + + + +
    databaseRuntime decode database.
    frameRaw CAN frame.
    +
    +
    +
    Returns
    Decoded frame value.
    -

    Referenced by Decode().

    +

    Definition at line 31 of file dbc_decoder.cpp.

    + +

    References RawCanFrame::canId, RawCanFrame::data, DecodedSignalValue::definition, DecodedFrameValue::definition, FindFrame(), RawCanFrame::isExtended, DecodedSignalValue::valid, DecodedFrameValue::valid, and DecodeSignal::valueType.

    @@ -375,9 +205,13 @@ Static Private Member Functions
  • dbc_decoder.cpp
  • + - + diff --git a/docs/html/classDbcDecoder.js b/docs/html/classDbcDecoder.js new file mode 100644 index 0000000..e36dac7 --- /dev/null +++ b/docs/html/classDbcDecoder.js @@ -0,0 +1,5 @@ +var classDbcDecoder = +[ + [ "FindFrame", "classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da", null ], + [ "Decode", "classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7", null ] +]; \ No newline at end of file diff --git a/docs/html/classDbcParser-members.html b/docs/html/classDbcParser-members.html index 13cf41d..cf45c26 100644 --- a/docs/html/classDbcParser-members.html +++ b/docs/html/classDbcParser-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DbcParser Member List
    @@ -51,23 +89,14 @@

    This is the complete list of members for DbcParser, including all inherited members.

    - - - - - - - - - - - - - +
    FindFrameById(DbcDatabase &database, std::uint32_t canId, bool isExtended)DbcParserprivatestatic
    FindSignalByName(FrameInfo &frame, const std::string &signalName)DbcParserprivatestatic
    IsCommentLine(const std::string &line)DbcParserprivatestatic
    IsFrameLine(const std::string &line)DbcParserprivatestatic
    IsSignalLine(const std::string &line)DbcParserprivatestatic
    NormalizeCanId(std::uint32_t rawCanId, std::uint32_t &normalizedCanId, bool &isExtended)DbcParserprivatestatic
    ParseCommentLine(const std::string &line, DbcDatabase &database)DbcParserprivatestatic
    ParseFile(const std::string &filePath) constDbcParser
    ParseFrameLine(const std::string &line)DbcParserprivatestatic
    ParseSignalLine(const std::string &line)DbcParserprivatestatic
    SplitReceivers(const std::string &text)DbcParserprivatestatic
    Trim(const std::string &text)DbcParserprivatestatic
    TryExtractPgn(std::uint32_t canId, bool isExtended, bool &hasPgn)DbcParserprivatestatic
    ParseFile(const std::string &filePath) constDbcParser
    + - + diff --git a/docs/html/classDbcParser.html b/docs/html/classDbcParser.html index 95bb025..449ecd9 100644 --- a/docs/html/classDbcParser.html +++ b/docs/html/classDbcParser.html @@ -5,10 +5,17 @@ -DBC framework: DbcParser Class Reference +DBC Framework: DbcParser Class Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,27 +35,56 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + @@ -63,33 +100,6 @@ Public Member Functions DbcDatabase ParseFile (const std::string &filePath) const  Parse DBC file. More...
      - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Static Private Member Functions

    static bool IsFrameLine (const std::string &line)
     
    static bool IsSignalLine (const std::string &line)
     
    static bool IsCommentLine (const std::string &line)
     
    static std::string Trim (const std::string &text)
     
    static std::vector< std::string > SplitReceivers (const std::string &text)
     
    static std::uint32_t TryExtractPgn (std::uint32_t canId, bool isExtended, bool &hasPgn)
     
    static void NormalizeCanId (std::uint32_t rawCanId, std::uint32_t &normalizedCanId, bool &isExtended)
     
    static FrameInfo ParseFrameLine (const std::string &line)
     
    static SignalInfo ParseSignalLine (const std::string &line)
     
    static void ParseCommentLine (const std::string &line, DbcDatabase &database)
     
    static FrameInfoFindFrameById (DbcDatabase &database, std::uint32_t canId, bool isExtended)
     
    static SignalInfoFindSignalByName (FrameInfo &frame, const std::string &signalName)
     

    Detailed Description

    Minimal DBC parser.

    @@ -107,274 +117,6 @@ Static Private Member Functions

    Definition at line 35 of file dbc_parser.h.

    Member Function Documentation

    - -

    ◆ FindFrameById()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    FrameInfo * DbcParser::FindFrameById (DbcDatabasedatabase,
    std::uint32_t canId,
    bool isExtended 
    )
    -
    -staticprivate
    -
    - -

    Definition at line 337 of file dbc_parser.cpp.

    - -

    References DbcDatabase::frames.

    - -

    Referenced by ParseCommentLine().

    - -
    -
    - -

    ◆ FindSignalByName()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    SignalInfo * DbcParser::FindSignalByName (FrameInfoframe,
    const std::string & signalName 
    )
    -
    -staticprivate
    -
    - -

    Definition at line 349 of file dbc_parser.cpp.

    - -

    References FrameInfo::signals.

    - -

    Referenced by ParseCommentLine().

    - -
    -
    - -

    ◆ IsCommentLine()

    - -
    -
    - - - - - -
    - - - - - - - - -
    bool DbcParser::IsCommentLine (const std::string & line)
    -
    -staticprivate
    -
    - -

    Definition at line 79 of file dbc_parser.cpp.

    - -

    Referenced by ParseFile().

    - -
    -
    - -

    ◆ IsFrameLine()

    - -
    -
    - - - - - -
    - - - - - - - - -
    bool DbcParser::IsFrameLine (const std::string & line)
    -
    -staticprivate
    -
    - -

    Definition at line 71 of file dbc_parser.cpp.

    - -

    Referenced by ParseFile().

    - -
    -
    - -

    ◆ IsSignalLine()

    - -
    -
    - - - - - -
    - - - - - - - - -
    bool DbcParser::IsSignalLine (const std::string & line)
    -
    -staticprivate
    -
    - -

    Definition at line 75 of file dbc_parser.cpp.

    - -

    Referenced by ParseFile().

    - -
    -
    - -

    ◆ NormalizeCanId()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    void DbcParser::NormalizeCanId (std::uint32_t rawCanId,
    std::uint32_t & normalizedCanId,
    bool & isExtended 
    )
    -
    -staticprivate
    -
    - -

    Definition at line 101 of file dbc_parser.cpp.

    - -

    Referenced by ParseCommentLine(), and ParseFrameLine().

    - -
    -
    - -

    ◆ ParseCommentLine()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    void DbcParser::ParseCommentLine (const std::string & line,
    DbcDatabasedatabase 
    )
    -
    -staticprivate
    -
    - -

    Definition at line 274 of file dbc_parser.cpp.

    - -

    References FrameInfo::comment, SignalInfo::comment, FindFrameById(), FindSignalByName(), and NormalizeCanId().

    - -

    Referenced by ParseFile().

    - -
    -

    ◆ ParseFile()

    @@ -408,183 +150,7 @@ Static Private Member Functions

    Definition at line 40 of file dbc_parser.cpp.

    -

    References DbcDatabase::frames, IsCommentLine(), IsFrameLine(), IsSignalLine(), ParseCommentLine(), ParseFrameLine(), ParseSignalLine(), FrameInfo::signals, and Trim().

    - -

    Referenced by main().

    - -
    - - -

    ◆ ParseFrameLine()

    - -
    -
    - - - - - -
    - - - - - - - - -
    FrameInfo DbcParser::ParseFrameLine (const std::string & line)
    -
    -staticprivate
    -
    -
    - -

    ◆ ParseSignalLine()

    - -
    -
    - - - - - -
    - - - - - - - - -
    SignalInfo DbcParser::ParseSignalLine (const std::string & line)
    -
    -staticprivate
    -
    -
    - -

    ◆ SplitReceivers()

    - -
    -
    - - - - - -
    - - - - - - - - -
    std::vector< std::string > DbcParser::SplitReceivers (const std::string & text)
    -
    -staticprivate
    -
    - -

    Definition at line 87 of file dbc_parser.cpp.

    - -

    References anonymous_namespace{dbc_parser.cpp}::TrimText().

    - -

    Referenced by ParseSignalLine().

    - -
    -
    - -

    ◆ Trim()

    - -
    -
    - - - - - -
    - - - - - - - - -
    std::string DbcParser::Trim (const std::string & text)
    -
    -staticprivate
    -
    - -

    Definition at line 83 of file dbc_parser.cpp.

    - -

    References anonymous_namespace{dbc_parser.cpp}::TrimText().

    - -

    Referenced by ParseFile().

    - -
    -
    - -

    ◆ TryExtractPgn()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    std::uint32_t DbcParser::TryExtractPgn (std::uint32_t canId,
    bool isExtended,
    bool & hasPgn 
    )
    -
    -staticprivate
    -
    - -

    Definition at line 118 of file dbc_parser.cpp.

    - -

    Referenced by ParseFrameLine().

    +

    References DbcDatabase::frames.

    @@ -593,9 +159,13 @@ Static Private Member Functions
  • dbc_parser.cpp
  • + - + diff --git a/docs/html/classDbcParser.js b/docs/html/classDbcParser.js new file mode 100644 index 0000000..46247c3 --- /dev/null +++ b/docs/html/classDbcParser.js @@ -0,0 +1,4 @@ +var classDbcParser = +[ + [ "ParseFile", "classDbcParser.html#aef72826942c9095d653fafa435855e56", null ] +]; \ No newline at end of file diff --git a/docs/html/classDbcTreeBuilder-members.html b/docs/html/classDbcTreeBuilder-members.html index 1c0bc40..46759e3 100644 --- a/docs/html/classDbcTreeBuilder-members.html +++ b/docs/html/classDbcTreeBuilder-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DbcTreeBuilder Member List
    @@ -53,9 +91,12 @@
    Build(const DbcDatabase &database) constDbcTreeBuilder
    + - + diff --git a/docs/html/classDbcTreeBuilder.html b/docs/html/classDbcTreeBuilder.html index fa81693..6003542 100644 --- a/docs/html/classDbcTreeBuilder.html +++ b/docs/html/classDbcTreeBuilder.html @@ -5,10 +5,17 @@ -DBC framework: DbcTreeBuilder Class Reference +DBC Framework: DbcTreeBuilder Class Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    Public Member Functions | @@ -95,9 +133,7 @@ Public Member Functions

    Definition at line 14 of file dbc_tree_builder.cpp.

    -

    References DbcDatabase::frames, and FrameInfo::signals.

    - -

    Referenced by main().

    +

    References DbcDatabase::frames.

    @@ -106,9 +142,13 @@ Public Member Functions
  • dbc_tree_builder.cpp
  • + - + diff --git a/docs/html/classDbcTreeBuilder.js b/docs/html/classDbcTreeBuilder.js new file mode 100644 index 0000000..b61edc1 --- /dev/null +++ b/docs/html/classDbcTreeBuilder.js @@ -0,0 +1,4 @@ +var classDbcTreeBuilder = +[ + [ "Build", "classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b", null ] +]; \ No newline at end of file diff --git a/docs/html/classTreeNode-members.html b/docs/html/classTreeNode-members.html index 4095d06..18ef360 100644 --- a/docs/html/classTreeNode-members.html +++ b/docs/html/classTreeNode-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    TreeNode Member List
    @@ -59,23 +97,21 @@ GetName() constTreeNode GetSignal() constTreeNode GetType() constTreeNode - m_childrenTreeNodeprivate - m_frameTreeNodeprivate - m_nameTreeNodeprivate - m_signalTreeNodeprivate - m_typeTreeNodeprivate - operator=(const TreeNode &)=deleteTreeNode - operator=(TreeNode &&)=defaultTreeNode - TreeNode()TreeNode - TreeNode(const FrameInfo &frame)TreeNodeexplicit - TreeNode(const SignalInfo &signal)TreeNodeexplicit - TreeNode(const TreeNode &)=deleteTreeNode - TreeNode(TreeNode &&)=defaultTreeNode - ~TreeNode()=defaultTreeNode + operator=(const TreeNode &)=delete (defined in TreeNode)TreeNode + operator=(TreeNode &&)=default (defined in TreeNode)TreeNode + TreeNode()TreeNode + TreeNode(const FrameInfo &frame)TreeNodeexplicit + TreeNode(const SignalInfo &signal)TreeNodeexplicit + TreeNode(const TreeNode &)=delete (defined in TreeNode)TreeNode + TreeNode(TreeNode &&)=default (defined in TreeNode)TreeNode + ~TreeNode()=default (defined in TreeNode)TreeNode
    + - + diff --git a/docs/html/classTreeNode.html b/docs/html/classTreeNode.html index e414e89..379fcae 100644 --- a/docs/html/classTreeNode.html +++ b/docs/html/classTreeNode.html @@ -5,10 +5,17 @@ -DBC framework: TreeNode Class Reference +DBC Framework: TreeNode Class Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,27 +35,56 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + @@ -69,15 +106,17 @@ Public Member Functions  TreeNode (const SignalInfo &signal)  Create signal node. More...
      - ~TreeNode ()=default -  - TreeNode (const TreeNode &)=delete +TreeNode (const TreeNode &)=delete   -TreeNodeoperator= (const TreeNode &)=delete + +TreeNodeoperator= (const TreeNode &)=delete   - TreeNode (TreeNode &&)=default +TreeNode (TreeNode &&)=default   -TreeNodeoperator= (TreeNode &&)=default + +TreeNodeoperator= (TreeNode &&)=default   void AddChild (std::unique_ptr< TreeNode > child)  Add child node. More...
    @@ -103,19 +142,6 @@ Public Member Functions const SignalInfoGetSignal () const  Get signal payload if node is signal. More...
      - - - - - - - - - - - -

    -Private Attributes

    NodeType m_type
     
    std::string m_name
     
    std::vector< std::unique_ptr< TreeNode > > m_children
     
    std::unique_ptr< FrameInfom_frame
     
    std::unique_ptr< SignalInfom_signal
     

    Detailed Description

    Tree node for later use in model/view or other hierarchy consumers.

    @@ -123,7 +149,7 @@ Private Attributes

    Definition at line 35 of file tree_node.h.

    Constructor & Destructor Documentation

    -

    ◆ TreeNode() [1/5]

    +

    ◆ TreeNode() [1/3]

    @@ -141,12 +167,10 @@ Private Attributes

    Definition at line 14 of file tree_node.cpp.

    -

    References Root.

    -
    -

    ◆ TreeNode() [2/5]

    +

    ◆ TreeNode() [2/3]

    @@ -179,12 +203,10 @@ Private Attributes

    Definition at line 22 of file tree_node.cpp.

    -

    References Frame.

    -
    -

    ◆ TreeNode() [3/5]

    +

    ◆ TreeNode() [3/3]

    @@ -217,85 +239,6 @@ Private Attributes

    Definition at line 30 of file tree_node.cpp.

    -

    References Signal.

    - -
    -
    - -

    ◆ ~TreeNode()

    - -
    -
    - - - - - -
    - - - - - - - -
    TreeNode::~TreeNode ()
    -
    -default
    -
    - -
    -
    - -

    ◆ TreeNode() [4/5]

    - -
    -
    - - - - - -
    - - - - - - - - -
    TreeNode::TreeNode (const TreeNode)
    -
    -delete
    -
    - -
    -
    - -

    ◆ TreeNode() [5/5]

    - -
    -
    - - - - - -
    - - - - - - - - -
    TreeNode::TreeNode (TreeNode && )
    -
    -default
    -
    -

    Member Function Documentation

    @@ -325,43 +268,32 @@ Private Attributes

    Definition at line 38 of file tree_node.cpp.

    -

    References m_children.

    -
    - -

    ◆ GetChild() [1/2]

    + +

    ◆ GetChildCount()

    - + - - - + +
    TreeNode * TreeNode::GetChild std::size_t TreeNode::GetChildCount (std::size_t index)) const
    -

    Get mutable child by index.

    -
    Parameters
    - - -
    indexChild index.
    -
    -
    -
    Returns
    Child pointer or nullptr if index is invalid.
    +

    Get child count.

    +
    Returns
    Number of children.
    -

    Definition at line 54 of file tree_node.cpp.

    - -

    References m_children.

    +

    Definition at line 43 of file tree_node.cpp.

    -

    ◆ GetChild() [2/2]

    +

    ◆ GetChild() [1/2]

    @@ -387,113 +319,34 @@ Private Attributes

    Definition at line 47 of file tree_node.cpp.

    -

    References m_children.

    - -

    Referenced by PrintTree().

    -
    - -

    ◆ GetChildCount()

    + +

    ◆ GetChild() [2/2]

    - + - - + + +
    std::size_t TreeNode::GetChildCount TreeNode * TreeNode::GetChild () conststd::size_t index)
    -

    Get child count.

    -
    Returns
    Number of children.
    +

    Get mutable child by index.

    +
    Parameters
    + + +
    indexChild index.
    +
    +
    +
    Returns
    Child pointer or nullptr if index is invalid.
    -

    Definition at line 43 of file tree_node.cpp.

    - -

    References m_children.

    - -

    Referenced by PrintTree().

    - -
    -
    - -

    ◆ GetFrame()

    - -
    -
    - - - - - - - -
    const FrameInfo * TreeNode::GetFrame () const
    -
    - -

    Get frame payload if node is frame.

    -
    Returns
    Pointer to frame info or nullptr.
    - -

    Definition at line 69 of file tree_node.cpp.

    - -

    References m_frame.

    - -

    Referenced by PrintTree().

    - -
    -
    - -

    ◆ GetName()

    - -
    -
    - - - - - - - -
    const std::string & TreeNode::GetName () const
    -
    - -

    Get display name.

    -
    Returns
    Node name.
    - -

    Definition at line 65 of file tree_node.cpp.

    - -

    References m_name.

    - -

    Referenced by PrintTree().

    - -
    -
    - -

    ◆ GetSignal()

    - -
    -
    - - - - - - - -
    const SignalInfo * TreeNode::GetSignal () const
    -
    - -

    Get signal payload if node is signal.

    -
    Returns
    Pointer to signal info or nullptr.
    - -

    Definition at line 73 of file tree_node.cpp.

    - -

    References m_signal.

    - -

    Referenced by PrintTree().

    +

    Definition at line 54 of file tree_node.cpp.

    @@ -517,192 +370,71 @@ Private Attributes

    Definition at line 61 of file tree_node.cpp.

    -

    References m_type.

    - -

    Referenced by PrintTree().

    - - -

    ◆ operator=() [1/2]

    + +

    ◆ GetName()

    - - - - - -
    - + - - +
    TreeNode & TreeNode::operator= const std::string & TreeNode::GetName (const TreeNode ) const
    -
    -delete
    +

    Get display name.

    +
    Returns
    Node name.
    + +

    Definition at line 65 of file tree_node.cpp.

    +
    - -

    ◆ operator=() [2/2]

    + +

    ◆ GetFrame()

    - - - - - -
    - + - - +
    TreeNode & TreeNode::operator= const FrameInfo * TreeNode::GetFrame (TreeNode &&  ) const
    -
    -default
    +

    Get frame payload if node is frame.

    +
    Returns
    Pointer to frame info or nullptr.
    + +

    Definition at line 69 of file tree_node.cpp.

    +
    -

    Member Data Documentation

    - -

    ◆ m_children

    + +

    ◆ GetSignal()

    - - - - - -
    - + + + +
    std::vector<std::unique_ptr<TreeNode> > TreeNode::m_childrenconst SignalInfo * TreeNode::GetSignal () const
    -
    -private
    -

    Definition at line 115 of file tree_node.h.

    +

    Get signal payload if node is signal.

    +
    Returns
    Pointer to signal info or nullptr.
    -

    Referenced by AddChild(), GetChild(), and GetChildCount().

    - -
    -
    - -

    ◆ m_frame

    - -
    -
    - - - - - -
    - - - - -
    std::unique_ptr<FrameInfo> TreeNode::m_frame
    -
    -private
    -
    - -

    Definition at line 116 of file tree_node.h.

    - -

    Referenced by GetFrame().

    - -
    -
    - -

    ◆ m_name

    - -
    -
    - - - - - -
    - - - - -
    std::string TreeNode::m_name
    -
    -private
    -
    - -

    Definition at line 114 of file tree_node.h.

    - -

    Referenced by GetName().

    - -
    -
    - -

    ◆ m_signal

    - -
    -
    - - - - - -
    - - - - -
    std::unique_ptr<SignalInfo> TreeNode::m_signal
    -
    -private
    -
    - -

    Definition at line 117 of file tree_node.h.

    - -

    Referenced by GetSignal().

    - -
    -
    - -

    ◆ m_type

    - -
    -
    - - - - - -
    - - - - -
    NodeType TreeNode::m_type
    -
    -private
    -
    - -

    Definition at line 113 of file tree_node.h.

    - -

    Referenced by GetType().

    +

    Definition at line 73 of file tree_node.cpp.

    @@ -711,9 +443,13 @@ Private Attributes
  • tree_node.cpp
  • + - + diff --git a/docs/html/classTreeNode.js b/docs/html/classTreeNode.js new file mode 100644 index 0000000..edfa15e --- /dev/null +++ b/docs/html/classTreeNode.js @@ -0,0 +1,14 @@ +var classTreeNode = +[ + [ "TreeNode", "classTreeNode.html#a984a98d5ccf7ef1f5a18094c6821f35d", null ], + [ "TreeNode", "classTreeNode.html#a8e38dd591d8801d7ee3a7dbad90c67fc", null ], + [ "TreeNode", "classTreeNode.html#ab9f00f5253d56461bb2d420fd639c5ae", null ], + [ "AddChild", "classTreeNode.html#a6161f2ebb92184eab4215d121870e788", null ], + [ "GetChildCount", "classTreeNode.html#abdd82460187dca8d3e5d66f5d5c529ea", null ], + [ "GetChild", "classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6", null ], + [ "GetChild", "classTreeNode.html#a81047bd7d2a4cc96b9ef5e20d0d63b5f", null ], + [ "GetType", "classTreeNode.html#afa2f4b0aafa12d3d41ed00df8e0250c9", null ], + [ "GetName", "classTreeNode.html#aaac5b8d9dc9e5ae1f367d1adbcf20e18", null ], + [ "GetFrame", "classTreeNode.html#afc503b40004764163605d6dbdb4ef811", null ], + [ "GetSignal", "classTreeNode.html#a226518612d0d00b5988a2c44fc21d3f1", null ] +]; \ No newline at end of file diff --git a/docs/html/classes.html b/docs/html/classes.html index 13d90c1..bada205 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -5,10 +5,17 @@ -DBC framework: Class Index +DBC Framework: Class Index + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    Class Index
    @@ -67,9 +105,12 @@
    TreeNode
    + - + diff --git a/docs/html/dbc.qch b/docs/html/dbc.qch index 1a4d0772d2e09f53612f2352bd7fd0c054ee9dc5..72a7fb22eda77fbe1a6c0f8f354b420ecb53a8a3 100644 GIT binary patch delta 234528 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≺A%c9xvB`rQ_&-bvQ7bx8Ejx(B0!0h2@q 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 delta 216904 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

    5yX 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

    Jb-jZ>1-cy%I!?oZqpf@xK=s5+| zD5}Rs15ItHlhNFB#eaYuo;E)K^xvaB-4>K4eo|EWyOBQ_T&;7fH|$0c^>#w)e5O$p zCh1R#DJg^QoN1%rza|U@)HiNY`-A$sY&nxY6v@6BM!{Cz$C7U*X_JlxN8BOUCfHAy@c7AcU&A80Ktzgx_3qJC%g9kdT@u(xx$@=GT0 ztt5Pe^cG1mvc0|Dbo}X<>2Pu3u^6t?yI-Bz3$O%$U3qD|Kszlw-7fD>#g~ZKVx&!z z5PdZgiSN^+z*56K0?{b8WF6j&4qaemW<|NStZHzsyrzV#9~^LThpSXCT0`+sAT z9S|%Yh~3ZFWCQ|;r%?a{D)?EgQ#SlJHvNAa6>Pc9a$&`SniSSWO$oUfvT8~PPtP1~ zA|MHAssM1}@wXQpZL0VNV@cJ6uETze@JYkFE8jKnu>Q(BLJqg@UY}@FM}oplx!xWx zufVK~i?3RbgN}nvrnd_|x0@Z}-s}87{)x1J1Y|k;%Z^%rTO3Ow^YmLyr)KqerD=9# zxz|g-kNkl5@+R+!alTcy$_ zAhSTo%tftVSVF zkq5NHWRfL9qfU=r5!B5$g|Mt~qPXrznvyiHW@%l!zf|Cdo7AI>7%OY|GaYP_?{GYZ z)8n;aedQhSVpBIwN;31-smtj9qWB{kBdDg~D7JQ!xj!g)-<}W*^xUt_A^2mkC`qCo z?^2kKU9?0Q{sYskKw^c#3tLcjH<*W-WymmDjl8%SSLhzQ2jTg zFh`5h8H5-2m@_Rz5i>CHVGhz~SZ~q|KEgP>u5TIHIP4uWtXU1wu9$j8Qq{k~ckqLN z{;(3z%s&Wd`+(#R0?Hn6k)5M1i5$F{(|h_7Z2bOi?70rWL*xhLafys-fZIn6I>4HC zlIP!wDNUlNT;&34mNx)I#=!95%;;E0AL`iK$SYfo4in*j#xn{}BT+3H+6d<0H$M-L^EQB$NjoYVSe6xeG*{a+>Q33Y4EZZsiRoU2-P8%_mY}qD_44hUH>esNYphC@ z*tii3w}yPV4~~-OLG)L{9Z<{IRaT#266nNrE?b4kBzxrEFx)PZ+34A^a-*!4tzGm< zfu@3_Z^Q)Y^@KRH&K4=EJ5<%&RaTy<2cjS-oNkGwtj-gmg6&u`x{}yEu!V)N=9>f| zKDmS4)2jyb;sg-{zn80L;hZSLSnbQ@RGhswjc+z3KpL*Aa|B%4PfeBk>nacnCpSpC zFd~g){YOiBl2lGT40Ij1rmG4a%|c0`i4h$RDc>sD@E7nNjF3swgko~umv?dsOQ)ec!MJ1o z^#Io(ZyTJ?HaYS3DFTM0*^rsc!BQXhG#7_68bwKBR7*TO=r!j}oCz8k~_$T7D<8s>HxbD$uB>Tqy%x_@6LN zJ#WJR-8#hQeGlXk=7p@95BB=bU2uR#OP_(juWb`39#;zANox6mO6Z9H`U_AAKVHNa zxg4h0B-WC}H>UUa-Gd1fA&nmZhkuI|WYlg^Zd&54yHf{THD#SQHl^C1y0fn!6ifdF z{AtuE9c~~G29ziY1cdlgJ3OuS9lODf_Wk(Ff17#=@qV!TJY)p@^^-=YYho;*EqnaLwBy;Qizfo zZr+@^8e>uJ+PYTtN5hbf}Kt(lg@OKTU}D%DL}{dddXGIYx(PSWm0~_nM!?clkdN7vRb-P?cNT0 z(-0RPy>53-%)1@bV}CKqF~Ng_^}(h5t_Zur&)**o4tr5tFww?M zcc7*=j1W?IUkxzPR6uu*{vDLoSftr`@93ZCOs=II4!+J9M=p}GU>Ypazn6c(?i9g@ zv5rd2}nxcbv zXU`AJ#gzK_o2AxTMjLFp!d!Cqs4#!N84)SnJYjtUwgOy`f{%-F(_ zjA=1Rm@2>sxM&rqG+LAC!NVRtCYOcQ`5Dj9(F7MaUvYmGB&p7)z+qM9^L!2?TaF&> zxmwXCQ?~TEzX~`r%f{!Aph49VN9cP}$Q|R<&)ysX>(K%QA+Rnr)Bvp>%>S^_3HtL@ z=`RBzaflPa%zEolTOl3!^t=oO4EHO-=L}5;`!+zd`tT#3-zce(D)zn$(=q2z0Pooy z?PU!pp$qfYKh+^^IZ#Z)n=bhqr-Fr_+wdRRpnG4SFF`#wlsjR7#y|oi9{HdKfDs3- zyGql#SsxSZozMTyU1c7z(17>yNz4IAAq!5dQGftm%wPc*D9XzHGot3w!UY61Q`QIZ}lAi1OivA6rw{#_Jgap^`=MH@}Oo zXH#wHZ;>5?yBJHp`ivZi1wB%9z)v>QK0UjPF4hnfTi8Dk21VqVV&#nPqG`B2=R{h= z;|76*$(4b&%#`Yj%X317_6yzr!=n9xVElh(H#ZnSgtsCXQ1Xu~g|g?Kwfz5&C85{& zi6xO)pcC2z&yI8HASdspg7j95+xLk*xKcgkr{;!?h9PLCoKI!dlasxghR1qtk^osKG$4@}!3&EY~2<>C> z%}*oD7uPk1<+&X1E265pxtd!ok5gUKEd0v|=Ai1qp!SOA(!_5JR1A?l)z&Wl-@M2A zRP|jvuU%EDq&F4i@Jl5e>$H8OQ_-S1{*VV4y@o6mtZDP3AywrY2eT5< zoR{V~@8Sk2%;DIgDXG9L&>T=8r^~H6M5Q2$3fgS_;QWB7|d>hJ@|6mz=7jw zn6Pw}3?fuRYp5RPb@Sb#tvJ~y*o6!HiTX4}@TC%h0&0K8I7J4k%JZ`^*e=(uyezka zJ8*0qGx(k|)d_$g+skQ}<%%oL_(zJMn~=4Nu8*$pbc*SHTN7i_n9g*K42Pyd*@BAx;pse z6beYeOh*z?VZzWu!C@9477^~VWj&cI-`{Ja66s>t=t)0WAxS18^zPxc0tAe*;DR-F z1a%Eg?qB;)k9{d7I7U5~Ot)Dnv_LqD;(${>CK@cWVvd&7N;9{|aRYGiK>_Sh61ado zG=cQUskd}WkAVoX=aI;7{%2mE9FYJsSpwm9sB)+V))`^{{-}Ls8j+FPwdJ)U`SRSq ztCXQlVfRHq7$?JilnPi2tm2RwL=*1vb084gZJ)wSwNb!Nc-OX_t%11b&x&n!8$aDI zJXz*APD``XuAJ@EmlvUHnKW~6#vrr7zja?nFyEhR%g1LYGd{w48Hv@KSU%j+(NY~2 zbeUq`7a^r_t(EczRy(>0l_a{|{7t2LgNlIhpUk04X3!U_ez+ zKtO`TKdPFxmfdC>%1=|5K6>67_)3dy3+*WT9L1F_h7E_gQWlRKu!v%drpAJ#GyTbG z?tk8DBQeKiZOuy|t8kLg!Pp1*apLr|$i&{5*>A6B2)chX!e+U8y?=N_HSHK*V}DE* zSy{Pxz2BUGZv<=~{OnQy=L87B5HbQ}AO|695#4XOhH-s+7nkMUhBt=}tSkVYHmpGi zRW{$Vd$D=0W5qOLNyEs63YG~Abt(PGPoY9`ipLM9+-QhL8s9qlr2(1Ba>W_L8R>rW zL1BPHa&A-N;5x0cN7^uCG4gu(@NaWl9oHK5$6ftUx$V#;$%qK(s-ro1oStH|g%xoh zHr)sip&jOy{e>;Je}VhsuHNeD*4Sm%SCh!Pm;9>qyFZF*nDnd5@%{%7jtmqus4Hqe zW?G?1a2q!*r%Oo62d<&!@a7V*9WlB%7CTRwQv)qVm_DnBfy|Cy1_HUr7}ir@GT{vb z>ZOruoF1ZxG1CNy+6ki7VupCL_oEY&GDc!EC4)!N{k#X)Gfb|?rzK~(n&h)e*?#Ob z-tgv<*V{lZ;!qd~s|&DhbQaO8sIx9*M&Uwqe7H6A1m$CG69x{Jb^vkdI(uIPb9P7#z|63-~jwbO7D_i;l`UXq6YPm#}Uh_IKIiE#49)brr7KY;S%51@=_a&Jp4qBYJ1{w$y+mCp&{ggUWgOb~f_)pQ?d zFO=U(Vq!IarjJkahYGG>Tg9}xa*F5uJg0=JXa^uL&n`n!@zgn#1(RtGKFu|uGln2> zvp!*D@vCYnmJEn9QfuYpKYKNKiHBp0ZneE9X_r9$l0n0>=k9$f6F75LHL!d@63MAe zew{qHe@ux_lLCrU4#c+2xZ1tX^!hV%y7T)HBM|x|#))4Tf(OJCj9A?X`Uj+83^JrAHveAotw%pS!FgQ6eV^(I1-c^Y9R(8U$6zoWc4z13UXmx zZ7`xo!>+EeeHTgfn36Y)vA3YhRM?9Xy7Vd*_tiQCg*Y8Njkf z>CLFy57UXD*4XRjadHL0F5gi@aO0Dq*LIZ1h!HHpW9y5`nc{YdIyhKUSYC z7`7Zs;!LGNRMCZQ`gqSn2zJhaP89zVIokk~1veJDpErN#o#J7PGg~^(F25Ynih6nj zwk~PZye`hi-`s{+i~q$&?8SMM9T3j@=so)qZW5R8FJ=UQlDOOy(1S#7or3+UtK+zk zvv-!%+UsG!(6Mi|o@EkS8%@hdgBu@n@jmY_ygm&w{LZw0+2{0DZ_8XpXy907d{bOO zc<^yJ4ft&&WOS*KVt3kc{qHCFnzaAdsH^q<#)?zxlj&!o$P&zxPyA^>2jEKmr>3mL z76+rG1^gh}f@SiF&bo0gj#o*_PSq>Cu`$K{CQ<;itNsl8I?doOA;P+S5$a%58Jls8 z8B+jHYi4pR;l^0zaw)L|_*)OZGw@$F{7sV~$1SF2nZZ6GA5Ma^96+IsyF`$H2 zyPquGsqR7h9X50%&LDW-yd7j;ttGNGlNLJiK-$Ar|hOQaelY8 z#HwYo-cTOhSeDTjHBq6qg0>lQD4?g3n~`ppih}SF?Uj^S^jrE1R-|S0Js9RT$_8B; zW$Y%*$AC-pT{cA~HlxNlaG(<)K~b|#`Fe9ZP00N^Gd4UHM`n6R>!+h23LzpgXB8CJ zhGN^9npVIP-N@rxh2lv+ep?yQusl-&xCrcROi)~(AP!kw9_~sqveQ4wY&S)xj9>d} z()p#x!1ZM+Z4^qUz@Dt`p8Hb07BD||`;oY-dDFb^y|UE?!yJEyczwk}9Mr>^1@B%p`n)e%lZllf^;+AI~dSYo}aaLe%5{<}( zH%=e8GO{6}T*)rqiu~1>$X+(hq+S_I{Ipzx6V2a`R{Pb%ObM0$M@SvYr+Zc$*H?@g zERv`{O1g5+s97XE8J`N^8114hJ5Pp0 zAVX%~|N7GXbL|oi&4JjcO{b5uaGfpHlr^@iZfOg2FwlfxrgB!DE2OF1T5I(k;qc;} z*R&<&B4Vm^jmwm=WX;HKBd~R1*G;KegP51&_ku^M*oIJJ)&2*7P7&JUmfM8!i6zC_ zH&yF!YII%q-O7lm;_9mIN#kLZ0dPg3XY5r(tQRgIhrP=Yz9q_w8|q;-d!X1tdsd*Q zi%WHo3$YczQbcV6WVw6`wEuA}`=$BvNEV$Csd(;J!_d2-3$sS=gKZcd^MUTDcCMq+ zqE#}VSjDT$hVcwIK7T?!hBJqeVft%wuXxzBO)C4OKgj=ckn^$%E5f!GaV@YG_~0x} zt(or;8rrI7ZOlv2%KeV9R#9)%<1T+%CcDPHea3Bh!Bv=>2Mlu=$8E8?!dp)N&M8kt zT`@`~>TQ|367XTk2Y1f}hx+k@XZf7rH6W^AQE2Y5r1$|$7$(P@Ni^%9b;+f(+&SCW z%+kH0xi7MVtXmw#;L)`+$PEQVTEq?4ad5tWYT`bTMMp%w?L%5>+myJG*aE*+z#tFF z%i&-@rRjCY0`D-IH~Lm*tJ_jtHnPtlRzpZEhC9l7iFlCcWf zS^UW3Ms>jP(ApYxr)_vVadRY|UZ@Slg|OGc9r4XAsZ$2}&guHO!Q)a$OlrTA`v5*R0u`$BZuXeA#&0k7Dmk$Jyz68Fu3%IsS$GoP4rRA>uAwf5fHp5H#*-OIY z6qZB<%Q&3A@h8y=nC)JKdk$OM%R7DP`2t2JPYT}ZPhvITAWJik0VP}FHPeTW~;HdWhI zO=owlxBre@Z}PW;0Lay84D$AjH|c+xkyz83rXkvTw&*k^XL4erza3_JR|m9|xqYt2 zC05yzh8}#2ybpO|OENKL0G7&x2vEQ#G?45!6d@I%vWE5HNyId`NFh%yYjS3ms01H) zXl*0u!6bVW{wqvW?BKa?qI|K%)E@oT{H#yDQkq}7HUeA?km&T`c;0#jY(me}a^%8d z0-Mm5?gLlq3P{X|s~ZzY;VF#Dj3$L2tdx#FD4kJ*8w!8w<#2)iVYW6UF>|&FN~|@R z?|OYf69qG2X!(nur+)gN-YRrem=cWEk&lYW4tp}pc@Zr}FLybuG7VGHEx3qOKQ81~ zSDQG3nZJ?%P*M;Fv*Ok$^TlI^7tI*8nhN--XSpCK}_HCuetSibS z(S%(koOtbAcP1H!`bim=CiB9}1tOzjTW}XL43>SDCgP@IK`0WdH&8V4%YR2rnN!EAo@m<833(=+9B;Z0~3CJdyG)8&K> ze8K>Z*a)ZsHk%`@qd^Ay0sedY`^$VzjGMc#^v1eebu90KL$<6+7Rd`H?fEjeHCXW% zWa7EyW{$$k_NF&>B!QJXI)9#gD+?7ex*e5)6|!F0;hQDqfQ@jjdYOs!QY@dj86gII z9>1!dZCShcz{MZ{3=%M>(9{RG6TJ!@ysrD=8z zHtwiC_>!GHvt{OdP$3O;Y=1=sry=)~1>g$TgTbNH)$&_WS_Oeq(_#Le0nZf^ZU%(r z$2P;75IthZ6GSTMkA(jfK!sA}C?y$u+2FM$gFtB7kg?rl@h!n)L%9!vU$twVxGxgB zq}~sB9dbacX!F0sCSVR6|Gh_;ge1mM~y1&tLCq zO1_yaMlr;T*3*+0>MFcS&6cuU?W(_R4i@I(M@NmkL-igP(us>d5{dczNoMv#<`wdl zS>&0!c^pFU9ak*j71k~7Ef{158$>Fe31I@e{E#up50f9vMLWcJe|1kiK0beMojvBq zY!kUm@%ZkE$)_QiUSVg(nNIas#}+4Q&Nv)_K4^3a>6$ea%6MGG`UZX+bP7mmmtY~l!h ztD9dd@d=5yHu7^oKjB9U^KWn8dxRF;!bKU%SKNXn3x4D=kDYU=IdTPfZj~l~w<0uW za#GuXza8qm)@W8qEpo+6v?!QTbT`MFtX>fP4umANc%KdwoL6tq?9Y-b_jQL@3fPoL&XclG^ zBEeQM=|+pc?_JjtzXuBO5gt!IJPThxIU&dOlyp>F!il7>(8EQU^aWUY{G@#XjJ~cK zjh^(}ewSA6p=jopyud}G9=lb>S0vb+x7L=K5o>~IYnz#i96a2B%oi3Dh--IW*SC9NN=r*OXVaGn-dgFe$af2-M$6R6?xChhSty$Y zx9=+-1|5`(Jn9v0pQ@Vn;zjiitq%&0bAP|+VVt5PPe}q+{#9gEPgke!r(2T2ugm5W zq1N$8h6Db{tVGh1uiL_RGkqh<2NwI#sWw#T>V*oI$#Q^PDLRoG{J?|cpXw&^=0e4e ztv6sh0lc~iZ7nVUI8?nJ805?AG$f5tLcKf5aY3GTv70st=HR!R^QRT+3ZJBo!#bUM zG5xQm+BL=6wU?yJqH0uLRlt`^f-BhhI{Sj=f`lOffjyPp~*)`Yk% zGzAv01OmLMB)WCx8r$wesaAG66+0#>xBSdFW#d{-DWE(nvP)UjEE1-^52orJsxHX@hTc&UJ@NwjU7dd-9_tromHV+AS?@U(rlCG zV3^vLO*92+<6+WF@iDh=xA&RHUtcjnZhW$Gz5u=1Yob|unLS;GZp`P-972tr1~tUD z4NW;Ar{3ecq?xUIJj)W38MJk2G#^rlu`eG(4N}5Fk zLi!ls6%iZ?CKamJn8`Eq)1NaxiEJ#SLIEleAPHa~AV@?1%@5nJ{ijmuDHEs#O9VVv z@kmjCm&eJiQr2+m{P1dg$nqh$y=Fe&B#BP)a^>g+h%5%X(Y$k zZ|tK(T6n*{JUAxH!*NSdibWw;45ooTtbGAx){toI3fzr(As{V2fhIOxQqv?x9NFlg!C{J)Sv@`2u!BOhdr2Llsn@ z5>i}(dDN`7+=8FdF9C3Q20pQ#6oo*O#>>g|J&q#I>FdN6J!jb2)8^ zro_C!6<3$`);*@$eL&_RD=WXJE&sls&5qzQ9t)UM9uz*44mPSUZ7!${%_7DLq%usx zALGdF#%&=*zgq??*)D;qwE>n4BgtAxK7)8=6@^LFNO-jgwjsAPhe%kUp@bQOMub2yVk0>wExmyD?Pk{ zAQ&xFlVLxv(%N}WIkp@B2_tD?CU5-AD0NIdVFb|r@meL$j*2~M-J7TcVWB2;;CveS zzy(r$*mSTj-#E>*hAh8@=(XKB_Kw(Vn9lYYY>>|Qjf74OeH#;FUdYs9eIuwUJ|=Ko}JfrNQZ6iki?WF>br)Fo;^v1Zc^d73uY4>j~`mdWI^?#;&lC zOEomi0;XOkPIrBgcsjG9-#GffRr#!^<0T7-?&^8Nvx=VN=L5Q}!tmA^H0y9QjD>lE{S--vs**^?M(6 zdVc5!SVfJ=HSKdj55tyk8}ZNY4UM=zW{E4xS)3z>vkdeNKY6o8+=axTJ_H}-*8=*3 zX7_iE251Qb0o{;tn>ji#Q8^TU&LZRN(<_e507y}O4sp>R0na21Lq3YH&IFNCKOY@% z`h|Z9>o&@~PX+I<{PtyGh+~B{!VB2DdEtr}G8MdzfjUyWgf3)5ZM^8HuNXm~&QQR7 zdU(RrTeOEvkbS}9P~OrqJNIaq&heDb1y58d&4<0V z1i&VGJGxrjiUj)Tsvc84L$bhq{DSym+}$S)OHVIYvK5lHuwVQjT>qF{Ydkxot6W;H zJ$N6EeWc6L%~^DUUSax1b!|+XRrdnc8ANKq$g<=qi;jz8x2Cu~E(T5t%pf}~-Qvx~ z*Z%}vH=hjpcm4wh5dwj)fw%|0fq=wgps)Z!nKXb23nO5{!WT&RQvV-E5AY0F2Q+NN zQ>@%-)52?HnvBIb3mzJ5h)WgN6tNe^-LG|RDJIyC$Z{eR1{wabl^oi0a+@NQKYE^6 z__skKFIgBSf${NnbhTxYp1*wBca&b~PgG40Wt%;@QJ+It6ot&MUkjlDdGAZ#n0w)k zrMyqxfTEuI6Bjs+C-dmfMZZ8-H}A95!9^qv3@U5~Q-?MTC3)HmP8lwu=#5LMWK_6h z3N{E$-Dq#Un+FJac*_*_O&fLA2-YX|o*>)EwRc8sl)}_h-U+*Q)JJ`=mt($B zNd$RO^rJ@)w4fo`IQkWcDL|@8Sc(t_Ms?T)(!RjlU-V2n4W}j=cvHMre7OlDp_MfA z@p7V0aUC#05%(WtezF;weUSzu3vV=|man}se1>X<>A=ob-E zA(#H`kN(@7=z(S!g*+(Lr`GaP`p4U<3B zQ+vKD1GM#Ug#c|mLur)>e#Q~eIU+(Wn&w(5%H=*;>fG2=NE;d>;o8Ok3LV08_`J+A zJ37^kuGI3Mumda?uao-02`$I^{w<9h4p>v%nwoU0b1zGn>Q* zg%L35c2hH9fTdYMQ2v@o;j~Ij4N~WDLJTz>>2zeRt>Z&LCE2#@!Dwd4<(v-vxLpR# z#2m$JC=t3iEh<7fTtawFy>RsOWmh}%g5HW_L)(s{Yu9O7KUNDh|G=4 z2k_$q_sc-x-q!q0YUH4oYk2IgkIOCiwa2jz8yX3?ZrEhzR6_k>XrsqD(R}|)?L~)@ z>A^{y--;=V?X_IYr%48v5r(cxGH3CS*OsuA)Gb_5RDmL0RphU@orVFef^Hx`lV_gm zuvHOjIH-D<_cmdJo5kiP$@TSN^L%sxnVO~&vnKyjUq2Id70&M`(v;t}m%AK)*SAfbc)K>?pfJ-PETQ8m zFn;043Dc!4Etk+eMzt19NNY;6emlC?7LhKMK!7$Y#{%c~3^C7K?Hd-%R3a`OS+l_}VQx5r~J-F5OjQhcy`)C3b+cSH+O-FtY zC0Vw1wvScj2)j8YZfI*}dAMM6o6@KT9QY4k1PnH%1&FDGJ+vXzqWH&|)?Qv;QO3m5 z5hgUdB5R}@o@ajhFFmg{~Wk_R@fJkSa#WXZXBY{RuI00LMVgw^~0W-++x*uwi zcBgFm%NZ|aTIa4%eP9Fd$YOi@2KWT(PeNg#dyw+boa`PK0@wG}ZB+KN0BgSch_e$%Gq+)lhveGfx~mnhO&v zJyV+~7H1Z-o`%Ph1461DnRzkMJXscBWztX~wew$b4(>K@V92P0^sR=Ht~FbHml>ON zutl}_2;f10lD{KjQI4&Kdq@F@2BukMK!O?i=)(I%o`PK zi0S5PUf-($gP|Hu$Fos3Dv186*S{4gfs$SiprqIPNY9%LBl@1B>=I4sJb%mVaP+WW zZhE}VPpCt zkFbF8E+I*BVc#OAAOB;NoO;@-qI>+(OdNb}$TTTHW310^a*YkTU%`E)g>J$d0rG@MP9c72&W7Ea z_gKdca}q(`2YL8F1UNU!A%-lL+@G9-5m2?u&nz|>%c7mnjeEVZ)UaHEIuz=oHRZO^ z9*9Z+q#b0lf#l6*D>MOSrM+j;xHT8q2HD{7er>~$AZLz--cE!1s7yk}fhkt*P}G8T zs**EoGY1I@p0PURE-#)3N$fN4|vGf!2EXw+*=B8}zc-QR>bUr_UxNX%{ ziTEE;K8>f{jBP`8lscO#kh`?T(ovZ_B)kJtJ$%UaW?03b)%MG*x6fI4qwregl`qwV#v zDW!6}Lhl8A1rN7UH{|t0)yq_0=R0P{I)RA%Hi|z}GE!nGh*7pa1^2*eo zI)nFs-1w}*_)UNmRU@^^3MbHxn{$uMvvpG8Sh^Lh={j&xRt?){y@rf`u^37Dx{IpK ziPTOc-?1jFq$J3m0k#=rEpi+M?dJ4IA%G`UK$p79o|A&&=o=Z^*ZFPLr|o#_ zt5EiOqy1{%8qsSdyy~)Hb(s!usUbD@_foE0ctd^$By&&4chMSM13{wm@A#=}gn(Cu z>Aw2=8BwfWv0KE~t2ot1A6c-%URspfi64yAX%&E-uFGjzUM~{gAx>_QfQCOC1I`23 ztOtnYZA_x(!8R2@-`7~Db16%%4%?9Y_2e}=$nPQfRvB3Ru4a%N_4o;Z%B}E94v|#@ zD&>iQqRfr|Ta+m<1D0sIVy8tF_h&(JwL%ix8EMhGps;=-fK)ZEX%EnqPrViwYr_cD zAM5Pao*X=Mgp;lF&XV=+?IwxUgtCA6IXCf;GEI!|g%{CxZR9BE40mY>wzS6iy~wWYr}Ma9aY6;L_HA8ShPN zI~(;JkZD?^7(UoowWhKpSfIdixRQ0#gD``Jb1htRfn)cYq$M|%{x+aHEKI=3q`2P! z9HHG8y%|{G1?xGj_j-{bn%J#P?3{{qwm@I~O$Z(1u6Q#nyG7)8>?GwCCsQ?wh$kj) zAyv|JRx80oY1m8MRT9;>S1!r{B6r(q%>1TI3yItQHjcU=+S+@VV&&-`&@{A! zqibD!<3KP>Eb}Zypd%JI?Dq})P-3<9&Xl`ZajOl^UFb}dC8HZr(-02efH#Yzti(H;<@VWDFs}X;mu|g;E-qM~z!BKKJ#x3BsPQ81 z0un?2SlkIUn2pie*FaIF0owN+fYEq7N;p?t^U@nr@0^}p?jGFJ(bsqU;QTAN96kA@ zzZUCr1#%WyjtUejWbJ#NS-~|&eCjMjY#HC591e@YQ&Y3G(1qv5KqSWRo~*UbCSoZl z&w+54e{+%MBKsWW1Nqe^IUEyb)6+KY8ACCNYq?w3;0j#Sx)KiQurkFy00^7ea$Dm5 z$oWJF#NW(1l!y8EKceSmB8tlHot`JO)%)=SkZV_7Nvky#vwrp-GL&LqT7FIyWc6KA zbX8$D*9q0ow92>imo`)JG}r82GdO*3by|b>?B!g%d6J=7+r1q?a;xr5CEC-OH5m5= zbE5s_HaD5|nn(^{q8iB33*-lfDJbcIeATTrpIC+736a5^7iC2hr8#?@M1l5t z`@+@LkNWXnKCfn4uJm>EW1_osx`3lA4gyu$dTy)7MTdaIEB(%!kni8kR`~8dCd}A2 zMfQp^UzV=k@vZ3_>Vwx}SJHnZiFpjH6g;`tmz>(Iu5q)YvktDG>tX-x9|J?6QgegI zR`=k0m`q<4uoYWcqi`4bTU=_sJ@|KIY9OPTFy$opEIEJuuFGV9@3>Ds|IVy-Uo3f{ zGqZfm66X>?x!?t=Y!AiJu+Dyw1+*mBi*nEQ58m7aGzLx7Sx#hqib=C&OKDhx=6~*p z=UJ17sOQUF!xc?d&J_9W?hbG(GOVt$Ut~`WTWcgt$Emlnp>J7c$kOV5Nggs#i%gB# z(YH>LF{mh4v#r6ka)Uq_#1#7yl^f_f=PgLr|GWi+R=31^6j%?;zuo_ayl{Oly$cJy z61)7aXm^GbAnWPI>&c{dGTf#=+&_4Z{Gh<;7>-@KBqFV1m2|u}Vj*H8d^(s@D_Rd_ zbl6H(5UiXaQ>VH|NZFx&r&!&*k8k<$T;!7M z3)O|Zuz4TGhpHfLG}7y#dArD!;ks?EJ`fe;e|zEbm{<0K#}W|Iva5SEItD36S#Bk- zWhjUQ&ZTl<)EkU&rUfK=GaSOsYG7BlRCNJ7@rruxn!TVju+_M3xIcgGCfm>}R`b-{ zAko4bm>0E06OL6)?8nxAciXMTZyBIfvkf0xUc)`$NJ>WpiZxqQyYyA0)WtzN8seDb zGM~#w7kX?335vpq3c^0ebUqLTYV`szJ+sPlWZi9MroCR7!>M+*xx;thR~u(8iFYI7 zh#P>yf;vZ@Z#Wt!L80d>LO)$4&D_)t{g=mV&-&4$_N@Nx7e39m5G;K~;mWYt5(Jj!vItR1k;ys!ZN@sRRJ4n*CFBr8X(>t5kHV%&X&9vcJyPkfFF$AlvOGN| zy`)l^iGmW=OvGN^#3+gqBuHvlJ6M;!K=oVoh<(%(YTa0AfzT{9avv`M20d+Gpk4va zAfcWzXcBxR1UuQe%%$MF9;Lq`(cQP{0+XX>#_hB)F+MwGVuFoHnvIc5TC4%~ZWV z>AsLNMv7uNbR%yenHmB}6x!sTMM2f9WBnbWnRG2Cl9k=8wz{SJ>`j^eQ}leLIi4lz z&{g|`%ZKD((U#+iv+xZ%yZK1{art(;K$yu)+!tZUs4u{d?=FM~?!K2;%t~B=gb>irdLTVSic+&wlDp#o6vTlfNisSIiGh2#_3rI|vBL`~T0ISOOBf zapifGLt9r`HD+aKDJpp+qlO#~8{~;%Kq!EiK9C%fOnm?rwo(DTsH09XQ>G;?TJpeU z@P{jQfOxgpSL)`6%N-QMd|Yli5IE76MOuCN_H`lS4RHM~4EXeU`XsdCNIRC>78#^H zgf;5~d>#4+w+AYf61;wTbl6q!ATl0)Zd88d1UBB=JZY#GmLlebd@qe04?~tt8m^61 z#+<`LfO2iZ{U`CHP{lc^b$R6oS2wmFMHfX^?OH3C7tZy@_YC8w=6RvjF(4_$1GIW- zUwMA=lK>Wfc2vo~uny27X=qM9q&t*1W+ni(DF{8C(iD6#u?v0KK5Kk|n7--bOF4}J z=S;_3sl6o@#c-C~a;^fGyIc4$bP$;ORs@!O4M3YGn-An8w51F_ewn2Mj8E z7x32-5iD9~X);<1wAonu;(6e#PiIbG4r;eA_zFzneN2wcxn!fE3L`aSBnHUQ^(+AV zK8+Q_p=^{d`vz`J4OtR3s$)u@jg~WVYBoK>Yt3m@q)w6?vGLpR#tMaZsOTMgV(j9I z8xq>DI^S<-)e15ODDsAp>JL9i2`F@YYbf*;3$SWMm|+CeVTgnWDJZCyiJR}~RH~B? z{v-6gkpc;Qa6mxcfMLe?klq{{;EIN_zeC>2qM(BFnm8gs<$B7XecO5iaiU;7LX%fs z2AX!!MRzr_y$n0WkUxSg&P(+EMVrS7#h)BlK|Fd|g|NUn*VCx23TuS_H3Xl$iR}epC&z=$#=+OQj*@A8!L| z5)7(sJFV2P@lqn6G&RL>R}7DG?MFGn7ujqNaLpyl6y#_ zM5CA?FgURbOh$#PRIm#oP1C#lEwZN~0N-XzQ`=|EVEj6T~tLAz?n0bcdm0j$&se2IT>hsVd5 z2IM&vRS9IxMX@r;3kbRc?9~c)JG=fS^P-cuET76PEooSs96818;*Xf+@(OE|V)>-x zxRjmfC{ek&%s$&2qA z^DmU2o3FUGrAd$f>{h(}tK^tKI-fvTNMIk;CXvo=$FHdt`F4%c#37)&gfv@9>R=1NQWLq3djn2RgQH>I+Z1W+VHumTd?D3+c5z7;_%G0 z`)=dPC^3KK)zwv<(|#m$M56Kx_|hZERMzv5j?xyb>7}wAR0j31Dwt1D!oo!Eo_B_Je+q^U zf=V|mOT#sz)~tR7ieQZ}z9Xk;jw+xyY(=?)-Dbjwt{EIfF4vh^4#G8i&(x!^b{yY~ zcRWd9VF#^-6O>Rs$4*&(q~V8V;ypOkD7@MQ|8FO$0kkuD*uwf{nuVU1mF>Ev_8;{!QOmYL(c^s+viR0XSt{4)DfNizfH;odOI z?xkHciH}Vn_VRQE(IR(cTz9G2vv@o^{jHuZfH4^44(#Gz->BCCsBlZP!8NNSjBR8+ z2tseoC7ul>Bc+}~4|fEoMA(3k)~Y|AKTN+kH&to1R19;KFR7(FcS?T9dT&G3e+hcb zuAF*28sDPiY+iQ8pks%HzoUag)V$AlW$<>Yr4&UcTsCxn5@)Qi^yPX_3lhrv2y&5l z0uC4*GR~8~|Eb9JtPJ?TaMt;uMR=g|BR9eWDLD#=t)S3``J7W(#Tq-%(o7yzb=0)Y z9;?J}Hzcr*_E)}%-dUiyKE2h~%N#Aw7w^tcr^>+0?knHhMZPKXI{biMDf|hdLZhN~ z-Xh}X55`eUbt}a6bSlGvgT|1L5y|*>%Zz)^1VGOIrY#O^0 zq!EHhbSwrBL7ERTZNkn4=^mmN1ax<)VKw z)|Ej_U093K@>XBa<3lT6{~atr#y}uALB`@yQM$l`EOeSvY@jT_0mPlt*w{@la)p~ZmA3% zCIRI!FI=Q=lfp`D>{LvXUtDePQv=!!+hZ`gUcc{lK5%C}{Cm18>wC7}ZwWqLrpBVb z#mp?tm;!?Kc=rv__AHp)-`av2Adf8hi4g4U>|VdC{Tw;;ACvdD7fKn2yvUTv;&gp<@5ImTsYPk zmv|FEW<38yAqvaE|3o10WJv9Daq7IYv390)j%MdEaPajJz>`ZP#0!Zs+e*|3SO7@i?ioH zOUTx1*gE_5k;^zxPJ ztq+N*{s=Ajqo6)rE*BIqgl99%i$1Vsi5W1HBy=S*I$0LqL#yPffY*PhkcuyCO2no1 z^B52&^a`$GJ4cb{(Ir3bX^39=pCzPDd{(^aUULzS?t$c=B_!AkVKTNR7InVTfY5ZyEaAoKJ^-!b|zf7D9QQAnq%tCL7{;4xI)nk1qEWzZ%;b)qC63j_rKgaVTlg%(=s zQaGp4km(bV@h^@N!$6P}!&|CQ4Z+<~sE7>u@w#zdX*Ekr_ncB47^^{58(PkD*%Ifv zrDLo^8Aenq-;z>rkDv^OA)NGi^7#g_AePz4Ty6rEISy*WtWdrsgTP+Z$|r?0aCifb zq_IVnv0mT^j4rnRL2o%=xJ2u->alnN&ZqZxUBbtQkBMv4Z}`k5)q;nw+cP^1M<}}7 zUKP?t=DAI^TUM<_C2 z;?2Rr`rjfiO^CUR_gEqrfusT3LQQYqq%=-EnSBLvt@L4}c~~|8-v-A;cl;s@2k$ub zVAh4g5KKf{ekYu)iz@#DeE9HJ=%}hw4k%O zT-;}}wV~$`3ui(88iKL!K~b2`oDQ(KzpF6a-3!n+a95C8&~JU> zM352O>opBNF0-N>@fN7_Y`8rwa?Xj`r_L$kUT(~n|3%8;F! zSIpRnIJS^4xy;VK87sa#d0D}-ZY9RN&Nip4-=YaNej%>iT|#in8ibl7BY4ywf>MG= z(G4R9=ECoHO1muGfUN}v*=*qc=(J=_UmpYWsUm*oA4M!j;N)1_SFEN)htx~qlPR^u(e8BEh8s+}NdXW`nMh6|F?dom2iHSV&cJ8zM#VY!^`SJs zX{-IiK$<%NlC?LrKkwic*Dxv%g`Ds>-W&I%)eelch$hoh@{h>yz5)x6PMi0^wCdzJ z-*6^HZCw_*aP>7SA0|o?>=CRc>{~YnZz7;-rAs5i6kojH`e5N6e2qr;xz}oRKfzQQ zKyOsuxUGV}byA+3wRc)v{hw*IaLi&fjj=bA_O;0nh#btBXi}b|2iiWov`j>n%@y_f zh3i@ATT|D<`}Y+B{hD-3Xn$z!s~IiopSYPWdE-P|_e7FLXjT7sGZi<2WI$<*(U23X z*LQd&x-Y%&JSAmaXBFjGZQ%UWJuzydssEMS_F zO8s^@0J>IXKCMJ%?|BXo6+YLgj_S_wRULVgkd4xY>X%@KoB?E|T*i&sO((P~*mcA1 z^gpNOyS+ea65lrp7?zig329fBdL!opy(e~`YO9?C`AA>p%io}`q$*oyFWFEvCSv2< zGBUSdTz&G*n{3B8#Ri{jlmW(@aW;{l!ErVWr0BZCi}XI5=^iiB`}`yX z-hs}M8kH_|C@>??s!K3tFtFE$GI~^i8+(#)dQZr`{|e|t%Sxx~nixnV<68G^ z4wmSTY+~*7FrEW*f6*PP5qFjyY-(066qn)@Foof3yaCt}sCAlzR5k{_v08&uW9viO z?D)uBDh<~Burr~qk$~N&*(%=2n|=%RvV~MvspwP z7aIMdLeUm=0}om$l;hWn<0Tq*e!9+QeuBTndP`Z8Y|X?r5!)XIn&`n|L{a zLbZn5nk!S6TulQ$wd9?Cj-a}GKSsy|NgGFLCS4-Od5;0yPypu)(#_Nq!nALw8c z3lRlqq}Y;f8Ncd{0uq;@)5$OgH zx&?d*r4G#NL~NJPB6F%Q$oo3Is(-aVG`KDZLMHqtybzoZY#j_Z@ZTywif&)Uy zjDb_7QXnAk#_k!JYKroETqr(A>f=zBE>yZ`a2AaMT9(bGZrq^3ImeG#G3he+{?^cI zmM2|ZwV6$l(Hnc0xw5QTFJ_17wL>dyGvE4d^uHe|thW3~f166i77p2E|G2YADayZr z=>*{G>k2V(|EV>b{WX?oLMl5|O$G>&vZixND;hgs)g+>jnwq__eckQ$m~8zWX*xg@8tt z*At8iF|U}iZt`l{=U&KO206w2aTaO+5k1PkUVch@3C9NL@%w`!Ig0mW#_C|Qp%SQ? zq*Xg(G+fz~OYL#}RBH3Yd$7CVm6R}F+_8rgsAERamUS3VY(@}c&|>X;^_+4Mu$VOk_g)G6 z9q@-7M%h`H!uu&%vhq=ijJT8QeVkEVuEH=y@A#Je$Ac`6MLiRw%EbXvdgX=Mlnygk zY(3_)Ox=U__4}*Tr>?&0(vnkTg-ySFl*;?^b4ea@Td}K;Lj^Sdkim1P$gIT_Yd_C_n-BLErM%1 zo^#U$1E7KAp`V6;h`=WVIcj$k)vL_5^qwXH1-JP(Y*)lHudlsV)j~ChC;sFkJRXS- z%3|Vd3b`b4(W!^?(Y8p*dnno%jeie+a!Uz(z|&M?ojJskMPA6_U3cNxo%gc_KaT1d zLHevsDs^TX6xjn{cts?*k5fU>c5Drb9I7owA2Ts5N+*CA3L44^PtI^jw{m=u%_+0( zY8MezubNlKoPDmWYLVjGZ;BtCVmM}Sh`4F+!9R=2{k{})P$*ONW{;EXtmbD4ix|7g z!&%sOAudsT8I_Ng+>ZDq)2{SNx#tAw(!`Yu4YlAwNmG0Q;Y_e{8OfBVV8x%VIR#@* zAD1Y6w_OX*-zZM*+sHUzEgQ8q>}y?k?27|x?JQ(y9w$L)9)9@Mh+v0C1m%huyJA_~ zO{L~AbYy-{7|~_eaeIA;@}@Yxx_{okKVC+k$Ms^*?9HvU?0h72_ICR9eRwir=Wa!g zcp|WXg*jXk0I{Qn^?(!=D!N}EXJ;kOew6b6@%9#AQEh7j@C>mx9ZGj2-Hjj(N{4{N z05d~LHwX@33kZm^MFk5nFi0uEmQp|g5fv2#QIHY?6!l+g=IHU>bHDHY&;OtEi7;!e z{jRrT?U&h1m9PUQ$jv7wt-)6#>C*A2u(7PI=VQQJ^Z~s~vfGq{7;rm%aX5xt@J>>< z5yx%nJZ+N-hXu48GOrg4l07%rzuqwy!0`bmpQIAjy;JDLi00$%4riX*X3|fddBG`L zS0Hq3N93VTv3H*vzuw0~shKpd-1I*4k#oS!aFt7PmnIb0mAvgQ@wc?8#QMl7?>pJ8 zx*$|A{O}YF;Ymvw6w;d^6QaaFx|AD`QsE}W( z>155b+pZQEIG}blxpz9{bNVg`7uNT)c^}xOlKoOW`AHEksu8~ed#?cs_l3;({dY!7 zi_S6V*Ua$jEfv={%)SebCa?+%e3g23-2MG- z&JPJ3Z_YUnFIKDS=2;VnPfwMvpO3Z`(?2ZPZg%7@ODVnUM<;pqgPJ6}PRoV>KLa=O zx7+>fqeHrvGqBpn`dP9u^@$|+%AI$Es7Won-L+|p9r+ydyR@i^l=#{$R<@Bo#w=O&q znm986J^=d1lF@$gO3{FZEW1E#eK69^9Ke9vhJe~rjV-V<@?e@F$Qe8VdlG`QF#9v$ zvW>x|eY8t8p-48~uR$ja37}_zMGTKShr^u%?W<#yGItUKu2mU_+q49pf&fjcSGrfe zn_SCI%rXnE+GFKfF5|SS?#R7_me5JQQl4bmqwv+6tm0%1O5Tlq|J=>r$tT)=KqMro zfw7`mX0LHNM{jD6q(a%&#AO1%=a0qyE$Y!x@$>y^l<%WoS=9~79DfKC?9X7H*vn{2 z6XnYSigPlK@u)u8bNGU?mq}^c4}E-5YQOT-a6%e|0{*OpQ`b~*+Q-EYwddK+H#|Mo z?l3pF`uTk4a;4kI*yPizXL}RYCh4f}m0G-_sw99>qO5LZDsEBUN(fF4Daxq{wR|8# zSgU-SLFV;T#KYaad8x~Onjs!4hieI!Ohk53ir!vX|2=7?yP=(bVkTS1`{?KCKIi8Pr@Zs1> z*X*GtBYfh)qYhiYWhk8ARYaKXTz)%XEci)^vL?LnteJCk+ei^6yk^%PwgdP2lM-&r zQVJ+3NvNhO>p|AxyPoasnb`3)!rsG?sq*Wzdc!Fatai7BB`9*K-mDyBXrJykUVW3< zp;PMQg8|_Z>$T(Ys|qJSX3KiV#_KM~eM!5aAAPx(kkxUD1ee@bgsl z)%#x?yvs&-zTmy;pPIN5LxVW+ei4e@Zx2_nd(PM&=~@X3JQVIS$m!=yFUi8e<8_jb zb)!xN<=E7XBe~u zJUFl2=b;Nq_NO(T(kU!H_aA(lP;w-; zkDbZKqr;U~=v?K@et`l?K{R{Tq?{VD*wmvte@vHe@OWE^Y1;Mmul#+&o^or|$Sbj3 zc=}{7dAb#yQRyzd;t+8qWa@E5RpMm$%4NgK&HaOZyK365^uIXh8uT`G`v;BA_Z!=8 z9}s6Chf|&vW-nWQZuM-f1E0>KrJk02x{@dD>>A$5vK1$xQ<8^2b!DD?`Rx=s@^J!-3?~KF3pr=FoNL}6ru+1HpJ+E`WL?oBSggsJ zb7-gJD@kHOyA0)~2(c$f%vz&}>4$P@!Tvyja=s&G=n=E#><><>TtA-NUPow*QY?{w z?JX^NaA&Y`PWv8m&@GwTB{st)Hl&!;Y24j(&j{J4lym*~w(9|*I;U3;WzBdcFo-5F zNLQ9_l6#5yWs%aPf+<(l)$g7{Tt zVmrmgv$zg1`U-6rm({jiEiL~AOTES}{Kdie8Fo-v#jVO?6^mGoOk`w~{ zUhszvYmQ89YFIoxqWb(T-YE2{RL<*yZLhh$OMmeZY4_T0*HIvDtsd+z{^a%PqK$FVP3Pi^CSns&is&z%5&q$x|RY*!m zgbQbqGv}wz?D5rB`j5@@4@E3g5JRt%y)UkR&X&;kcuf7>OLhBp{m_U7wxoGB4r_zZ z9ItuRAi>$=3gzlnQu`><3>Ji{$2J8qYt-nR7y?7b*}ih5fjQ`1p^!m>9IN+;DVP$C)ybS>r&-_UxGTZc?v=vZd;`Umm}`mN;;BXxQ|2V(ppE zrl-C~o+Y1rAeZc-np06a_*95uf)_Q-+Sp-cJ?Zmo!l<$PGb-RGdzkEDJX7d@Tjqe~ zK4f1;j&%l__k}d@xWTq3x!|aiOVkuX;F_bj)AGR6Wj#`3CtgQ`_xt5mXn zR5*U3d<^~iwKFdiY2FmHgYGsr3zzoY!Bt8;68jkPb2ll;@G0%Tb%A%Mv*FAkR78W| z5P!GOcF#Jo&-!;X?DCGb46*!pMOk@M)pyM6fW628`wsC=yH!dgiG2lGeUx)Wb>>`S z9krcjjgNR)+KE`&?c|!E>@KSF+OO}m-;#J#rrs;h&?|3WkWP5D(8!(eTcxBf=c#tF zB2$U6LtmX^oU+APIJwpKaWX}j@T5NJI$QoG5qnV)`v?4#8l~R+ zqV0AZ80(WBtkC~^7&_R&QcD_prI}6?&|3Dyk6`!9Q>enA| zz|JedK{UbPmWy1VhSbQN-O`6-CB^n-tW7k}u+{j;bjJ8~wc11H$WHe->)z700@seW zg&dfj%_mz|j_{y$r>^f+rL#%kP9b#c%U;LS<@JU!t2c~G>xE73!^iS=TsxRuDM<&C zVse=V=#*YEi-e`Chd(r~@-mF6N}!GoY3Sc8Z^|uUVmrqcPNJK>Bg0~`bJYu{)eHuX zc?OJ2viCac)tkiE>6(vao)uXdORquOdW zrn48!DMyc+$X>W!^XQn`v#yq9_l!HNC6W?4EfZkm zY#LfY=8X60;s=!Z@~=8)>QUPEmooNh2z@U95b8H$)H~xk*tMqa2MlX2Rz%e&tLZc~tjgQi-_}x8wz24m24nNdr=Qd#m+HSiKcRAd zzfS%6hXQQ?yiLo;VPv+dbzt1F(7LkIk9;h9<1)65qWhty>!{JCuxSJ12Yn7FDJOa} zpSC)sX+QfK)w)$^?$W@6e(90)(MXf_jHc>KZTIWi(>^m!_`htK6t>xRZIY)VM_eQMWv}V|yEyHnX;yJzECXL=F8z*C|RJQnBW_QgU-D!D{BFRDF z319AIu79@Jck1KVr5Y!WJL*xPDyNkwloXD6J%g79Q5|b{X$pBHAIxx{#y8#7?U^Bq zsk}|n5fxhqSiLZL`{Zo>(1YD`O-GFaW>2cD?Ktt~gM&lj)q*3t@}C)}?-M%8%KK`t zYVyghoXnxo(~cu1?iNi$>BJ`4Te>d}wB;T?X%oH|IUh#!4(||on|bhpJa;qC)V(%} z*T8XQhQ_5n8}2OBc+8TO?H-Qk>v5sS$=+~5-s3#ki_pK|BIAemVXnz_jRx0|c!|Z}vg>T5( znFm?Z_@~>flVacPlhz9}ZdE-YaN2(2co?ObcQ57@x=z?mQ|Pet+_uk|mt8q872qS2 znh)LId2eDXy~#)7nQg>z6OYk(0Z>1P+L?Q<;l$67WQ2uol z_Tu94Cwdy+^-$bVzfV!gXB;m%MPC$7JhWM{vW6q6)YEUv>jxx7qux~6skB!&mcueA z-S1ac2ET|ruE8BEW?ZUVK{IBKPy7hps(q`?U$UN~oN-~B!M%9Ks2>4uW-SSc7itqf zZBE)!D`~sMIp(W*MzR+E_1SS|_gzXoR!LgXJ#tgsTZ{E7_n!|5Z^<;N-e?}0CLLY! zT+zM7E!Lxd^741_hlDj`>YGRyUgMZp=onsu#}l3~P$~q28F2S>akvaya3Ag$8UO0a z0)=vn?!kT1CB1s9dG3MXvhq)U`yI!E<9g~cCh*LC!RC8d?3R0G>W;PI?CgBKU$0tK zx;#nIGVw{r@#T!Xh~~d}Ynb1Y(sFfqGJmc!L#MYR-}J}C*E!YBagyP;mUx3w{}JCp zO8Sspxk)W>UH}&T(-pDs8d3_Q$xNRkG=_U8jr60Fq$4$ zqNdn%)-g&9i!&d4-M?JE|5)YgiR6W~YU{nhBe{#C+bIqeUs;yhJ9`Pod|xlhUVgY{ zx_EKqYyA2KHI*gbGN;*bbH1xxIX&AvmnUr!{mv;ECngh8Y$wi;{oP9^O;4X}HsyaW znKxngZM0X$Zw=$ZyYk#rx!xn;m33X?cLoWncCKe@OeXGJ)^g=_eXbfO=``2bp6+pb zf4Z$!s%~T%Wou&b=^R35hUDtg%wh-6#Ckj0O4csgd9Mwwxr(_myD5}{%)w3`m^Fk&QDJ5uQ=HE(Z2HJ^5FTvO*!X( zoE5*oE6JZ7O75g&E2p~X%nazYg()|?(5p{;DcR@F`u+Hmbsk5w{EPEab+U_UJsve3 zK208c?%YuGVJx>{?NQb3E9p=4Kb5$?8XH5)RNK-WGNwoJR~$=XGZrGc2J_Qm34$9w z`Z9Md*#$S_p9XbFPK3@(l|55d+~s(L;9I&7KeF(rLD0MM&5tKD;Esjka6(0(W$8_Oo7F7ghT^&y z)(bM%2CG*;y?&{5_I1IBz2L9ZWU#C$yfX0cxwpQ5E|rw^i97n_EqTsDYL5uV zPC1@UF4e_5ISIJiA!tHAdbE#_Nqza3av`1P8g#@+~v>; zx1z4xz3Nw2-f*jF$PG;fE-fty7$?!4dp-Isa%ua$O^wYdA05bH*Vz{D=A9T>2$R%Y zTa!K&v1!|l>ld%o9o0-xZal#dmhnBZ?{PVTl6 z#4I`ahT=qilY52vk3*V8xdMdK8lPv{du8rlU+2DLSdpFo?24RDcK(@bjve;+%QolQ z%2uD!r*z1?GBYq9MLB%8a-nB_ z&E;`v$6M-^9Bzd@T1IBNU-{ewEdAFa%HB)~#crVjv#W(B#C8apD=D^lnQvw))5yL% zws+iJ@Ql3U%IoYWB`5eO_lql}JghyBTd*eZxo_t8cZ|{W-P?86wq8LlV14;3NfqOx z!MUc4stvmW?nb0r^uPO1KDgOG{bW27(MX?7Vdcin4CA=t{W@X|zQ^f&biW9gg!+9L z=cvs;GD4NH8_<4iMRQSK&-19b1ZIm^hG4S5QIj=Uk+&dh7 zO`0xj8Ju@67PlxG?QAjRmt}OLRB7C6U!AGo{O)Mok(sg=@0KodER(}lo$Kj55P$fv zzT}TX6*-wJWvT~O_7v7ZyC(hBduUbF8Dc8Bi-b?O`N zzBU(Tlt?ku^5|@uUB%ve~a!D$v!qeEF$56hOb?aRs+dibYZvBC6*Cct4m)%*F6QuhdN7`xE zQeL9ebg%mvgMo_n;Ns;s2a;-6oerZ!xN3#vM_!CScu9)E787dIS1W(a=6~a*&M~v0 zfbQuIx3|VwmpvB3gc&wCitreG>P>m}2(x-9&{TEaIR2byBg&s%R}y*Of2-lsw&S>0 zhR;!NkZ>e*%6{dC#q^t~y> z4d=Og6L9lZgn=Ma?Z*<&F7JQc7Z8B0+*3-P$n|7BbbjAH?+4dc?iYH|f0p8y&Wt`) zweJgRQFvDyeCz^aM`Xj6qxERWw_v@fD^HZ8>Q8N)+ZDt+Ar&oLrPCO5$;3P2Pn%4R1BEp$gyLDiD+YkDi-@yk=yt{TRHVtXMGdFyExOCxpX42tre8;M5 zdydcL%|)ddGdBnshi{0kb9Jqueb>*8AAZK4>yzalM2uA=QUp5LE*=`rS{{{9@J+YZ4t(N4$}UiB zNoA{u)1M4CTljJ^F5O5D@92cI*1oS7|sdFS2E`=5%|p1L@2_S%`}JfB5RGmUO6caV!# zwfdw$dB>vk+{@!?WA$K}%bPoS`-jux&Fk~K#EjI(vYTcl#RgWg#); z&o-M=8e`Y7M=s9)@K^}g99y?{*AX7~2Re$EA5`C?6yMshQ)rFzuoCP2J)ycM&ZoUf z>iu-KASQa_MWOo2lBv_~se-kwo`c9`?+~t6^-4pe{+EpkoL|Jd4vlS^v&Tu8rE%hySE17%@?oC3!~W@a3zQ?_O-r zyM~iv+rbD<0=TVqLb8<0&xKBwwJ7JOeDYN=?MRi$F^k;1br7jMx@G!wq=is-SwsR( zb;$oh_}sHlwZ!Xn7XuouRBQ+R$~8leu7!pBZS;Gr(h^M(UU9fo?r~O{x9xUiQ`(Nr zY%-}2*A;GD2pgGo9PJvKd!6T!a7ppdf%=j+v-g!hIvE66Xw00k&f0WvB$;n{+ zD^6C{sdB08YSa43GviMa{KqMpg-Wfqr`y9eBg&f_1uGDN%;is(FEgFo!b;PBR8+mFxn?WQ}*r@QP` z{m<;FDcJsO<-_-HGap}Edj4YT=7$?I&+?eLH}ktBkGtGFtH*H=#VK3iikq#QQLgpe zOsBU?iJ8K;W(FkxLtPB(4oFF? z|C}9~Zy$fKj5ohR6Q6RL>FUGQ`6tqDz8lSlFP?M8c`IaJ(AL)2DE#tR-pgaH{6ESz z&qr7K))z$wx^{FLa`rV%&O|nY>Op$yJ1~?`cUSER-A<)0WOumqZc6wZJApIQ{@nh^ zvY9Itt!ei0xZO{gc0c_lSzYLYtGmKocjfCVLap|7%m(vwQNf$&BU8?O41kjIP`C71Lb7`VN@9TogsrO!~?`zzf9r+Zy$w437RK0h# zrTvU;|F)=|FG#&kN8VSaQ&tY}2gOP9SEk0t68*1RbYvt|9(%COOwneoWBKNfS7&Wh zc$Ys*jNo@xbMLGkVzVd*MxOjk)aG=tW)|9VD*Tl)>2sZffJ>2bM_tHms@2fs1FVaHi9W-x&a!Z)$P_Ol& zUJk<5EWX86o%Dl*YI*Z+hjQ___8@mTsTlJ?dhyMVqm9w%zDvnz`9 zo!HiQqTlo|@uoP3geoejdgfT;y`@|DfeDF$2{w^tNxjXF&T2WX)$}d!@SZG>Pt-Xw zb(yrg`Cuhay~O8p=2xZKC<7Ei-vOZ?>sL3&;+PGYm<J&GX;ysi`T$LX~ zmEUHf=2v|MZ}gl1HP`!8;;_1Xb>HlZ70^s<%oOz9 zF8FNW&<)0WFQvf$Q!96MXXuh*xZ(fDA^nLQnB|<3U)x#*-H}6grQDFge{p)@C2@ zsNP$7U&7+sx!Lx)Dajp&7j=(Kr?rhQPP8=NLT};%1o#658jc0#2H;|Ha=`!i97#4D zM=Uo-?5>y&4mRy=rg!yU;*%D*k`@Z0rEwf}t90IWO4`1p;Ctq|dgi|v+!A3nzAhqm zQ>5(M4^igB``)d)@#!WX>tRQ61QB~_%{gk_tFe&GIe%oRJ=&sn@6gd5nkO}D%4cL_ z?-|4g9lT_tXu;Xq!Fs{kv7sngL~O@s;y3=Cf#d0yhhKI8i`>hdN{UI@^mdbR zm1v2&BJoLw;J&fx6hEUj6YIH8Need)&29_roy+;e=2a-`BGRd!o8hT`S4!w^8IQ}G zbI)I&@cg_Z`dgvjmme|t*#g5hK_tr6SYC0!NE>3g$vlhSzbX<66zat4`*3wkY7XYsb~ z3yNDPI5XCm&~?VdAwtmVghPo^>iCm^)$SQg%7W@vJG#WeTlL=fZw%7)QF-`cPrz|eWw$Lujwtye`$~5wo$hmV#LTbM728HVdNqt<{yZ+Lu z$;urMuHM7N5HoYPGu*N^XYszcm$AwJtt?%dp{k0Hr(-YB5#>rI2n)LDHENNbvWO>`SaBQ(dQL6Q`k&8 z%;?u?;>|V9Ogj(hhvIfqWY+DLxxVN2Ju~|2JouYDH@GTNrj9?54twNM!i4C{tONgp zC+V{MnZ+fsm*hXtiu zM~643yHODBljqD>ur9M;9hcPT^$x*LPw98v73>nlDzszY4CS^MR(3khc8Im{ znpLHv`hzjz2zJVhpFZL)moD*JL@=EnTLG^{$KFvA8TmO3W8Qvg`MjU$7WM5K*A>`C zd32Ry1@Sipj*IMc<`6D!xeC|a*hUp}ldNyygf+J333P;hKf9#OmW~tE+|DtavWK1i z=v^*HB9S7m%N8SKp`TYGrwg8ofA7CqoEgu(or!yUaM*n_I(#-0cQ#XdPq6tqE=hB) z6C=}gYFhm(>MtA{OB)OC42qu*uxWH>>0ZTLR6OGy>-F_h^S*_+a;|yr-Sgi1{`+|7 zZnALSWNGgyG{3%9^5)tTVf$nr#+59zH?v63(H-THq8#Pn=q_lUjZ)@%nawqt9b+3# z8lTPNHs8)|{wOio_4_t{HPyG^yD03eAq=zOyINu2s&t5t7!rUyh;en|B+Ha9Qd~fMr+}m-OeLt?id+x5}t;r6rD4up>mebL($53Ua zY%d0>!fHwgtB;!D(8bt31I=rmHzjmSE<9M7JvtHDRb&7WAE=r4-w9B4$17+OlznR zywoXC@Nn{|x7kY;)7_2JPo9029?IEPa3|?h=g4sT7WaldBKgk3s`plO6>=|dZntjr znPeL(`LOnNN*S5aMZ~bUh{5G1xwYIhm}616bjA^ReyUdGgxCpf-^0t1O(*&TH_^KY z)iiOAM9gYYLaWy@9{J!*DiRB?v*Y|@Xc$@~*2JYaHp4zw5#4fRb0S^qWKM<&&xP|T zt_{1k^|VFmEigFg`V5pUWD%~_32)ApvJ}(f6m1QqI1OvMJhbBXOrx(!V-4r+wA6{7 z+k=nlPP3S}d;Vj`K7Y3t!^Plp-~`nSeRgoTQ=ZM>9_hKy6s!ySb~EA%yTT_WMaPC} zc5hSTE7sFzt12Hjyh$opAG=>`qk=!l^Ryq5;eXNS!Zpraoz3nwvfrZ?UL|jDc*@=W zShvhYFqy%B{EGCt=1=LS1It3gu4P@%^rFwpTy~f&Gdr90ipwU+{i?5t*$LcIZdwqZ z$Sdt7%6Ya|Z9;8*L|u!w$7j!fbc?>Swc3v*rmbX_Qb0F9_dbs|lb<;^QOgBaJLoXI zdBa7*Q@xMO4bSBJqx`Qsemt2FdL}And+C@G4>>57o{k`|eRFN!2MlIk>8bu`ZOq$KnZ8JPhf_W{> zYBj>!Bi_5n&<(%E9Gb80(|rP$UlUovZMc1R zsi3yndS0p}X(NX~^ke?SL~HRURh#`DF6j!qd-77_tpLSj!y~U(DTTP$=$-k5D^8r* zk7vi{F$t3|+n3&GjAZsiXwD&Zwtej4^9iS7mm;%W^8E+I(T_}qob$5H3h56WMz2R@ zqcUvEhe>^fEVeT2Jz+N;H<&-IidVf^V9jQ{e)MxBa@1A-tl*OJ?T{levL7{y3zhBK z3dY}0Pd`ea6iFRh?Ko8=d_?*=N7ZA|+9x_*-)0<#NWq`_n25cS8|6y+q`(9CoiWquBZ0h*x)D9Xu6rnCBE^?Q@fgVUR3@Fj?#~Rmez*q zj~%kizrRpL5uQlm6e1kszL?L9o?$+-*dl87$+A9X_1VfQ!P3PN!y?Q4h&i9xlIbhc zC8jVY3A781LB)^`Bo&cExES9v4lq_R?qu|5G-UY5aDgF>L680e{T=#3dOvzCdO^Ao zx>7nTd@DW^Z-QsR&Ep>7uHwoI!D9)0W{k|Dc+uz>a+GRJREXKnfxtROW^ufDRA3Sz z6kb^OYb0R$>q-c`VhXQNM*=3lt^~s?Ch!V%q`8)nSqX0w6&Oj5j|n7_<5fcwA|uvX zno}$!g5$tya&+8gLkY*9*Cp)3;uF>xGcudu9e!>^j(Yu2Dkha*K>S#EJ;F&*hU652qa#SR`uBx3ij2&X__e`6vozTi|BY>`&Y^QlDNw1BQllvGWSYiQ!{Zge{I{vd z8b)Smyfi5~B{c-ZXM9q~n%~AE^8a#`7#}bH^C}qg$T2bteyy*; z3uD`x5D7$>wxrR5@L+9C2p3)m>jm2oq2Jc&nvvCbL5!~%kwOH2TX$_nR!IpkG8^DS zsC?1XNDF$ZZwdSce7G6m#q(oT%|HeGzt({YngM@&7)uM_oA1}UDxMb$Xh9Sa-d{_i z*u@sWA7B$aK!ou8w$5-BSK;cX zI|7fQDuI&*!`q5T<2f*cR$x~S+R}U*!YjLhosoGhK7_i@GKdJbnkRL;StR18X}J%zo2+2e2mmW z8bnH_7E;Ea13m`YI*||$1Carwd+I=i9wq?Oz^JI`gun!lPhdr)ry~5bCRtFk9LyKS zbg+W@xLTQ6I#?0(BWdt-zu+mf3QD`K8cC9%W}06mgb~lk#LmnP4{e92kc?2P69(_H=e5wt2SmY#wYJtPQNGtlBJ}S?X9~S)`c9m`j*9F|TG?WEx~@ zVLHLIiz$-HgNXyZg=PX&fBXXvnZ7{itb(yM?T8o>OjC?~J0gWAW6|vhKSHK0<+dZT z@+3xP3%p+fuskTFFcDF!W_)yF9FgWiBpR?t2O@yYw}W^gV&B? z>S&#aA2t2Pr$!M8(NvrJ{Wcc!g|Q<`TM4Eff_#6USovTgoghQ`&?GYM1j%d@M(hL` zXA^A+28*@bcVpiw*8nr088h_}W3dO%UM z{SC~<20Pw^2qQMMwHrMEn>F^f2Vk@Q6HH3Xism9Q5n%~IfpO5itm1#0*jZwBy+G-f zv^~+ih>U~fZ^p|}LF8UdhraE|{00*3>i z?1uaAyG8!PZV8+{E)391z~QXH$0FeX;lDBw2-c#(cPd~b8kY#b3E=Cma0Hw>P7_n) zMTIFufG7q4spGV8ze`{Z`2Q=izoOcLBjJL81_)G5!~v3ITpYke!uW{Z#}9-bih~}aH9ie+F+~&_=GWi3a|s*BmfzqOEX~3Jg5el48X|% zy#ZCvS^$j(_|^yDTHuNf_^A(8)TwB702)o8b3L$w4Aug{F6jUNO2h%UY6AF<1K$w< z<`*eVFwv)OG60&^prX~Iat=)inFt0XHNaR4jPwC=2m|GZhSvEHq&$E;@xa6(;1vq; zlN1*D0@>>WMIlr1kO3BL@D0E80X}{3MFOHgL9_u~J@5r-LbuZdSD>Ro{qf-3{=iNX zkqqcSD)d+kFKU4mzC_ghpd`Tn52T?9)D{GALwo2@aYEmM>N5aqP-<=PO$JcVK5!pY zpb*FaVN}f4Kxwo@WDa894oAZFy+pK#K>$1mfa*{;YXc-u5F(iCf}cb{5R!w4VeCTj zAha$(r3Z*W3rPGT@l&8cU>iu}kGuv6>G(h`LES)~3Zx>}1uG;#0uqP1f+REngaH^q ztwAXbsPe;*69PQP<1B#TBdHMuy$z;0U>&L?-Xtn&eSjLqH$<&P<&j9`ngr$sUFfGmi*0(GwozMxA$mx3887!ZK90LDfn zARYl!lLoF>fN|8H=7ySw8(|zk?}TJvWI(fOQ8^`16{H7NwZL`gbL!v~W(1fVp}Cy_ zN?P*%AFYu?^Kpoeh>OI_-}C1Pi4UWD0-jUV;IVn>m2Mp(R)ipLPGNLXZ{ znrS%~3IX#J%`i{|81*okV1PmofFi+=g;^QGK~AArf&pb(&Vtnink2#*mjT za5pprtadbCgc%7|MW_TA7PPDk$B-^`BU-S)nAZZ>IDQo<81L~7Z(f0J3t&13Q|Cf8 zOlidyIz1E{3jXu31G4~(N9atDFiXyzC3+B+F_^|755PnSl4bp~%Nu%!AWf9cL-v|N5opLEA)0aFE7Ya|AWlon&?s;X=2EB# zcn$8;!L|yZ;+XUTqK{#-NCEckJ>rfH&VXsd9I_r85k{G4SJ`Kgy_nAel8g1ugCEQ9 zke!&Q2sox;^8h&VJ=jZ`LH1$SM1c~h2;}DwMPOYb<~)a}VJ?eEiYZLf&>Nsxo5;~xJWBt!}G46Gl} z2_Pdd9l(R70a%49g7p|?K442MMg|qe|2tCXK`@IzgF;~F#W0?s3@|al)J2PacoZN3 zvM_pKF@TPu{uiV~$SM4S1qhl2X1Je;2%d3hr)g*;n6lsz2A+jrY(hq0e8R%c1Il^~ zScln=cKlt7TMO1<{`*Y?Z<=0UtV25RkN}eg3VBfjLq%!m z=Gf2#>@q~`^aY87nT$$eD|X`xvegud4q1dIrsYJKa%l+|nh1Ij#1HEStvJ#SKrrEe zih|95L7XsgJcv%MZ-_RQrwL+`I*QalgW#wQ+pq!>$c`V#dXOSWSkDhc3o~6o*syQk zk=>Z-S0o!t{th6NbWpE@)2J>+PzTufS3q*D)JE+a;_>JgycO;64Fd$`2&inx8_ivy zdqDYNOhC?I{e#zNRSF)~)q#pv;kIJO@u-<8&F5fnz(fp_FFfBtzk?@BXhkS8%>!X_ zhW-Ny!P5dLC71*qYGn#1FbzW#w8{(5!0_A#oeZ9Se#R;+Zcww(1>s#KbPEkC5-gG) z-Hxdlq8l-9MpPA}Fo3D30UChS;=wcr0aIoK&Bi!U)Qh&ZixJKCfYA+I5ZVCR1Xf^p zD1zYxZ3Z&|WSlmG*%op|%MnmlP#1p*TdWF?YIwln32#AQnWAL|Sb3qw;1%eMFk8V0 zh3-hZJ%gHr`3|c4e@5*I%RS^ACJq>MFd0J5XmuH`Lq)@%@LWPO0}MDA(lE?mvWWy8 z8Y1XWg@IEA2_zkGYf9zY31%!<^dUHO26%ANqw)>YA1o@gn-f+V1wp&g;7X?BKdwBsVIF0`bn50J7^ky86jRFrOT zI}9l(63qBN@6lk1f}RLn36>ui)G*J|?tS3RF7!%xNZ_KPj0Y-!_y6E{MNG5OQ<^|FVH8f(5*`l&Xlvk% zxREvj2SsPhgBv~jH=dZe(SPK`yb9&SW7O`L6A!BC16}wZYKvj^Jg80}jA!UH|5!_m zMh2dc|Iv0Bl?-f!d0|j-oBzRn7>GtipfwnF1TYT9Uh<$;)PqA5wJnW>@u6Iv@ZbPL z{%`K5jeocgSH+9|-}K=Cp?|gy2POFj`*0BbKiY?b1pe_p93(>gzv#mOLOED1 zFRK2J_u-&O{|9|INXF@J?!#d*I^eFdffrT&Tbpl?Rlk3<`PQJ%hnCX)9qkHF*s1Ws zx`j}ETDwA85R87dE7oD4Q{jpk!K(DCHhCa2u?(ny^*BkU@(Ox=`E<&-#YtZkcFv^0 zufpIP8^CW@;jbzL(cfuM`-`w41Mi#R%`I&H&|2*9CKujv(7LSf)|b}Nq5aAQb_!s( z2i_{f-o-B()ZZZ1GT z{-$P`v)!GMr?;6n1YVkKG-bVh_M@kDd?EF zV|$Fih}t$I>VXkxo4I2sSo?>1X90SsmfJtkIRl6_{;|#(M84r~?3`hlMyQ_M-_|vw zqWecWW>9c&T>pDJW(CHm1wE$31l;Y0DHtl@_G9QeR7!`!&c(Ka^$Tk>D;-N2iy`wc zb22jrQw7sHbQn!W`jGXEHy9lm9y0{d&(P=5tI;{)LvZ`SAIR6HWVtFaX$9*WXlQ7u2L#@N&_Ct;$p|43JU~IwHBi^n($>({Cu)&&wDdL9 zbx1man!$QxvU;EaGX(ixA+r1xfcYp{_&?2O7nMMc_*W_aXCW!S@%^_-N#%k79vT29 z)6mrcpK7V66%?dRBxwbzYwKtSYisC`^z}4lnExw??;7l>6>5lg!}zRGDZD&pV2v8% zH(*I{CWn<+qb_(SY#PpFF%BEl74L!t+Mtq@1Q{lrLKY*?%;I4J46C!7l$5 zB8y&<38$4M_$O_uSbtFdgC<-GAXC?V3QzhI46tDk3_?99NMD-_R1fr_r$Gjq4l)3u zYw2qSIsI3NEEx%GhYgyIXU3Rpfh&k(O17v8-Wv;tGchdB7PY|pU=QF-6#HO{ngfT@ zvjZ~`Y?B>o2^{JeoC#w$?NBSc1IDx-%!Dwd^#F?-7QP;pBoe@hkUts-N(_v$qw&9i zoN8!Doe~1oH8l-1^mKJJgS1InM9pALQZSLI0|Fp0NRJp8sO|AzA%X<3y!Gfhz)KIL z&W|m?nK#C@0hOfN%!hewKD&wAiN{0 z3WE5XBdQD{ThR%X!`opl@P!>qaY98TSViekoTM~B`Kyq`{W&5qV|7lbB2dN)CscxB z10PqB!a3kLOE|STwy<}yi?W?y(_y{GYQZwXlED0dIgJ_5w4X^9twU{)Q6z(Lo-vz| zhv6Ki*xB?U(w;Nl%=zb> z|9t=V|Kphm!CCA_jtm)bWyKRdNSwu<>(U@nasDRAdIUdWTlZkaForUJXx}(U)={Jp z0z^n@>_kx@!idoz@Ms9KAUsN9?&VhymCYcf!dEDXyZWjK5R}VLRSTj zP@w=fg|6edPUuTStC0G{&EFES%|Q4ez5krO7oPFLIjr=Me&Zar<5B&QX+5d$oWz!! z&|{Ne?bJSKTVoa2HMCfzsw1U2*%;68Vn}K3LU->h`i+vPzP(i_G~%%i(ieWT=m6?l;f>ck<5 zK@pM5omdFaTtpO$l8`9ZXSvM~xfRItp#FH$eiHj8Igc4D?W-+hX%SLN&VjeH@iJ~& z?JH91yHUa-ClQV(RpfBx$jA?s6FAg!12WnaF*|^v%-XD8c2Liqw`1(u*Uw`u_v&}f z+lR3AKU*|wx&4VYYdjMtLyP<7%VjyYbo-OmZ~}s)AH*?rXvo7r@Px=f3NKD%6p<)V z64Q1wV#ittdtApw@aeE#F2dBu^s7Zg0sILVOl_IjqksAY*fp;^_u}BA+SzL#MeDk0 zeM!HzH#_!M(<wgW{r_nsR4+kTCai4t-t@rlX zJu??VaEI}qY!fe5W8+}$)yhJl+6(#1L?945ywLHuD{!Z-M}5dA#S`C&yrHHDLG;J_ zaBm0oor7i>wgt9Tyo`bCe$ls9+LpxbZZiZ1FIA9n_iSIa$ zK*;um2&F^fFmgsWK~z>D7kv278bdZ5$&m@Af`rTibqE#X<@kWmgu97D9Ojxx+5|D} z+14&YZZN-6mgWVrzUolsXYH=cPf#fWwVQZmcR_`)&IzrZE%EAcxOITs1_bFiF=LJZY55T%1&xCQeVhz6MWp=>GJt%R z>KrJ|)#Tm4@-YOCzHIR-=03Z7l?f&FTrFGwI+0dWHFH8Eovyza#C*gO!ekIY9+Hsr zn4l#XOiw}@xiq&iqOSpxKJo~x?a3&?43HT(uskICK;-(Hkg58`LHmJX1Ff%t!3bAL z>3ayV0hrzA(shy`VF8mo@?4d`h$e_Md{~bS+FyfI{M#Tl=@)f=e-@ig?ni64UfQ3< zrnmOnJ%@~T=&{~6+9B+EuS<3Qr}LFgzvEXOmpXRjj&J|d_OG=6vwflMA8j-CPi$}7 zx3+y|>-V;fAk&tue{cP2>pd-Rw(QyR!IpXJePr7&R`3-F+qz~bz=XCcTd(fLEOE>d zt@D=i(#(#+M&842a;HHtKFCD;%F&qvx2$HI$b5Jr)&D1iC%zSqx*gX6>TYO_B{( zD69EFsg74yAP~{y5l8^cph}U@Q-6l-WpM!wyg*1OG{_X#P#(LXUSG|5{FC2Oy*@8 zh{c}pxIm8Qnw*PxB$i&}f&dbaCdhs!nj%Uiy?w+!2zBC&m;g4VFOOvD!P_Hn;|u!t zBla<}9-rC&as+46_euuN!sEKBFR$6)q(uH{&k&p(G|CGBEu)?~J7nXIeM-|cFK zb*ErgaK@2a3s4m3+)Er^a^<2gKwKrl%dJCHZib{Cw9T4GTX7@VAR8f`owTi?ryC9Ft0zC*y}kW=gjDqM>{7k2Vf-SEW5qbaO=6^IC63`+ z2`31I330Hh3CXX8Y=B6ubGCJI?fBIqYJJ4+%!paJ)R6tH%mK0p5NQ$#t}4Vwy#X9g zJk-@Z778QGD9x`zHbJDhi8gC2+iLX-_x0bj8Z&Zv-C8_J7qLL~896k+(AN*X2we{q zB$M&_QQ}CrN5GvBF&QeIC2FiGf}hpHXRS0%n;0Nt=w$u49cHyDDRUEAL~S3gT+r`7as?`j^?==^JkDAK_s5H1p6R0BQK z0po-b=1Cf1M{rL_rg8{-w?-7l^nK&@9er_DBH>`hTTBG{Iag>=3>-)~4 zHKGU3+K(eUe(Ed;QV#2HpUrAle>MkC>5hr4KIKf9gD3UniR|DHCUEeC{!Mo9m2)5l zdVHl)v9x@#!HvpA(?-22V4PEy$Pj52#Wsq-LXl9C!<{@Y$TvmEW2o#H#ZWF*18LoR zQ4Xopx=ekO#6BU8$-9&A)SFkIO0i|Z;CJ~>7glm247G5Z^`b_H>T{JmG*SIZE?dECs6swNU3IXeZIRNG#^0O-HoI8 zCy-|Mm+>Jl^DVGKVdW&4h#0PMp0XgH63RgYay^JfJaLFNLR8j3FoW%F)?zi@ z7;~!nt*WYOW;J$YLJKh_`%;crZ&o7`nQtfKA71dALDg4sP)Ivc0P%ZPAaG5%_C;zbM-~ThcB1FJ=39 zt*>$^wQS2bo^rkJ8hslCvz3DgW{G63WRCO*s@13{`aFsq783;ljLI2eSrf!e#kTG< zHK8k1t2xwHj_TLvKt|W~J9Chy$Mwg!gO=%Qn#`kSby8oS$H8ayYx5Z!{&pS*>6i6O zCo;-=_k`VZciMY3OKHtRt&xRgq)Fzni9n8T$$Ri#DfnH+@dfC zO68j(Dp&MJC+tbo%8s0bgIw10C+!Ke-ZiZy{n1H8y}S-ip|z;TPNB#+te-mt=b2y7 zKRbn5-C_NSXooKup^(iMCTa?=>l zu(E5 -DBC framework: dbc_database.h File Reference +DBC Framework: dbc_database.h File Reference + + + + + + + @@ -18,8 +25,9 @@ -

    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    @@ -69,9 +108,13 @@ Classes

    Definition in file dbc_database.h.

    + - + diff --git a/docs/html/dbc__database_8h.js b/docs/html/dbc__database_8h.js new file mode 100644 index 0000000..1514ec6 --- /dev/null +++ b/docs/html/dbc__database_8h.js @@ -0,0 +1,4 @@ +var dbc__database_8h = +[ + [ "DbcDatabase", "structDbcDatabase.html", "structDbcDatabase" ] +]; \ No newline at end of file diff --git a/docs/html/dbc__database_8h_source.html b/docs/html/dbc__database_8h_source.html index 614d235..d076836 100644 --- a/docs/html/dbc__database_8h_source.html +++ b/docs/html/dbc__database_8h_source.html @@ -5,10 +5,17 @@ -DBC framework: dbc_database.h Source File +DBC Framework: dbc_database.h Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,49 +35,67 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_database.h
    -Go to the documentation of this file.
    1/**
    -
    2 * @file dbc_database.h
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#ifndef DBC_DATABASE_H
    13#define DBC_DATABASE_H
    14
    15#include <vector>
    16
    17#include "frame_info.h"
    -
    18
    -
    19/**
    -
    20 * @brief Parsed DBC content stored in a simple internal form.
    -
    21 */
    +
    18
    -
    23 std::vector<FrameInfo> frames; /**< All frames found in the DBC file. */
    +
    23 std::vector<FrameInfo> frames;
    24};
    25
    26#endif /* DBC_DATABASE_H */
    @@ -77,9 +103,13 @@
    Parsed DBC content stored in a simple internal form.
    Definition: dbc_database.h:22
    std::vector< FrameInfo > frames
    Definition: dbc_database.h:23
    +
    - + diff --git a/docs/html/dbc__decode__builder_8cpp.html b/docs/html/dbc__decode__builder_8cpp.html index 790675e..f04e5d1 100644 --- a/docs/html/dbc__decode__builder_8cpp.html +++ b/docs/html/dbc__decode__builder_8cpp.html @@ -5,10 +5,17 @@ -DBC framework: dbc_decode_builder.cpp File Reference +DBC Framework: dbc_decode_builder.cpp File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_decode_builder.cpp File Reference
    @@ -59,9 +98,13 @@

    Definition in file dbc_decode_builder.cpp.

    + - + diff --git a/docs/html/dbc__decode__builder_8cpp_source.html b/docs/html/dbc__decode__builder_8cpp_source.html index a7abccf..69dab41 100644 --- a/docs/html/dbc__decode__builder_8cpp_source.html +++ b/docs/html/dbc__decode__builder_8cpp_source.html @@ -5,10 +5,17 @@ -DBC framework: dbc_decode_builder.cpp Source File +DBC Framework: dbc_decode_builder.cpp Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_decode_builder.cpp
    -Go to the documentation of this file.
    1/**
    -
    2 * @file dbc_decode_builder.cpp
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#include "dbc_decode_builder.h"
    13
    @@ -76,15 +105,15 @@
    27 targetFrame.transmitter = sourceFrame.transmitter;
    28 targetFrame.comment = sourceFrame.comment;
    29
    -
    30 for (std::size_t signalIndex = 0U; signalIndex < sourceFrame.signals.size(); ++signalIndex) {
    -
    31 const SignalInfo &sourceSignal = sourceFrame.signals[signalIndex];
    +
    30 for (std::size_t signalIndex = 0U; signalIndex < sourceFrame.signals.size(); ++signalIndex) {
    +
    31 const SignalInfo &sourceSignal = sourceFrame.signals[signalIndex];
    32 DecodeSignal targetSignal;
    33
    34 targetSignal.name = sourceSignal.name;
    35 targetSignal.startBit = sourceSignal.startBit;
    36 targetSignal.length = sourceSignal.length;
    -
    37 targetSignal.byteOrder = sourceSignal.isLittleEndian ? ByteOrder::Intel : ByteOrder::Motorola;
    -
    38 targetSignal.valueType = sourceSignal.isSigned ? ValueType::Signed : ValueType::Unsigned;
    +
    37 targetSignal.byteOrder = sourceSignal.isLittleEndian ? ByteOrder::Intel : ByteOrder::Motorola;
    +
    38 targetSignal.valueType = sourceSignal.isSigned ? ValueType::Signed : ValueType::Unsigned;
    39 targetSignal.factor = sourceSignal.factor;
    40 targetSignal.offset = sourceSignal.offset;
    41 targetSignal.minimum = sourceSignal.minimum;
    @@ -93,32 +122,25 @@
    44 targetSignal.receivers = sourceSignal.receivers;
    45 targetSignal.comment = sourceSignal.comment;
    46
    -
    47 targetFrame.signals.push_back (targetSignal);
    +
    47 targetFrame.signals.push_back (targetSignal);
    48 }
    49
    -
    50 result.frames.push_back (targetFrame);
    -
    51 result.frameIndexByKey[FrameKey (targetFrame.canId, targetFrame.isExtended)] =
    -
    52 result.frames.size() - 1U;
    +
    50 result.frames.push_back (targetFrame);
    +
    51 result.frameIndexByKey[FrameKey (targetFrame.canId, targetFrame.isExtended)] =
    +
    52 result.frames.size() - 1U;
    53 }
    54
    55 return result;
    56}
    DecodeDatabase Build(const DbcDatabase &source) const
    Build runtime decode database.
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    - - - -
    Parsed DBC content stored in a simple internal form.
    Definition: dbc_database.h:22
    std::vector< FrameInfo > frames
    Definition: dbc_database.h:23
    Runtime decode database with fast lookup by CAN ID.
    -
    std::vector< DecodeFrame > frames
    -
    std::unordered_map< FrameKey, std::size_t, FrameKeyHasher > frameIndexByKey
    Runtime-ready frame definition.
    std::uint32_t pgn
    std::string comment
    -
    std::vector< DecodeSignal > signals
    std::uint8_t dlc
    std::uint32_t canId
    @@ -141,7 +163,6 @@
    bool isExtended
    Definition: frame_info.h:27
    bool hasPgn
    Definition: frame_info.h:29
    std::string transmitter
    Definition: frame_info.h:31
    -
    std::vector< SignalInfo > signals
    Definition: frame_info.h:33
    std::uint8_t dlc
    Definition: frame_info.h:30
    std::string name
    Definition: frame_info.h:25
    std::string comment
    Definition: frame_info.h:32
    @@ -162,9 +183,13 @@
    double factor
    Definition: signal_info.h:28
    bool isLittleEndian
    Definition: signal_info.h:26
    +
    - + diff --git a/docs/html/dbc__decode__builder_8h.html b/docs/html/dbc__decode__builder_8h.html index e22e560..5830c0e 100644 --- a/docs/html/dbc__decode__builder_8h.html +++ b/docs/html/dbc__decode__builder_8h.html @@ -5,10 +5,17 @@ -DBC framework: dbc_decode_builder.h File Reference +DBC Framework: dbc_decode_builder.h File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    @@ -69,9 +108,13 @@ Classes

    Definition in file dbc_decode_builder.h.

    + - + diff --git a/docs/html/dbc__decode__builder_8h.js b/docs/html/dbc__decode__builder_8h.js new file mode 100644 index 0000000..a7a4bc7 --- /dev/null +++ b/docs/html/dbc__decode__builder_8h.js @@ -0,0 +1,4 @@ +var dbc__decode__builder_8h = +[ + [ "DbcDecodeBuilder", "classDbcDecodeBuilder.html", "classDbcDecodeBuilder" ] +]; \ No newline at end of file diff --git a/docs/html/dbc__decode__builder_8h_source.html b/docs/html/dbc__decode__builder_8h_source.html index d502e09..f8d622d 100644 --- a/docs/html/dbc__decode__builder_8h_source.html +++ b/docs/html/dbc__decode__builder_8h_source.html @@ -5,10 +5,17 @@ -DBC framework: dbc_decode_builder.h Source File +DBC Framework: dbc_decode_builder.h Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,53 +35,66 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_decode_builder.h
    -Go to the documentation of this file.
    1/**
    -
    2 * @file dbc_decode_builder.h
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#ifndef DBC_DECODE_BUILDER_H
    13#define DBC_DECODE_BUILDER_H
    14
    15#include "dbc_database.h"
    16#include "decode_database.h"
    -
    17
    -
    18/**
    -
    19 * @brief Converts parsed DBC data into runtime decode database.
    -
    20 */
    +
    17
    -
    22 public:
    -
    23 /**
    -
    24 * @brief Build runtime decode database.
    -
    25 * @param source Parsed DBC database.
    -
    26 * @return Runtime-ready decode database.
    -
    27 */
    +
    22 public:
    28 DecodeDatabase Build (const DbcDatabase &source) const;
    29};
    30
    @@ -85,9 +106,13 @@
    Parsed DBC content stored in a simple internal form.
    Definition: dbc_database.h:22
    Runtime decode database with fast lookup by CAN ID.
    +
    - + diff --git a/docs/html/dbc__decoder_8cpp.html b/docs/html/dbc__decoder_8cpp.html index 3606b3a..4c76fc0 100644 --- a/docs/html/dbc__decoder_8cpp.html +++ b/docs/html/dbc__decoder_8cpp.html @@ -5,10 +5,17 @@ -DBC framework: dbc_decoder.cpp File Reference +DBC Framework: dbc_decoder.cpp File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_decoder.cpp File Reference
    @@ -59,9 +98,13 @@

    Definition in file dbc_decoder.cpp.

    + - + diff --git a/docs/html/dbc__decoder_8cpp_source.html b/docs/html/dbc__decoder_8cpp_source.html index e212796..5e4921e 100644 --- a/docs/html/dbc__decoder_8cpp_source.html +++ b/docs/html/dbc__decoder_8cpp_source.html @@ -5,10 +5,17 @@ -DBC framework: dbc_decoder.cpp Source File +DBC Framework: dbc_decoder.cpp Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_decoder.cpp
    -Go to the documentation of this file.
    1/**
    -
    2 * @file dbc_decoder.cpp
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#include "dbc_decoder.h"
    13
    @@ -65,16 +94,16 @@
    16 bool isExtended) const {
    17 const FrameKey key (canId, isExtended);
    18 const std::unordered_map<FrameKey, std::size_t, FrameKeyHasher>::const_iterator it =
    -
    19 database.frameIndexByKey.find (key);
    +
    19 database.frameIndexByKey.find (key);
    20
    -
    21 if (it == database.frameIndexByKey.end())
    +
    21 if (it == database.frameIndexByKey.end())
    22 return nullptr;
    23
    24 const std::size_t index = it->second;
    -
    25 if (index >= database.frames.size())
    +
    25 if (index >= database.frames.size())
    26 return nullptr;
    27
    -
    28 return &database.frames[index];
    +
    28 return &database.frames[index];
    29}
    30
    @@ -88,21 +117,21 @@
    39 result.definition = definition;
    40 result.valid = true;
    41
    -
    42 for (std::size_t signalIndex = 0U; signalIndex < definition->signals.size(); ++signalIndex) {
    -
    43 const DecodeSignal &signal = definition->signals[signalIndex];
    +
    42 for (std::size_t signalIndex = 0U; signalIndex < definition->signals.size(); ++signalIndex) {
    +
    43 const DecodeSignal &signal = definition->signals[signalIndex];
    44 DecodedSignalValue decoded;
    45 std::uint64_t unsignedValue = 0U;
    46
    47 decoded.definition = &signal;
    48
    -
    49 if (!ExtractUnsigned (frame.data, signal, unsignedValue)) {
    +
    49 if (!ExtractUnsigned (frame.data, signal, unsignedValue)) {
    50 decoded.valid = false;
    -
    51 result.signals.push_back (decoded);
    +
    51 result.signals.push_back (decoded);
    52 continue;
    53 }
    54
    -
    55 if (signal.valueType == ValueType::Signed)
    -
    56 decoded.rawValue = SignExtend (unsignedValue, signal.length);
    +
    55 if (signal.valueType == ValueType::Signed)
    +
    56 decoded.rawValue = SignExtend (unsignedValue, signal.length);
    57 else
    58 decoded.rawValue = static_cast<std::int64_t> (unsignedValue);
    59
    @@ -110,25 +139,25 @@
    61 (static_cast<double> (decoded.rawValue) * signal.factor) + signal.offset;
    62 decoded.valid = true;
    63
    -
    64 result.signals.push_back (decoded);
    +
    64 result.signals.push_back (decoded);
    65 }
    66
    67 return result;
    68}
    69
    -
    70bool DbcDecoder::ExtractUnsigned (const std::vector<std::uint8_t> &data,
    +
    70bool DbcDecoder::ExtractUnsigned (const std::vector<std::uint8_t> &data,
    71 const DecodeSignal &signal,
    72 std::uint64_t &value) {
    73 if ((signal.length == 0U) || (signal.length > 64U))
    74 return false;
    75
    -
    76 if (signal.byteOrder == ByteOrder::Intel)
    -
    77 return ExtractIntel (data, signal.startBit, signal.length, value);
    +
    76 if (signal.byteOrder == ByteOrder::Intel)
    +
    77 return ExtractIntel (data, signal.startBit, signal.length, value);
    78
    -
    79 return ExtractMotorola (data, signal.startBit, signal.length, value);
    +
    79 return ExtractMotorola (data, signal.startBit, signal.length, value);
    80}
    81
    -
    82bool DbcDecoder::ExtractIntel (const std::vector<std::uint8_t> &data,
    +
    82bool DbcDecoder::ExtractIntel (const std::vector<std::uint8_t> &data,
    83 std::uint32_t startBit,
    84 std::uint32_t length,
    85 std::uint64_t &value) {
    @@ -151,7 +180,7 @@
    102 return true;
    103}
    104
    -
    105bool DbcDecoder::ExtractMotorola (const std::vector<std::uint8_t> &data,
    +
    105bool DbcDecoder::ExtractMotorola (const std::vector<std::uint8_t> &data,
    106 std::uint32_t startBit,
    107 std::uint32_t length,
    108 std::uint64_t &value) {
    @@ -190,7 +219,7 @@
    141 return true;
    142}
    143
    -
    144std::int64_t DbcDecoder::SignExtend (std::uint64_t value, std::uint32_t bitLength) {
    +
    144std::int64_t DbcDecoder::SignExtend (std::uint64_t value, std::uint32_t bitLength) {
    145 if ((bitLength == 0U) || (bitLength >= 64U))
    146 return static_cast<std::int64_t> (value);
    147
    @@ -204,20 +233,11 @@
    155
    156 return static_cast<std::int64_t> (value | (~valueMask));
    157}
    -
    static bool ExtractUnsigned(const std::vector< std::uint8_t > &data, const DecodeSignal &signal, std::uint64_t &value)
    Definition: dbc_decoder.cpp:70
    DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
    Decode one raw CAN frame.
    Definition: dbc_decoder.cpp:31
    -
    static std::int64_t SignExtend(std::uint64_t value, std::uint32_t bitLength)
    const DecodeFrame * FindFrame(const DecodeDatabase &database, std::uint32_t canId, bool isExtended) const
    Find frame definition by CAN ID.
    Definition: dbc_decoder.cpp:14
    -
    static bool ExtractIntel(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)
    Definition: dbc_decoder.cpp:82
    -
    static bool ExtractMotorola(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    - -
    Runtime decode database with fast lookup by CAN ID.
    -
    std::vector< DecodeFrame > frames
    -
    std::unordered_map< FrameKey, std::size_t, FrameKeyHasher > frameIndexByKey
    Runtime-ready frame definition.
    -
    std::vector< DecodeSignal > signals
    Runtime-ready signal definition.
    @@ -228,7 +248,6 @@
    Fully decoded frame.
    Definition: dbc_decoder.h:55
    const DecodeFrame * definition
    Definition: dbc_decoder.h:56
    -
    std::vector< DecodedSignalValue > signals
    Definition: dbc_decoder.h:57
    One decoded signal value.
    Definition: dbc_decoder.h:38
    std::int64_t rawValue
    Definition: dbc_decoder.h:40
    @@ -240,9 +259,13 @@
    std::uint32_t canId
    Definition: dbc_decoder.h:24
    bool isExtended
    Definition: dbc_decoder.h:25
    +
    - + diff --git a/docs/html/dbc__decoder_8h.html b/docs/html/dbc__decoder_8h.html index 6cc42ab..c2e4e03 100644 --- a/docs/html/dbc__decoder_8h.html +++ b/docs/html/dbc__decoder_8h.html @@ -5,10 +5,17 @@ -DBC framework: dbc_decoder.h File Reference +DBC Framework: dbc_decoder.h File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    @@ -79,9 +118,13 @@ Classes

    Definition in file dbc_decoder.h.

    + - + diff --git a/docs/html/dbc__decoder_8h.js b/docs/html/dbc__decoder_8h.js new file mode 100644 index 0000000..b9711cc --- /dev/null +++ b/docs/html/dbc__decoder_8h.js @@ -0,0 +1,7 @@ +var dbc__decoder_8h = +[ + [ "RawCanFrame", "structRawCanFrame.html", "structRawCanFrame" ], + [ "DecodedSignalValue", "structDecodedSignalValue.html", "structDecodedSignalValue" ], + [ "DecodedFrameValue", "structDecodedFrameValue.html", "structDecodedFrameValue" ], + [ "DbcDecoder", "classDbcDecoder.html", "classDbcDecoder" ] +]; \ No newline at end of file diff --git a/docs/html/dbc__decoder_8h_source.html b/docs/html/dbc__decoder_8h_source.html index c7beeeb..f765efb 100644 --- a/docs/html/dbc__decoder_8h_source.html +++ b/docs/html/dbc__decoder_8h_source.html @@ -5,10 +5,17 @@ -DBC framework: dbc_decoder.h Source File +DBC Framework: dbc_decoder.h Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_decoder.h
    -Go to the documentation of this file.
    1/**
    -
    2 * @file dbc_decoder.h
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#ifndef DBC_DECODER_H
    13#define DBC_DECODER_H
    14
    @@ -65,129 +94,97 @@
    16#include <cstdint>
    17
    18#include "decode_database.h"
    -
    19
    -
    20/**
    -
    21 * @brief Raw CAN frame used for runtime or trace decoding.
    -
    22 */
    +
    19
    -
    24 std::uint32_t canId; /**< Normalized CAN ID. */
    -
    25 bool isExtended; /**< true for extended frame. */
    -
    26 std::vector<std::uint8_t> data; /**< Payload bytes. */
    -
    27
    - +
    24 std::uint32_t canId;
    + +
    26 std::vector<std::uint8_t> data;
    +
    29 : canId (0U)
    30 , isExtended (false)
    31 , data() {
    32 }
    33};
    -
    34
    -
    35/**
    -
    36 * @brief One decoded signal value.
    -
    37 */
    +
    34
    -
    39 const DecodeSignal *definition; /**< Signal definition. */
    -
    40 std::int64_t rawValue; /**< Extracted raw integer value. */
    -
    41 double physicalValue; /**< Converted physical value. */
    -
    42 bool valid; /**< true if decoding succeeded. */
    -
    43
    - + +
    40 std::int64_t rawValue;
    + +
    42 bool valid;
    +
    45 : definition (nullptr)
    46 , rawValue (0)
    47 , physicalValue (0.0)
    48 , valid (false) {
    49 }
    50};
    -
    51
    -
    52/**
    -
    53 * @brief Fully decoded frame.
    -
    54 */
    +
    51
    -
    56 const DecodeFrame *definition; /**< Frame definition. */
    -
    57 std::vector<DecodedSignalValue> signals; /**< Decoded signal values. */
    -
    58 bool valid; /**< true if frame was matched. */
    -
    59
    - + +
    57 std::vector<DecodedSignalValue> signals;
    +
    58 bool valid;
    +
    61 : definition (nullptr)
    -
    62 , signals()
    +
    62 , signals()
    63 , valid (false) {
    64 }
    65};
    -
    66
    -
    67/**
    -
    68 * @brief Runtime CAN decoder using prebuilt decode database.
    -
    69 */
    +
    66
    -
    71 public:
    -
    72 /**
    -
    73 * @brief Find frame definition by CAN ID.
    -
    74 * @param database Runtime decode database.
    -
    75 * @param canId Normalized CAN ID.
    -
    76 * @param isExtended true for extended frame.
    -
    77 * @return Pointer to frame definition or nullptr.
    -
    78 */
    +
    71 public:
    79 const DecodeFrame *FindFrame (const DecodeDatabase &database,
    80 std::uint32_t canId,
    81 bool isExtended) const;
    -
    82
    -
    83 /**
    -
    84 * @brief Decode one raw CAN frame.
    -
    85 * @param database Runtime decode database.
    -
    86 * @param frame Raw CAN frame.
    -
    87 * @return Decoded frame value.
    -
    88 */
    +
    82
    90 const RawCanFrame &frame) const;
    91
    92 private:
    -
    93 static bool ExtractUnsigned (const std::vector<std::uint8_t> &data,
    +
    93 static bool ExtractUnsigned (const std::vector<std::uint8_t> &data,
    94 const DecodeSignal &signal,
    95 std::uint64_t &value);
    96
    -
    97 static bool ExtractIntel (const std::vector<std::uint8_t> &data,
    +
    97 static bool ExtractIntel (const std::vector<std::uint8_t> &data,
    98 std::uint32_t startBit,
    99 std::uint32_t length,
    100 std::uint64_t &value);
    101
    -
    102 static bool ExtractMotorola (const std::vector<std::uint8_t> &data,
    +
    102 static bool ExtractMotorola (const std::vector<std::uint8_t> &data,
    103 std::uint32_t startBit,
    104 std::uint32_t length,
    105 std::uint64_t &value);
    106
    -
    107 static std::int64_t SignExtend (std::uint64_t value, std::uint32_t bitLength);
    +
    107 static std::int64_t SignExtend (std::uint64_t value, std::uint32_t bitLength);
    108};
    109
    110#endif /* DBC_DECODER_H */
    Runtime CAN decoder using prebuilt decode database.
    Definition: dbc_decoder.h:70
    -
    static bool ExtractUnsigned(const std::vector< std::uint8_t > &data, const DecodeSignal &signal, std::uint64_t &value)
    Definition: dbc_decoder.cpp:70
    DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
    Decode one raw CAN frame.
    Definition: dbc_decoder.cpp:31
    -
    static std::int64_t SignExtend(std::uint64_t value, std::uint32_t bitLength)
    const DecodeFrame * FindFrame(const DecodeDatabase &database, std::uint32_t canId, bool isExtended) const
    Find frame definition by CAN ID.
    Definition: dbc_decoder.cpp:14
    -
    static bool ExtractIntel(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)
    Definition: dbc_decoder.cpp:82
    -
    static bool ExtractMotorola(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    Runtime decode database with fast lookup by CAN ID.
    Runtime-ready frame definition.
    Runtime-ready signal definition.
    Fully decoded frame.
    Definition: dbc_decoder.h:55
    -
    const DecodeFrame * definition
    Definition: dbc_decoder.h:56
    -
    std::vector< DecodedSignalValue > signals
    Definition: dbc_decoder.h:57
    One decoded signal value.
    Definition: dbc_decoder.h:38
    -
    std::int64_t rawValue
    Definition: dbc_decoder.h:40
    const DecodeSignal * definition
    Definition: dbc_decoder.h:39
    Raw CAN frame used for runtime or trace decoding.
    Definition: dbc_decoder.h:23
    std::vector< std::uint8_t > data
    Definition: dbc_decoder.h:26
    -
    std::uint32_t canId
    Definition: dbc_decoder.h:24
    bool isExtended
    Definition: dbc_decoder.h:25
    +
    - + diff --git a/docs/html/dbc__parser_8cpp.html b/docs/html/dbc__parser_8cpp.html index 167e655..f943b59 100644 --- a/docs/html/dbc__parser_8cpp.html +++ b/docs/html/dbc__parser_8cpp.html @@ -5,10 +5,17 @@ -DBC framework: dbc_parser.cpp File Reference +DBC Framework: dbc_parser.cpp File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,26 +35,54 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    -
    dbc_parser.cpp File Reference
    @@ -60,27 +96,19 @@ #include <cctype>

    Go to the source code of this file.

    - - - - -

    -Namespaces

    namespace  anonymous_namespace{dbc_parser.cpp}
     
    - - - - -

    -Functions

    std::string anonymous_namespace{dbc_parser.cpp}::TrimText (const std::string &text)
     Remove leading and trailing spaces. More...
     

    Detailed Description

    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)

    Licensed under the MIT License. See LICENSE file in the project root for full license text.

    Definition in file dbc_parser.cpp.

    + - + diff --git a/docs/html/dbc__parser_8cpp_source.html b/docs/html/dbc__parser_8cpp_source.html index 2f502d5..b98cb34 100644 --- a/docs/html/dbc__parser_8cpp_source.html +++ b/docs/html/dbc__parser_8cpp_source.html @@ -5,10 +5,17 @@ -DBC framework: dbc_parser.cpp Source File +DBC Framework: dbc_parser.cpp Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_parser.cpp
    -Go to the documentation of this file.
    1/**
    -
    2 * @file dbc_parser.cpp
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#include "dbc_parser.h"
    13
    14#include <fstream>
    @@ -65,13 +94,8 @@
    16#include <stdexcept>
    17#include <cctype>
    18
    -
    19namespace {
    -
    20 /**
    -
    21 * @brief Remove leading and trailing spaces.
    -
    22 * @param text Input text.
    -
    23 * @return Trimmed text.
    -
    24 */
    -
    25 std::string TrimText (const std::string &text) {
    +
    19namespace {
    +
    25 std::string TrimText (const std::string &text) {
    26 std::string::size_type begin = 0U;
    27 while ((begin < text.size()) &&
    28 std::isspace (static_cast<unsigned char> (text[begin])))
    @@ -96,50 +120,50 @@
    47
    48 std::string line;
    49 while (std::getline (input, line)) {
    -
    50 line = Trim (line);
    +
    50 line = Trim (line);
    51 if (line.empty())
    52 continue;
    53
    -
    54 if (IsFrameLine (line)) {
    -
    55 FrameInfo frame = ParseFrameLine (line);
    +
    54 if (IsFrameLine (line)) {
    +
    55 FrameInfo frame = ParseFrameLine (line);
    56 database.frames.push_back (frame);
    57 currentFrame = &database.frames.back();
    -
    58 } else if (IsSignalLine (line)) {
    +
    58 } else if (IsSignalLine (line)) {
    59 if (currentFrame == nullptr)
    60 throw std::runtime_error ("Signal found before any frame definition.");
    61
    -
    62 SignalInfo signal = ParseSignalLine (line);
    -
    63 currentFrame->signals.push_back (signal);
    -
    64 } else if (IsCommentLine (line))
    -
    65 ParseCommentLine (line, database);
    +
    62 SignalInfo signal = ParseSignalLine (line);
    +
    63 currentFrame->signals.push_back (signal);
    +
    64 } else if (IsCommentLine (line))
    +
    65 ParseCommentLine (line, database);
    66 }
    67
    68 return database;
    69}
    70
    -
    71bool DbcParser::IsFrameLine (const std::string &line) {
    +
    71bool DbcParser::IsFrameLine (const std::string &line) {
    72 return (line.size() >= 4U) && (line.compare (0U, 4U, "BO_ ") == 0);
    73}
    74
    -
    75bool DbcParser::IsSignalLine (const std::string &line) {
    +
    75bool DbcParser::IsSignalLine (const std::string &line) {
    76 return (line.size() >= 4U) && (line.compare (0U, 4U, "SG_ ") == 0);
    77}
    78
    -
    79bool DbcParser::IsCommentLine (const std::string &line) {
    +
    79bool DbcParser::IsCommentLine (const std::string &line) {
    80 return (line.size() >= 4U) && (line.compare (0U, 4U, "CM_ ") == 0);
    81}
    82
    -
    83std::string DbcParser::Trim (const std::string &text) {
    -
    84 return TrimText (text);
    +
    83std::string DbcParser::Trim (const std::string &text) {
    +
    84 return TrimText (text);
    85}
    86
    -
    87std::vector<std::string> DbcParser::SplitReceivers (const std::string &text) {
    +
    87std::vector<std::string> DbcParser::SplitReceivers (const std::string &text) {
    88 std::vector<std::string> receivers;
    89 std::string token;
    90 std::istringstream stream (text);
    91
    92 while (std::getline (stream, token, ',')) {
    -
    93 token = TrimText (token);
    +
    93 token = TrimText (token);
    94 if (!token.empty())
    95 receivers.push_back (token);
    96 }
    @@ -147,7 +171,7 @@
    98 return receivers;
    99}
    100
    -
    101void DbcParser::NormalizeCanId (std::uint32_t rawCanId,
    +
    101void DbcParser::NormalizeCanId (std::uint32_t rawCanId,
    102 std::uint32_t &normalizedCanId,
    103 bool &isExtended) {
    104 /*
    @@ -164,7 +188,7 @@
    115 }
    116}
    117
    -
    118std::uint32_t DbcParser::TryExtractPgn (std::uint32_t canId, bool isExtended, bool &hasPgn) {
    +
    118std::uint32_t DbcParser::TryExtractPgn (std::uint32_t canId, bool isExtended, bool &hasPgn) {
    119 hasPgn = false;
    120
    121 if (!isExtended)
    @@ -188,7 +212,7 @@
    139 return pgn;
    140}
    141
    -
    142FrameInfo DbcParser::ParseFrameLine (const std::string &line) {
    +
    142FrameInfo DbcParser::ParseFrameLine (const std::string &line) {
    143 /*
    144 * Example:
    145 * BO_ 256 EngineData: 8 EEC1
    @@ -204,7 +228,7 @@
    155 throw std::runtime_error ("Invalid frame line: " + line);
    156
    157 stream >> rawCanId;
    -
    158 NormalizeCanId (rawCanId, frame.canId, frame.isExtended);
    +
    158 NormalizeCanId (rawCanId, frame.canId, frame.isExtended);
    159
    160 stream >> token;
    161 if (token.empty())
    @@ -222,12 +246,12 @@
    173 }
    174
    175 stream >> frame.transmitter;
    -
    176 frame.pgn = TryExtractPgn (frame.canId, frame.isExtended, frame.hasPgn);
    +
    176 frame.pgn = TryExtractPgn (frame.canId, frame.isExtended, frame.hasPgn);
    177
    178 return frame;
    179}
    180
    -
    181SignalInfo DbcParser::ParseSignalLine (const std::string &line) {
    +
    181SignalInfo DbcParser::ParseSignalLine (const std::string &line) {
    182 /*
    183 * Example:
    184 * SG_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] "rpm" ECU1,ECU2
    @@ -235,7 +259,7 @@
    186
    187 SignalInfo signal;
    188
    -
    189 std::string work = TrimText (line);
    +
    189 std::string work = TrimText (line);
    190 if (work.compare (0U, 4U, "SG_ ") != 0)
    191 throw std::runtime_error ("Invalid signal line: " + line);
    192
    @@ -245,8 +269,8 @@
    196 if (colonPos == std::string::npos)
    197 throw std::runtime_error ("Signal line missing ':' : " + line);
    198
    -
    199 signal.name = TrimText (work.substr (0U, colonPos));
    -
    200 std::string rest = TrimText (work.substr (colonPos + 1U));
    +
    199 signal.name = TrimText (work.substr (0U, colonPos));
    +
    200 std::string rest = TrimText (work.substr (colonPos + 1U));
    201
    202 const std::string::size_type pipePos = rest.find ('|');
    203 const std::string::size_type atPos = rest.find ('@');
    @@ -274,11 +298,11 @@
    225 throw std::runtime_error ("Unsupported signal syntax: " + line);
    226
    227 signal.startBit = static_cast<std::uint32_t> (
    -
    228 std::stoul (TrimText (rest.substr (0U, pipePos)))
    +
    228 std::stoul (TrimText (rest.substr (0U, pipePos)))
    229 );
    230
    231 signal.length = static_cast<std::uint32_t> (
    -
    232 std::stoul (TrimText (rest.substr (pipePos + 1U, atPos - pipePos - 1U)))
    +
    232 std::stoul (TrimText (rest.substr (pipePos + 1U, atPos - pipePos - 1U)))
    233 );
    234
    235 {
    @@ -295,32 +319,32 @@
    246 }
    247
    248 signal.factor = std::stod (
    -
    249 TrimText (rest.substr (factorBegin + 1U, factorComma - factorBegin - 1U))
    +
    249 TrimText (rest.substr (factorBegin + 1U, factorComma - factorBegin - 1U))
    250 );
    251
    252 signal.offset = std::stod (
    -
    253 TrimText (rest.substr (factorComma + 1U, factorEnd - factorComma - 1U))
    +
    253 TrimText (rest.substr (factorComma + 1U, factorEnd - factorComma - 1U))
    254 );
    255
    256 signal.minimum = std::stod (
    -
    257 TrimText (rest.substr (rangeBegin + 1U, rangeSep - rangeBegin - 1U))
    +
    257 TrimText (rest.substr (rangeBegin + 1U, rangeSep - rangeBegin - 1U))
    258 );
    259
    260 signal.maximum = std::stod (
    -
    261 TrimText (rest.substr (rangeSep + 1U, rangeEnd - rangeSep - 1U))
    +
    261 TrimText (rest.substr (rangeSep + 1U, rangeEnd - rangeSep - 1U))
    262 );
    263
    264 signal.unit = rest.substr (unitBegin + 1U, unitEnd - unitBegin - 1U);
    265
    266 {
    -
    267 const std::string receiversText = TrimText (rest.substr (unitEnd + 1U));
    -
    268 signal.receivers = SplitReceivers (receiversText);
    +
    267 const std::string receiversText = TrimText (rest.substr (unitEnd + 1U));
    +
    268 signal.receivers = SplitReceivers (receiversText);
    269 }
    270
    271 return signal;
    272}
    273
    -
    274void DbcParser::ParseCommentLine (const std::string &line, DbcDatabase &database) {
    +
    274void DbcParser::ParseCommentLine (const std::string &line, DbcDatabase &database) {
    275 /*
    276 * Examples:
    277 * CM_ BO_ 256 "Frame comment";
    @@ -342,7 +366,7 @@
    293 bool isExtended = false;
    294
    295 stream >> rawCanId;
    -
    296 NormalizeCanId (rawCanId, canId, isExtended);
    +
    296 NormalizeCanId (rawCanId, canId, isExtended);
    297
    298 const std::string::size_type quoteBegin = line.find ('"');
    299 const std::string::size_type quoteEnd = line.rfind ('"');
    @@ -352,7 +376,7 @@
    303 (quoteEnd <= quoteBegin))
    304 return;
    305
    -
    306 FrameInfo *frame = FindFrameById (database, canId, isExtended);
    +
    306 FrameInfo *frame = FindFrameById (database, canId, isExtended);
    307 if (frame != nullptr)
    308 frame->comment = line.substr (quoteBegin + 1U, quoteEnd - quoteBegin - 1U);
    309 } else if (token == "SG_") {
    @@ -364,7 +388,7 @@
    315 stream >> rawCanId;
    316 stream >> signalName;
    317
    -
    318 NormalizeCanId (rawCanId, canId, isExtended);
    +
    318 NormalizeCanId (rawCanId, canId, isExtended);
    319
    320 const std::string::size_type quoteBegin = line.find ('"');
    321 const std::string::size_type quoteEnd = line.rfind ('"');
    @@ -374,16 +398,16 @@
    325 (quoteEnd <= quoteBegin))
    326 return;
    327
    -
    328 FrameInfo *frame = FindFrameById (database, canId, isExtended);
    +
    328 FrameInfo *frame = FindFrameById (database, canId, isExtended);
    329 if (frame != nullptr) {
    -
    330 SignalInfo *signal = FindSignalByName (*frame, signalName);
    +
    330 SignalInfo *signal = FindSignalByName (*frame, signalName);
    331 if (signal != nullptr)
    332 signal->comment = line.substr (quoteBegin + 1U, quoteEnd - quoteBegin - 1U);
    333 }
    334 }
    335}
    336
    - +
    337FrameInfo *DbcParser::FindFrameById (DbcDatabase &database,
    338 std::uint32_t canId,
    339 bool isExtended) {
    340 for (std::size_t index = 0U; index < database.frames.size(); ++index) {
    @@ -395,36 +419,22 @@
    346 return nullptr;
    347}
    348
    -
    349SignalInfo *DbcParser::FindSignalByName (FrameInfo &frame, const std::string &signalName) {
    -
    350 for (std::size_t index = 0U; index < frame.signals.size(); ++index) {
    -
    351 if (frame.signals[index].name == signalName)
    -
    352 return &frame.signals[index];
    +
    349SignalInfo *DbcParser::FindSignalByName (FrameInfo &frame, const std::string &signalName) {
    +
    350 for (std::size_t index = 0U; index < frame.signals.size(); ++index) {
    +
    351 if (frame.signals[index].name == signalName)
    +
    352 return &frame.signals[index];
    353 }
    354
    355 return nullptr;
    356}
    -
    static std::vector< std::string > SplitReceivers(const std::string &text)
    Definition: dbc_parser.cpp:87
    -
    static std::string Trim(const std::string &text)
    Definition: dbc_parser.cpp:83
    -
    static SignalInfo ParseSignalLine(const std::string &line)
    Definition: dbc_parser.cpp:181
    -
    static FrameInfo ParseFrameLine(const std::string &line)
    Definition: dbc_parser.cpp:142
    -
    static std::uint32_t TryExtractPgn(std::uint32_t canId, bool isExtended, bool &hasPgn)
    Definition: dbc_parser.cpp:118
    -
    static void NormalizeCanId(std::uint32_t rawCanId, std::uint32_t &normalizedCanId, bool &isExtended)
    Definition: dbc_parser.cpp:101
    -
    static void ParseCommentLine(const std::string &line, DbcDatabase &database)
    Definition: dbc_parser.cpp:274
    -
    static FrameInfo * FindFrameById(DbcDatabase &database, std::uint32_t canId, bool isExtended)
    Definition: dbc_parser.cpp:337
    -
    static SignalInfo * FindSignalByName(FrameInfo &frame, const std::string &signalName)
    Definition: dbc_parser.cpp:349
    -
    static bool IsSignalLine(const std::string &line)
    Definition: dbc_parser.cpp:75
    -
    static bool IsFrameLine(const std::string &line)
    Definition: dbc_parser.cpp:71
    -
    static bool IsCommentLine(const std::string &line)
    Definition: dbc_parser.cpp:79
    DbcDatabase ParseFile(const std::string &filePath) const
    Parse DBC file.
    Definition: dbc_parser.cpp:40
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    -
    std::string TrimText(const std::string &text)
    Remove leading and trailing spaces.
    Definition: dbc_parser.cpp:25
    Parsed DBC content stored in a simple internal form.
    Definition: dbc_database.h:22
    std::vector< FrameInfo > frames
    Definition: dbc_database.h:23
    Describes one CAN frame from a DBC file.
    Definition: frame_info.h:24
    bool isExtended
    Definition: frame_info.h:27
    bool hasPgn
    Definition: frame_info.h:29
    std::string transmitter
    Definition: frame_info.h:31
    -
    std::vector< SignalInfo > signals
    Definition: frame_info.h:33
    std::uint8_t dlc
    Definition: frame_info.h:30
    std::string name
    Definition: frame_info.h:25
    std::string comment
    Definition: frame_info.h:32
    @@ -444,9 +454,13 @@
    double factor
    Definition: signal_info.h:28
    bool isLittleEndian
    Definition: signal_info.h:26
    +
    - + diff --git a/docs/html/dbc__parser_8h.html b/docs/html/dbc__parser_8h.html index 369cbe6..9e37fcc 100644 --- a/docs/html/dbc__parser_8h.html +++ b/docs/html/dbc__parser_8h.html @@ -5,10 +5,17 @@ -DBC framework: dbc_parser.h File Reference +DBC Framework: dbc_parser.h File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    @@ -71,9 +110,13 @@ Classes

    Definition in file dbc_parser.h.

    + - + diff --git a/docs/html/dbc__parser_8h.js b/docs/html/dbc__parser_8h.js new file mode 100644 index 0000000..1eb44b1 --- /dev/null +++ b/docs/html/dbc__parser_8h.js @@ -0,0 +1,4 @@ +var dbc__parser_8h = +[ + [ "DbcParser", "classDbcParser.html", "classDbcParser" ] +]; \ No newline at end of file diff --git a/docs/html/dbc__parser_8h_source.html b/docs/html/dbc__parser_8h_source.html index 63dfc7e..5792d31 100644 --- a/docs/html/dbc__parser_8h_source.html +++ b/docs/html/dbc__parser_8h_source.html @@ -5,10 +5,17 @@ -DBC framework: dbc_parser.h Source File +DBC Framework: dbc_parser.h Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_parser.h
    -Go to the documentation of this file.
    1/**
    -
    2 * @file dbc_parser.h
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#ifndef DBC_PARSER_H
    13#define DBC_PARSER_H
    14
    @@ -66,78 +95,50 @@
    17#include <cstdint>
    18
    19#include "dbc_database.h"
    -
    20
    -
    21/**
    -
    22 * @brief Minimal DBC parser.
    -
    23 *
    -
    24 * Supports:
    -
    25 * - BO_
    -
    26 * - SG_
    -
    27 * - CM_ BO_
    -
    28 * - CM_ SG_
    -
    29 *
    -
    30 * Ignores:
    -
    31 * - attributes
    -
    32 * - multiplexing
    -
    33 * - value tables
    -
    34 */
    +
    20
    35class DbcParser {
    -
    36 public:
    -
    37 /**
    -
    38 * @brief Parse DBC file.
    -
    39 * @param filePath Path to input file.
    -
    40 * @return Parsed database.
    -
    41 * @throws std::runtime_error on file or parse errors.
    -
    42 */
    +
    36 public:
    43 DbcDatabase ParseFile (const std::string &filePath) const;
    44
    45 private:
    -
    46 static bool IsFrameLine (const std::string &line);
    -
    47 static bool IsSignalLine (const std::string &line);
    -
    48 static bool IsCommentLine (const std::string &line);
    -
    49 static std::string Trim (const std::string &text);
    -
    50 static std::vector<std::string> SplitReceivers (const std::string &text);
    -
    51 static std::uint32_t TryExtractPgn (std::uint32_t canId, bool isExtended, bool &hasPgn);
    +
    46 static bool IsFrameLine (const std::string &line);
    +
    47 static bool IsSignalLine (const std::string &line);
    +
    48 static bool IsCommentLine (const std::string &line);
    +
    49 static std::string Trim (const std::string &text);
    +
    50 static std::vector<std::string> SplitReceivers (const std::string &text);
    +
    51 static std::uint32_t TryExtractPgn (std::uint32_t canId, bool isExtended, bool &hasPgn);
    52
    -
    53 static void NormalizeCanId (std::uint32_t rawCanId,
    +
    53 static void NormalizeCanId (std::uint32_t rawCanId,
    54 std::uint32_t &normalizedCanId,
    55 bool &isExtended);
    56
    -
    57 static FrameInfo ParseFrameLine (const std::string &line);
    -
    58 static SignalInfo ParseSignalLine (const std::string &line);
    +
    57 static FrameInfo ParseFrameLine (const std::string &line);
    +
    58 static SignalInfo ParseSignalLine (const std::string &line);
    59
    -
    60 static void ParseCommentLine (const std::string &line, DbcDatabase &database);
    +
    60 static void ParseCommentLine (const std::string &line, DbcDatabase &database);
    61
    -
    62 static FrameInfo *FindFrameById (DbcDatabase &database,
    +
    62 static FrameInfo *FindFrameById (DbcDatabase &database,
    63 std::uint32_t canId,
    64 bool isExtended);
    65
    -
    66 static SignalInfo *FindSignalByName (FrameInfo &frame, const std::string &signalName);
    +
    66 static SignalInfo *FindSignalByName (FrameInfo &frame, const std::string &signalName);
    67};
    68
    69#endif /* DBC_PARSER_H */
    Minimal DBC parser.
    Definition: dbc_parser.h:35
    -
    static std::vector< std::string > SplitReceivers(const std::string &text)
    Definition: dbc_parser.cpp:87
    -
    static std::string Trim(const std::string &text)
    Definition: dbc_parser.cpp:83
    -
    static SignalInfo ParseSignalLine(const std::string &line)
    Definition: dbc_parser.cpp:181
    -
    static FrameInfo ParseFrameLine(const std::string &line)
    Definition: dbc_parser.cpp:142
    -
    static std::uint32_t TryExtractPgn(std::uint32_t canId, bool isExtended, bool &hasPgn)
    Definition: dbc_parser.cpp:118
    -
    static void NormalizeCanId(std::uint32_t rawCanId, std::uint32_t &normalizedCanId, bool &isExtended)
    Definition: dbc_parser.cpp:101
    -
    static void ParseCommentLine(const std::string &line, DbcDatabase &database)
    Definition: dbc_parser.cpp:274
    -
    static FrameInfo * FindFrameById(DbcDatabase &database, std::uint32_t canId, bool isExtended)
    Definition: dbc_parser.cpp:337
    -
    static SignalInfo * FindSignalByName(FrameInfo &frame, const std::string &signalName)
    Definition: dbc_parser.cpp:349
    -
    static bool IsSignalLine(const std::string &line)
    Definition: dbc_parser.cpp:75
    -
    static bool IsFrameLine(const std::string &line)
    Definition: dbc_parser.cpp:71
    -
    static bool IsCommentLine(const std::string &line)
    Definition: dbc_parser.cpp:79
    DbcDatabase ParseFile(const std::string &filePath) const
    Parse DBC file.
    Definition: dbc_parser.cpp:40
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    Parsed DBC content stored in a simple internal form.
    Definition: dbc_database.h:22
    Describes one CAN frame from a DBC file.
    Definition: frame_info.h:24
    Describes one signal inside a DBC frame.
    Definition: signal_info.h:22
    +
    - + diff --git a/docs/html/dbc__tree__builder_8cpp.html b/docs/html/dbc__tree__builder_8cpp.html index 0427eec..bd70981 100644 --- a/docs/html/dbc__tree__builder_8cpp.html +++ b/docs/html/dbc__tree__builder_8cpp.html @@ -5,10 +5,17 @@ -DBC framework: dbc_tree_builder.cpp File Reference +DBC Framework: dbc_tree_builder.cpp File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_tree_builder.cpp File Reference
    @@ -59,9 +98,13 @@

    Definition in file dbc_tree_builder.cpp.

    + - + diff --git a/docs/html/dbc__tree__builder_8cpp_source.html b/docs/html/dbc__tree__builder_8cpp_source.html index c5f65a8..577390b 100644 --- a/docs/html/dbc__tree__builder_8cpp_source.html +++ b/docs/html/dbc__tree__builder_8cpp_source.html @@ -5,10 +5,17 @@ -DBC framework: dbc_tree_builder.cpp Source File +DBC Framework: dbc_tree_builder.cpp Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_tree_builder.cpp
    -Go to the documentation of this file.
    1/**
    -
    2 * @file dbc_tree_builder.cpp
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#include "dbc_tree_builder.h"
    13
    14std::unique_ptr<TreeNode> DbcTreeBuilder::Build (const DbcDatabase &database) const {
    @@ -67,8 +96,8 @@
    18 const FrameInfo &frame = database.frames[frameIndex];
    19 std::unique_ptr<TreeNode> frameNode (new TreeNode (frame));
    20
    -
    21 for (std::size_t signalIndex = 0U; signalIndex < frame.signals.size(); ++signalIndex) {
    -
    22 const SignalInfo &signal = frame.signals[signalIndex];
    +
    21 for (std::size_t signalIndex = 0U; signalIndex < frame.signals.size(); ++signalIndex) {
    +
    22 const SignalInfo &signal = frame.signals[signalIndex];
    23 std::unique_ptr<TreeNode> signalNode (new TreeNode (signal));
    24 frameNode->AddChild (std::move (signalNode));
    25 }
    @@ -84,12 +113,15 @@
    Parsed DBC content stored in a simple internal form.
    Definition: dbc_database.h:22
    std::vector< FrameInfo > frames
    Definition: dbc_database.h:23
    Describes one CAN frame from a DBC file.
    Definition: frame_info.h:24
    -
    std::vector< SignalInfo > signals
    Definition: frame_info.h:33
    Describes one signal inside a DBC frame.
    Definition: signal_info.h:22
    +
    - + diff --git a/docs/html/dbc__tree__builder_8h.html b/docs/html/dbc__tree__builder_8h.html index ccbfb85..de86569 100644 --- a/docs/html/dbc__tree__builder_8h.html +++ b/docs/html/dbc__tree__builder_8h.html @@ -5,10 +5,17 @@ -DBC framework: dbc_tree_builder.h File Reference +DBC Framework: dbc_tree_builder.h File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    @@ -70,9 +109,13 @@ Classes

    Definition in file dbc_tree_builder.h.

    + - + diff --git a/docs/html/dbc__tree__builder_8h.js b/docs/html/dbc__tree__builder_8h.js new file mode 100644 index 0000000..7cf0dbb --- /dev/null +++ b/docs/html/dbc__tree__builder_8h.js @@ -0,0 +1,4 @@ +var dbc__tree__builder_8h = +[ + [ "DbcTreeBuilder", "classDbcTreeBuilder.html", "classDbcTreeBuilder" ] +]; \ No newline at end of file diff --git a/docs/html/dbc__tree__builder_8h_source.html b/docs/html/dbc__tree__builder_8h_source.html index 47ce76a..b13e3fc 100644 --- a/docs/html/dbc__tree__builder_8h_source.html +++ b/docs/html/dbc__tree__builder_8h_source.html @@ -5,10 +5,17 @@ -DBC framework: dbc_tree_builder.h Source File +DBC Framework: dbc_tree_builder.h Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    dbc_tree_builder.h
    -Go to the documentation of this file.
    1/**
    -
    2 * @file dbc_tree_builder.h
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#ifndef DBC_TREE_BUILDER_H
    13#define DBC_TREE_BUILDER_H
    14
    @@ -65,17 +94,9 @@
    16
    17#include "dbc_database.h"
    18#include "tree_node.h"
    -
    19
    -
    20/**
    -
    21 * @brief Builds a simple tree from parsed DBC database.
    -
    22 */
    +
    19
    -
    24 public:
    -
    25 /**
    -
    26 * @brief Build tree representation of parsed DBC data.
    -
    27 * @param database Parsed database.
    -
    28 * @return Root node of the tree.
    -
    29 */
    +
    24 public:
    30 std::unique_ptr<TreeNode> Build (const DbcDatabase &database) const;
    31};
    32
    @@ -86,9 +107,13 @@
    Parsed DBC content stored in a simple internal form.
    Definition: dbc_database.h:22
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    +
    - + diff --git a/docs/html/decode__database_8h.html b/docs/html/decode__database_8h.html index 406c715..189e2b9 100644 --- a/docs/html/decode__database_8h.html +++ b/docs/html/decode__database_8h.html @@ -5,10 +5,17 @@ -DBC framework: decode_database.h File Reference +DBC Framework: decode_database.h File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    Classes | @@ -80,13 +119,13 @@ Classes - - @@ -118,10 +157,6 @@ Enumerations

    Signal byte order used for runtime decoding.

    -

    Enumerations

    enum class  ByteOrder { Intel -, Motorola +
    enum class  ByteOrder { Intel +, Motorola }
     Signal byte order used for runtime decoding. More...
     
    enum class  ValueType { Unsigned -, Signed +
    enum class  ValueType { Unsigned +, Signed }
     Signal numeric type. More...
     
    - - -
    Enumerator
    Intel 
    Motorola 

    Definition at line 23 of file decode_database.h.

    @@ -148,19 +183,19 @@ Enumerations

    Signal numeric type.

    - - - -
    Enumerator
    Unsigned 
    Signed 

    Definition at line 31 of file decode_database.h.

    + - + diff --git a/docs/html/decode__database_8h.js b/docs/html/decode__database_8h.js new file mode 100644 index 0000000..5fce961 --- /dev/null +++ b/docs/html/decode__database_8h.js @@ -0,0 +1,16 @@ +var decode__database_8h = +[ + [ "DecodeSignal", "structDecodeSignal.html", "structDecodeSignal" ], + [ "DecodeFrame", "structDecodeFrame.html", "structDecodeFrame" ], + [ "FrameKey", "structFrameKey.html", null ], + [ "FrameKeyHasher", "structFrameKeyHasher.html", null ], + [ "DecodeDatabase", "structDecodeDatabase.html", null ], + [ "ByteOrder", "decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b", [ + [ "Intel", "decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5", null ], + [ "Motorola", "decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31", null ] + ] ], + [ "ValueType", "decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1", [ + [ "Unsigned", "decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a", null ], + [ "Signed", "decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379", null ] + ] ] +]; \ No newline at end of file diff --git a/docs/html/decode__database_8h_source.html b/docs/html/decode__database_8h_source.html index b6fdf4a..be86652 100644 --- a/docs/html/decode__database_8h_source.html +++ b/docs/html/decode__database_8h_source.html @@ -5,10 +5,17 @@ -DBC framework: decode_database.h Source File +DBC Framework: decode_database.h Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    decode_database.h
    -Go to the documentation of this file.
    1/**
    -
    2 * @file decode_database.h
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#ifndef DECODE_DATABASE_H
    13#define DECODE_DATABASE_H
    14
    @@ -65,46 +94,36 @@
    16#include <vector>
    17#include <unordered_map>
    18#include <cstdint>
    -
    19
    -
    20/**
    -
    21 * @brief Signal byte order used for runtime decoding.
    -
    22 */
    +
    19
    23enum class ByteOrder {
    -
    24 Intel,
    - +
    24 Intel,
    +
    25 Motorola
    26};
    -
    27
    -
    28/**
    -
    29 * @brief Signal numeric type.
    -
    30 */
    +
    27
    31enum class ValueType {
    - -
    33 Signed
    +
    32 Unsigned,
    +
    33 Signed
    34};
    -
    35
    -
    36/**
    -
    37 * @brief Runtime-ready signal definition.
    -
    38 */
    +
    35
    -
    40 std::string name; /**< Signal name. */
    -
    41 std::uint32_t startBit; /**< DBC start bit. */
    -
    42 std::uint32_t length; /**< Signal length in bits. */
    -
    43 ByteOrder byteOrder; /**< Intel or Motorola. */
    -
    44 ValueType valueType; /**< Signed or unsigned. */
    -
    45 double factor; /**< Scaling factor. */
    -
    46 double offset; /**< Physical offset. */
    -
    47 double minimum; /**< Minimum physical value. */
    -
    48 double maximum; /**< Maximum physical value. */
    -
    49 std::string unit; /**< Physical unit. */
    -
    50 std::vector<std::string> receivers; /**< Receivers. */
    -
    51 std::string comment; /**< Comment. */
    -
    52
    - +
    40 std::string name;
    +
    41 std::uint32_t startBit;
    +
    42 std::uint32_t length;
    + + +
    45 double factor;
    +
    46 double offset;
    +
    47 double minimum;
    +
    48 double maximum;
    +
    49 std::string unit;
    +
    50 std::vector<std::string> receivers;
    +
    51 std::string comment;
    +
    54 : name()
    55 , startBit (0U)
    56 , length (0U)
    - - +
    57 , byteOrder (ByteOrder::Intel)
    +
    58 , valueType (ValueType::Unsigned)
    59 , factor (1.0)
    60 , offset (0.0)
    61 , minimum (0.0)
    @@ -114,22 +133,18 @@
    65 , comment() {
    66 }
    67};
    -
    68
    -
    69/**
    -
    70 * @brief Runtime-ready frame definition.
    -
    71 */
    +
    68
    -
    73 std::string name; /**< Frame name. */
    -
    74 std::uint32_t canId; /**< Normalized CAN ID. */
    -
    75 bool isExtended; /**< true for extended frame. */
    -
    76 std::uint8_t dlc; /**< Payload length. */
    -
    77 std::uint32_t pgn; /**< PGN if available. */
    -
    78 bool hasPgn; /**< true if PGN is valid. */
    -
    79 std::string transmitter; /**< Transmitter ECU. */
    -
    80 std::string comment; /**< Frame comment. */
    -
    81 std::vector<DecodeSignal> signals; /**< Signal definitions. */
    -
    82
    - +
    73 std::string name;
    +
    74 std::uint32_t canId;
    + +
    76 std::uint8_t dlc;
    +
    77 std::uint32_t pgn;
    +
    78 bool hasPgn;
    +
    79 std::string transmitter;
    +
    80 std::string comment;
    +
    81 std::vector<DecodeSignal> signals;
    +
    84 : name()
    85 , canId (0U)
    86 , isExtended (false)
    @@ -138,72 +153,55 @@
    89 , hasPgn (false)
    90 , transmitter()
    91 , comment()
    -
    92 , signals() {
    +
    92 , signals() {
    93 }
    94};
    -
    95
    -
    96/**
    -
    97 * @brief Key for fast frame lookup.
    -
    98 */
    +
    95
    99struct FrameKey {
    -
    100 std::uint32_t canId;
    - +
    100 std::uint32_t canId;
    +
    101 bool isExtended;
    102
    - -
    104 : canId (0U)
    -
    105 , isExtended (false) {
    +
    103 FrameKey()
    +
    104 : canId (0U)
    +
    105 , isExtended (false) {
    106 }
    107
    -
    108 FrameKey (std::uint32_t id, bool extended)
    -
    109 : canId (id)
    -
    110 , isExtended (extended) {
    +
    108 FrameKey (std::uint32_t id, bool extended)
    +
    109 : canId (id)
    +
    110 , isExtended (extended) {
    111 }
    112
    -
    113 bool operator== (const FrameKey &other) const {
    -
    114 return (canId == other.canId) && (isExtended == other.isExtended);
    +
    113 bool operator== (const FrameKey &other) const {
    +
    114 return (canId == other.canId) && (isExtended == other.isExtended);
    115 }
    116};
    -
    117
    -
    118/**
    -
    119 * @brief Hasher for frame key.
    -
    120 */
    +
    117
    -
    122 std::size_t operator() (const FrameKey &key) const {
    -
    123 const std::size_t a = static_cast<std::size_t> (key.canId);
    -
    124 const std::size_t b = key.isExtended ? 1U : 0U;
    +
    122 std::size_t operator() (const FrameKey &key) const {
    +
    123 const std::size_t a = static_cast<std::size_t> (key.canId);
    +
    124 const std::size_t b = key.isExtended ? 1U : 0U;
    125 return (a * 1315423911U) ^ b;
    126 }
    127};
    -
    128
    -
    129/**
    -
    130 * @brief Runtime decode database with fast lookup by CAN ID.
    -
    131 */
    +
    128
    -
    133 std::vector<DecodeFrame> frames;
    -
    134 std::unordered_map<FrameKey, std::size_t, FrameKeyHasher> frameIndexByKey;
    +
    133 std::vector<DecodeFrame> frames;
    +
    134 std::unordered_map<FrameKey, std::size_t, FrameKeyHasher> frameIndexByKey;
    135};
    136
    137#endif /* DECODE_DATABASE_H */
    ByteOrder
    Signal byte order used for runtime decoding.
    - -
    ValueType
    Signal numeric type.
    - -
    Runtime decode database with fast lookup by CAN ID.
    -
    std::vector< DecodeFrame > frames
    -
    std::unordered_map< FrameKey, std::size_t, FrameKeyHasher > frameIndexByKey
    Runtime-ready frame definition.
    std::uint32_t pgn
    std::string comment
    -
    std::vector< DecodeSignal > signals
    std::uint8_t dlc
    std::uint32_t canId
    std::string name
    std::string transmitter
    -
    Runtime-ready signal definition.
    std::string unit
    @@ -211,7 +209,6 @@
    std::string name
    -
    ValueType valueType
    std::uint32_t startBit
    std::vector< std::string > receivers
    @@ -219,17 +216,15 @@
    std::uint32_t length
    std::string comment
    Hasher for frame key.
    -
    std::size_t operator()(const FrameKey &key) const
    Key for fast frame lookup.
    -
    std::uint32_t canId
    - -
    FrameKey(std::uint32_t id, bool extended)
    - -
    bool operator==(const FrameKey &other) const
    +
    - + diff --git a/docs/html/files.html b/docs/html/files.html index 6b966c3..dbb765c 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -5,10 +5,17 @@ -DBC framework: File List +DBC Framework: File List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,27 +35,58 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    File List
    -
    Here is a list of all files with brief descriptions:
    +
    Here is a list of all documented files with brief descriptions:
    @@ -67,9 +106,12 @@
     dbc_database.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
     dbc_decode_builder.cppCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
    +
    - + diff --git a/docs/html/files_dup.js b/docs/html/files_dup.js new file mode 100644 index 0000000..8384f1b --- /dev/null +++ b/docs/html/files_dup.js @@ -0,0 +1,18 @@ +var files_dup = +[ + [ "dbc_database.h", "dbc__database_8h.html", "dbc__database_8h" ], + [ "dbc_decode_builder.cpp", "dbc__decode__builder_8cpp.html", null ], + [ "dbc_decode_builder.h", "dbc__decode__builder_8h.html", "dbc__decode__builder_8h" ], + [ "dbc_decoder.cpp", "dbc__decoder_8cpp.html", null ], + [ "dbc_decoder.h", "dbc__decoder_8h.html", "dbc__decoder_8h" ], + [ "dbc_parser.cpp", "dbc__parser_8cpp.html", null ], + [ "dbc_parser.h", "dbc__parser_8h.html", "dbc__parser_8h" ], + [ "dbc_tree_builder.cpp", "dbc__tree__builder_8cpp.html", null ], + [ "dbc_tree_builder.h", "dbc__tree__builder_8h.html", "dbc__tree__builder_8h" ], + [ "decode_database.h", "decode__database_8h.html", "decode__database_8h" ], + [ "frame_info.h", "frame__info_8h.html", "frame__info_8h" ], + [ "main.cpp", "main_8cpp.html", null ], + [ "signal_info.h", "signal__info_8h.html", "signal__info_8h" ], + [ "tree_node.cpp", "tree__node_8cpp.html", null ], + [ "tree_node.h", "tree__node_8h.html", "tree__node_8h" ] +]; \ No newline at end of file diff --git a/docs/html/frame__info_8h.html b/docs/html/frame__info_8h.html index 23f2efc..2151798 100644 --- a/docs/html/frame__info_8h.html +++ b/docs/html/frame__info_8h.html @@ -5,10 +5,17 @@ -DBC framework: frame_info.h File Reference +DBC Framework: frame_info.h File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    @@ -71,9 +110,13 @@ Classes

    Definition in file frame_info.h.

    + - + diff --git a/docs/html/frame__info_8h.js b/docs/html/frame__info_8h.js new file mode 100644 index 0000000..6488e18 --- /dev/null +++ b/docs/html/frame__info_8h.js @@ -0,0 +1,4 @@ +var frame__info_8h = +[ + [ "FrameInfo", "structFrameInfo.html", "structFrameInfo" ] +]; \ No newline at end of file diff --git a/docs/html/frame__info_8h_source.html b/docs/html/frame__info_8h_source.html index 32a6f1f..e8982ea 100644 --- a/docs/html/frame__info_8h_source.html +++ b/docs/html/frame__info_8h_source.html @@ -5,10 +5,17 @@ -DBC framework: frame_info.h Source File +DBC Framework: frame_info.h Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    frame_info.h
    -Go to the documentation of this file.
    1/**
    -
    2 * @file frame_info.h
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#ifndef FRAME_INFO_H
    13#define FRAME_INFO_H
    14
    @@ -66,22 +95,18 @@
    17#include <cstdint>
    18
    19#include "signal_info.h"
    -
    20
    -
    21/**
    -
    22 * @brief Describes one CAN frame from a DBC file.
    -
    23 */
    +
    20
    24struct FrameInfo {
    -
    25 std::string name; /**< Frame name. */
    -
    26 std::uint32_t canId; /**< Normalized CAN identifier. */
    -
    27 bool isExtended; /**< true for extended frame. */
    -
    28 std::uint32_t pgn; /**< J1939 PGN if applicable. */
    -
    29 bool hasPgn; /**< true if PGN was derived. */
    -
    30 std::uint8_t dlc; /**< Frame payload length. */
    -
    31 std::string transmitter; /**< Transmitter ECU name. */
    -
    32 std::string comment; /**< Optional frame comment. */
    -
    33 std::vector<SignalInfo> signals; /**< Signals contained in the frame. */
    -
    34
    - +
    25 std::string name;
    +
    26 std::uint32_t canId;
    + +
    28 std::uint32_t pgn;
    +
    29 bool hasPgn;
    +
    30 std::uint8_t dlc;
    +
    31 std::string transmitter;
    +
    32 std::string comment;
    +
    33 std::vector<SignalInfo> signals;
    +
    35 FrameInfo()
    36 : name()
    37 , canId (0U)
    38 , isExtended (false)
    @@ -90,7 +115,7 @@
    41 , dlc (0U)
    42 , transmitter()
    43 , comment()
    -
    44 , signals() {
    +
    44 , signals() {
    45 }
    46};
    47
    @@ -99,18 +124,20 @@
    Describes one CAN frame from a DBC file.
    Definition: frame_info.h:24
    bool isExtended
    Definition: frame_info.h:27
    bool hasPgn
    Definition: frame_info.h:29
    -
    std::string transmitter
    Definition: frame_info.h:31
    -
    std::vector< SignalInfo > signals
    Definition: frame_info.h:33
    std::uint8_t dlc
    Definition: frame_info.h:30
    std::string name
    Definition: frame_info.h:25
    std::string comment
    Definition: frame_info.h:32
    std::uint32_t pgn
    Definition: frame_info.h:28
    std::uint32_t canId
    Definition: frame_info.h:26
    +
    - + diff --git a/docs/html/functions.html b/docs/html/functions.html index 04ce34c..df238d0 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -5,10 +5,17 @@ -DBC framework: Class Members +DBC Framework: Class Members + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,56 +35,55 @@
    - - - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    -
    Here is a list of all class members with links to the classes they belong to:
    +
    Here is a list of all documented class members with links to the class documentation for each member:

    - a -

    - - -

    - ~ -

    +
    - + diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index b72d7db..4a37e4b 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -5,10 +5,17 @@ -DBC framework: Class Members - Functions +DBC Framework: Class Members - Functions + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,149 +35,75 @@
    - - - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    -  - -

    - a -

    +
    - + diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index 5267e4b..7d44d94 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -5,10 +5,17 @@ -DBC framework: Class Members - Variables +DBC Framework: Class Members - Variables + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,50 +35,53 @@
    - - - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
      @@ -80,7 +91,7 @@

    - c -

    @@ -94,8 +105,7 @@

    - f -

    @@ -105,7 +115,7 @@

    - i -

    @@ -117,11 +127,6 @@

    - m -

    @@ -140,6 +145,7 @@

    - p -

    @@ -150,7 +156,6 @@

    - s -

    @@ -170,9 +175,12 @@
  • valueType : DecodeSignal
  • +
    - + diff --git a/docs/html/globals.html b/docs/html/globals.html index 18651ec..594e5b3 100644 --- a/docs/html/globals.html +++ b/docs/html/globals.html @@ -5,10 +5,17 @@ -DBC framework: File Members +DBC Framework: File Members + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,42 +35,66 @@
    - - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    -
    Here is a list of all file members with links to the files they belong to:
    +
    - + diff --git a/docs/html/globals_enum.html b/docs/html/globals_enum.html index 427a8a7..4b7186e 100644 --- a/docs/html/globals_enum.html +++ b/docs/html/globals_enum.html @@ -5,10 +5,17 @@ -DBC framework: File Members +DBC Framework: File Members + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,29 +35,53 @@
    - - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
     
    +
    - + diff --git a/docs/html/graph_legend.html b/docs/html/graph_legend.html new file mode 100644 index 0000000..b160e8c --- /dev/null +++ b/docs/html/graph_legend.html @@ -0,0 +1,158 @@ + + + + + + + +DBC Framework: Graph Legend + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    DBC Framework +
    +
    DBC parsing and CAN signal decoding framework
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Graph Legend
    +
    +
    +

    This page explains how to interpret the graphs that are generated by doxygen.

    +

    Consider the following example:

    /*! Invisible class because of truncation */
    +
    class Invisible { };
    +
    +
    /*! Truncated class, inheritance relation is hidden */
    +
    class Truncated : public Invisible { };
    +
    +
    /* Class not documented with doxygen comments */
    +
    class Undocumented { };
    +
    +
    /*! Class that is inherited using public inheritance */
    +
    class PublicBase : public Truncated { };
    +
    +
    /*! A template class */
    +
    template<class T> class Templ { };
    +
    +
    /*! Class that is inherited using protected inheritance */
    +
    class ProtectedBase { };
    +
    +
    /*! Class that is inherited using private inheritance */
    +
    class PrivateBase { };
    +
    +
    /*! Class that is used by the Inherited class */
    +
    class Used { };
    +
    +
    /*! Super class that inherits a number of other classes */
    +
    class Inherited : public PublicBase,
    +
    protected ProtectedBase,
    +
    private PrivateBase,
    +
    public Undocumented,
    +
    public Templ<int>
    +
    {
    +
    private:
    +
    Used *m_usedClass;
    +
    };
    +

    This will result in the following graph:

    +

    The boxes in the above graph have the following meaning:

    +
      +
    • +A filled gray box represents the struct or class for which the graph is generated.
    • +
    • +A box with a black border denotes a documented struct or class.
    • +
    • +A box with a gray border denotes an undocumented struct or class.
    • +
    • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
    • +
    +

    The arrows have the following meaning:

    +
      +
    • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
    • +
    • +A dark green arrow is used for protected inheritance.
    • +
    • +A dark red arrow is used for private inheritance.
    • +
    • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
    • +
    • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
    • +
    +
    +
    + + + + diff --git a/docs/html/graph_legend.md5 b/docs/html/graph_legend.md5 new file mode 100644 index 0000000..5543aee --- /dev/null +++ b/docs/html/graph_legend.md5 @@ -0,0 +1 @@ +2949d8d683b49299ad5e82dbf5d1be6c \ No newline at end of file diff --git a/docs/html/graph_legend.svg b/docs/html/graph_legend.svg new file mode 100644 index 0000000..5c7a71a --- /dev/null +++ b/docs/html/graph_legend.svg @@ -0,0 +1,117 @@ + + + + + + +Graph Legend + + + +Node9 + +Inherited + + + +Node10 + +PublicBase + + + +Node10->Node9 + + + + + +Node11 + +Truncated + + + +Node11->Node10 + + + + + +Node13 + +ProtectedBase + + + +Node13->Node9 + + + + + +Node14 + +PrivateBase + + + +Node14->Node9 + + + + + +Node15 + +Undocumented + + + +Node15->Node9 + + + + + +Node16 + +Templ< int > + + + +Node16->Node9 + + + + + +Node17 + +Templ< T > + + + +Node17->Node16 + + +< int > + + + +Node18 + +Used + + + +Node18->Node9 + + +m_usedClass + + + diff --git a/docs/html/index.html b/docs/html/index.html index e4a3f66..6500132 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -5,10 +5,17 @@ -DBC framework: Main Page +DBC Framework: Main Page + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,24 +35,64 @@
    - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    -
    DBC framework Documentation
    +
    DBC Framework Documentation
    +
    - + diff --git a/docs/html/index.qhp b/docs/html/index.qhp index 0c034d8..8e11983 100644 --- a/docs/html/index.qhp +++ b/docs/html/index.qhp @@ -1,11 +1,17 @@ -org.doxygen.Project +ca.himro.dbcframework doc + + +dbc +framework +c++ +qt doxygen -
    +
    @@ -74,17 +80,6 @@
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    @@ -94,140 +89,99 @@
    -
    -
    -
    -
    -
    +
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    -
    -
    +
    -
    -
    -
    -
    -
    -
    +
    +
    +
    -
    +
    +
    +
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    -
    -
    -
    -
    +
    +
    -
    +
    +
    +
    +
    -
    -
    -
    -
    -
    -
    -
    -
    +
    -
    -
    -
    +
    +
    +
    -
    -
    -
    -
    +
    -
    -
    +
    +
    +
    +
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +
    -
    -
    -
    -
    -
    -
    -
    +
    +
    +
    @@ -253,51 +207,30 @@
    -
    -
    +
    -
    -
    +
    -
    -
    +
    -
    -
    -
    -
    -
    +
    -
    -
    -
    +
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    @@ -308,45 +241,35 @@
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    -
    -
    -
    -
    +
    +
    +
    -
    +
    +
    +
    -
    -
    -
    -
    -
    -
    -
    -
    @@ -359,38 +282,33 @@
    -
    -
    -
    -
    -
    -
    +
    +
    -
    +
    +
    +
    +
    -
    -
    -
    -
    -
    -
    +
    +
    +
    -
    -
    -
    -
    +
    -
    -
    +
    +
    +
    +
    @@ -399,24 +317,14 @@
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +
    -
    -
    -
    -
    -
    -
    -
    +
    +
    +
    @@ -427,7 +335,6 @@
    -
    @@ -450,7 +357,6 @@ - @@ -458,7 +364,6 @@ - @@ -466,28 +371,14 @@ - - - - - - - - - - - - - - @@ -497,22 +388,13 @@ - - - - - - - - - @@ -521,30 +403,18 @@ - - - - - - - - - + + + - - - - - - @@ -552,40 +422,23 @@ - - - - - - - - - - - - - - - - -README_8md.html annotated.html bc_s.png bdwn.png @@ -635,21 +488,27 @@ functions_vars.html globals.html globals_enum.html -globals_func.html +graph_legend.html +graph_legend.svg index.html jquery.js main_8cpp.html main_8cpp_source.html md_README.html -namespaceanonymous__namespace_02dbc__parser_8cpp_03.html -namespacemembers.html -namespacemembers_func.html -namespaces.html +menu.js +menudata.js nav_f.png nav_g.png nav_h.png open.png pages.html +search/close.svg +search/mag_sel.svg +search/search.css +search/search.js +search/search_l.png +search/search_m.png +search/search_r.png signal__info_8h.html signal__info_8h_source.html splitbar.png @@ -675,6 +534,7 @@ structRawCanFrame.html structSignalInfo-members.html structSignalInfo.html +svgpan.js sync_off.png sync_on.png tab_a.png diff --git a/docs/html/main_8cpp.html b/docs/html/main_8cpp.html index b2b0c08..bc44619 100644 --- a/docs/html/main_8cpp.html +++ b/docs/html/main_8cpp.html @@ -5,10 +5,17 @@ -DBC framework: main.cpp File Reference +DBC Framework: main.cpp File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    @@ -66,10 +105,6 @@ - - - -

    Functions

    static void PrintTree (const TreeNode *node, int indent)
     
    static void PrintDecodedFrame (const DecodedFrameValue &decoded)
     
    int main (int argc, char *argv[])
     
    @@ -107,88 +142,16 @@ Functions

    Definition at line 97 of file main.cpp.

    -

    References DbcTreeBuilder::Build(), DbcDecodeBuilder::Build(), RawCanFrame::canId, RawCanFrame::data, DbcDecoder::Decode(), DecodeDatabase::frames, RawCanFrame::isExtended, DbcParser::ParseFile(), PrintDecodedFrame(), and PrintTree().

    - -
    -
    - -

    ◆ PrintDecodedFrame()

    - -
    -
    - - - - - -
    - - - - - - - - -
    static void PrintDecodedFrame (const DecodedFrameValuedecoded)
    -
    -static
    -
    -
    - -

    ◆ PrintTree()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    static void PrintTree (const TreeNodenode,
    int indent 
    )
    -
    -static
    -
    + - + diff --git a/docs/html/main_8cpp_source.html b/docs/html/main_8cpp_source.html index dd07911..e15edfa 100644 --- a/docs/html/main_8cpp_source.html +++ b/docs/html/main_8cpp_source.html @@ -5,10 +5,17 @@ -DBC framework: main.cpp Source File +DBC Framework: main.cpp Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    main.cpp
    -Go to the documentation of this file.
    1/**
    -
    2 * @file main.cpp
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#include <iostream>
    13#include <iomanip>
    14#include <memory>
    @@ -69,7 +98,7 @@
    20#include "dbc_decode_builder.h"
    21#include "dbc_decoder.h"
    22
    -
    23static void PrintTree (const TreeNode *node, int indent) {
    +
    23static void PrintTree (const TreeNode *node, int indent) {
    24 if (node == nullptr)
    25 return;
    26
    @@ -77,11 +106,11 @@
    28 std::cout << " ";
    29
    30 switch (node->GetType()) {
    -
    31 case NodeType::Root:
    +
    31 case NodeType::Root:
    32 std::cout << "[root] " << node->GetName() << "\n";
    33 break;
    34
    -
    35 case NodeType::Frame: {
    +
    35 case NodeType::Frame: {
    36 const FrameInfo *frame = node->GetFrame();
    37 std::cout << "[frame] " << node->GetName();
    38
    @@ -98,7 +127,7 @@
    49 break;
    50 }
    51
    -
    52 case NodeType::Signal: {
    +
    52 case NodeType::Signal: {
    53 const SignalInfo *signal = node->GetSignal();
    54 std::cout << "[signal] " << node->GetName();
    55
    @@ -118,10 +147,10 @@
    69 }
    70
    71 for (std::size_t i = 0U; i < node->GetChildCount(); ++i)
    -
    72 PrintTree (node->GetChild (i), indent + 1);
    +
    72 PrintTree (node->GetChild (i), indent + 1);
    73}
    74
    -
    75static void PrintDecodedFrame (const DecodedFrameValue &decoded) {
    +
    75static void PrintDecodedFrame (const DecodedFrameValue &decoded) {
    76 if (!decoded.valid || (decoded.definition == nullptr)) {
    77 std::cout << "No frame definition found.\n";
    78 return;
    @@ -129,8 +158,8 @@
    80
    81 std::cout << "Decoded frame: " << decoded.definition->name << "\n";
    82
    -
    83 for (std::size_t index = 0U; index < decoded.signals.size(); ++index) {
    -
    84 const DecodedSignalValue &signal = decoded.signals[index];
    +
    83 for (std::size_t index = 0U; index < decoded.signals.size(); ++index) {
    +
    84 const DecodedSignalValue &signal = decoded.signals[index];
    85
    86 if ((signal.definition == nullptr) || !signal.valid)
    87 continue;
    @@ -143,7 +172,7 @@
    94 }
    95}
    96
    -
    97int main (int argc, char *argv[]) {
    +
    97int main (int argc, char *argv[]) {
    98 if (argc < 2) {
    99 std::cerr << "Usage: dbc_demo <file.dbc>\n";
    100 return 1;
    @@ -157,7 +186,7 @@
    108 std::unique_ptr<TreeNode> root = treeBuilder.Build (database);
    109
    110 std::cout << "=== Parsed tree ===\n";
    -
    111 PrintTree (root.get(), 0);
    +
    111 PrintTree (root.get(), 0);
    112
    113 DbcDecodeBuilder decodeBuilder;
    114 DecodeDatabase decodeDatabase = decodeBuilder.Build (database);
    @@ -167,15 +196,15 @@
    118 * Replace with live CAN frame or trace record later.
    119 */
    120 RawCanFrame rawFrame;
    -
    121 rawFrame.canId = decodeDatabase.frames.empty() ? 0U : decodeDatabase.frames[0].canId;
    -
    122 rawFrame.isExtended = decodeDatabase.frames.empty() ? false : decodeDatabase.frames[0].isExtended;
    +
    121 rawFrame.canId = decodeDatabase.frames.empty() ? 0U : decodeDatabase.frames[0].canId;
    +
    122 rawFrame.isExtended = decodeDatabase.frames.empty() ? false : decodeDatabase.frames[0].isExtended;
    123 rawFrame.data.resize (8U, 0U);
    124
    125 DbcDecoder decoder;
    126 DecodedFrameValue decoded = decoder.Decode (decodeDatabase, rawFrame);
    127
    128 std::cout << "\n=== Decoded frame ===\n";
    -
    129 PrintDecodedFrame (decoded);
    +
    129 PrintDecodedFrame (decoded);
    130 } catch (const std::exception &ex) {
    131 std::cerr << "Error: " << ex.what() << "\n";
    132 return 2;
    @@ -202,19 +231,14 @@
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    -
    int main(int argc, char *argv[])
    Definition: main.cpp:97
    -
    static void PrintDecodedFrame(const DecodedFrameValue &decoded)
    Definition: main.cpp:75
    -
    static void PrintTree(const TreeNode *node, int indent)
    Definition: main.cpp:23
    Parsed DBC content stored in a simple internal form.
    Definition: dbc_database.h:22
    Runtime decode database with fast lookup by CAN ID.
    -
    std::vector< DecodeFrame > frames
    std::string name
    std::string unit
    std::string name
    Fully decoded frame.
    Definition: dbc_decoder.h:55
    const DecodeFrame * definition
    Definition: dbc_decoder.h:56
    -
    std::vector< DecodedSignalValue > signals
    Definition: dbc_decoder.h:57
    One decoded signal value.
    Definition: dbc_decoder.h:38
    std::int64_t rawValue
    Definition: dbc_decoder.h:40
    @@ -234,13 +258,14 @@
    std::uint32_t length
    Definition: signal_info.h:25
    std::string unit
    Definition: signal_info.h:32
    std::uint32_t startBit
    Definition: signal_info.h:24
    - - -
    +
    - + diff --git a/docs/html/md_README.html b/docs/html/md_README.html index f6dd088..bf84030 100644 --- a/docs/html/md_README.html +++ b/docs/html/md_README.html @@ -5,10 +5,17 @@ -DBC framework: DBC Parser and Runtime Decode Module Documentation +DBC Framework: DBC Parser and Runtime Decode Module Documentation + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,16 +35,53 @@
    - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DBC Parser and Runtime Decode Module Documentation
    @@ -732,9 +777,12 @@ Runtime decode representation

    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.

    + - + diff --git a/docs/html/menu.js b/docs/html/menu.js new file mode 100644 index 0000000..818b859 --- /dev/null +++ b/docs/html/menu.js @@ -0,0 +1,135 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBox; + if (searchEnabled) { + if (serverSide) { + searchBox='
    '+ + '
    '+ + '
    '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBox='
    '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' + '' + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBox) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBox); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBox); + $('#searchBoxPos2').show(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/docs/html/menudata.js b/docs/html/menudata.js index 34f2450..96a64d1 100644 --- a/docs/html/menudata.js +++ b/docs/html/menudata.js @@ -25,11 +25,6 @@ var menudata={children:[ {text:"Main Page",url:"index.html"}, {text:"Related Pages",url:"pages.html"}, -{text:"Namespaces",url:"namespaces.html",children:[ -{text:"Namespace List",url:"namespaces.html"}, -{text:"Namespace Members",url:"namespacemembers.html",children:[ -{text:"All",url:"namespacemembers.html"}, -{text:"Functions",url:"namespacemembers_func.html"}]}]}, {text:"Classes",url:"annotated.html",children:[ {text:"Class List",url:"annotated.html"}, {text:"Class Index",url:"classes.html"}, @@ -39,7 +34,6 @@ var menudata={children:[ {text:"b",url:"functions.html#index_b"}, {text:"c",url:"functions.html#index_c"}, {text:"d",url:"functions.html#index_d"}, -{text:"e",url:"functions.html#index_e"}, {text:"f",url:"functions.html#index_f"}, {text:"g",url:"functions.html#index_g"}, {text:"h",url:"functions.html#index_h"}, @@ -53,23 +47,8 @@ var menudata={children:[ {text:"s",url:"functions.html#index_s"}, {text:"t",url:"functions.html#index_t"}, {text:"u",url:"functions.html#index_u"}, -{text:"v",url:"functions.html#index_v"}, -{text:"~",url:"functions.html#index__7E"}]}, -{text:"Functions",url:"functions_func.html",children:[ -{text:"a",url:"functions_func.html#index_a"}, -{text:"b",url:"functions_func.html#index_b"}, -{text:"d",url:"functions_func.html#index_d"}, -{text:"e",url:"functions_func.html#index_e"}, -{text:"f",url:"functions_func.html#index_f"}, -{text:"g",url:"functions_func.html#index_g"}, -{text:"i",url:"functions_func.html#index_i"}, -{text:"n",url:"functions_func.html#index_n"}, -{text:"o",url:"functions_func.html#index_o"}, -{text:"p",url:"functions_func.html#index_p"}, -{text:"r",url:"functions_func.html#index_r"}, -{text:"s",url:"functions_func.html#index_s"}, -{text:"t",url:"functions_func.html#index_t"}, -{text:"~",url:"functions_func.html#index__7E"}]}, +{text:"v",url:"functions.html#index_v"}]}, +{text:"Functions",url:"functions_func.html"}, {text:"Variables",url:"functions_vars.html",children:[ {text:"b",url:"functions_vars.html#index_b"}, {text:"c",url:"functions_vars.html#index_c"}, @@ -91,5 +70,4 @@ var menudata={children:[ {text:"File List",url:"files.html"}, {text:"File Members",url:"globals.html",children:[ {text:"All",url:"globals.html"}, -{text:"Functions",url:"globals_func.html"}, {text:"Enumerations",url:"globals_enum.html"}]}]}]} diff --git a/docs/html/navtree.css b/docs/html/navtree.css new file mode 100644 index 0000000..20c9e0d --- /dev/null +++ b/docs/html/navtree.css @@ -0,0 +1,147 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; + outline:none; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:#fff; +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + background-color: #FAFAFF; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: 280px; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background-image:url("splitbar.png"); + background-size:100%; + background-repeat:repeat-y; + background-attachment: scroll; + cursor:ew-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/docs/html/navtree.js b/docs/html/navtree.js new file mode 100644 index 0000000..2798368 --- /dev/null +++ b/docs/html/navtree.js @@ -0,0 +1,549 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +var navTreeSubIndices = new Array(); +var arrowDown = '▼'; +var arrowRight = '►'; + +function getData(varName) +{ + var i = varName.lastIndexOf('/'); + var n = i>=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=arrowRight; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=arrowRight; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + var span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + var topOffset=5; + if (typeof page_layout!=='undefined' && page_layout==1) { + topOffset+=$('#top').outerHeight(); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + $('#nav-sync').css('top',topOffset+'px'); + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +var loadTriggered = false; +var readyTriggered = false; +var loadObject,loadToRoot,loadUrl,loadRelPath; + +$(window).on('load',function(){ + if (readyTriggered) { // ready first + navTo(loadObject,loadToRoot,loadUrl,loadRelPath); + showRoot(); + } + loadTriggered=true; +}); + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("span"); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = arrowRight; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + if (loadTriggered) { // load before ready + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + } else { // ready before load + loadObject = o; + loadToRoot = toroot; + loadUrl = hashUrl(); + loadRelPath = relpath; + readyTriggered=true; + } + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/SignalInfo", "md_README.html#autotoc_md18", null ], + [ "FrameInfo", "md_README.html#autotoc_md20", null ], + [ "DbcDatabase", "md_README.html#autotoc_md22", null ], + [ "UI Tree Layer", "md_README.html#autotoc_md24", null ], + [ "TreeNode", "md_README.html#autotoc_md25", null ], + [ "Runtime Decode Layer", "md_README.html#autotoc_md27", null ], + [ "Purpose", "md_README.html#autotoc_md28", null ], + [ "ByteOrder", "md_README.html#autotoc_md30", null ], + [ "ValueType", "md_README.html#autotoc_md32", null ], + [ "DecodeSignal", "md_README.html#autotoc_md34", null ], + [ "DecodeFrame", "md_README.html#autotoc_md36", null ], + [ "FrameKey", "md_README.html#autotoc_md38", null ], + [ "DecodeDatabase", "md_README.html#autotoc_md40", null ], + [ "Decoder Layer", "md_README.html#autotoc_md42", null ], + [ "RawCanFrame", "md_README.html#autotoc_md43", null ], + [ "DecodedSignalValue", "md_README.html#autotoc_md45", null ], + [ "DecodedFrameValue", "md_README.html#autotoc_md47", null ], + [ "DbcDecoder", "md_README.html#autotoc_md49", null ], + [ "Parser Support", "md_README.html#autotoc_md51", null ], + [ "Supported DBC Syntax", "md_README.html#autotoc_md53", null ], + [ "Frame definition", "md_README.html#autotoc_md54", null ], + [ "Signal definition", "md_README.html#autotoc_md56", null ], + [ "Comments", "md_README.html#autotoc_md58", null ], + [ "CAN ID Normalization", "md_README.html#autotoc_md60", null ], + [ "PGN Extraction", "md_README.html#autotoc_md62", null ], + [ "Decode Flow", "md_README.html#autotoc_md64", null ], + [ "Intel and Motorola Extraction", "md_README.html#autotoc_md66", null ], + [ "Example Usage", "md_README.html#autotoc_md68", null ], + [ "Parse DBC", "md_README.html#autotoc_md69", null ], + [ "Build UI tree", "md_README.html#autotoc_md70", null ], + [ "Build runtime decode database", "md_README.html#autotoc_md71", null ], + [ "Decode a raw frame", "md_README.html#autotoc_md72", null ], + [ "Unified Decode Strategy", "md_README.html#autotoc_md74", [ + [ "live path", "md_README.html#autotoc_md75", null ], + [ "trace path", "md_README.html#autotoc_md76", null ] + ] ], + [ "Intended Use in FrameTap", "md_README.html#autotoc_md78", null ], + [ "Why the Tree Is Not Enough", "md_README.html#autotoc_md80", null ], + [ "Why No Abstract Factory Is Used", "md_README.html#autotoc_md82", null ], + [ "Current Limitations", "md_README.html#autotoc_md84", null ], + [ "Recommended Next Steps", "md_README.html#autotoc_md86", [ + [ "Stage 1 - already implemented", "md_README.html#autotoc_md87", null ], + [ "Stage 2", "md_README.html#autotoc_md88", null ], + [ "Stage 3", "md_README.html#autotoc_md89", null ], + [ "Stage 4", "md_README.html#autotoc_md90", null ] + ] ], + [ "Build Integration", "md_README.html#autotoc_md92", null ], + [ "Summary", "md_README.html#autotoc_md94", [ + [ "Parsed representation", "md_README.html#autotoc_md95", null ], + [ "Runtime decode representation", "md_README.html#autotoc_md96", null ] + ] ] + ] ], + [ "Classes", "annotated.html", [ + [ "Class List", "annotated.html", "annotated_dup" ], + [ "Class Index", "classes.html", null ], + [ "Class Members", "functions.html", [ + [ "All", "functions.html", null ], + [ "Functions", "functions_func.html", null ], + [ "Variables", "functions_vars.html", null ] + ] ] + ] ], + [ "Files", "files.html", [ + [ "File List", "files.html", "files_dup" ], + [ "File Members", "globals.html", [ + [ "All", "globals.html", null ], + [ "Enumerations", "globals_enum.html", null ] + ] ] + ] ] + ] ] +]; + +var NAVTREEINDEX = +[ +"annotated.html" +]; + +var SYNCONMSG = 'click to disable panel synchronisation'; +var SYNCOFFMSG = 'click to enable panel synchronisation'; \ No newline at end of file diff --git a/docs/html/navtreeindex0.js b/docs/html/navtreeindex0.js new file mode 100644 index 0000000..aa3896e --- /dev/null +++ b/docs/html/navtreeindex0.js @@ -0,0 +1,200 @@ +var NAVTREEINDEX0 = +{ +"annotated.html":[1,0], +"classDbcDecodeBuilder.html":[1,0,1], +"classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b":[1,0,1,0], +"classDbcDecoder.html":[1,0,2], +"classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7":[1,0,2,1], +"classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da":[1,0,2,0], +"classDbcParser.html":[1,0,3], +"classDbcParser.html#aef72826942c9095d653fafa435855e56":[1,0,3,0], +"classDbcTreeBuilder.html":[1,0,4], +"classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b":[1,0,4,0], +"classTreeNode.html":[1,0,15], +"classTreeNode.html#a226518612d0d00b5988a2c44fc21d3f1":[1,0,15,10], +"classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6":[1,0,15,5], +"classTreeNode.html#a6161f2ebb92184eab4215d121870e788":[1,0,15,3], +"classTreeNode.html#a81047bd7d2a4cc96b9ef5e20d0d63b5f":[1,0,15,6], +"classTreeNode.html#a8e38dd591d8801d7ee3a7dbad90c67fc":[1,0,15,1], +"classTreeNode.html#a984a98d5ccf7ef1f5a18094c6821f35d":[1,0,15,0], +"classTreeNode.html#aaac5b8d9dc9e5ae1f367d1adbcf20e18":[1,0,15,8], +"classTreeNode.html#ab9f00f5253d56461bb2d420fd639c5ae":[1,0,15,2], +"classTreeNode.html#abdd82460187dca8d3e5d66f5d5c529ea":[1,0,15,4], +"classTreeNode.html#afa2f4b0aafa12d3d41ed00df8e0250c9":[1,0,15,7], +"classTreeNode.html#afc503b40004764163605d6dbdb4ef811":[1,0,15,9], +"classes.html":[1,1], +"dbc__database_8h.html":[2,0,0], +"dbc__database_8h_source.html":[2,0,0], +"dbc__decode__builder_8cpp.html":[2,0,1], +"dbc__decode__builder_8cpp_source.html":[2,0,1], +"dbc__decode__builder_8h.html":[2,0,2], +"dbc__decode__builder_8h_source.html":[2,0,2], +"dbc__decoder_8cpp.html":[2,0,3], +"dbc__decoder_8cpp_source.html":[2,0,3], +"dbc__decoder_8h.html":[2,0,4], +"dbc__decoder_8h_source.html":[2,0,4], +"dbc__parser_8cpp.html":[2,0,5], +"dbc__parser_8cpp_source.html":[2,0,5], +"dbc__parser_8h.html":[2,0,6], +"dbc__parser_8h_source.html":[2,0,6], +"dbc__tree__builder_8cpp.html":[2,0,7], +"dbc__tree__builder_8cpp_source.html":[2,0,7], +"dbc__tree__builder_8h.html":[2,0,8], +"dbc__tree__builder_8h_source.html":[2,0,8], +"decode__database_8h.html":[2,0,9], +"decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b":[2,0,9,5], +"decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31":[2,0,9,5,1], +"decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5":[2,0,9,5,0], +"decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1":[2,0,9,6], +"decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379":[2,0,9,6,1], +"decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a":[2,0,9,6,0], +"decode__database_8h_source.html":[2,0,9], +"files.html":[2,0], +"frame__info_8h.html":[2,0,10], +"frame__info_8h_source.html":[2,0,10], +"functions.html":[1,2,0], +"functions_func.html":[1,2,1], +"functions_vars.html":[1,2,2], +"globals.html":[2,1,0], +"globals_enum.html":[2,1,1], +"index.html":[], +"main_8cpp.html":[2,0,11], +"main_8cpp_source.html":[2,0,11], +"md_README.html":[0], +"md_README.html#autotoc_md1":[0,0], +"md_README.html#autotoc_md10":[0,3,0], +"md_README.html#autotoc_md11":[0,3,1], +"md_README.html#autotoc_md12":[0,3,2], +"md_README.html#autotoc_md13":[0,3,3], +"md_README.html#autotoc_md14":[0,3,4], +"md_README.html#autotoc_md15":[0,3,5], +"md_README.html#autotoc_md17":[0,4], +"md_README.html#autotoc_md18":[0,5], +"md_README.html#autotoc_md20":[0,6], +"md_README.html#autotoc_md22":[0,7], +"md_README.html#autotoc_md24":[0,8], +"md_README.html#autotoc_md25":[0,9], +"md_README.html#autotoc_md27":[0,10], +"md_README.html#autotoc_md28":[0,11], +"md_README.html#autotoc_md3":[0,1], +"md_README.html#autotoc_md30":[0,12], +"md_README.html#autotoc_md32":[0,13], +"md_README.html#autotoc_md34":[0,14], +"md_README.html#autotoc_md36":[0,15], +"md_README.html#autotoc_md38":[0,16], +"md_README.html#autotoc_md4":[0,1,0], +"md_README.html#autotoc_md40":[0,17], +"md_README.html#autotoc_md42":[0,18], +"md_README.html#autotoc_md43":[0,19], +"md_README.html#autotoc_md45":[0,20], +"md_README.html#autotoc_md47":[0,21], +"md_README.html#autotoc_md49":[0,22], +"md_README.html#autotoc_md5":[0,1,1], +"md_README.html#autotoc_md51":[0,23], +"md_README.html#autotoc_md53":[0,24], +"md_README.html#autotoc_md54":[0,25], +"md_README.html#autotoc_md56":[0,26], +"md_README.html#autotoc_md58":[0,27], +"md_README.html#autotoc_md60":[0,28], +"md_README.html#autotoc_md62":[0,29], +"md_README.html#autotoc_md64":[0,30], +"md_README.html#autotoc_md66":[0,31], +"md_README.html#autotoc_md68":[0,32], +"md_README.html#autotoc_md69":[0,33], +"md_README.html#autotoc_md7":[0,2], +"md_README.html#autotoc_md70":[0,34], +"md_README.html#autotoc_md71":[0,35], +"md_README.html#autotoc_md72":[0,36], +"md_README.html#autotoc_md74":[0,37], +"md_README.html#autotoc_md75":[0,37,0], +"md_README.html#autotoc_md76":[0,37,1], +"md_README.html#autotoc_md78":[0,38], +"md_README.html#autotoc_md80":[0,39], +"md_README.html#autotoc_md82":[0,40], +"md_README.html#autotoc_md84":[0,41], +"md_README.html#autotoc_md86":[0,42], +"md_README.html#autotoc_md87":[0,42,0], +"md_README.html#autotoc_md88":[0,42,1], +"md_README.html#autotoc_md89":[0,42,2], +"md_README.html#autotoc_md9":[0,3], +"md_README.html#autotoc_md90":[0,42,3], +"md_README.html#autotoc_md92":[0,43], +"md_README.html#autotoc_md94":[0,44], +"md_README.html#autotoc_md95":[0,44,0], +"md_README.html#autotoc_md96":[0,44,1], +"pages.html":[], +"signal__info_8h.html":[2,0,12], +"signal__info_8h_source.html":[2,0,12], +"structDbcDatabase.html":[1,0,0], +"structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b":[1,0,0,0], +"structDecodeDatabase.html":[1,0,5], +"structDecodeFrame.html":[1,0,8], +"structDecodeFrame.html#a1d3c54055c0cbceb73adf551f7067f23":[1,0,8,4], +"structDecodeFrame.html#a2551102670c4a540fced4c71da0b369d":[1,0,8,5], +"structDecodeFrame.html#a25819ef907a32391af5c9f7cae9cdb22":[1,0,8,7], +"structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41":[1,0,8,2], +"structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060":[1,0,8,3], +"structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf":[1,0,8,1], +"structDecodeFrame.html#a7f4e71bbdec3f424b625e724e3dfbf14":[1,0,8,8], +"structDecodeFrame.html#aa0a7f8fd5bfde2148dfd0d838328f579":[1,0,8,0], +"structDecodeFrame.html#ad78241dc40c793aabb8495b6989b81a9":[1,0,8,6], +"structDecodeSignal.html":[1,0,9], +"structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25":[1,0,9,7], +"structDecodeSignal.html#a38eed9ca7581423fd8bfbedcffc12092":[1,0,9,9], +"structDecodeSignal.html#a428c39913a366a8476dd291061354391":[1,0,9,5], +"structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7":[1,0,9,8], +"structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780":[1,0,9,0], +"structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74":[1,0,9,6], +"structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8":[1,0,9,4], +"structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d":[1,0,9,1], +"structDecodeSignal.html#abdbae62a64d2df716bf60c6b67b30eaa":[1,0,9,10], +"structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d":[1,0,9,3], +"structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb":[1,0,9,2], +"structDecodeSignal.html#ae28c905d4a2bc86419c2a8361bfea473":[1,0,9,11], +"structDecodedFrameValue.html":[1,0,6], +"structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0":[1,0,6,2], +"structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c":[1,0,6,0], +"structDecodedFrameValue.html#adae123ac7fbb4a5c314b64b01109f4a8":[1,0,6,1], +"structDecodedSignalValue.html":[1,0,7], +"structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec":[1,0,7,1], +"structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978":[1,0,7,2], +"structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686":[1,0,7,3], +"structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7":[1,0,7,0], +"structFrameInfo.html":[1,0,10], +"structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf":[1,0,10,2], +"structFrameInfo.html#a3f7e25d67ddae22f2ed50823a5a26084":[1,0,10,8], +"structFrameInfo.html#a4737a5420213ad4304724e39f3a4e55d":[1,0,10,4], +"structFrameInfo.html#a92749ec3798d4211a505860fb389a9e8":[1,0,10,6], +"structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9":[1,0,10,5], +"structFrameInfo.html#abb53a7f93ed7abc0ea1ae4a8ccafcdcb":[1,0,10,0], +"structFrameInfo.html#ace75121294f9d89b762080ab5643293c":[1,0,10,7], +"structFrameInfo.html#aee518b33f1000bf0b7f6e4a87474c943":[1,0,10,3], +"structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e":[1,0,10,1], +"structFrameKey.html":[1,0,11], +"structFrameKeyHasher.html":[1,0,12], +"structRawCanFrame.html":[1,0,13], +"structRawCanFrame.html#a0acb487612104c99c9907344c035df83":[1,0,13,2], +"structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4":[1,0,13,0], +"structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7":[1,0,13,1], +"structSignalInfo.html":[1,0,14], +"structSignalInfo.html#a1008b5201f71848177217bd52fb84baa":[1,0,14,2], +"structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01":[1,0,14,9], +"structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3":[1,0,14,10], +"structSignalInfo.html#a379e422a00cad56f896cacf60455b088":[1,0,14,0], +"structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f":[1,0,14,4], +"structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e":[1,0,14,6], +"structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5":[1,0,14,11], +"structSignalInfo.html#ace290724f9801521609aedaa946d61f1":[1,0,14,1], +"structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b":[1,0,14,7], +"structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52":[1,0,14,8], +"structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499":[1,0,14,5], +"structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c":[1,0,14,3], +"tree__node_8cpp.html":[2,0,13], +"tree__node_8cpp_source.html":[2,0,13], +"tree__node_8h.html":[2,0,14], +"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16":[2,0,14,1], +"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398":[2,0,14,1,2], +"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a":[2,0,14,1,1], +"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad":[2,0,14,1,0], +"tree__node_8h_source.html":[2,0,14] +}; diff --git a/docs/html/pages.html b/docs/html/pages.html index 8f9cce5..1f4374d 100644 --- a/docs/html/pages.html +++ b/docs/html/pages.html @@ -5,10 +5,17 @@ -DBC framework: Related Pages +DBC Framework: Related Pages + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,16 +35,53 @@
    - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    Related Pages
    @@ -47,9 +92,12 @@
    + - + diff --git a/docs/html/resize.js b/docs/html/resize.js new file mode 100644 index 0000000..7fe30d1 --- /dev/null +++ b/docs/html/resize.js @@ -0,0 +1,150 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initResizable() +{ + var cookie_namespace = 'doxygen'; + var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight; + + function readCookie(cookie) + { + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) { + var index = document.cookie.indexOf(myCookie); + if (index != -1) { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; + } + + function writeCookie(cookie, val, expiration) + { + if (val==undefined) return; + if (expiration == null) { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; SameSite=Lax; expires=" + expiration+"; path=/"; + } + + function resizeWidth() + { + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth-barWidth, null); + } + + function restoreWidth(navWidth) + { + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight() + { + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height(); + var contentHeight,navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + content.css({height:contentHeight + "px"}); + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + var width=$(window).width(); + if (width!=collapsedWidth) { + if (width=desktop_vp) { + if (!collapsed) { + collapseExpand(); + } + } else if (width>desktop_vp && collapsedWidth0) { + restoreWidth(0); + collapsed=true; + } + else { + var width = readCookie('width'); + if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); } + collapsed=false; + } + } + + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + $(window).resize(function() { resizeHeight(); }); + var device = navigator.userAgent.toLowerCase(); + var touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/docs/html/search/all_0.html b/docs/html/search/all_0.html new file mode 100644 index 0000000..bb9e364 --- /dev/null +++ b/docs/html/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js new file mode 100644 index 0000000..ca215cf --- /dev/null +++ b/docs/html/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addchild_0',['AddChild',['../classTreeNode.html#a6161f2ebb92184eab4215d121870e788',1,'TreeNode']]] +]; diff --git a/docs/html/search/all_1.html b/docs/html/search/all_1.html new file mode 100644 index 0000000..8989416 --- /dev/null +++ b/docs/html/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js new file mode 100644 index 0000000..4506f0c --- /dev/null +++ b/docs/html/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['build_0',['Build',['../classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b',1,'DbcDecodeBuilder::Build()'],['../classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b',1,'DbcTreeBuilder::Build()']]], + ['byteorder_1',['byteOrder',['../structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d',1,'DecodeSignal']]], + ['byteorder_2',['ByteOrder',['../decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b',1,'decode_database.h']]] +]; diff --git a/docs/html/search/all_10.html b/docs/html/search/all_10.html new file mode 100644 index 0000000..a7c1f9c --- /dev/null +++ b/docs/html/search/all_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js new file mode 100644 index 0000000..1917cda --- /dev/null +++ b/docs/html/search/all_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unit_0',['unit',['../structDecodeSignal.html#a38eed9ca7581423fd8bfbedcffc12092',1,'DecodeSignal::unit()'],['../structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01',1,'SignalInfo::unit()']]] +]; diff --git a/docs/html/search/all_11.html b/docs/html/search/all_11.html new file mode 100644 index 0000000..8f86146 --- /dev/null +++ b/docs/html/search/all_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_11.js b/docs/html/search/all_11.js new file mode 100644 index 0000000..c0770ac --- /dev/null +++ b/docs/html/search/all_11.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['valid_0',['valid',['../structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686',1,'DecodedSignalValue::valid()'],['../structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0',1,'DecodedFrameValue::valid()']]], + ['valuetype_1',['valueType',['../structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8',1,'DecodeSignal']]], + ['valuetype_2',['ValueType',['../decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1',1,'decode_database.h']]] +]; diff --git a/docs/html/search/all_2.html b/docs/html/search/all_2.html new file mode 100644 index 0000000..98e648c --- /dev/null +++ b/docs/html/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js new file mode 100644 index 0000000..ec3952d --- /dev/null +++ b/docs/html/search/all_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['canid_0',['canId',['../structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4',1,'RawCanFrame::canId()'],['../structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf',1,'DecodeFrame::canId()'],['../structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e',1,'FrameInfo::canId()']]], + ['comment_1',['comment',['../structDecodeSignal.html#ae28c905d4a2bc86419c2a8361bfea473',1,'DecodeSignal::comment()'],['../structDecodeFrame.html#a25819ef907a32391af5c9f7cae9cdb22',1,'DecodeFrame::comment()'],['../structFrameInfo.html#ace75121294f9d89b762080ab5643293c',1,'FrameInfo::comment()'],['../structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5',1,'SignalInfo::comment()']]] +]; diff --git a/docs/html/search/all_3.html b/docs/html/search/all_3.html new file mode 100644 index 0000000..f4e8da7 --- /dev/null +++ b/docs/html/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js new file mode 100644 index 0000000..68f18d8 --- /dev/null +++ b/docs/html/search/all_3.js @@ -0,0 +1,28 @@ +var searchData= +[ + ['data_0',['data',['../structRawCanFrame.html#a0acb487612104c99c9907344c035df83',1,'RawCanFrame']]], + ['dbc_20parser_20and_20runtime_20decode_20module_20documentation_1',['DBC Parser and Runtime Decode Module Documentation',['../md_README.html',1,'']]], + ['dbc_5fdatabase_2eh_2',['dbc_database.h',['../dbc__database_8h.html',1,'']]], + ['dbc_5fdecode_5fbuilder_2ecpp_3',['dbc_decode_builder.cpp',['../dbc__decode__builder_8cpp.html',1,'']]], + ['dbc_5fdecode_5fbuilder_2eh_4',['dbc_decode_builder.h',['../dbc__decode__builder_8h.html',1,'']]], + ['dbc_5fdecoder_2ecpp_5',['dbc_decoder.cpp',['../dbc__decoder_8cpp.html',1,'']]], + ['dbc_5fdecoder_2eh_6',['dbc_decoder.h',['../dbc__decoder_8h.html',1,'']]], + ['dbc_5fparser_2ecpp_7',['dbc_parser.cpp',['../dbc__parser_8cpp.html',1,'']]], + ['dbc_5fparser_2eh_8',['dbc_parser.h',['../dbc__parser_8h.html',1,'']]], + ['dbc_5ftree_5fbuilder_2ecpp_9',['dbc_tree_builder.cpp',['../dbc__tree__builder_8cpp.html',1,'']]], + ['dbc_5ftree_5fbuilder_2eh_10',['dbc_tree_builder.h',['../dbc__tree__builder_8h.html',1,'']]], + ['dbcdatabase_11',['DbcDatabase',['../structDbcDatabase.html',1,'']]], + ['dbcdecodebuilder_12',['DbcDecodeBuilder',['../classDbcDecodeBuilder.html',1,'']]], + ['dbcdecoder_13',['DbcDecoder',['../classDbcDecoder.html',1,'']]], + ['dbcparser_14',['DbcParser',['../classDbcParser.html',1,'']]], + ['dbctreebuilder_15',['DbcTreeBuilder',['../classDbcTreeBuilder.html',1,'']]], + ['decode_16',['Decode',['../classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7',1,'DbcDecoder']]], + ['decode_5fdatabase_2eh_17',['decode_database.h',['../decode__database_8h.html',1,'']]], + ['decodedatabase_18',['DecodeDatabase',['../structDecodeDatabase.html',1,'']]], + ['decodedframevalue_19',['DecodedFrameValue',['../structDecodedFrameValue.html',1,'']]], + ['decodedsignalvalue_20',['DecodedSignalValue',['../structDecodedSignalValue.html',1,'']]], + ['decodeframe_21',['DecodeFrame',['../structDecodeFrame.html',1,'']]], + ['decodesignal_22',['DecodeSignal',['../structDecodeSignal.html',1,'']]], + ['definition_23',['definition',['../structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7',1,'DecodedSignalValue::definition()'],['../structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c',1,'DecodedFrameValue::definition()']]], + ['dlc_24',['dlc',['../structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060',1,'DecodeFrame::dlc()'],['../structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9',1,'FrameInfo::dlc()']]] +]; diff --git a/docs/html/search/all_4.html b/docs/html/search/all_4.html new file mode 100644 index 0000000..678d3a2 --- /dev/null +++ b/docs/html/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js new file mode 100644 index 0000000..741adc5 --- /dev/null +++ b/docs/html/search/all_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['factor_0',['factor',['../structDecodeSignal.html#a428c39913a366a8476dd291061354391',1,'DecodeSignal::factor()'],['../structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499',1,'SignalInfo::factor()']]], + ['findframe_1',['FindFrame',['../classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da',1,'DbcDecoder']]], + ['frame_5finfo_2eh_2',['frame_info.h',['../frame__info_8h.html',1,'']]], + ['frameinfo_3',['FrameInfo',['../structFrameInfo.html',1,'']]], + ['framekey_4',['FrameKey',['../structFrameKey.html',1,'']]], + ['framekeyhasher_5',['FrameKeyHasher',['../structFrameKeyHasher.html',1,'']]], + ['frames_6',['frames',['../structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b',1,'DbcDatabase']]] +]; diff --git a/docs/html/search/all_5.html b/docs/html/search/all_5.html new file mode 100644 index 0000000..aa9af78 --- /dev/null +++ b/docs/html/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js new file mode 100644 index 0000000..3319dfe --- /dev/null +++ b/docs/html/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['getchild_0',['GetChild',['../classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6',1,'TreeNode::GetChild(std::size_t index) const'],['../classTreeNode.html#a81047bd7d2a4cc96b9ef5e20d0d63b5f',1,'TreeNode::GetChild(std::size_t index)']]], + ['getchildcount_1',['GetChildCount',['../classTreeNode.html#abdd82460187dca8d3e5d66f5d5c529ea',1,'TreeNode']]], + ['getframe_2',['GetFrame',['../classTreeNode.html#afc503b40004764163605d6dbdb4ef811',1,'TreeNode']]], + ['getname_3',['GetName',['../classTreeNode.html#aaac5b8d9dc9e5ae1f367d1adbcf20e18',1,'TreeNode']]], + ['getsignal_4',['GetSignal',['../classTreeNode.html#a226518612d0d00b5988a2c44fc21d3f1',1,'TreeNode']]], + ['gettype_5',['GetType',['../classTreeNode.html#afa2f4b0aafa12d3d41ed00df8e0250c9',1,'TreeNode']]] +]; diff --git a/docs/html/search/all_6.html b/docs/html/search/all_6.html new file mode 100644 index 0000000..d3026a7 --- /dev/null +++ b/docs/html/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js new file mode 100644 index 0000000..34587db --- /dev/null +++ b/docs/html/search/all_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['haspgn_0',['hasPgn',['../structDecodeFrame.html#a2551102670c4a540fced4c71da0b369d',1,'DecodeFrame::hasPgn()'],['../structFrameInfo.html#a4737a5420213ad4304724e39f3a4e55d',1,'FrameInfo::hasPgn()']]] +]; diff --git a/docs/html/search/all_7.html b/docs/html/search/all_7.html new file mode 100644 index 0000000..b2ee042 --- /dev/null +++ b/docs/html/search/all_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js new file mode 100644 index 0000000..b82eca0 --- /dev/null +++ b/docs/html/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['isextended_0',['isExtended',['../structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7',1,'RawCanFrame::isExtended()'],['../structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41',1,'DecodeFrame::isExtended()'],['../structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf',1,'FrameInfo::isExtended()']]], + ['islittleendian_1',['isLittleEndian',['../structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c',1,'SignalInfo']]], + ['issigned_2',['isSigned',['../structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f',1,'SignalInfo']]] +]; diff --git a/docs/html/search/all_8.html b/docs/html/search/all_8.html new file mode 100644 index 0000000..40a0b3f --- /dev/null +++ b/docs/html/search/all_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js new file mode 100644 index 0000000..12aa6af --- /dev/null +++ b/docs/html/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['length_0',['length',['../structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb',1,'DecodeSignal::length()'],['../structSignalInfo.html#a1008b5201f71848177217bd52fb84baa',1,'SignalInfo::length()']]] +]; diff --git a/docs/html/search/all_9.html b/docs/html/search/all_9.html new file mode 100644 index 0000000..7c49144 --- /dev/null +++ b/docs/html/search/all_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js new file mode 100644 index 0000000..aeab39d --- /dev/null +++ b/docs/html/search/all_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['main_2ecpp_0',['main.cpp',['../main_8cpp.html',1,'']]], + ['maximum_1',['maximum',['../structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7',1,'DecodeSignal::maximum()'],['../structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52',1,'SignalInfo::maximum()']]], + ['minimum_2',['minimum',['../structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25',1,'DecodeSignal::minimum()'],['../structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b',1,'SignalInfo::minimum()']]] +]; diff --git a/docs/html/search/all_a.html b/docs/html/search/all_a.html new file mode 100644 index 0000000..fc9d79c --- /dev/null +++ b/docs/html/search/all_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js new file mode 100644 index 0000000..251adad --- /dev/null +++ b/docs/html/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['name_0',['name',['../structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780',1,'DecodeSignal::name()'],['../structDecodeFrame.html#aa0a7f8fd5bfde2148dfd0d838328f579',1,'DecodeFrame::name()'],['../structFrameInfo.html#abb53a7f93ed7abc0ea1ae4a8ccafcdcb',1,'FrameInfo::name()'],['../structSignalInfo.html#a379e422a00cad56f896cacf60455b088',1,'SignalInfo::name()']]], + ['nodetype_1',['NodeType',['../tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16',1,'tree_node.h']]] +]; diff --git a/docs/html/search/all_b.html b/docs/html/search/all_b.html new file mode 100644 index 0000000..dafb1fa --- /dev/null +++ b/docs/html/search/all_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js new file mode 100644 index 0000000..c896e33 --- /dev/null +++ b/docs/html/search/all_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['offset_0',['offset',['../structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74',1,'DecodeSignal::offset()'],['../structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e',1,'SignalInfo::offset()']]] +]; diff --git a/docs/html/search/all_c.html b/docs/html/search/all_c.html new file mode 100644 index 0000000..9df619d --- /dev/null +++ b/docs/html/search/all_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js new file mode 100644 index 0000000..badd1ba --- /dev/null +++ b/docs/html/search/all_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['parsefile_0',['ParseFile',['../classDbcParser.html#aef72826942c9095d653fafa435855e56',1,'DbcParser']]], + ['pgn_1',['pgn',['../structDecodeFrame.html#a1d3c54055c0cbceb73adf551f7067f23',1,'DecodeFrame::pgn()'],['../structFrameInfo.html#aee518b33f1000bf0b7f6e4a87474c943',1,'FrameInfo::pgn()']]], + ['physicalvalue_2',['physicalValue',['../structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978',1,'DecodedSignalValue']]], + ['public_3',['public',['../structDecodedFrameValue.html#adae123ac7fbb4a5c314b64b01109f4a8',1,'DecodedFrameValue::public()'],['../structDecodeFrame.html#a7f4e71bbdec3f424b625e724e3dfbf14',1,'DecodeFrame::public()'],['../structFrameInfo.html#a3f7e25d67ddae22f2ed50823a5a26084',1,'FrameInfo::public()']]] +]; diff --git a/docs/html/search/all_d.html b/docs/html/search/all_d.html new file mode 100644 index 0000000..95d8eec --- /dev/null +++ b/docs/html/search/all_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js new file mode 100644 index 0000000..55695ce --- /dev/null +++ b/docs/html/search/all_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['rawcanframe_0',['RawCanFrame',['../structRawCanFrame.html',1,'']]], + ['rawvalue_1',['rawValue',['../structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec',1,'DecodedSignalValue']]], + ['receivers_2',['receivers',['../structDecodeSignal.html#abdbae62a64d2df716bf60c6b67b30eaa',1,'DecodeSignal::receivers()'],['../structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3',1,'SignalInfo::receivers()']]] +]; diff --git a/docs/html/search/all_e.html b/docs/html/search/all_e.html new file mode 100644 index 0000000..a54e120 --- /dev/null +++ b/docs/html/search/all_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js new file mode 100644 index 0000000..d56d0c7 --- /dev/null +++ b/docs/html/search/all_e.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['signal_5finfo_2eh_0',['signal_info.h',['../signal__info_8h.html',1,'']]], + ['signalinfo_1',['SignalInfo',['../structSignalInfo.html',1,'']]], + ['startbit_2',['startBit',['../structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d',1,'DecodeSignal::startBit()'],['../structSignalInfo.html#ace290724f9801521609aedaa946d61f1',1,'SignalInfo::startBit()']]] +]; diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html new file mode 100644 index 0000000..8d0aed3 --- /dev/null +++ b/docs/html/search/all_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js new file mode 100644 index 0000000..b7db7b5 --- /dev/null +++ b/docs/html/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['transmitter_0',['transmitter',['../structDecodeFrame.html#ad78241dc40c793aabb8495b6989b81a9',1,'DecodeFrame::transmitter()'],['../structFrameInfo.html#a92749ec3798d4211a505860fb389a9e8',1,'FrameInfo::transmitter()']]], + ['tree_5fnode_2ecpp_1',['tree_node.cpp',['../tree__node_8cpp.html',1,'']]], + ['tree_5fnode_2eh_2',['tree_node.h',['../tree__node_8h.html',1,'']]], + ['treenode_3',['TreeNode',['../classTreeNode.html',1,'TreeNode'],['../classTreeNode.html#a984a98d5ccf7ef1f5a18094c6821f35d',1,'TreeNode::TreeNode()'],['../classTreeNode.html#a8e38dd591d8801d7ee3a7dbad90c67fc',1,'TreeNode::TreeNode(const FrameInfo &frame)'],['../classTreeNode.html#ab9f00f5253d56461bb2d420fd639c5ae',1,'TreeNode::TreeNode(const SignalInfo &signal)']]] +]; diff --git a/docs/html/search/classes_0.html b/docs/html/search/classes_0.html new file mode 100644 index 0000000..9d4f871 --- /dev/null +++ b/docs/html/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js new file mode 100644 index 0000000..85200ca --- /dev/null +++ b/docs/html/search/classes_0.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['dbcdatabase_0',['DbcDatabase',['../structDbcDatabase.html',1,'']]], + ['dbcdecodebuilder_1',['DbcDecodeBuilder',['../classDbcDecodeBuilder.html',1,'']]], + ['dbcdecoder_2',['DbcDecoder',['../classDbcDecoder.html',1,'']]], + ['dbcparser_3',['DbcParser',['../classDbcParser.html',1,'']]], + ['dbctreebuilder_4',['DbcTreeBuilder',['../classDbcTreeBuilder.html',1,'']]], + ['decodedatabase_5',['DecodeDatabase',['../structDecodeDatabase.html',1,'']]], + ['decodedframevalue_6',['DecodedFrameValue',['../structDecodedFrameValue.html',1,'']]], + ['decodedsignalvalue_7',['DecodedSignalValue',['../structDecodedSignalValue.html',1,'']]], + ['decodeframe_8',['DecodeFrame',['../structDecodeFrame.html',1,'']]], + ['decodesignal_9',['DecodeSignal',['../structDecodeSignal.html',1,'']]] +]; diff --git a/docs/html/search/classes_1.html b/docs/html/search/classes_1.html new file mode 100644 index 0000000..0557f9f --- /dev/null +++ b/docs/html/search/classes_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_1.js b/docs/html/search/classes_1.js new file mode 100644 index 0000000..4259dc9 --- /dev/null +++ b/docs/html/search/classes_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['frameinfo_0',['FrameInfo',['../structFrameInfo.html',1,'']]], + ['framekey_1',['FrameKey',['../structFrameKey.html',1,'']]], + ['framekeyhasher_2',['FrameKeyHasher',['../structFrameKeyHasher.html',1,'']]] +]; diff --git a/docs/html/search/classes_2.html b/docs/html/search/classes_2.html new file mode 100644 index 0000000..fa20861 --- /dev/null +++ b/docs/html/search/classes_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js new file mode 100644 index 0000000..ee60254 --- /dev/null +++ b/docs/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['rawcanframe_0',['RawCanFrame',['../structRawCanFrame.html',1,'']]] +]; diff --git a/docs/html/search/classes_3.html b/docs/html/search/classes_3.html new file mode 100644 index 0000000..98fbc87 --- /dev/null +++ b/docs/html/search/classes_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_3.js b/docs/html/search/classes_3.js new file mode 100644 index 0000000..3cc8467 --- /dev/null +++ b/docs/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['signalinfo_0',['SignalInfo',['../structSignalInfo.html',1,'']]] +]; diff --git a/docs/html/search/classes_4.html b/docs/html/search/classes_4.html new file mode 100644 index 0000000..3b6c51e --- /dev/null +++ b/docs/html/search/classes_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js new file mode 100644 index 0000000..740b87e --- /dev/null +++ b/docs/html/search/classes_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['treenode_0',['TreeNode',['../classTreeNode.html',1,'']]] +]; diff --git a/docs/html/search/close.svg b/docs/html/search/close.svg new file mode 100644 index 0000000..a933eea --- /dev/null +++ b/docs/html/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/docs/html/search/enums_0.html b/docs/html/search/enums_0.html new file mode 100644 index 0000000..ec25efd --- /dev/null +++ b/docs/html/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/enums_0.js b/docs/html/search/enums_0.js new file mode 100644 index 0000000..f52116f --- /dev/null +++ b/docs/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['byteorder_0',['ByteOrder',['../decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b',1,'decode_database.h']]] +]; diff --git a/docs/html/search/enums_1.html b/docs/html/search/enums_1.html new file mode 100644 index 0000000..cc99a33 --- /dev/null +++ b/docs/html/search/enums_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/enums_1.js b/docs/html/search/enums_1.js new file mode 100644 index 0000000..07a6d2a --- /dev/null +++ b/docs/html/search/enums_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nodetype_0',['NodeType',['../tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16',1,'tree_node.h']]] +]; diff --git a/docs/html/search/enums_2.html b/docs/html/search/enums_2.html new file mode 100644 index 0000000..cd5e771 --- /dev/null +++ b/docs/html/search/enums_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/enums_2.js b/docs/html/search/enums_2.js new file mode 100644 index 0000000..9189d7f --- /dev/null +++ b/docs/html/search/enums_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['valuetype_0',['ValueType',['../decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1',1,'decode_database.h']]] +]; diff --git a/docs/html/search/files_0.html b/docs/html/search/files_0.html new file mode 100644 index 0000000..2dbb4c2 --- /dev/null +++ b/docs/html/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_0.js b/docs/html/search/files_0.js new file mode 100644 index 0000000..e3df137 --- /dev/null +++ b/docs/html/search/files_0.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['dbc_5fdatabase_2eh_0',['dbc_database.h',['../dbc__database_8h.html',1,'']]], + ['dbc_5fdecode_5fbuilder_2ecpp_1',['dbc_decode_builder.cpp',['../dbc__decode__builder_8cpp.html',1,'']]], + ['dbc_5fdecode_5fbuilder_2eh_2',['dbc_decode_builder.h',['../dbc__decode__builder_8h.html',1,'']]], + ['dbc_5fdecoder_2ecpp_3',['dbc_decoder.cpp',['../dbc__decoder_8cpp.html',1,'']]], + ['dbc_5fdecoder_2eh_4',['dbc_decoder.h',['../dbc__decoder_8h.html',1,'']]], + ['dbc_5fparser_2ecpp_5',['dbc_parser.cpp',['../dbc__parser_8cpp.html',1,'']]], + ['dbc_5fparser_2eh_6',['dbc_parser.h',['../dbc__parser_8h.html',1,'']]], + ['dbc_5ftree_5fbuilder_2ecpp_7',['dbc_tree_builder.cpp',['../dbc__tree__builder_8cpp.html',1,'']]], + ['dbc_5ftree_5fbuilder_2eh_8',['dbc_tree_builder.h',['../dbc__tree__builder_8h.html',1,'']]], + ['decode_5fdatabase_2eh_9',['decode_database.h',['../decode__database_8h.html',1,'']]] +]; diff --git a/docs/html/search/files_1.html b/docs/html/search/files_1.html new file mode 100644 index 0000000..18ccd15 --- /dev/null +++ b/docs/html/search/files_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_1.js b/docs/html/search/files_1.js new file mode 100644 index 0000000..7cebf32 --- /dev/null +++ b/docs/html/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['frame_5finfo_2eh_0',['frame_info.h',['../frame__info_8h.html',1,'']]] +]; diff --git a/docs/html/search/files_2.html b/docs/html/search/files_2.html new file mode 100644 index 0000000..a4c2be4 --- /dev/null +++ b/docs/html/search/files_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_2.js b/docs/html/search/files_2.js new file mode 100644 index 0000000..695b4fd --- /dev/null +++ b/docs/html/search/files_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['main_2ecpp_0',['main.cpp',['../main_8cpp.html',1,'']]] +]; diff --git a/docs/html/search/files_3.html b/docs/html/search/files_3.html new file mode 100644 index 0000000..3ac4cfb --- /dev/null +++ b/docs/html/search/files_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_3.js b/docs/html/search/files_3.js new file mode 100644 index 0000000..e805d1d --- /dev/null +++ b/docs/html/search/files_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['signal_5finfo_2eh_0',['signal_info.h',['../signal__info_8h.html',1,'']]] +]; diff --git a/docs/html/search/files_4.html b/docs/html/search/files_4.html new file mode 100644 index 0000000..eb19ecf --- /dev/null +++ b/docs/html/search/files_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_4.js b/docs/html/search/files_4.js new file mode 100644 index 0000000..b1801c1 --- /dev/null +++ b/docs/html/search/files_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['tree_5fnode_2ecpp_0',['tree_node.cpp',['../tree__node_8cpp.html',1,'']]], + ['tree_5fnode_2eh_1',['tree_node.h',['../tree__node_8h.html',1,'']]] +]; diff --git a/docs/html/search/functions_0.html b/docs/html/search/functions_0.html new file mode 100644 index 0000000..3b739c7 --- /dev/null +++ b/docs/html/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js new file mode 100644 index 0000000..ca215cf --- /dev/null +++ b/docs/html/search/functions_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addchild_0',['AddChild',['../classTreeNode.html#a6161f2ebb92184eab4215d121870e788',1,'TreeNode']]] +]; diff --git a/docs/html/search/functions_1.html b/docs/html/search/functions_1.html new file mode 100644 index 0000000..2cef5e3 --- /dev/null +++ b/docs/html/search/functions_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js new file mode 100644 index 0000000..1ce5ea1 --- /dev/null +++ b/docs/html/search/functions_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['build_0',['Build',['../classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b',1,'DbcDecodeBuilder::Build()'],['../classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b',1,'DbcTreeBuilder::Build()']]] +]; diff --git a/docs/html/search/functions_2.html b/docs/html/search/functions_2.html new file mode 100644 index 0000000..3308c65 --- /dev/null +++ b/docs/html/search/functions_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js new file mode 100644 index 0000000..a362985 --- /dev/null +++ b/docs/html/search/functions_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['decode_0',['Decode',['../classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7',1,'DbcDecoder']]] +]; diff --git a/docs/html/search/functions_3.html b/docs/html/search/functions_3.html new file mode 100644 index 0000000..43ac697 --- /dev/null +++ b/docs/html/search/functions_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js new file mode 100644 index 0000000..4087d48 --- /dev/null +++ b/docs/html/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['findframe_0',['FindFrame',['../classDbcDecoder.html#ab2cfb2fb711c95d3a29365546b89f3da',1,'DbcDecoder']]] +]; diff --git a/docs/html/search/functions_4.html b/docs/html/search/functions_4.html new file mode 100644 index 0000000..d12c2df --- /dev/null +++ b/docs/html/search/functions_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js new file mode 100644 index 0000000..3319dfe --- /dev/null +++ b/docs/html/search/functions_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['getchild_0',['GetChild',['../classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6',1,'TreeNode::GetChild(std::size_t index) const'],['../classTreeNode.html#a81047bd7d2a4cc96b9ef5e20d0d63b5f',1,'TreeNode::GetChild(std::size_t index)']]], + ['getchildcount_1',['GetChildCount',['../classTreeNode.html#abdd82460187dca8d3e5d66f5d5c529ea',1,'TreeNode']]], + ['getframe_2',['GetFrame',['../classTreeNode.html#afc503b40004764163605d6dbdb4ef811',1,'TreeNode']]], + ['getname_3',['GetName',['../classTreeNode.html#aaac5b8d9dc9e5ae1f367d1adbcf20e18',1,'TreeNode']]], + ['getsignal_4',['GetSignal',['../classTreeNode.html#a226518612d0d00b5988a2c44fc21d3f1',1,'TreeNode']]], + ['gettype_5',['GetType',['../classTreeNode.html#afa2f4b0aafa12d3d41ed00df8e0250c9',1,'TreeNode']]] +]; diff --git a/docs/html/search/functions_5.html b/docs/html/search/functions_5.html new file mode 100644 index 0000000..7266236 --- /dev/null +++ b/docs/html/search/functions_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js new file mode 100644 index 0000000..514d33b --- /dev/null +++ b/docs/html/search/functions_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['parsefile_0',['ParseFile',['../classDbcParser.html#aef72826942c9095d653fafa435855e56',1,'DbcParser']]] +]; diff --git a/docs/html/search/functions_6.html b/docs/html/search/functions_6.html new file mode 100644 index 0000000..7f9fc45 --- /dev/null +++ b/docs/html/search/functions_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js new file mode 100644 index 0000000..b3a8b4b --- /dev/null +++ b/docs/html/search/functions_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['treenode_0',['TreeNode',['../classTreeNode.html#a984a98d5ccf7ef1f5a18094c6821f35d',1,'TreeNode::TreeNode()'],['../classTreeNode.html#a8e38dd591d8801d7ee3a7dbad90c67fc',1,'TreeNode::TreeNode(const FrameInfo &frame)'],['../classTreeNode.html#ab9f00f5253d56461bb2d420fd639c5ae',1,'TreeNode::TreeNode(const SignalInfo &signal)']]] +]; diff --git a/docs/html/search/mag_sel.svg b/docs/html/search/mag_sel.svg new file mode 100644 index 0000000..03626f6 --- /dev/null +++ b/docs/html/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/docs/html/search/nomatches.html b/docs/html/search/nomatches.html new file mode 100644 index 0000000..2b9360b --- /dev/null +++ b/docs/html/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/docs/html/search/pages_0.html b/docs/html/search/pages_0.html new file mode 100644 index 0000000..1981712 --- /dev/null +++ b/docs/html/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js new file mode 100644 index 0000000..10cf524 --- /dev/null +++ b/docs/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['dbc_20parser_20and_20runtime_20decode_20module_20documentation_0',['DBC Parser and Runtime Decode Module Documentation',['../md_README.html',1,'']]] +]; diff --git a/docs/html/search/search.css b/docs/html/search/search.css new file mode 100644 index 0000000..648a792 --- /dev/null +++ b/docs/html/search/search.css @@ -0,0 +1,263 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 19px; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/docs/html/search/search.js b/docs/html/search/search.js new file mode 100644 index 0000000..607f4e1 --- /dev/null +++ b/docs/html/search/search.js @@ -0,0 +1,802 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var width = 400; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/docs/html/search/search_r.png b/docs/html/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js new file mode 100644 index 0000000..da6f2db --- /dev/null +++ b/docs/html/search/searchdata.js @@ -0,0 +1,33 @@ +var indexSectionsWithContent = +{ + 0: "abcdfghilmnoprstuv", + 1: "dfrst", + 2: "dfmst", + 3: "abdfgpt", + 4: "bcdfhilmnoprstuv", + 5: "bnv", + 6: "d" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "files", + 3: "functions", + 4: "variables", + 5: "enums", + 6: "pages" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Files", + 3: "Functions", + 4: "Variables", + 5: "Enumerations", + 6: "Pages" +}; + diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html new file mode 100644 index 0000000..fd893a6 --- /dev/null +++ b/docs/html/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js new file mode 100644 index 0000000..b7fd3e2 --- /dev/null +++ b/docs/html/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['byteorder_0',['byteOrder',['../structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d',1,'DecodeSignal']]] +]; diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html new file mode 100644 index 0000000..5f8e440 --- /dev/null +++ b/docs/html/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js new file mode 100644 index 0000000..ec3952d --- /dev/null +++ b/docs/html/search/variables_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['canid_0',['canId',['../structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4',1,'RawCanFrame::canId()'],['../structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf',1,'DecodeFrame::canId()'],['../structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e',1,'FrameInfo::canId()']]], + ['comment_1',['comment',['../structDecodeSignal.html#ae28c905d4a2bc86419c2a8361bfea473',1,'DecodeSignal::comment()'],['../structDecodeFrame.html#a25819ef907a32391af5c9f7cae9cdb22',1,'DecodeFrame::comment()'],['../structFrameInfo.html#ace75121294f9d89b762080ab5643293c',1,'FrameInfo::comment()'],['../structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5',1,'SignalInfo::comment()']]] +]; diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html new file mode 100644 index 0000000..77a7f48 --- /dev/null +++ b/docs/html/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js new file mode 100644 index 0000000..862409f --- /dev/null +++ b/docs/html/search/variables_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['data_0',['data',['../structRawCanFrame.html#a0acb487612104c99c9907344c035df83',1,'RawCanFrame']]], + ['definition_1',['definition',['../structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7',1,'DecodedSignalValue::definition()'],['../structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c',1,'DecodedFrameValue::definition()']]], + ['dlc_2',['dlc',['../structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060',1,'DecodeFrame::dlc()'],['../structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9',1,'FrameInfo::dlc()']]] +]; diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html new file mode 100644 index 0000000..3ee62ba --- /dev/null +++ b/docs/html/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js new file mode 100644 index 0000000..ac972b6 --- /dev/null +++ b/docs/html/search/variables_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['factor_0',['factor',['../structDecodeSignal.html#a428c39913a366a8476dd291061354391',1,'DecodeSignal::factor()'],['../structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499',1,'SignalInfo::factor()']]], + ['frames_1',['frames',['../structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b',1,'DbcDatabase']]] +]; diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html new file mode 100644 index 0000000..640713f --- /dev/null +++ b/docs/html/search/variables_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js new file mode 100644 index 0000000..34587db --- /dev/null +++ b/docs/html/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['haspgn_0',['hasPgn',['../structDecodeFrame.html#a2551102670c4a540fced4c71da0b369d',1,'DecodeFrame::hasPgn()'],['../structFrameInfo.html#a4737a5420213ad4304724e39f3a4e55d',1,'FrameInfo::hasPgn()']]] +]; diff --git a/docs/html/search/variables_5.html b/docs/html/search/variables_5.html new file mode 100644 index 0000000..7b2ba97 --- /dev/null +++ b/docs/html/search/variables_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_5.js b/docs/html/search/variables_5.js new file mode 100644 index 0000000..b82eca0 --- /dev/null +++ b/docs/html/search/variables_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['isextended_0',['isExtended',['../structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7',1,'RawCanFrame::isExtended()'],['../structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41',1,'DecodeFrame::isExtended()'],['../structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf',1,'FrameInfo::isExtended()']]], + ['islittleendian_1',['isLittleEndian',['../structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c',1,'SignalInfo']]], + ['issigned_2',['isSigned',['../structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f',1,'SignalInfo']]] +]; diff --git a/docs/html/search/variables_6.html b/docs/html/search/variables_6.html new file mode 100644 index 0000000..fb1de8f --- /dev/null +++ b/docs/html/search/variables_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_6.js b/docs/html/search/variables_6.js new file mode 100644 index 0000000..12aa6af --- /dev/null +++ b/docs/html/search/variables_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['length_0',['length',['../structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb',1,'DecodeSignal::length()'],['../structSignalInfo.html#a1008b5201f71848177217bd52fb84baa',1,'SignalInfo::length()']]] +]; diff --git a/docs/html/search/variables_7.html b/docs/html/search/variables_7.html new file mode 100644 index 0000000..cf8dcf4 --- /dev/null +++ b/docs/html/search/variables_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_7.js b/docs/html/search/variables_7.js new file mode 100644 index 0000000..4b85df7 --- /dev/null +++ b/docs/html/search/variables_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['maximum_0',['maximum',['../structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7',1,'DecodeSignal::maximum()'],['../structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52',1,'SignalInfo::maximum()']]], + ['minimum_1',['minimum',['../structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25',1,'DecodeSignal::minimum()'],['../structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b',1,'SignalInfo::minimum()']]] +]; diff --git a/docs/html/search/variables_8.html b/docs/html/search/variables_8.html new file mode 100644 index 0000000..88cbb01 --- /dev/null +++ b/docs/html/search/variables_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_8.js b/docs/html/search/variables_8.js new file mode 100644 index 0000000..53c98f7 --- /dev/null +++ b/docs/html/search/variables_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['name_0',['name',['../structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780',1,'DecodeSignal::name()'],['../structDecodeFrame.html#aa0a7f8fd5bfde2148dfd0d838328f579',1,'DecodeFrame::name()'],['../structFrameInfo.html#abb53a7f93ed7abc0ea1ae4a8ccafcdcb',1,'FrameInfo::name()'],['../structSignalInfo.html#a379e422a00cad56f896cacf60455b088',1,'SignalInfo::name()']]] +]; diff --git a/docs/html/search/variables_9.html b/docs/html/search/variables_9.html new file mode 100644 index 0000000..36c49bd --- /dev/null +++ b/docs/html/search/variables_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_9.js b/docs/html/search/variables_9.js new file mode 100644 index 0000000..c896e33 --- /dev/null +++ b/docs/html/search/variables_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['offset_0',['offset',['../structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74',1,'DecodeSignal::offset()'],['../structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e',1,'SignalInfo::offset()']]] +]; diff --git a/docs/html/search/variables_a.html b/docs/html/search/variables_a.html new file mode 100644 index 0000000..0005c6a --- /dev/null +++ b/docs/html/search/variables_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_a.js b/docs/html/search/variables_a.js new file mode 100644 index 0000000..3195ea0 --- /dev/null +++ b/docs/html/search/variables_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['pgn_0',['pgn',['../structDecodeFrame.html#a1d3c54055c0cbceb73adf551f7067f23',1,'DecodeFrame::pgn()'],['../structFrameInfo.html#aee518b33f1000bf0b7f6e4a87474c943',1,'FrameInfo::pgn()']]], + ['physicalvalue_1',['physicalValue',['../structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978',1,'DecodedSignalValue']]], + ['public_2',['public',['../structDecodedFrameValue.html#adae123ac7fbb4a5c314b64b01109f4a8',1,'DecodedFrameValue::public()'],['../structDecodeFrame.html#a7f4e71bbdec3f424b625e724e3dfbf14',1,'DecodeFrame::public()'],['../structFrameInfo.html#a3f7e25d67ddae22f2ed50823a5a26084',1,'FrameInfo::public()']]] +]; diff --git a/docs/html/search/variables_b.html b/docs/html/search/variables_b.html new file mode 100644 index 0000000..757c068 --- /dev/null +++ b/docs/html/search/variables_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_b.js b/docs/html/search/variables_b.js new file mode 100644 index 0000000..4be5336 --- /dev/null +++ b/docs/html/search/variables_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['rawvalue_0',['rawValue',['../structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec',1,'DecodedSignalValue']]], + ['receivers_1',['receivers',['../structDecodeSignal.html#abdbae62a64d2df716bf60c6b67b30eaa',1,'DecodeSignal::receivers()'],['../structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3',1,'SignalInfo::receivers()']]] +]; diff --git a/docs/html/search/variables_c.html b/docs/html/search/variables_c.html new file mode 100644 index 0000000..451a136 --- /dev/null +++ b/docs/html/search/variables_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_c.js b/docs/html/search/variables_c.js new file mode 100644 index 0000000..95f24d0 --- /dev/null +++ b/docs/html/search/variables_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['startbit_0',['startBit',['../structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d',1,'DecodeSignal::startBit()'],['../structSignalInfo.html#ace290724f9801521609aedaa946d61f1',1,'SignalInfo::startBit()']]] +]; diff --git a/docs/html/search/variables_d.html b/docs/html/search/variables_d.html new file mode 100644 index 0000000..aea4286 --- /dev/null +++ b/docs/html/search/variables_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_d.js b/docs/html/search/variables_d.js new file mode 100644 index 0000000..9f0de08 --- /dev/null +++ b/docs/html/search/variables_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['transmitter_0',['transmitter',['../structDecodeFrame.html#ad78241dc40c793aabb8495b6989b81a9',1,'DecodeFrame::transmitter()'],['../structFrameInfo.html#a92749ec3798d4211a505860fb389a9e8',1,'FrameInfo::transmitter()']]] +]; diff --git a/docs/html/search/variables_e.html b/docs/html/search/variables_e.html new file mode 100644 index 0000000..ec3793e --- /dev/null +++ b/docs/html/search/variables_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_e.js b/docs/html/search/variables_e.js new file mode 100644 index 0000000..1917cda --- /dev/null +++ b/docs/html/search/variables_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unit_0',['unit',['../structDecodeSignal.html#a38eed9ca7581423fd8bfbedcffc12092',1,'DecodeSignal::unit()'],['../structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01',1,'SignalInfo::unit()']]] +]; diff --git a/docs/html/search/variables_f.html b/docs/html/search/variables_f.html new file mode 100644 index 0000000..ee82fce --- /dev/null +++ b/docs/html/search/variables_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_f.js b/docs/html/search/variables_f.js new file mode 100644 index 0000000..e8ddaf7 --- /dev/null +++ b/docs/html/search/variables_f.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['valid_0',['valid',['../structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686',1,'DecodedSignalValue::valid()'],['../structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0',1,'DecodedFrameValue::valid()']]], + ['valuetype_1',['valueType',['../structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8',1,'DecodeSignal']]] +]; diff --git a/docs/html/signal__info_8h.html b/docs/html/signal__info_8h.html index f41b4db..e19351b 100644 --- a/docs/html/signal__info_8h.html +++ b/docs/html/signal__info_8h.html @@ -5,10 +5,17 @@ -DBC framework: signal_info.h File Reference +DBC Framework: signal_info.h File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    @@ -70,9 +109,13 @@ Classes

    Definition in file signal_info.h.

    + - + diff --git a/docs/html/signal__info_8h.js b/docs/html/signal__info_8h.js new file mode 100644 index 0000000..5b565e1 --- /dev/null +++ b/docs/html/signal__info_8h.js @@ -0,0 +1,4 @@ +var signal__info_8h = +[ + [ "SignalInfo", "structSignalInfo.html", "structSignalInfo" ] +]; \ No newline at end of file diff --git a/docs/html/signal__info_8h_source.html b/docs/html/signal__info_8h_source.html index abdeb3e..95e3958 100644 --- a/docs/html/signal__info_8h_source.html +++ b/docs/html/signal__info_8h_source.html @@ -5,10 +5,17 @@ -DBC framework: signal_info.h Source File +DBC Framework: signal_info.h Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,62 +35,79 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    signal_info.h
    -Go to the documentation of this file.
    1/**
    -
    2 * @file signal_info.h
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#ifndef SIGNAL_INFO_H
    13#define SIGNAL_INFO_H
    14
    15#include <string>
    16#include <vector>
    17#include <cstdint>
    -
    18
    -
    19/**
    -
    20 * @brief Describes one signal inside a DBC frame.
    -
    21 */
    +
    18
    22struct SignalInfo {
    -
    23 std::string name; /**< Signal name. */
    -
    24 std::uint32_t startBit; /**< Start bit in DBC notation. */
    -
    25 std::uint32_t length; /**< Signal length in bits. */
    -
    26 bool isLittleEndian; /**< true for Intel, false for Motorola. */
    -
    27 bool isSigned; /**< true if signal is signed. */
    -
    28 double factor; /**< Scaling factor. */
    -
    29 double offset; /**< Physical offset. */
    -
    30 double minimum; /**< Minimum physical value. */
    -
    31 double maximum; /**< Maximum physical value. */
    -
    32 std::string unit; /**< Physical unit. */
    -
    33 std::vector<std::string> receivers; /**< Signal receivers. */
    -
    34 std::string comment; /**< Optional signal comment. */
    -
    35
    - +
    23 std::string name;
    +
    24 std::uint32_t startBit;
    +
    25 std::uint32_t length;
    + +
    27 bool isSigned;
    +
    28 double factor;
    +
    29 double offset;
    +
    30 double minimum;
    +
    31 double maximum;
    +
    32 std::string unit;
    +
    33 std::vector<std::string> receivers;
    +
    34 std::string comment;
    +
    37 : name()
    38 , startBit (0U)
    39 , length (0U)
    @@ -105,7 +130,6 @@
    std::vector< std::string > receivers
    Definition: signal_info.h:33
    std::string name
    Definition: signal_info.h:23
    bool isSigned
    Definition: signal_info.h:27
    -
    double offset
    Definition: signal_info.h:29
    std::string comment
    Definition: signal_info.h:34
    std::uint32_t startBit
    Definition: signal_info.h:24
    @@ -114,9 +138,13 @@
    double factor
    Definition: signal_info.h:28
    bool isLittleEndian
    Definition: signal_info.h:26
    +
    - + diff --git a/docs/html/structDbcDatabase-members.html b/docs/html/structDbcDatabase-members.html index ad6b28c..ec9b049 100644 --- a/docs/html/structDbcDatabase-members.html +++ b/docs/html/structDbcDatabase-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DbcDatabase Member List
    @@ -53,9 +91,12 @@
    framesDbcDatabase
    + - + diff --git a/docs/html/structDbcDatabase.html b/docs/html/structDbcDatabase.html index 2068a72..3154d21 100644 --- a/docs/html/structDbcDatabase.html +++ b/docs/html/structDbcDatabase.html @@ -5,10 +5,17 @@ -DBC framework: DbcDatabase Struct Reference +DBC Framework: DbcDatabase Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + @@ -90,9 +128,13 @@ Public Attributes
  • dbc_database.h
  • + - + diff --git a/docs/html/structDbcDatabase.js b/docs/html/structDbcDatabase.js new file mode 100644 index 0000000..43ad455 --- /dev/null +++ b/docs/html/structDbcDatabase.js @@ -0,0 +1,4 @@ +var structDbcDatabase = +[ + [ "frames", "structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b", null ] +]; \ No newline at end of file diff --git a/docs/html/structDecodeDatabase-members.html b/docs/html/structDecodeDatabase-members.html index cde9ba8..6c0bf65 100644 --- a/docs/html/structDecodeDatabase-members.html +++ b/docs/html/structDecodeDatabase-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DecodeDatabase Member List
    @@ -51,12 +89,15 @@

    This is the complete list of members for DecodeDatabase, including all inherited members.

    - - + +
    frameIndexByKeyDecodeDatabase
    framesDecodeDatabase
    frameIndexByKey (defined in DecodeDatabase)DecodeDatabase
    frames (defined in DecodeDatabase)DecodeDatabase
    + - + diff --git a/docs/html/structDecodeDatabase.html b/docs/html/structDecodeDatabase.html index 0ac4fbd..d5057a5 100644 --- a/docs/html/structDecodeDatabase.html +++ b/docs/html/structDecodeDatabase.html @@ -5,10 +5,17 @@ -DBC framework: DecodeDatabase Struct Reference +DBC Framework: DecodeDatabase Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    Public Attributes | @@ -69,24 +107,6 @@ Public Attributes

    Definition at line 132 of file decode_database.h.

    Member Data Documentation

    - -

    ◆ frameIndexByKey

    - -
    -
    - - - - -
    std::unordered_map<FrameKey, std::size_t, FrameKeyHasher> DecodeDatabase::frameIndexByKey
    -
    - -

    Definition at line 134 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcDecoder::FindFrame().

    - -
    -

    ◆ frames

    @@ -101,7 +121,21 @@ Public Attributes

    Definition at line 133 of file decode_database.h.

    -

    Referenced by DbcDecodeBuilder::Build(), DbcDecoder::FindFrame(), and main().

    +
    +
    + +

    ◆ frameIndexByKey

    + +
    +
    + + + + +
    std::unordered_map<FrameKey, std::size_t, FrameKeyHasher> DecodeDatabase::frameIndexByKey
    +
    + +

    Definition at line 134 of file decode_database.h.

    @@ -109,9 +143,13 @@ Public Attributes
  • decode_database.h
  • + - + diff --git a/docs/html/structDecodeFrame-members.html b/docs/html/structDecodeFrame-members.html index 4464859..0866aab 100644 --- a/docs/html/structDecodeFrame-members.html +++ b/docs/html/structDecodeFrame-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + + + - + diff --git a/docs/html/structDecodeFrame.html b/docs/html/structDecodeFrame.html index dec3d42..2b943d4 100644 --- a/docs/html/structDecodeFrame.html +++ b/docs/html/structDecodeFrame.html @@ -5,10 +5,17 @@ -DBC framework: DecodeFrame Struct Reference +DBC Framework: DecodeFrame Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,26 +35,55 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DecodeFrame Struct Reference
    @@ -58,11 +95,6 @@

    #include <decode_database.h>

    - - - -

    -Public Member Functions

     DecodeFrame ()
     
    @@ -81,8 +113,8 @@ Public Attributes - - + +

    Public Attributes

    std::string name
     
    std::string comment
     
    std::vector< DecodeSignalsignals
     
    std::vector< DecodeSignalpublic
     

    Detailed Description

    Runtime-ready frame definition.

    @@ -117,6 +149,25 @@ Public Attributes

    Member Data Documentation

    + +

    ◆ name

    + +
    +
    + + + + +
    std::string DecodeFrame::name
    +
    +

    Frame name.

    + +

    Definition at line 73 of file decode_database.h.

    + +

    Referenced by DbcDecodeBuilder::Build().

    + +
    +

    ◆ canId

    @@ -134,63 +185,6 @@ Public Attributes

    Referenced by DbcDecodeBuilder::Build().

    -
    - - -

    ◆ comment

    - -
    -
    - - - - -
    std::string DecodeFrame::comment
    -
    -

    Frame comment.

    - -

    Definition at line 80 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build().

    - -
    -
    - -

    ◆ dlc

    - -
    -
    - - - - -
    std::uint8_t DecodeFrame::dlc
    -
    -

    Payload length.

    - -

    Definition at line 76 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build().

    - -
    -
    - -

    ◆ hasPgn

    - -
    -
    - - - - -
    bool DecodeFrame::hasPgn
    -
    -

    true if PGN is valid.

    - -

    Definition at line 78 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build().

    -
    @@ -212,22 +206,22 @@ Public Attributes - -

    ◆ name

    + +

    ◆ dlc

    - +
    std::string DecodeFrame::namestd::uint8_t DecodeFrame::dlc
    -

    Frame name.

    +

    Payload length.

    -

    Definition at line 73 of file decode_database.h.

    +

    Definition at line 76 of file decode_database.h.

    -

    Referenced by DbcDecodeBuilder::Build(), and PrintDecodedFrame().

    +

    Referenced by DbcDecodeBuilder::Build().

    @@ -250,22 +244,22 @@ Public Attributes - -

    ◆ signals

    + +

    ◆ hasPgn

    - +
    std::vector<DecodeSignal> DecodeFrame::signalsbool DecodeFrame::hasPgn
    -

    Signal definitions.

    +

    true if PGN is valid.

    -

    Definition at line 81 of file decode_database.h.

    +

    Definition at line 78 of file decode_database.h.

    -

    Referenced by DbcDecodeBuilder::Build(), and DbcDecoder::Decode().

    +

    Referenced by DbcDecodeBuilder::Build().

    @@ -286,15 +280,55 @@ Public Attributes

    Referenced by DbcDecodeBuilder::Build().

    + + + +

    ◆ comment

    + +
    +
    + + + + +
    std::string DecodeFrame::comment
    +
    +

    Frame comment.

    + +

    Definition at line 80 of file decode_database.h.

    + +

    Referenced by DbcDecodeBuilder::Build().

    + +
    +
    + +

    ◆ public

    + +
    +
    + + + + +
    std::vector<DecodeSignal> DecodeFrame::public
    +
    +

    Signal definitions.

    + +

    Definition at line 81 of file decode_database.h.

    +

    The documentation for this struct was generated from the following file: + - + diff --git a/docs/html/structDecodeFrame.js b/docs/html/structDecodeFrame.js new file mode 100644 index 0000000..a662af7 --- /dev/null +++ b/docs/html/structDecodeFrame.js @@ -0,0 +1,12 @@ +var structDecodeFrame = +[ + [ "name", "structDecodeFrame.html#aa0a7f8fd5bfde2148dfd0d838328f579", null ], + [ "canId", "structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf", null ], + [ "isExtended", "structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41", null ], + [ "dlc", "structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060", null ], + [ "pgn", "structDecodeFrame.html#a1d3c54055c0cbceb73adf551f7067f23", null ], + [ "hasPgn", "structDecodeFrame.html#a2551102670c4a540fced4c71da0b369d", null ], + [ "transmitter", "structDecodeFrame.html#ad78241dc40c793aabb8495b6989b81a9", null ], + [ "comment", "structDecodeFrame.html#a25819ef907a32391af5c9f7cae9cdb22", null ], + [ "public", "structDecodeFrame.html#a7f4e71bbdec3f424b625e724e3dfbf14", null ] +]; \ No newline at end of file diff --git a/docs/html/structDecodeSignal-members.html b/docs/html/structDecodeSignal-members.html index 10a0df2..f6fc09b 100644 --- a/docs/html/structDecodeSignal-members.html +++ b/docs/html/structDecodeSignal-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DecodeSignal Member List
    @@ -53,7 +91,7 @@ - + @@ -65,9 +103,12 @@
    byteOrderDecodeSignal
    commentDecodeSignal
    DecodeSignal()DecodeSignalinline
    DecodeSignal() (defined in DecodeSignal)DecodeSignalinline
    factorDecodeSignal
    lengthDecodeSignal
    maximumDecodeSignal
    unitDecodeSignal
    valueTypeDecodeSignal
    + - + diff --git a/docs/html/structDecodeSignal.html b/docs/html/structDecodeSignal.html index 6163042..451312a 100644 --- a/docs/html/structDecodeSignal.html +++ b/docs/html/structDecodeSignal.html @@ -5,10 +5,17 @@ -DBC framework: DecodeSignal Struct Reference +DBC Framework: DecodeSignal Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,26 +35,55 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DecodeSignal Struct Reference
    @@ -58,11 +95,6 @@

    #include <decode_database.h>

    - - - -

    -Public Member Functions

     DecodeSignal ()
     
    @@ -123,120 +155,6 @@ Public Attributes

    Member Data Documentation

    - -

    ◆ byteOrder

    - -
    -
    -

    Public Attributes

    std::string name
    - - - -
    ByteOrder DecodeSignal::byteOrder
    -
    -

    Intel or Motorola.

    - -

    Definition at line 43 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcDecoder::ExtractUnsigned().

    - -
    -
    - -

    ◆ comment

    - -
    -
    - - - - -
    std::string DecodeSignal::comment
    -
    -

    Comment.

    - -

    Definition at line 51 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build().

    - -
    -
    - -

    ◆ factor

    - -
    -
    - - - - -
    double DecodeSignal::factor
    -
    -

    Scaling factor.

    - -

    Definition at line 45 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcDecoder::Decode().

    - -
    -
    - -

    ◆ length

    - -
    -
    - - - - -
    std::uint32_t DecodeSignal::length
    -
    -

    Signal length in bits.

    - -

    Definition at line 42 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), DbcDecoder::Decode(), and DbcDecoder::ExtractUnsigned().

    - -
    -
    - -

    ◆ maximum

    - -
    -
    - - - - -
    double DecodeSignal::maximum
    -
    -

    Maximum physical value.

    - -

    Definition at line 48 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build().

    - -
    -
    - -

    ◆ minimum

    - -
    -
    - - - - -
    double DecodeSignal::minimum
    -
    -

    Minimum physical value.

    - -

    Definition at line 47 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build().

    - -
    -

    ◆ name

    @@ -252,44 +170,6 @@ Public Attributes

    Definition at line 40 of file decode_database.h.

    -

    Referenced by DbcDecodeBuilder::Build(), and PrintDecodedFrame().

    - - - - -

    ◆ offset

    - -
    -
    - - - - -
    double DecodeSignal::offset
    -
    -

    Physical offset.

    - -

    Definition at line 46 of file decode_database.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcDecoder::Decode().

    - -
    -
    - -

    ◆ receivers

    - -
    -
    - - - - -
    std::vector<std::string> DecodeSignal::receivers
    -
    -

    Receivers.

    - -

    Definition at line 50 of file decode_database.h.

    -

    Referenced by DbcDecodeBuilder::Build().

    @@ -309,26 +189,45 @@ Public Attributes

    Definition at line 41 of file decode_database.h.

    -

    Referenced by DbcDecodeBuilder::Build(), and DbcDecoder::ExtractUnsigned().

    +

    Referenced by DbcDecodeBuilder::Build().

    - -

    ◆ unit

    + +

    ◆ length

    - +
    std::string DecodeSignal::unitstd::uint32_t DecodeSignal::length
    -

    Physical unit.

    +

    Signal length in bits.

    -

    Definition at line 49 of file decode_database.h.

    +

    Definition at line 42 of file decode_database.h.

    -

    Referenced by DbcDecodeBuilder::Build(), and PrintDecodedFrame().

    +

    Referenced by DbcDecodeBuilder::Build().

    + +
    +
    + +

    ◆ byteOrder

    + +
    +
    + + + + +
    ByteOrder DecodeSignal::byteOrder
    +
    +

    Intel or Motorola.

    + +

    Definition at line 43 of file decode_database.h.

    + +

    Referenced by DbcDecodeBuilder::Build().

    @@ -347,7 +246,126 @@ Public Attributes

    Definition at line 44 of file decode_database.h.

    -

    Referenced by DbcDecodeBuilder::Build(), and DbcDecoder::Decode().

    +

    Referenced by DbcDecoder::Decode().

    + + + + +

    ◆ factor

    + +
    +
    + + + + +
    double DecodeSignal::factor
    +
    +

    Scaling factor.

    + +

    Definition at line 45 of file decode_database.h.

    + +
    +
    + +

    ◆ offset

    + +
    +
    + + + + +
    double DecodeSignal::offset
    +
    +

    Physical offset.

    + +

    Definition at line 46 of file decode_database.h.

    + +
    +
    + +

    ◆ minimum

    + +
    +
    + + + + +
    double DecodeSignal::minimum
    +
    +

    Minimum physical value.

    + +

    Definition at line 47 of file decode_database.h.

    + +
    +
    + +

    ◆ maximum

    + +
    +
    + + + + +
    double DecodeSignal::maximum
    +
    +

    Maximum physical value.

    + +

    Definition at line 48 of file decode_database.h.

    + +
    +
    + +

    ◆ unit

    + +
    +
    + + + + +
    std::string DecodeSignal::unit
    +
    +

    Physical unit.

    + +

    Definition at line 49 of file decode_database.h.

    + +
    +
    + +

    ◆ receivers

    + +
    +
    + + + + +
    std::vector<std::string> DecodeSignal::receivers
    +
    +

    Receivers.

    + +

    Definition at line 50 of file decode_database.h.

    + +
    +
    + +

    ◆ comment

    + +
    +
    + + + + +
    std::string DecodeSignal::comment
    +
    +

    Comment.

    + +

    Definition at line 51 of file decode_database.h.

    @@ -355,9 +373,13 @@ Public Attributes
  • decode_database.h
  • + - + diff --git a/docs/html/structDecodeSignal.js b/docs/html/structDecodeSignal.js new file mode 100644 index 0000000..10381c9 --- /dev/null +++ b/docs/html/structDecodeSignal.js @@ -0,0 +1,15 @@ +var structDecodeSignal = +[ + [ "name", "structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780", null ], + [ "startBit", "structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d", null ], + [ "length", "structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb", null ], + [ "byteOrder", "structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d", null ], + [ "valueType", "structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8", null ], + [ "factor", "structDecodeSignal.html#a428c39913a366a8476dd291061354391", null ], + [ "offset", "structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74", null ], + [ "minimum", "structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25", null ], + [ "maximum", "structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7", null ], + [ "unit", "structDecodeSignal.html#a38eed9ca7581423fd8bfbedcffc12092", null ], + [ "receivers", "structDecodeSignal.html#abdbae62a64d2df716bf60c6b67b30eaa", null ], + [ "comment", "structDecodeSignal.html#ae28c905d4a2bc86419c2a8361bfea473", null ] +]; \ No newline at end of file diff --git a/docs/html/structDecodedFrameValue-members.html b/docs/html/structDecodedFrameValue-members.html index 2573264..8bf0a21 100644 --- a/docs/html/structDecodedFrameValue-members.html +++ b/docs/html/structDecodedFrameValue-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DecodedFrameValue Member List
    @@ -51,14 +89,17 @@

    This is the complete list of members for DecodedFrameValue, including all inherited members.

    - + - +
    DecodedFrameValue()DecodedFrameValueinline
    DecodedFrameValue() (defined in DecodedFrameValue)DecodedFrameValueinline
    definitionDecodedFrameValue
    signalsDecodedFrameValue
    publicDecodedFrameValue
    validDecodedFrameValue
    + - + diff --git a/docs/html/structDecodedFrameValue.html b/docs/html/structDecodedFrameValue.html index 2ce38f5..8c4da38 100644 --- a/docs/html/structDecodedFrameValue.html +++ b/docs/html/structDecodedFrameValue.html @@ -5,10 +5,17 @@ -DBC framework: DecodedFrameValue Struct Reference +DBC Framework: DecodedFrameValue Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,26 +35,55 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DecodedFrameValue Struct Reference
    @@ -58,17 +95,12 @@

    #include <dbc_decoder.h>

    - - - -

    -Public Member Functions

     DecodedFrameValue ()
     
    - - + +

    Public Attributes

    const DecodeFramedefinition
     
    std::vector< DecodedSignalValuesignals
     
    std::vector< DecodedSignalValuepublic
     
    bool valid
     
    @@ -120,18 +152,18 @@ Public Attributes

    Definition at line 56 of file dbc_decoder.h.

    -

    Referenced by DbcDecoder::Decode(), and PrintDecodedFrame().

    +

    Referenced by DbcDecoder::Decode().

    - -

    ◆ signals

    + +

    ◆ public

    - +
    std::vector<DecodedSignalValue> DecodedFrameValue::signalsstd::vector<DecodedSignalValue> DecodedFrameValue::public
    @@ -139,8 +171,6 @@ Public Attributes

    Definition at line 57 of file dbc_decoder.h.

    -

    Referenced by DbcDecoder::Decode(), and PrintDecodedFrame().

    -
    @@ -158,7 +188,7 @@ Public Attributes

    Definition at line 58 of file dbc_decoder.h.

    -

    Referenced by DbcDecoder::Decode(), and PrintDecodedFrame().

    +

    Referenced by DbcDecoder::Decode().

    @@ -166,9 +196,13 @@ Public Attributes
  • dbc_decoder.h
  • + - + diff --git a/docs/html/structDecodedFrameValue.js b/docs/html/structDecodedFrameValue.js new file mode 100644 index 0000000..6e26145 --- /dev/null +++ b/docs/html/structDecodedFrameValue.js @@ -0,0 +1,6 @@ +var structDecodedFrameValue = +[ + [ "definition", "structDecodedFrameValue.html#a60dda1cc352d2c8087f0bdbc81dd266c", null ], + [ "public", "structDecodedFrameValue.html#adae123ac7fbb4a5c314b64b01109f4a8", null ], + [ "valid", "structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0", null ] +]; \ No newline at end of file diff --git a/docs/html/structDecodedSignalValue-members.html b/docs/html/structDecodedSignalValue-members.html index d0eaab6..fedfc2d 100644 --- a/docs/html/structDecodedSignalValue-members.html +++ b/docs/html/structDecodedSignalValue-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DecodedSignalValue Member List
    @@ -51,15 +89,18 @@

    This is the complete list of members for DecodedSignalValue, including all inherited members.

    - +
    DecodedSignalValue()DecodedSignalValueinline
    DecodedSignalValue() (defined in DecodedSignalValue)DecodedSignalValueinline
    definitionDecodedSignalValue
    physicalValueDecodedSignalValue
    rawValueDecodedSignalValue
    validDecodedSignalValue
    + - + diff --git a/docs/html/structDecodedSignalValue.html b/docs/html/structDecodedSignalValue.html index 0dcf1f8..4b01830 100644 --- a/docs/html/structDecodedSignalValue.html +++ b/docs/html/structDecodedSignalValue.html @@ -5,10 +5,17 @@ -DBC framework: DecodedSignalValue Struct Reference +DBC Framework: DecodedSignalValue Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,26 +35,55 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    DecodedSignalValue Struct Reference
    @@ -58,11 +95,6 @@

    #include <dbc_decoder.h>

    - - - -

    -Public Member Functions

     DecodedSignalValue ()
     
    @@ -122,26 +154,7 @@ Public Attributes

    Definition at line 39 of file dbc_decoder.h.

    -

    Referenced by DbcDecoder::Decode(), and PrintDecodedFrame().

    - - - - -

    ◆ physicalValue

    - -
    -
    -

    Public Attributes

    const DecodeSignaldefinition
    - - - -
    double DecodedSignalValue::physicalValue
    -
    -

    Converted physical value.

    - -

    Definition at line 41 of file dbc_decoder.h.

    - -

    Referenced by DbcDecoder::Decode(), and PrintDecodedFrame().

    +

    Referenced by DbcDecoder::Decode().

    @@ -160,7 +173,22 @@ Public Attributes

    Definition at line 40 of file dbc_decoder.h.

    -

    Referenced by DbcDecoder::Decode(), and PrintDecodedFrame().

    + + + +

    ◆ physicalValue

    + +
    +
    + + + + +
    double DecodedSignalValue::physicalValue
    +
    +

    Converted physical value.

    + +

    Definition at line 41 of file dbc_decoder.h.

    @@ -179,7 +207,7 @@ Public Attributes

    Definition at line 42 of file dbc_decoder.h.

    -

    Referenced by DbcDecoder::Decode(), and PrintDecodedFrame().

    +

    Referenced by DbcDecoder::Decode().

    @@ -187,9 +215,13 @@ Public Attributes
  • dbc_decoder.h
  • + - + diff --git a/docs/html/structDecodedSignalValue.js b/docs/html/structDecodedSignalValue.js new file mode 100644 index 0000000..bbf0127 --- /dev/null +++ b/docs/html/structDecodedSignalValue.js @@ -0,0 +1,7 @@ +var structDecodedSignalValue = +[ + [ "definition", "structDecodedSignalValue.html#acadc3b3bb21dd6b0412d342c7e6b20d7", null ], + [ "rawValue", "structDecodedSignalValue.html#a5138b825940e34689f7b3891627ee9ec", null ], + [ "physicalValue", "structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978", null ], + [ "valid", "structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686", null ] +]; \ No newline at end of file diff --git a/docs/html/structFrameInfo-members.html b/docs/html/structFrameInfo-members.html index 03dbb8d..b55daa1 100644 --- a/docs/html/structFrameInfo-members.html +++ b/docs/html/structFrameInfo-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + + + - + diff --git a/docs/html/structFrameInfo.html b/docs/html/structFrameInfo.html index 770acb0..abfd547 100644 --- a/docs/html/structFrameInfo.html +++ b/docs/html/structFrameInfo.html @@ -5,10 +5,17 @@ -DBC framework: FrameInfo Struct Reference +DBC Framework: FrameInfo Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,26 +35,55 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    FrameInfo Struct Reference
    @@ -58,11 +95,6 @@

    #include <frame_info.h>

    - - - -

    -Public Member Functions

     FrameInfo ()
     
    @@ -81,8 +113,8 @@ Public Attributes - - + +

    Public Attributes

    std::string name
     
    std::string comment
     
    std::vector< SignalInfosignals
     
    std::vector< SignalInfopublic
     

    Detailed Description

    Describes one CAN frame from a DBC file.

    @@ -117,6 +149,25 @@ Public Attributes

    Member Data Documentation

    + +

    ◆ name

    + +
    +
    + + + + +
    std::string FrameInfo::name
    +
    +

    Frame name.

    + +

    Definition at line 25 of file frame_info.h.

    + +

    Referenced by DbcDecodeBuilder::Build().

    + +
    +

    ◆ canId

    @@ -132,64 +183,7 @@ Public Attributes

    Definition at line 26 of file frame_info.h.

    -

    Referenced by DbcDecodeBuilder::Build(), DbcParser::ParseFrameLine(), and PrintTree().

    - -
    - - -

    ◆ comment

    - -
    -
    - - - - -
    std::string FrameInfo::comment
    -
    -

    Optional frame comment.

    - -

    Definition at line 32 of file frame_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseCommentLine().

    - -
    -
    - -

    ◆ dlc

    - -
    -
    - - - - -
    std::uint8_t FrameInfo::dlc
    -
    -

    Frame payload length.

    - -

    Definition at line 30 of file frame_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), DbcParser::ParseFrameLine(), and PrintTree().

    - -
    -
    - -

    ◆ hasPgn

    - -
    -
    - - - - -
    bool FrameInfo::hasPgn
    -
    -

    true if PGN was derived.

    - -

    Definition at line 29 of file frame_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), DbcParser::ParseFrameLine(), and PrintTree().

    +

    Referenced by DbcDecodeBuilder::Build().

    @@ -208,26 +202,7 @@ Public Attributes

    Definition at line 27 of file frame_info.h.

    -

    Referenced by DbcDecodeBuilder::Build(), DbcParser::ParseFrameLine(), and PrintTree().

    - - - - -

    ◆ name

    - -
    -
    - - - - -
    std::string FrameInfo::name
    -
    -

    Frame name.

    - -

    Definition at line 25 of file frame_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseFrameLine().

    +

    Referenced by DbcDecodeBuilder::Build().

    @@ -246,26 +221,45 @@ Public Attributes

    Definition at line 28 of file frame_info.h.

    -

    Referenced by DbcDecodeBuilder::Build(), DbcParser::ParseFrameLine(), and PrintTree().

    +

    Referenced by DbcDecodeBuilder::Build().

    - -

    ◆ signals

    + +

    ◆ hasPgn

    - +
    std::vector<SignalInfo> FrameInfo::signalsbool FrameInfo::hasPgn
    -

    Signals contained in the frame.

    +

    true if PGN was derived.

    -

    Definition at line 33 of file frame_info.h.

    +

    Definition at line 29 of file frame_info.h.

    -

    Referenced by DbcTreeBuilder::Build(), DbcDecodeBuilder::Build(), DbcParser::FindSignalByName(), and DbcParser::ParseFile().

    +

    Referenced by DbcDecodeBuilder::Build().

    + +
    +
    + +

    ◆ dlc

    + +
    +
    + + + + +
    std::uint8_t FrameInfo::dlc
    +
    +

    Frame payload length.

    + +

    Definition at line 30 of file frame_info.h.

    + +

    Referenced by DbcDecodeBuilder::Build().

    @@ -284,7 +278,43 @@ Public Attributes

    Definition at line 31 of file frame_info.h.

    -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseFrameLine().

    +

    Referenced by DbcDecodeBuilder::Build().

    + + + + +

    ◆ comment

    + +
    +
    + + + + +
    std::string FrameInfo::comment
    +
    +

    Optional frame comment.

    + +

    Definition at line 32 of file frame_info.h.

    + +

    Referenced by DbcDecodeBuilder::Build().

    + +
    +
    + +

    ◆ public

    + +
    +
    + + + + +
    std::vector<SignalInfo> FrameInfo::public
    +
    +

    Signals contained in the frame.

    + +

    Definition at line 33 of file frame_info.h.

    @@ -292,9 +322,13 @@ Public Attributes
  • frame_info.h
  • + - + diff --git a/docs/html/structFrameInfo.js b/docs/html/structFrameInfo.js new file mode 100644 index 0000000..7a9f055 --- /dev/null +++ b/docs/html/structFrameInfo.js @@ -0,0 +1,12 @@ +var structFrameInfo = +[ + [ "name", "structFrameInfo.html#abb53a7f93ed7abc0ea1ae4a8ccafcdcb", null ], + [ "canId", "structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e", null ], + [ "isExtended", "structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf", null ], + [ "pgn", "structFrameInfo.html#aee518b33f1000bf0b7f6e4a87474c943", null ], + [ "hasPgn", "structFrameInfo.html#a4737a5420213ad4304724e39f3a4e55d", null ], + [ "dlc", "structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9", null ], + [ "transmitter", "structFrameInfo.html#a92749ec3798d4211a505860fb389a9e8", null ], + [ "comment", "structFrameInfo.html#ace75121294f9d89b762080ab5643293c", null ], + [ "public", "structFrameInfo.html#a3f7e25d67ddae22f2ed50823a5a26084", null ] +]; \ No newline at end of file diff --git a/docs/html/structFrameKey-members.html b/docs/html/structFrameKey-members.html index 7310bfc..010c2c0 100644 --- a/docs/html/structFrameKey-members.html +++ b/docs/html/structFrameKey-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    FrameKey Member List
    @@ -51,15 +89,18 @@

    This is the complete list of members for FrameKey, including all inherited members.

    - - - - - + + + + +
    canIdFrameKey
    FrameKey()FrameKeyinline
    FrameKey(std::uint32_t id, bool extended)FrameKeyinline
    isExtendedFrameKey
    operator==(const FrameKey &other) constFrameKeyinline
    canId (defined in FrameKey)FrameKey
    FrameKey() (defined in FrameKey)FrameKeyinline
    FrameKey(std::uint32_t id, bool extended) (defined in FrameKey)FrameKeyinline
    isExtended (defined in FrameKey)FrameKey
    operator==(const FrameKey &other) const (defined in FrameKey)FrameKeyinline
    + - + diff --git a/docs/html/structFrameKey.html b/docs/html/structFrameKey.html index a9e39a4..015887e 100644 --- a/docs/html/structFrameKey.html +++ b/docs/html/structFrameKey.html @@ -5,10 +5,17 @@ -DBC framework: FrameKey Struct Reference +DBC Framework: FrameKey Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    Public Member Functions | @@ -60,8 +98,6 @@ - - @@ -171,8 +207,6 @@ Public Attributes

    Definition at line 113 of file decode_database.h.

    -

    References canId, and isExtended.

    -

    Member Data Documentation

    @@ -190,8 +224,6 @@ Public Attributes

    Definition at line 100 of file decode_database.h.

    -

    Referenced by FrameKeyHasher::operator()(), and operator==().

    - @@ -208,17 +240,19 @@ Public Attributes

    Definition at line 101 of file decode_database.h.

    -

    Referenced by FrameKeyHasher::operator()(), and operator==().

    -
    The documentation for this struct was generated from the following file: + - + diff --git a/docs/html/structFrameKeyHasher-members.html b/docs/html/structFrameKeyHasher-members.html index 4ad2989..1585d35 100644 --- a/docs/html/structFrameKeyHasher-members.html +++ b/docs/html/structFrameKeyHasher-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ @@ -27,23 +35,53 @@ - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    FrameKeyHasher Member List
    @@ -51,11 +89,14 @@

    This is the complete list of members for FrameKeyHasher, including all inherited members.

    Public Member Functions

     FrameKey ()
     
     FrameKey (std::uint32_t id, bool extended)
     
    bool operator== (const FrameKey &other) const
    -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    - +
    operator()(const FrameKey &key) constFrameKeyHasherinline
    operator()(const FrameKey &key) const (defined in FrameKeyHasher)FrameKeyHasherinline
    +
    - + diff --git a/docs/html/structFrameKeyHasher.html b/docs/html/structFrameKeyHasher.html index 9919ed5..e22e46e 100644 --- a/docs/html/structFrameKeyHasher.html +++ b/docs/html/structFrameKeyHasher.html @@ -5,10 +5,17 @@ -DBC framework: FrameKeyHasher Struct Reference +DBC Framework: FrameKeyHasher Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    Public Member Functions | @@ -93,17 +131,19 @@ Public Member Functions

    Definition at line 122 of file decode_database.h.

    -

    References FrameKey::canId, and FrameKey::isExtended.

    -

    The documentation for this struct was generated from the following file:
    + - + diff --git a/docs/html/structRawCanFrame-members.html b/docs/html/structRawCanFrame-members.html index 1d9410a..e3694ff 100644 --- a/docs/html/structRawCanFrame-members.html +++ b/docs/html/structRawCanFrame-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    RawCanFrame Member List
    @@ -54,11 +92,14 @@ canIdRawCanFrame dataRawCanFrame isExtendedRawCanFrame - RawCanFrame()RawCanFrameinline + RawCanFrame() (defined in RawCanFrame)RawCanFrameinline
    + - + diff --git a/docs/html/structRawCanFrame.html b/docs/html/structRawCanFrame.html index 863c3ef..3a7415f 100644 --- a/docs/html/structRawCanFrame.html +++ b/docs/html/structRawCanFrame.html @@ -5,10 +5,17 @@ -DBC framework: RawCanFrame Struct Reference +DBC Framework: RawCanFrame Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,26 +35,55 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    RawCanFrame Struct Reference
    @@ -58,11 +95,6 @@

    #include <dbc_decoder.h>

    - - - -

    -Public Member Functions

     RawCanFrame ()
     
    @@ -120,26 +152,7 @@ Public Attributes

    Definition at line 24 of file dbc_decoder.h.

    -

    Referenced by DbcDecoder::Decode(), and main().

    - - - - -

    ◆ data

    - -
    -
    -

    Public Attributes

    std::uint32_t canId
    - - - -
    std::vector<std::uint8_t> RawCanFrame::data
    -
    -

    Payload bytes.

    - -

    Definition at line 26 of file dbc_decoder.h.

    - -

    Referenced by DbcDecoder::Decode(), and main().

    +

    Referenced by DbcDecoder::Decode().

    @@ -158,7 +171,26 @@ Public Attributes

    Definition at line 25 of file dbc_decoder.h.

    -

    Referenced by DbcDecoder::Decode(), and main().

    +

    Referenced by DbcDecoder::Decode().

    + + + + +

    ◆ data

    + +
    +
    + + + + +
    std::vector<std::uint8_t> RawCanFrame::data
    +
    +

    Payload bytes.

    + +

    Definition at line 26 of file dbc_decoder.h.

    + +

    Referenced by DbcDecoder::Decode().

    @@ -166,9 +198,13 @@ Public Attributes
  • dbc_decoder.h
  • + - + diff --git a/docs/html/structRawCanFrame.js b/docs/html/structRawCanFrame.js new file mode 100644 index 0000000..b430f42 --- /dev/null +++ b/docs/html/structRawCanFrame.js @@ -0,0 +1,6 @@ +var structRawCanFrame = +[ + [ "canId", "structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4", null ], + [ "isExtended", "structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7", null ], + [ "data", "structRawCanFrame.html#a0acb487612104c99c9907344c035df83", null ] +]; \ No newline at end of file diff --git a/docs/html/structSignalInfo-members.html b/docs/html/structSignalInfo-members.html index f1f700a..cbac353 100644 --- a/docs/html/structSignalInfo-members.html +++ b/docs/html/structSignalInfo-members.html @@ -5,10 +5,17 @@ -DBC framework: Member List +DBC Framework: Member List + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,23 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    SignalInfo Member List
    @@ -61,13 +99,16 @@ nameSignalInfo offsetSignalInfo receiversSignalInfo - SignalInfo()SignalInfoinline + SignalInfo() (defined in SignalInfo)SignalInfoinline startBitSignalInfo unitSignalInfo
    + - + diff --git a/docs/html/structSignalInfo.html b/docs/html/structSignalInfo.html index d8517f6..b6dc5ff 100644 --- a/docs/html/structSignalInfo.html +++ b/docs/html/structSignalInfo.html @@ -5,10 +5,17 @@ -DBC framework: SignalInfo Struct Reference +DBC Framework: SignalInfo Struct Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,26 +35,55 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    SignalInfo Struct Reference
    @@ -58,11 +95,6 @@

    #include <signal_info.h>

    - - - -

    -Public Member Functions

     SignalInfo ()
     
    @@ -123,139 +155,6 @@ Public Attributes

    Member Data Documentation

    - -

    ◆ comment

    - -
    -
    -

    Public Attributes

    std::string name
    - - - -
    std::string SignalInfo::comment
    -
    -

    Optional signal comment.

    - -

    Definition at line 34 of file signal_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseCommentLine().

    - -
    -
    - -

    ◆ factor

    - -
    -
    - - - - -
    double SignalInfo::factor
    -
    -

    Scaling factor.

    - -

    Definition at line 28 of file signal_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseSignalLine().

    - -
    -
    - -

    ◆ isLittleEndian

    - -
    -
    - - - - -
    bool SignalInfo::isLittleEndian
    -
    -

    true for Intel, false for Motorola.

    - -

    Definition at line 26 of file signal_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseSignalLine().

    - -
    -
    - -

    ◆ isSigned

    - -
    -
    - - - - -
    bool SignalInfo::isSigned
    -
    -

    true if signal is signed.

    - -

    Definition at line 27 of file signal_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseSignalLine().

    - -
    -
    - -

    ◆ length

    - -
    -
    - - - - -
    std::uint32_t SignalInfo::length
    -
    -

    Signal length in bits.

    - -

    Definition at line 25 of file signal_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), DbcParser::ParseSignalLine(), and PrintTree().

    - -
    -
    - -

    ◆ maximum

    - -
    -
    - - - - -
    double SignalInfo::maximum
    -
    -

    Maximum physical value.

    - -

    Definition at line 31 of file signal_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseSignalLine().

    - -
    -
    - -

    ◆ minimum

    - -
    -
    - - - - -
    double SignalInfo::minimum
    -
    -

    Minimum physical value.

    - -

    Definition at line 30 of file signal_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseSignalLine().

    - -
    -

    ◆ name

    @@ -271,45 +170,7 @@ Public Attributes

    Definition at line 23 of file signal_info.h.

    -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseSignalLine().

    - - - - -

    ◆ offset

    - -
    -
    - - - - -
    double SignalInfo::offset
    -
    -

    Physical offset.

    - -

    Definition at line 29 of file signal_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseSignalLine().

    - -
    -
    - -

    ◆ receivers

    - -
    -
    - - - - -
    std::vector<std::string> SignalInfo::receivers
    -
    -

    Signal receivers.

    - -

    Definition at line 33 of file signal_info.h.

    - -

    Referenced by DbcDecodeBuilder::Build(), and DbcParser::ParseSignalLine().

    +

    Referenced by DbcDecodeBuilder::Build().

    @@ -328,7 +189,130 @@ Public Attributes

    Definition at line 24 of file signal_info.h.

    -

    Referenced by DbcDecodeBuilder::Build(), DbcParser::ParseSignalLine(), and PrintTree().

    +

    Referenced by DbcDecodeBuilder::Build().

    + + + + +

    ◆ length

    + +
    +
    + + + + +
    std::uint32_t SignalInfo::length
    +
    +

    Signal length in bits.

    + +

    Definition at line 25 of file signal_info.h.

    + +

    Referenced by DbcDecodeBuilder::Build().

    + +
    +
    + +

    ◆ isLittleEndian

    + +
    +
    + + + + +
    bool SignalInfo::isLittleEndian
    +
    +

    true for Intel, false for Motorola.

    + +

    Definition at line 26 of file signal_info.h.

    + +

    Referenced by DbcDecodeBuilder::Build().

    + +
    +
    + +

    ◆ isSigned

    + +
    +
    + + + + +
    bool SignalInfo::isSigned
    +
    +

    true if signal is signed.

    + +

    Definition at line 27 of file signal_info.h.

    + +
    +
    + +

    ◆ factor

    + +
    +
    + + + + +
    double SignalInfo::factor
    +
    +

    Scaling factor.

    + +

    Definition at line 28 of file signal_info.h.

    + +
    +
    + +

    ◆ offset

    + +
    +
    + + + + +
    double SignalInfo::offset
    +
    +

    Physical offset.

    + +

    Definition at line 29 of file signal_info.h.

    + +
    +
    + +

    ◆ minimum

    + +
    +
    + + + + +
    double SignalInfo::minimum
    +
    +

    Minimum physical value.

    + +

    Definition at line 30 of file signal_info.h.

    + +
    +
    + +

    ◆ maximum

    + +
    +
    + + + + +
    double SignalInfo::maximum
    +
    +

    Maximum physical value.

    + +

    Definition at line 31 of file signal_info.h.

    @@ -347,7 +331,39 @@ Public Attributes

    Definition at line 32 of file signal_info.h.

    -

    Referenced by DbcDecodeBuilder::Build(), DbcParser::ParseSignalLine(), and PrintTree().

    + + + +

    ◆ receivers

    + +
    +
    + + + + +
    std::vector<std::string> SignalInfo::receivers
    +
    +

    Signal receivers.

    + +

    Definition at line 33 of file signal_info.h.

    + +
    +
    + +

    ◆ comment

    + +
    +
    + + + + +
    std::string SignalInfo::comment
    +
    +

    Optional signal comment.

    + +

    Definition at line 34 of file signal_info.h.

    @@ -355,9 +371,13 @@ Public Attributes
  • signal_info.h
  • + - + diff --git a/docs/html/structSignalInfo.js b/docs/html/structSignalInfo.js new file mode 100644 index 0000000..229ec28 --- /dev/null +++ b/docs/html/structSignalInfo.js @@ -0,0 +1,15 @@ +var structSignalInfo = +[ + [ "name", "structSignalInfo.html#a379e422a00cad56f896cacf60455b088", null ], + [ "startBit", "structSignalInfo.html#ace290724f9801521609aedaa946d61f1", null ], + [ "length", "structSignalInfo.html#a1008b5201f71848177217bd52fb84baa", null ], + [ "isLittleEndian", "structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c", null ], + [ "isSigned", "structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f", null ], + [ "factor", "structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499", null ], + [ "offset", "structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e", null ], + [ "minimum", "structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b", null ], + [ "maximum", "structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52", null ], + [ "unit", "structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01", null ], + [ "receivers", "structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3", null ], + [ "comment", "structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5", null ] +]; \ No newline at end of file diff --git a/docs/html/svgpan.js b/docs/html/svgpan.js new file mode 100644 index 0000000..2678d38 --- /dev/null +++ b/docs/html/svgpan.js @@ -0,0 +1,323 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + The code below is based on SVGPan Library 1.2 and was modified for doxygen + to support both zooming and panning via the mouse and via embedded buttons. + + This code is licensed under the following BSD license: + + Copyright 2009-2010 Andrea Leofreddi . All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are + permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those of the + authors and should not be interpreted as representing official policies, either expressed + or implied, of Andrea Leofreddi. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +var root = document.documentElement; +var state = 'none'; +var stateOrigin; +var stateTf = root.createSVGMatrix(); +var cursorGrab = ' url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRFAAAA////////c3ilYwAAAAN0Uk5T//8A18oNQQAAAD1JREFUeNp0zlEKACAIA9Bt9z90bZBZkQj29qFBEuBOzQHSnWTTyckEfqUuZgFvslH4ch3qLCO/Kr8cAgwATw4Ax6XRCcoAAAAASUVORK5CYII="), move'; +var zoomSteps = 10; +var zoomInFactor; +var zoomOutFactor; +var windowWidth; +var windowHeight; +var svgDoc; +var minZoom; +var maxZoom; +if (!window) window=this; + +/** + * Show the graph in the middle of the view, scaled to fit + */ +function show() +{ + if (window.innerHeight) // Firefox + { + windowWidth = window.innerWidth; + windowHeight = window.innerHeight; + } + else if (document.documentElement.clientWidth) // Chrome/Safari + { + windowWidth = document.documentElement.clientWidth + windowHeight = document.documentElement.clientHeight + } + if (!windowWidth || !windowHeight) // failsafe + { + windowWidth = 800; + windowHeight = 600; + } + minZoom = Math.min(Math.min(viewHeight,windowHeight)/viewHeight,Math.min(viewWidth,windowWidth)/viewWidth); + maxZoom = minZoom+1.5; + zoomInFactor = Math.pow(maxZoom/minZoom,1.0/zoomSteps); + zoomOutFactor = 1.0/zoomInFactor; + + var g = svgDoc.getElementById('viewport'); + try + { + var bb = g.getBBox(); // this can throw an exception if css { display: none } + var tx = (windowWidth-viewWidth*minZoom+8)/(2*minZoom); + var ty = viewHeight+(windowHeight-viewHeight*minZoom)/(2*minZoom); + var a = 'scale('+minZoom+') rotate(0) translate('+tx+' '+ty+')'; + g.setAttribute('transform',a); + } + catch(e) {} +} + +/** + * Register handlers + */ +function init(evt) +{ + svgDoc = evt.target.ownerDocument; + try { + if (top.window && top.window.registerShow) { // register show function in html doc for dynamic sections + top.window.registerShow(sectionId,show); + } + } catch(e) { + // ugh, we are not allowed to talk to the parent; can happen with Chrome when viewing pages + // locally, since they treat every local page as having a different origin + } + show(); + + setAttributes(root, { + "onmousedown" : "handleMouseDown(evt)", + "onmousemove" : "handleMouseMove(evt)", + "onmouseup" : "handleMouseUp(evt)" + }); + + if (window.addEventListener) + { + if (navigator.userAgent.toLowerCase().indexOf('webkit') >= 0 || + navigator.userAgent.toLowerCase().indexOf("opera") >= 0 || + navigator.appVersion.indexOf("MSIE") != -1) + { + window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari/IE9 + } + else + { + window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others + } + } +} + +window.onresize=function() +{ + if (svgDoc) { show(); } +} + +/** + * Instance an SVGPoint object with given event coordinates. + */ +function getEventPoint(evt) +{ + var p = root.createSVGPoint(); + p.x = evt.clientX; + p.y = evt.clientY; + return p; +} + +/** + * Sets the current transform matrix of an element. + */ +function setCTM(element, matrix) +{ + var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")"; + element.setAttribute("transform", s); +} + +/** + * Sets attributes of an element. + */ +function setAttributes(element, attributes) +{ + for (i in attributes) + element.setAttributeNS(null, i, attributes[i]); +} + +function doZoom(g,point,zoomFactor) +{ + var p = point.matrixTransform(g.getCTM().inverse()); + var k = root.createSVGMatrix().translate(p.x, p.y).scale(zoomFactor).translate(-p.x, -p.y); + var n = g.getCTM().multiply(k); + var s = Math.max(n.a,n.d); + if (s>maxZoom) n=n.translate(p.x,p.y).scale(maxZoom/s).translate(-p.x,-p.y); + else if (s'); + d.write('Print SVG'); + d.write(''); + d.write('
    '+xs+'
    '); + d.write(''); + d.write(''); + d.close(); + } catch(e) { + alert('Failed to open popup window needed for printing!\n'+e.message); + } +} +/* @license-end */ diff --git a/docs/html/tabs.css b/docs/html/tabs.css index 720b1c6..fb0977a 100644 --- a/docs/html/tabs.css +++ b/docs/html/tabs.css @@ -1,61 +1 @@ -.tabs, .tabs2, .tabs3 { - background-image: url('tab_b.png'); - width: 100%; - z-index: 101; - font-size: 13px; - font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; -} - -.tabs2 { - font-size: 10px; -} -.tabs3 { - font-size: 9px; -} - -.tablist { - margin: 0; - padding: 0; - display: table; -} - -.tablist li { - float: left; - display: table-cell; - background-image: url('tab_b.png'); - line-height: 36px; - list-style: none; -} - -.tablist a { - display: block; - padding: 0 20px; - font-weight: bold; - background-image:url('tab_s.png'); - background-repeat:no-repeat; - background-position:right; - color: #283A5D; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; - outline: none; -} - -.tabs3 .tablist a { - padding: 0 10px; -} - -.tablist a:hover { - background-image: url('tab_h.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); - text-decoration: none; -} - -.tablist li.current a { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); -} - +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#666;-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} diff --git a/docs/html/tree__node_8cpp.html b/docs/html/tree__node_8cpp.html index 4bb189b..c116bbc 100644 --- a/docs/html/tree__node_8cpp.html +++ b/docs/html/tree__node_8cpp.html @@ -5,10 +5,17 @@ -DBC framework: tree_node.cpp File Reference +DBC Framework: tree_node.cpp File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    tree_node.cpp File Reference
    @@ -59,9 +98,13 @@

    Definition in file tree_node.cpp.

    + - + diff --git a/docs/html/tree__node_8cpp_source.html b/docs/html/tree__node_8cpp_source.html index d71545a..534d18a 100644 --- a/docs/html/tree__node_8cpp_source.html +++ b/docs/html/tree__node_8cpp_source.html @@ -5,10 +5,17 @@ -DBC framework: tree_node.cpp Source File +DBC Framework: tree_node.cpp Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,41 +35,62 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    tree_node.cpp
    -Go to the documentation of this file.
    1/**
    -
    2 * @file tree_node.cpp
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#include "tree_node.h"
    13
    -
    15 : m_type (NodeType::Root)
    +
    15 : m_type (NodeType::Root)
    16 , m_name ("dbc")
    17 , m_children()
    18 , m_frame()
    @@ -69,7 +98,7 @@
    20}
    21
    -
    23 : m_type (NodeType::Frame)
    +
    23 : m_type (NodeType::Frame)
    24 , m_name (frame.name)
    25 , m_children()
    26 , m_frame (new FrameInfo (frame))
    @@ -77,7 +106,7 @@
    28}
    29
    -
    31 : m_type (NodeType::Signal)
    +
    31 : m_type (NodeType::Signal)
    32 , m_name (signal.name)
    33 , m_children()
    34 , m_frame()
    @@ -86,67 +115,63 @@
    37
    38void TreeNode::AddChild (std::unique_ptr<TreeNode> child) {
    39 if (child)
    -
    40 m_children.push_back (std::move (child));
    +
    40 m_children.push_back (std::move (child));
    41}
    42
    43std::size_t TreeNode::GetChildCount() const {
    -
    44 return m_children.size();
    +
    44 return m_children.size();
    45}
    46
    47const TreeNode *TreeNode::GetChild (std::size_t index) const {
    -
    48 if (index >= m_children.size())
    +
    48 if (index >= m_children.size())
    49 return nullptr;
    50
    -
    51 return m_children[index].get();
    +
    51 return m_children[index].get();
    52}
    53
    54TreeNode *TreeNode::GetChild (std::size_t index) {
    -
    55 if (index >= m_children.size())
    +
    55 if (index >= m_children.size())
    56 return nullptr;
    57
    -
    58 return m_children[index].get();
    +
    58 return m_children[index].get();
    59}
    60
    -
    62 return m_type;
    +
    62 return m_type;
    63}
    64
    65const std::string &TreeNode::GetName() const {
    -
    66 return m_name;
    +
    66 return m_name;
    67}
    68
    -
    70 return m_frame.get();
    +
    70 return m_frame.get();
    71}
    72
    -
    74 return m_signal.get();
    +
    74 return m_signal.get();
    75}
    Tree node for later use in model/view or other hierarchy consumers.
    Definition: tree_node.h:35
    -
    NodeType m_type
    Definition: tree_node.h:113
    -
    std::vector< std::unique_ptr< TreeNode > > m_children
    Definition: tree_node.h:115
    const SignalInfo * GetSignal() const
    Get signal payload if node is signal.
    Definition: tree_node.cpp:73
    const TreeNode * GetChild(std::size_t index) const
    Get child by index.
    Definition: tree_node.cpp:47
    void AddChild(std::unique_ptr< TreeNode > child)
    Add child node.
    Definition: tree_node.cpp:38
    -
    std::unique_ptr< FrameInfo > m_frame
    Definition: tree_node.h:116
    TreeNode()
    Create root node.
    Definition: tree_node.cpp:14
    const std::string & GetName() const
    Get display name.
    Definition: tree_node.cpp:65
    std::size_t GetChildCount() const
    Get child count.
    Definition: tree_node.cpp:43
    -
    std::string m_name
    Definition: tree_node.h:114
    -
    std::unique_ptr< SignalInfo > m_signal
    Definition: tree_node.h:117
    NodeType GetType() const
    Get node type.
    Definition: tree_node.cpp:61
    const FrameInfo * GetFrame() const
    Get frame payload if node is frame.
    Definition: tree_node.cpp:69
    Describes one CAN frame from a DBC file.
    Definition: frame_info.h:24
    Describes one signal inside a DBC frame.
    Definition: signal_info.h:22
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    NodeType
    Type of a tree node.
    Definition: tree_node.h:26
    - - -
    +
    - + diff --git a/docs/html/tree__node_8h.html b/docs/html/tree__node_8h.html index ee53ea3..a48d999 100644 --- a/docs/html/tree__node_8h.html +++ b/docs/html/tree__node_8h.html @@ -5,10 +5,17 @@ -DBC framework: tree_node.h File Reference +DBC Framework: tree_node.h File Reference + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,22 +35,53 @@
    - - + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    Classes | @@ -70,9 +109,9 @@ Classes - @@ -104,20 +143,19 @@ Enumerations

    Type of a tree node.

    -

    Enumerations

    enum class  NodeType { Root -, Frame -, Signal +
    enum class  NodeType { Root +, Frame +, Signal }
     Type of a tree node. More...
     
    - - - -
    Enumerator
    Root 
    Frame 
    Signal 

    Definition at line 26 of file tree_node.h.

    + - + diff --git a/docs/html/tree__node_8h.js b/docs/html/tree__node_8h.js new file mode 100644 index 0000000..460c18d --- /dev/null +++ b/docs/html/tree__node_8h.js @@ -0,0 +1,9 @@ +var tree__node_8h = +[ + [ "TreeNode", "classTreeNode.html", "classTreeNode" ], + [ "NodeType", "tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16", [ + [ "Root", "tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad", null ], + [ "Frame", "tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a", null ], + [ "Signal", "tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398", null ] + ] ] +]; \ No newline at end of file diff --git a/docs/html/tree__node_8h_source.html b/docs/html/tree__node_8h_source.html index cf19e10..acb3935 100644 --- a/docs/html/tree__node_8h_source.html +++ b/docs/html/tree__node_8h_source.html @@ -5,10 +5,17 @@ -DBC framework: tree_node.h Source File +DBC Framework: tree_node.h Source File + + + + + + + @@ -18,8 +25,9 @@ -
    DBC framework +
    DBC Framework
    +
    DBC parsing and CAN signal decoding framework
    @@ -27,37 +35,58 @@
    - - + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    tree_node.h
    -Go to the documentation of this file.
    1/**
    -
    2 * @file tree_node.h
    -
    3 * @brief
    -
    4 *
    -
    5 * Created: 2026-03-13
    -
    6 * Author: Deeaitch (Dim. Himro)
    -
    7 *
    -
    8 * Licensed under the MIT License.
    -
    9 * See LICENSE file in the project root for full license text.
    -
    10 */
    -
    11
    +Go to the documentation of this file.
    1
    12#ifndef TREE_NODE_H
    13#define TREE_NODE_H
    14
    @@ -68,121 +97,61 @@
    19
    20#include "frame_info.h"
    21#include "signal_info.h"
    -
    22
    -
    23/**
    -
    24 * @brief Type of a tree node.
    -
    25 */
    +
    22
    26enum class NodeType {
    -
    27 Root,
    -
    28 Frame,
    -
    29 Signal
    +
    27 Root,
    +
    28 Frame,
    +
    29 Signal
    30};
    -
    31
    -
    32/**
    -
    33 * @brief Tree node for later use in model/view or other hierarchy consumers.
    -
    34 */
    +
    31
    35class TreeNode {
    -
    36 public:
    -
    37 /**
    -
    38 * @brief Create root node.
    -
    39 */
    +
    36 public:
    40 TreeNode();
    -
    41
    -
    42 /**
    -
    43 * @brief Create frame node.
    -
    44 * @param frame Frame payload.
    -
    45 */
    +
    41
    46 explicit TreeNode (const FrameInfo &frame);
    -
    47
    -
    48 /**
    -
    49 * @brief Create signal node.
    -
    50 * @param signal Signal payload.
    -
    51 */
    +
    47
    52 explicit TreeNode (const SignalInfo &signal);
    53
    -
    54 ~TreeNode() = default;
    +
    54 ~TreeNode() = default;
    55
    -
    56 TreeNode (const TreeNode &) = delete;
    -
    57 TreeNode &operator= (const TreeNode &) = delete;
    +
    56 TreeNode (const TreeNode &) = delete;
    +
    57 TreeNode &operator= (const TreeNode &) = delete;
    58
    -
    59 TreeNode (TreeNode &&) = default;
    - -
    61
    -
    62 /**
    -
    63 * @brief Add child node.
    -
    64 * @param child Child node to add.
    -
    65 */
    +
    59 TreeNode (TreeNode &&) = default;
    +
    60 TreeNode &operator= (TreeNode &&) = default;
    +
    61
    66 void AddChild (std::unique_ptr<TreeNode> child);
    -
    67
    -
    68 /**
    -
    69 * @brief Get child count.
    -
    70 * @return Number of children.
    -
    71 */
    +
    67
    72 std::size_t GetChildCount() const;
    -
    73
    -
    74 /**
    -
    75 * @brief Get child by index.
    -
    76 * @param index Child index.
    -
    77 * @return Child pointer or nullptr if index is invalid.
    -
    78 */
    +
    73
    79 const TreeNode *GetChild (std::size_t index) const;
    -
    80
    -
    81 /**
    -
    82 * @brief Get mutable child by index.
    -
    83 * @param index Child index.
    -
    84 * @return Child pointer or nullptr if index is invalid.
    -
    85 */
    +
    80
    86 TreeNode *GetChild (std::size_t index);
    -
    87
    -
    88 /**
    -
    89 * @brief Get node type.
    -
    90 * @return Node type.
    -
    91 */
    +
    87
    92 NodeType GetType() const;
    -
    93
    -
    94 /**
    -
    95 * @brief Get display name.
    -
    96 * @return Node name.
    -
    97 */
    +
    93
    98 const std::string &GetName() const;
    -
    99
    -
    100 /**
    -
    101 * @brief Get frame payload if node is frame.
    -
    102 * @return Pointer to frame info or nullptr.
    -
    103 */
    +
    99
    104 const FrameInfo *GetFrame() const;
    -
    105
    -
    106 /**
    -
    107 * @brief Get signal payload if node is signal.
    -
    108 * @return Pointer to signal info or nullptr.
    -
    109 */
    +
    105
    110 const SignalInfo *GetSignal() const;
    111
    112 private:
    - -
    114 std::string m_name;
    -
    115 std::vector<std::unique_ptr<TreeNode> > m_children;
    -
    116 std::unique_ptr<FrameInfo> m_frame;
    -
    117 std::unique_ptr<SignalInfo> m_signal;
    +
    113 NodeType m_type;
    +
    114 std::string m_name;
    +
    115 std::vector<std::unique_ptr<TreeNode> > m_children;
    +
    116 std::unique_ptr<FrameInfo> m_frame;
    +
    117 std::unique_ptr<SignalInfo> m_signal;
    118};
    119
    120#endif /* TREE_NODE_H */
    Tree node for later use in model/view or other hierarchy consumers.
    Definition: tree_node.h:35
    -
    NodeType m_type
    Definition: tree_node.h:113
    -
    std::vector< std::unique_ptr< TreeNode > > m_children
    Definition: tree_node.h:115
    const SignalInfo * GetSignal() const
    Get signal payload if node is signal.
    Definition: tree_node.cpp:73
    -
    TreeNode(TreeNode &&)=default
    const TreeNode * GetChild(std::size_t index) const
    Get child by index.
    Definition: tree_node.cpp:47
    -
    TreeNode(const TreeNode &)=delete
    void AddChild(std::unique_ptr< TreeNode > child)
    Add child node.
    Definition: tree_node.cpp:38
    -
    std::unique_ptr< FrameInfo > m_frame
    Definition: tree_node.h:116
    -
    ~TreeNode()=default
    TreeNode()
    Create root node.
    Definition: tree_node.cpp:14
    const std::string & GetName() const
    Get display name.
    Definition: tree_node.cpp:65
    std::size_t GetChildCount() const
    Get child count.
    Definition: tree_node.cpp:43
    -
    std::string m_name
    Definition: tree_node.h:114
    -
    TreeNode & operator=(const TreeNode &)=delete
    -
    std::unique_ptr< SignalInfo > m_signal
    Definition: tree_node.h:117
    NodeType GetType() const
    Get node type.
    Definition: tree_node.cpp:61
    const FrameInfo * GetFrame() const
    Get frame payload if node is frame.
    Definition: tree_node.cpp:69
    Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
    @@ -190,13 +159,14 @@
    Describes one CAN frame from a DBC file.
    Definition: frame_info.h:24
    Describes one signal inside a DBC frame.
    Definition: signal_info.h:22
    NodeType
    Type of a tree node.
    Definition: tree_node.h:26
    - - -
    +
    - +