From 8797f9dfe71660b35b19eb90e78385e419757859 Mon Sep 17 00:00:00 2001 From: ihedvall <92839244+ihedvall@users.noreply.github.com> Date: Fri, 26 May 2023 14:19:25 +0200 Subject: [PATCH] Added doxygen documentation and prepare for release 1.0 --- README.md | 24 +- docs/.gitignore | 5 + docs/404.html | 25 + docs/Gemfile | 39 + docs/Gemfile.lock | 268 +++ docs/_config.yml | 7 + docs/_includes/head-custom.html | 7 +- docs/assets/img/dbcviewer.png | Bin 0 -> 115347 bytes docs/assets/img/logo.png | Bin 3259 -> 5967 bytes docs/assets/img/mdfviewer.png | Bin 51714 -> 0 bytes docs/dbclib.md | 19 + docs/dbcviewer.md | 14 + docs/favicon.ico | Bin 0 -> 3259 bytes docs/index.md | 18 + docs/manual/html/annotated.html | 101 + docs/manual/html/attribute_8h.html | 164 ++ docs/manual/html/attribute_8h__dep__incl.map | 9 + docs/manual/html/attribute_8h__dep__incl.md5 | 1 + docs/manual/html/attribute_8h__dep__incl.png | Bin 0 -> 20348 bytes docs/manual/html/attribute_8h__incl.map | 6 + docs/manual/html/attribute_8h__incl.md5 | 1 + docs/manual/html/attribute_8h__incl.png | Bin 0 -> 3934 bytes docs/manual/html/attribute_8h_source.html | 248 ++ docs/manual/html/bc_s.png | Bin 0 -> 676 bytes docs/manual/html/bc_sd.png | Bin 0 -> 635 bytes docs/manual/html/bdwn.png | Bin 0 -> 147 bytes .../html/classdbc_1_1_attribute-members.html | 108 + docs/manual/html/classdbc_1_1_attribute.html | 182 ++ .../html/classdbc_1_1_dbc_file-members.html | 104 + docs/manual/html/classdbc_1_1_dbc_file.html | 209 ++ .../classdbc_1_1_dbc_message-members.html | 106 + .../manual/html/classdbc_1_1_dbc_message.html | 210 ++ .../html/classdbc_1_1_env_var-members.html | 113 + docs/manual/html/classdbc_1_1_env_var.html | 194 ++ ...lassdbc_1_1_i_sample_observer-members.html | 94 + .../html/classdbc_1_1_i_sample_observer.html | 180 ++ ..._1_1_i_sample_observer__inherit__graph.map | 4 + ..._1_1_i_sample_observer__inherit__graph.md5 | 1 + ..._1_1_i_sample_observer__inherit__graph.png | Bin 0 -> 1525 bytes .../html/classdbc_1_1_message-members.html | 130 ++ docs/manual/html/classdbc_1_1_message.html | 355 +++ .../html/classdbc_1_1_network-members.html | 137 ++ docs/manual/html/classdbc_1_1_network.html | 314 +++ .../html/classdbc_1_1_node-members.html | 99 + docs/manual/html/classdbc_1_1_node.html | 139 ++ .../html/classdbc_1_1_signal-members.html | 147 ++ docs/manual/html/classdbc_1_1_signal.html | 336 +++ .../classdbc_1_1_signal_group-members.html | 98 + .../html/classdbc_1_1_signal_group.html | 134 ++ .../classdbc_1_1_signal_observer-members.html | 113 + .../html/classdbc_1_1_signal_observer.html | 379 ++++ ...ssdbc_1_1_signal_observer__coll__graph.map | 4 + ...ssdbc_1_1_signal_observer__coll__graph.md5 | 1 + ...ssdbc_1_1_signal_observer__coll__graph.png | Bin 0 -> 1511 bytes ...bc_1_1_signal_observer__inherit__graph.map | 4 + ...bc_1_1_signal_observer__inherit__graph.md5 | 1 + ...bc_1_1_signal_observer__inherit__graph.png | Bin 0 -> 1511 bytes docs/manual/html/classes.html | 107 + docs/manual/html/closed.png | Bin 0 -> 132 bytes docs/manual/html/dbcfile_8h.html | 135 ++ docs/manual/html/dbcfile_8h__incl.map | 18 + docs/manual/html/dbcfile_8h__incl.md5 | 1 + docs/manual/html/dbcfile_8h__incl.png | Bin 0 -> 102282 bytes docs/manual/html/dbcfile_8h_source.html | 154 ++ .../manual/html/dbclib.css | 0 docs/manual/html/dbcmessage_8h.html | 129 ++ docs/manual/html/dbcmessage_8h__dep__incl.map | 4 + docs/manual/html/dbcmessage_8h__dep__incl.md5 | 1 + docs/manual/html/dbcmessage_8h__dep__incl.png | Bin 0 -> 1513 bytes docs/manual/html/dbcmessage_8h__incl.map | 5 + docs/manual/html/dbcmessage_8h__incl.md5 | 1 + docs/manual/html/dbcmessage_8h__incl.png | Bin 0 -> 2950 bytes docs/manual/html/dbcmessage_8h_source.html | 145 ++ .../dir_4e8d938e9ddb5a617c200d5739d1f41a.html | 87 + .../dir_67453f04da784cdd04890da01913ef0e.html | 133 ++ ...r_67453f04da784cdd04890da01913ef0e_dep.map | 4 + ...r_67453f04da784cdd04890da01913ef0e_dep.md5 | 1 + ...r_67453f04da784cdd04890da01913ef0e_dep.png | Bin 0 -> 788 bytes .../dir_d44c64559bbebec7f509842c48db8b23.html | 93 + docs/manual/html/doc.png | Bin 0 -> 746 bytes docs/manual/html/docd.png | Bin 0 -> 756 bytes docs/manual/html/doxygen.css | 1989 +++++++++++++++++ docs/manual/html/doxygen.svg | 26 + docs/manual/html/dynsections.js | 123 + docs/manual/html/envvar_8h.html | 152 ++ docs/manual/html/envvar_8h__dep__incl.map | 5 + docs/manual/html/envvar_8h__dep__incl.md5 | 1 + docs/manual/html/envvar_8h__dep__incl.png | Bin 0 -> 2339 bytes docs/manual/html/envvar_8h__incl.map | 7 + docs/manual/html/envvar_8h__incl.md5 | 1 + docs/manual/html/envvar_8h__incl.png | Bin 0 -> 5460 bytes docs/manual/html/envvar_8h_source.html | 204 ++ docs/manual/html/files.html | 100 + docs/manual/html/folderclosed.png | Bin 0 -> 616 bytes docs/manual/html/folderopen.png | Bin 0 -> 597 bytes docs/manual/html/functions.html | 92 + docs/manual/html/functions_b.html | 89 + docs/manual/html/functions_c.html | 93 + docs/manual/html/functions_d.html | 90 + docs/manual/html/functions_e.html | 89 + docs/manual/html/functions_f.html | 87 + docs/manual/html/functions_func.html | 91 + docs/manual/html/functions_func_b.html | 89 + docs/manual/html/functions_func_c.html | 93 + docs/manual/html/functions_func_d.html | 90 + docs/manual/html/functions_func_e.html | 89 + docs/manual/html/functions_func_f.html | 86 + docs/manual/html/functions_func_g.html | 102 + docs/manual/html/functions_func_i.html | 94 + docs/manual/html/functions_func_j.html | 85 + docs/manual/html/functions_func_l.html | 88 + docs/manual/html/functions_func_m.html | 92 + docs/manual/html/functions_func_n.html | 93 + docs/manual/html/functions_func_o.html | 86 + docs/manual/html/functions_func_p.html | 92 + docs/manual/html/functions_func_r.html | 90 + docs/manual/html/functions_func_s.html | 96 + docs/manual/html/functions_func_t.html | 88 + docs/manual/html/functions_func_u.html | 86 + docs/manual/html/functions_func_v.html | 89 + docs/manual/html/functions_func_~.html | 87 + docs/manual/html/functions_g.html | 102 + docs/manual/html/functions_i.html | 94 + docs/manual/html/functions_j.html | 85 + docs/manual/html/functions_l.html | 88 + docs/manual/html/functions_m.html | 93 + docs/manual/html/functions_n.html | 93 + docs/manual/html/functions_o.html | 86 + docs/manual/html/functions_p.html | 92 + docs/manual/html/functions_r.html | 91 + docs/manual/html/functions_s.html | 97 + docs/manual/html/functions_t.html | 88 + docs/manual/html/functions_u.html | 87 + docs/manual/html/functions_v.html | 90 + docs/manual/html/functions_vars.html | 89 + docs/manual/html/functions_~.html | 87 + docs/manual/html/graph_legend.html | 143 ++ docs/manual/html/graph_legend.md5 | 1 + docs/manual/html/graph_legend.png | Bin 0 -> 13520 bytes docs/manual/html/hierarchy.html | 102 + docs/manual/html/index.html | 94 + docs/manual/html/inherit_graph_0.map | 3 + docs/manual/html/inherit_graph_0.md5 | 1 + docs/manual/html/inherit_graph_0.png | Bin 0 -> 442 bytes docs/manual/html/inherit_graph_1.map | 3 + docs/manual/html/inherit_graph_1.md5 | 1 + docs/manual/html/inherit_graph_1.png | Bin 0 -> 446 bytes docs/manual/html/inherit_graph_10.map | 3 + docs/manual/html/inherit_graph_10.md5 | 1 + docs/manual/html/inherit_graph_10.png | Bin 0 -> 530 bytes docs/manual/html/inherit_graph_11.map | 3 + docs/manual/html/inherit_graph_11.md5 | 1 + docs/manual/html/inherit_graph_11.png | Bin 0 -> 508 bytes docs/manual/html/inherit_graph_2.map | 3 + docs/manual/html/inherit_graph_2.md5 | 1 + docs/manual/html/inherit_graph_2.png | Bin 0 -> 532 bytes docs/manual/html/inherit_graph_3.map | 3 + docs/manual/html/inherit_graph_3.md5 | 1 + docs/manual/html/inherit_graph_3.png | Bin 0 -> 440 bytes docs/manual/html/inherit_graph_4.map | 3 + docs/manual/html/inherit_graph_4.md5 | 1 + docs/manual/html/inherit_graph_4.png | Bin 0 -> 522 bytes docs/manual/html/inherit_graph_5.map | 4 + docs/manual/html/inherit_graph_5.md5 | 1 + docs/manual/html/inherit_graph_5.png | Bin 0 -> 1191 bytes docs/manual/html/inherit_graph_6.map | 3 + docs/manual/html/inherit_graph_6.md5 | 1 + docs/manual/html/inherit_graph_6.png | Bin 0 -> 452 bytes docs/manual/html/inherit_graph_7.map | 3 + docs/manual/html/inherit_graph_7.md5 | 1 + docs/manual/html/inherit_graph_7.png | Bin 0 -> 461 bytes docs/manual/html/inherit_graph_8.map | 3 + docs/manual/html/inherit_graph_8.md5 | 1 + docs/manual/html/inherit_graph_8.png | Bin 0 -> 402 bytes docs/manual/html/inherit_graph_9.map | 3 + docs/manual/html/inherit_graph_9.md5 | 1 + docs/manual/html/inherit_graph_9.png | Bin 0 -> 453 bytes docs/manual/html/inherits.html | 148 ++ docs/manual/html/isampleobserver_8h.html | 131 ++ .../html/isampleobserver_8h__dep__incl.map | 8 + .../html/isampleobserver_8h__dep__incl.md5 | 1 + .../html/isampleobserver_8h__dep__incl.png | Bin 0 -> 12079 bytes docs/manual/html/isampleobserver_8h__incl.map | 4 + docs/manual/html/isampleobserver_8h__incl.md5 | 1 + docs/manual/html/isampleobserver_8h__incl.png | Bin 0 -> 1464 bytes .../html/isampleobserver_8h_source.html | 109 + docs/manual/html/jquery.js | 34 + docs/manual/html/menu.js | 136 ++ docs/manual/html/menudata.js | 82 + docs/manual/html/message_8h.html | 148 ++ docs/manual/html/message_8h__dep__incl.map | 5 + docs/manual/html/message_8h__dep__incl.md5 | 1 + docs/manual/html/message_8h__dep__incl.png | Bin 0 -> 2380 bytes docs/manual/html/message_8h__incl.map | 11 + docs/manual/html/message_8h__incl.md5 | 1 + docs/manual/html/message_8h__incl.png | Bin 0 -> 32937 bytes docs/manual/html/message_8h_source.html | 244 ++ docs/manual/html/namespacedbc.html | 484 ++++ docs/manual/html/namespacemembers.html | 95 + docs/manual/html/namespacemembers_enum.html | 90 + docs/manual/html/namespacemembers_type.html | 87 + docs/manual/html/namespaces.html | 101 + docs/manual/html/nav_f.png | Bin 0 -> 153 bytes docs/manual/html/nav_fd.png | Bin 0 -> 169 bytes docs/manual/html/nav_g.png | Bin 0 -> 95 bytes docs/manual/html/nav_h.png | Bin 0 -> 98 bytes docs/manual/html/nav_hd.png | Bin 0 -> 114 bytes docs/manual/html/network_8h.html | 172 ++ docs/manual/html/network_8h__dep__incl.map | 4 + docs/manual/html/network_8h__dep__incl.md5 | 1 + docs/manual/html/network_8h__dep__incl.png | Bin 0 -> 1425 bytes docs/manual/html/network_8h__incl.map | 15 + docs/manual/html/network_8h__incl.md5 | 1 + docs/manual/html/network_8h__incl.png | Bin 0 -> 80859 bytes docs/manual/html/network_8h_source.html | 298 +++ docs/manual/html/node_8h.html | 133 ++ docs/manual/html/node_8h__dep__incl.map | 5 + docs/manual/html/node_8h__dep__incl.md5 | 1 + docs/manual/html/node_8h__dep__incl.png | Bin 0 -> 2302 bytes docs/manual/html/node_8h__incl.map | 7 + docs/manual/html/node_8h__incl.md5 | 1 + docs/manual/html/node_8h__incl.png | Bin 0 -> 8209 bytes docs/manual/html/node_8h_source.html | 136 ++ docs/manual/html/open.png | Bin 0 -> 123 bytes docs/manual/html/search/all_0.js | 15 + docs/manual/html/search/all_1.js | 9 + docs/manual/html/search/all_10.js | 29 + docs/manual/html/search/all_11.js | 7 + docs/manual/html/search/all_12.js | 8 + docs/manual/html/search/all_13.js | 9 + docs/manual/html/search/all_14.js | 4 + docs/manual/html/search/all_15.js | 6 + docs/manual/html/search/all_2.js | 13 + docs/manual/html/search/all_3.js | 18 + docs/manual/html/search/all_4.js | 16 + docs/manual/html/search/all_5.js | 9 + docs/manual/html/search/all_6.js | 21 + docs/manual/html/search/all_7.js | 4 + docs/manual/html/search/all_8.js | 16 + docs/manual/html/search/all_9.js | 4 + docs/manual/html/search/all_a.js | 7 + docs/manual/html/search/all_b.js | 18 + docs/manual/html/search/all_c.js | 19 + docs/manual/html/search/all_d.js | 6 + docs/manual/html/search/all_e.js | 12 + docs/manual/html/search/all_f.js | 13 + docs/manual/html/search/classes_0.js | 4 + docs/manual/html/search/classes_1.js | 5 + docs/manual/html/search/classes_2.js | 5 + docs/manual/html/search/classes_3.js | 4 + docs/manual/html/search/classes_4.js | 4 + docs/manual/html/search/classes_5.js | 5 + docs/manual/html/search/classes_6.js | 7 + docs/manual/html/search/close.svg | 31 + docs/manual/html/search/enums_0.js | 6 + docs/manual/html/search/enums_1.js | 4 + docs/manual/html/search/enums_2.js | 4 + docs/manual/html/search/enums_3.js | 4 + docs/manual/html/search/enums_4.js | 4 + docs/manual/html/search/enums_5.js | 4 + docs/manual/html/search/enumvalues_0.js | 4 + docs/manual/html/search/enumvalues_1.js | 9 + docs/manual/html/search/enumvalues_2.js | 6 + docs/manual/html/search/enumvalues_3.js | 6 + docs/manual/html/search/enumvalues_4.js | 4 + docs/manual/html/search/enumvalues_5.js | 5 + docs/manual/html/search/enumvalues_6.js | 4 + docs/manual/html/search/enumvalues_7.js | 5 + docs/manual/html/search/enumvalues_8.js | 7 + docs/manual/html/search/enumvalues_9.js | 4 + docs/manual/html/search/enumvalues_a.js | 5 + docs/manual/html/search/enumvalues_b.js | 7 + docs/manual/html/search/enumvalues_c.js | 5 + docs/manual/html/search/enumvalues_d.js | 4 + docs/manual/html/search/files_0.js | 4 + docs/manual/html/search/files_1.js | 5 + docs/manual/html/search/files_2.js | 4 + docs/manual/html/search/files_3.js | 4 + docs/manual/html/search/files_4.js | 4 + docs/manual/html/search/files_5.js | 5 + docs/manual/html/search/files_6.js | 6 + docs/manual/html/search/functions_0.js | 10 + docs/manual/html/search/functions_1.js | 8 + docs/manual/html/search/functions_10.js | 7 + docs/manual/html/search/functions_11.js | 5 + docs/manual/html/search/functions_12.js | 8 + docs/manual/html/search/functions_13.js | 6 + docs/manual/html/search/functions_2.js | 12 + docs/manual/html/search/functions_3.js | 9 + docs/manual/html/search/functions_4.js | 8 + docs/manual/html/search/functions_5.js | 5 + docs/manual/html/search/functions_6.js | 21 + docs/manual/html/search/functions_7.js | 13 + docs/manual/html/search/functions_8.js | 4 + docs/manual/html/search/functions_9.js | 7 + docs/manual/html/search/functions_a.js | 11 + docs/manual/html/search/functions_b.js | 12 + docs/manual/html/search/functions_c.js | 5 + docs/manual/html/search/functions_d.js | 11 + docs/manual/html/search/functions_e.js | 9 + docs/manual/html/search/functions_f.js | 15 + docs/manual/html/search/mag.svg | 37 + docs/manual/html/search/mag_d.svg | 37 + docs/manual/html/search/mag_sel.svg | 74 + docs/manual/html/search/mag_seld.svg | 74 + docs/manual/html/search/namespaces_0.js | 4 + docs/manual/html/search/pages_0.js | 4 + docs/manual/html/search/search.css | 291 +++ docs/manual/html/search/search.js | 816 +++++++ docs/manual/html/search/searchdata.js | 42 + docs/manual/html/search/typedefs_0.js | 4 + docs/manual/html/search/typedefs_1.js | 4 + docs/manual/html/search/typedefs_2.js | 4 + docs/manual/html/search/typedefs_3.js | 5 + docs/manual/html/search/variables_0.js | 4 + docs/manual/html/search/variables_1.js | 4 + docs/manual/html/search/variables_2.js | 4 + docs/manual/html/search/variables_3.js | 4 + docs/manual/html/search/variables_4.js | 4 + docs/manual/html/search/variables_5.js | 4 + docs/manual/html/search/variables_6.js | 4 + docs/manual/html/signal_8h.html | 173 ++ docs/manual/html/signal_8h__dep__incl.map | 7 + docs/manual/html/signal_8h__dep__incl.md5 | 1 + docs/manual/html/signal_8h__dep__incl.png | Bin 0 -> 8667 bytes docs/manual/html/signal_8h__incl.map | 10 + docs/manual/html/signal_8h__incl.md5 | 1 + docs/manual/html/signal_8h__incl.png | Bin 0 -> 15799 bytes docs/manual/html/signal_8h_source.html | 481 ++++ docs/manual/html/signalgroup_8h.html | 132 ++ .../manual/html/signalgroup_8h__dep__incl.map | 5 + .../manual/html/signalgroup_8h__dep__incl.md5 | 1 + .../manual/html/signalgroup_8h__dep__incl.png | Bin 0 -> 2467 bytes docs/manual/html/signalgroup_8h__incl.map | 6 + docs/manual/html/signalgroup_8h__incl.md5 | 1 + docs/manual/html/signalgroup_8h__incl.png | Bin 0 -> 3874 bytes docs/manual/html/signalgroup_8h_source.html | 129 ++ docs/manual/html/signalobserver_8h.html | 138 ++ docs/manual/html/signalobserver_8h__incl.map | 13 + docs/manual/html/signalobserver_8h__incl.md5 | 1 + docs/manual/html/signalobserver_8h__incl.png | Bin 0 -> 21372 bytes .../manual/html/signalobserver_8h_source.html | 342 +++ docs/manual/html/splitbar.png | Bin 0 -> 314 bytes docs/manual/html/splitbard.png | Bin 0 -> 282 bytes .../structdbc_1_1_extended_mux-members.html | 93 + .../html/structdbc_1_1_extended_mux.html | 118 + .../structdbc_1_1_signal_value-members.html | 96 + .../html/structdbc_1_1_signal_value.html | 130 ++ docs/manual/html/sync_off.png | Bin 0 -> 853 bytes docs/manual/html/sync_on.png | Bin 0 -> 845 bytes docs/manual/html/tab_a.png | Bin 0 -> 142 bytes docs/manual/html/tab_ad.png | Bin 0 -> 135 bytes docs/manual/html/tab_b.png | Bin 0 -> 169 bytes docs/manual/html/tab_bd.png | Bin 0 -> 173 bytes docs/manual/html/tab_h.png | Bin 0 -> 177 bytes docs/manual/html/tab_hd.png | Bin 0 -> 180 bytes docs/manual/html/tab_s.png | Bin 0 -> 184 bytes docs/manual/html/tab_sd.png | Bin 0 -> 188 bytes docs/manual/html/tabs.css | 1 + doxygen/dbclib.css | 8 + doxygen/mainpage.dox | 46 +- doxygen/namespaces.dox | 8 +- img/document.ico | Bin 0 -> 43006 bytes img/mdflib.ico | Bin 0 -> 136682 bytes img/mdflib.png | Bin 0 -> 1673 bytes include/dbc/attribute.h | 93 +- include/dbc/dbcfile.h | 48 +- include/dbc/dbcmessage.h | 48 +- include/dbc/envvar.h | 78 +- include/dbc/isampleobserver.h | 15 +- include/dbc/message.h | 78 +- include/dbc/network.h | 105 +- include/dbc/node.h | 25 +- include/dbc/signal.h | 178 +- include/dbc/signalgroup.h | 25 +- include/dbc/signalobserver.h | 80 +- 376 files changed, 19785 insertions(+), 270 deletions(-) create mode 100644 docs/.gitignore create mode 100644 docs/404.html create mode 100644 docs/Gemfile create mode 100644 docs/Gemfile.lock create mode 100644 docs/_config.yml create mode 100644 docs/assets/img/dbcviewer.png delete mode 100644 docs/assets/img/mdfviewer.png create mode 100644 docs/dbclib.md create mode 100644 docs/dbcviewer.md create mode 100644 docs/favicon.ico create mode 100644 docs/index.md create mode 100644 docs/manual/html/annotated.html create mode 100644 docs/manual/html/attribute_8h.html create mode 100644 docs/manual/html/attribute_8h__dep__incl.map create mode 100644 docs/manual/html/attribute_8h__dep__incl.md5 create mode 100644 docs/manual/html/attribute_8h__dep__incl.png create mode 100644 docs/manual/html/attribute_8h__incl.map create mode 100644 docs/manual/html/attribute_8h__incl.md5 create mode 100644 docs/manual/html/attribute_8h__incl.png create mode 100644 docs/manual/html/attribute_8h_source.html create mode 100644 docs/manual/html/bc_s.png create mode 100644 docs/manual/html/bc_sd.png create mode 100644 docs/manual/html/bdwn.png create mode 100644 docs/manual/html/classdbc_1_1_attribute-members.html create mode 100644 docs/manual/html/classdbc_1_1_attribute.html create mode 100644 docs/manual/html/classdbc_1_1_dbc_file-members.html create mode 100644 docs/manual/html/classdbc_1_1_dbc_file.html create mode 100644 docs/manual/html/classdbc_1_1_dbc_message-members.html create mode 100644 docs/manual/html/classdbc_1_1_dbc_message.html create mode 100644 docs/manual/html/classdbc_1_1_env_var-members.html create mode 100644 docs/manual/html/classdbc_1_1_env_var.html create mode 100644 docs/manual/html/classdbc_1_1_i_sample_observer-members.html create mode 100644 docs/manual/html/classdbc_1_1_i_sample_observer.html create mode 100644 docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.map create mode 100644 docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.md5 create mode 100644 docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.png create mode 100644 docs/manual/html/classdbc_1_1_message-members.html create mode 100644 docs/manual/html/classdbc_1_1_message.html create mode 100644 docs/manual/html/classdbc_1_1_network-members.html create mode 100644 docs/manual/html/classdbc_1_1_network.html create mode 100644 docs/manual/html/classdbc_1_1_node-members.html create mode 100644 docs/manual/html/classdbc_1_1_node.html create mode 100644 docs/manual/html/classdbc_1_1_signal-members.html create mode 100644 docs/manual/html/classdbc_1_1_signal.html create mode 100644 docs/manual/html/classdbc_1_1_signal_group-members.html create mode 100644 docs/manual/html/classdbc_1_1_signal_group.html create mode 100644 docs/manual/html/classdbc_1_1_signal_observer-members.html create mode 100644 docs/manual/html/classdbc_1_1_signal_observer.html create mode 100644 docs/manual/html/classdbc_1_1_signal_observer__coll__graph.map create mode 100644 docs/manual/html/classdbc_1_1_signal_observer__coll__graph.md5 create mode 100644 docs/manual/html/classdbc_1_1_signal_observer__coll__graph.png create mode 100644 docs/manual/html/classdbc_1_1_signal_observer__inherit__graph.map create mode 100644 docs/manual/html/classdbc_1_1_signal_observer__inherit__graph.md5 create mode 100644 docs/manual/html/classdbc_1_1_signal_observer__inherit__graph.png create mode 100644 docs/manual/html/classes.html create mode 100644 docs/manual/html/closed.png create mode 100644 docs/manual/html/dbcfile_8h.html create mode 100644 docs/manual/html/dbcfile_8h__incl.map create mode 100644 docs/manual/html/dbcfile_8h__incl.md5 create mode 100644 docs/manual/html/dbcfile_8h__incl.png create mode 100644 docs/manual/html/dbcfile_8h_source.html rename doxygen/utillib.css => docs/manual/html/dbclib.css (100%) create mode 100644 docs/manual/html/dbcmessage_8h.html create mode 100644 docs/manual/html/dbcmessage_8h__dep__incl.map create mode 100644 docs/manual/html/dbcmessage_8h__dep__incl.md5 create mode 100644 docs/manual/html/dbcmessage_8h__dep__incl.png create mode 100644 docs/manual/html/dbcmessage_8h__incl.map create mode 100644 docs/manual/html/dbcmessage_8h__incl.md5 create mode 100644 docs/manual/html/dbcmessage_8h__incl.png create mode 100644 docs/manual/html/dbcmessage_8h_source.html create mode 100644 docs/manual/html/dir_4e8d938e9ddb5a617c200d5739d1f41a.html create mode 100644 docs/manual/html/dir_67453f04da784cdd04890da01913ef0e.html create mode 100644 docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.map create mode 100644 docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.md5 create mode 100644 docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.png create mode 100644 docs/manual/html/dir_d44c64559bbebec7f509842c48db8b23.html create mode 100644 docs/manual/html/doc.png create mode 100644 docs/manual/html/docd.png create mode 100644 docs/manual/html/doxygen.css create mode 100644 docs/manual/html/doxygen.svg create mode 100644 docs/manual/html/dynsections.js create mode 100644 docs/manual/html/envvar_8h.html create mode 100644 docs/manual/html/envvar_8h__dep__incl.map create mode 100644 docs/manual/html/envvar_8h__dep__incl.md5 create mode 100644 docs/manual/html/envvar_8h__dep__incl.png create mode 100644 docs/manual/html/envvar_8h__incl.map create mode 100644 docs/manual/html/envvar_8h__incl.md5 create mode 100644 docs/manual/html/envvar_8h__incl.png create mode 100644 docs/manual/html/envvar_8h_source.html create mode 100644 docs/manual/html/files.html create mode 100644 docs/manual/html/folderclosed.png create mode 100644 docs/manual/html/folderopen.png create mode 100644 docs/manual/html/functions.html create mode 100644 docs/manual/html/functions_b.html create mode 100644 docs/manual/html/functions_c.html create mode 100644 docs/manual/html/functions_d.html create mode 100644 docs/manual/html/functions_e.html create mode 100644 docs/manual/html/functions_f.html create mode 100644 docs/manual/html/functions_func.html create mode 100644 docs/manual/html/functions_func_b.html create mode 100644 docs/manual/html/functions_func_c.html create mode 100644 docs/manual/html/functions_func_d.html create mode 100644 docs/manual/html/functions_func_e.html create mode 100644 docs/manual/html/functions_func_f.html create mode 100644 docs/manual/html/functions_func_g.html create mode 100644 docs/manual/html/functions_func_i.html create mode 100644 docs/manual/html/functions_func_j.html create mode 100644 docs/manual/html/functions_func_l.html create mode 100644 docs/manual/html/functions_func_m.html create mode 100644 docs/manual/html/functions_func_n.html create mode 100644 docs/manual/html/functions_func_o.html create mode 100644 docs/manual/html/functions_func_p.html create mode 100644 docs/manual/html/functions_func_r.html create mode 100644 docs/manual/html/functions_func_s.html create mode 100644 docs/manual/html/functions_func_t.html create mode 100644 docs/manual/html/functions_func_u.html create mode 100644 docs/manual/html/functions_func_v.html create mode 100644 docs/manual/html/functions_func_~.html create mode 100644 docs/manual/html/functions_g.html create mode 100644 docs/manual/html/functions_i.html create mode 100644 docs/manual/html/functions_j.html create mode 100644 docs/manual/html/functions_l.html create mode 100644 docs/manual/html/functions_m.html create mode 100644 docs/manual/html/functions_n.html create mode 100644 docs/manual/html/functions_o.html create mode 100644 docs/manual/html/functions_p.html create mode 100644 docs/manual/html/functions_r.html create mode 100644 docs/manual/html/functions_s.html create mode 100644 docs/manual/html/functions_t.html create mode 100644 docs/manual/html/functions_u.html create mode 100644 docs/manual/html/functions_v.html create mode 100644 docs/manual/html/functions_vars.html create mode 100644 docs/manual/html/functions_~.html create mode 100644 docs/manual/html/graph_legend.html create mode 100644 docs/manual/html/graph_legend.md5 create mode 100644 docs/manual/html/graph_legend.png create mode 100644 docs/manual/html/hierarchy.html create mode 100644 docs/manual/html/index.html create mode 100644 docs/manual/html/inherit_graph_0.map create mode 100644 docs/manual/html/inherit_graph_0.md5 create mode 100644 docs/manual/html/inherit_graph_0.png create mode 100644 docs/manual/html/inherit_graph_1.map create mode 100644 docs/manual/html/inherit_graph_1.md5 create mode 100644 docs/manual/html/inherit_graph_1.png create mode 100644 docs/manual/html/inherit_graph_10.map create mode 100644 docs/manual/html/inherit_graph_10.md5 create mode 100644 docs/manual/html/inherit_graph_10.png create mode 100644 docs/manual/html/inherit_graph_11.map create mode 100644 docs/manual/html/inherit_graph_11.md5 create mode 100644 docs/manual/html/inherit_graph_11.png create mode 100644 docs/manual/html/inherit_graph_2.map create mode 100644 docs/manual/html/inherit_graph_2.md5 create mode 100644 docs/manual/html/inherit_graph_2.png create mode 100644 docs/manual/html/inherit_graph_3.map create mode 100644 docs/manual/html/inherit_graph_3.md5 create mode 100644 docs/manual/html/inherit_graph_3.png create mode 100644 docs/manual/html/inherit_graph_4.map create mode 100644 docs/manual/html/inherit_graph_4.md5 create mode 100644 docs/manual/html/inherit_graph_4.png create mode 100644 docs/manual/html/inherit_graph_5.map create mode 100644 docs/manual/html/inherit_graph_5.md5 create mode 100644 docs/manual/html/inherit_graph_5.png create mode 100644 docs/manual/html/inherit_graph_6.map create mode 100644 docs/manual/html/inherit_graph_6.md5 create mode 100644 docs/manual/html/inherit_graph_6.png create mode 100644 docs/manual/html/inherit_graph_7.map create mode 100644 docs/manual/html/inherit_graph_7.md5 create mode 100644 docs/manual/html/inherit_graph_7.png create mode 100644 docs/manual/html/inherit_graph_8.map create mode 100644 docs/manual/html/inherit_graph_8.md5 create mode 100644 docs/manual/html/inherit_graph_8.png create mode 100644 docs/manual/html/inherit_graph_9.map create mode 100644 docs/manual/html/inherit_graph_9.md5 create mode 100644 docs/manual/html/inherit_graph_9.png create mode 100644 docs/manual/html/inherits.html create mode 100644 docs/manual/html/isampleobserver_8h.html create mode 100644 docs/manual/html/isampleobserver_8h__dep__incl.map create mode 100644 docs/manual/html/isampleobserver_8h__dep__incl.md5 create mode 100644 docs/manual/html/isampleobserver_8h__dep__incl.png create mode 100644 docs/manual/html/isampleobserver_8h__incl.map create mode 100644 docs/manual/html/isampleobserver_8h__incl.md5 create mode 100644 docs/manual/html/isampleobserver_8h__incl.png create mode 100644 docs/manual/html/isampleobserver_8h_source.html create mode 100644 docs/manual/html/jquery.js create mode 100644 docs/manual/html/menu.js create mode 100644 docs/manual/html/menudata.js create mode 100644 docs/manual/html/message_8h.html create mode 100644 docs/manual/html/message_8h__dep__incl.map create mode 100644 docs/manual/html/message_8h__dep__incl.md5 create mode 100644 docs/manual/html/message_8h__dep__incl.png create mode 100644 docs/manual/html/message_8h__incl.map create mode 100644 docs/manual/html/message_8h__incl.md5 create mode 100644 docs/manual/html/message_8h__incl.png create mode 100644 docs/manual/html/message_8h_source.html create mode 100644 docs/manual/html/namespacedbc.html create mode 100644 docs/manual/html/namespacemembers.html create mode 100644 docs/manual/html/namespacemembers_enum.html create mode 100644 docs/manual/html/namespacemembers_type.html create mode 100644 docs/manual/html/namespaces.html create mode 100644 docs/manual/html/nav_f.png create mode 100644 docs/manual/html/nav_fd.png create mode 100644 docs/manual/html/nav_g.png create mode 100644 docs/manual/html/nav_h.png create mode 100644 docs/manual/html/nav_hd.png create mode 100644 docs/manual/html/network_8h.html create mode 100644 docs/manual/html/network_8h__dep__incl.map create mode 100644 docs/manual/html/network_8h__dep__incl.md5 create mode 100644 docs/manual/html/network_8h__dep__incl.png create mode 100644 docs/manual/html/network_8h__incl.map create mode 100644 docs/manual/html/network_8h__incl.md5 create mode 100644 docs/manual/html/network_8h__incl.png create mode 100644 docs/manual/html/network_8h_source.html create mode 100644 docs/manual/html/node_8h.html create mode 100644 docs/manual/html/node_8h__dep__incl.map create mode 100644 docs/manual/html/node_8h__dep__incl.md5 create mode 100644 docs/manual/html/node_8h__dep__incl.png create mode 100644 docs/manual/html/node_8h__incl.map create mode 100644 docs/manual/html/node_8h__incl.md5 create mode 100644 docs/manual/html/node_8h__incl.png create mode 100644 docs/manual/html/node_8h_source.html create mode 100644 docs/manual/html/open.png create mode 100644 docs/manual/html/search/all_0.js create mode 100644 docs/manual/html/search/all_1.js create mode 100644 docs/manual/html/search/all_10.js create mode 100644 docs/manual/html/search/all_11.js create mode 100644 docs/manual/html/search/all_12.js create mode 100644 docs/manual/html/search/all_13.js create mode 100644 docs/manual/html/search/all_14.js create mode 100644 docs/manual/html/search/all_15.js create mode 100644 docs/manual/html/search/all_2.js create mode 100644 docs/manual/html/search/all_3.js create mode 100644 docs/manual/html/search/all_4.js create mode 100644 docs/manual/html/search/all_5.js create mode 100644 docs/manual/html/search/all_6.js create mode 100644 docs/manual/html/search/all_7.js create mode 100644 docs/manual/html/search/all_8.js create mode 100644 docs/manual/html/search/all_9.js create mode 100644 docs/manual/html/search/all_a.js create mode 100644 docs/manual/html/search/all_b.js create mode 100644 docs/manual/html/search/all_c.js create mode 100644 docs/manual/html/search/all_d.js create mode 100644 docs/manual/html/search/all_e.js create mode 100644 docs/manual/html/search/all_f.js create mode 100644 docs/manual/html/search/classes_0.js create mode 100644 docs/manual/html/search/classes_1.js create mode 100644 docs/manual/html/search/classes_2.js create mode 100644 docs/manual/html/search/classes_3.js create mode 100644 docs/manual/html/search/classes_4.js create mode 100644 docs/manual/html/search/classes_5.js create mode 100644 docs/manual/html/search/classes_6.js create mode 100644 docs/manual/html/search/close.svg create mode 100644 docs/manual/html/search/enums_0.js create mode 100644 docs/manual/html/search/enums_1.js create mode 100644 docs/manual/html/search/enums_2.js create mode 100644 docs/manual/html/search/enums_3.js create mode 100644 docs/manual/html/search/enums_4.js create mode 100644 docs/manual/html/search/enums_5.js create mode 100644 docs/manual/html/search/enumvalues_0.js create mode 100644 docs/manual/html/search/enumvalues_1.js create mode 100644 docs/manual/html/search/enumvalues_2.js create mode 100644 docs/manual/html/search/enumvalues_3.js create mode 100644 docs/manual/html/search/enumvalues_4.js create mode 100644 docs/manual/html/search/enumvalues_5.js create mode 100644 docs/manual/html/search/enumvalues_6.js create mode 100644 docs/manual/html/search/enumvalues_7.js create mode 100644 docs/manual/html/search/enumvalues_8.js create mode 100644 docs/manual/html/search/enumvalues_9.js create mode 100644 docs/manual/html/search/enumvalues_a.js create mode 100644 docs/manual/html/search/enumvalues_b.js create mode 100644 docs/manual/html/search/enumvalues_c.js create mode 100644 docs/manual/html/search/enumvalues_d.js create mode 100644 docs/manual/html/search/files_0.js create mode 100644 docs/manual/html/search/files_1.js create mode 100644 docs/manual/html/search/files_2.js create mode 100644 docs/manual/html/search/files_3.js create mode 100644 docs/manual/html/search/files_4.js create mode 100644 docs/manual/html/search/files_5.js create mode 100644 docs/manual/html/search/files_6.js create mode 100644 docs/manual/html/search/functions_0.js create mode 100644 docs/manual/html/search/functions_1.js create mode 100644 docs/manual/html/search/functions_10.js create mode 100644 docs/manual/html/search/functions_11.js create mode 100644 docs/manual/html/search/functions_12.js create mode 100644 docs/manual/html/search/functions_13.js create mode 100644 docs/manual/html/search/functions_2.js create mode 100644 docs/manual/html/search/functions_3.js create mode 100644 docs/manual/html/search/functions_4.js create mode 100644 docs/manual/html/search/functions_5.js create mode 100644 docs/manual/html/search/functions_6.js create mode 100644 docs/manual/html/search/functions_7.js create mode 100644 docs/manual/html/search/functions_8.js create mode 100644 docs/manual/html/search/functions_9.js create mode 100644 docs/manual/html/search/functions_a.js create mode 100644 docs/manual/html/search/functions_b.js create mode 100644 docs/manual/html/search/functions_c.js create mode 100644 docs/manual/html/search/functions_d.js create mode 100644 docs/manual/html/search/functions_e.js create mode 100644 docs/manual/html/search/functions_f.js create mode 100644 docs/manual/html/search/mag.svg create mode 100644 docs/manual/html/search/mag_d.svg create mode 100644 docs/manual/html/search/mag_sel.svg create mode 100644 docs/manual/html/search/mag_seld.svg create mode 100644 docs/manual/html/search/namespaces_0.js create mode 100644 docs/manual/html/search/pages_0.js create mode 100644 docs/manual/html/search/search.css create mode 100644 docs/manual/html/search/search.js create mode 100644 docs/manual/html/search/searchdata.js create mode 100644 docs/manual/html/search/typedefs_0.js create mode 100644 docs/manual/html/search/typedefs_1.js create mode 100644 docs/manual/html/search/typedefs_2.js create mode 100644 docs/manual/html/search/typedefs_3.js create mode 100644 docs/manual/html/search/variables_0.js create mode 100644 docs/manual/html/search/variables_1.js create mode 100644 docs/manual/html/search/variables_2.js create mode 100644 docs/manual/html/search/variables_3.js create mode 100644 docs/manual/html/search/variables_4.js create mode 100644 docs/manual/html/search/variables_5.js create mode 100644 docs/manual/html/search/variables_6.js create mode 100644 docs/manual/html/signal_8h.html create mode 100644 docs/manual/html/signal_8h__dep__incl.map create mode 100644 docs/manual/html/signal_8h__dep__incl.md5 create mode 100644 docs/manual/html/signal_8h__dep__incl.png create mode 100644 docs/manual/html/signal_8h__incl.map create mode 100644 docs/manual/html/signal_8h__incl.md5 create mode 100644 docs/manual/html/signal_8h__incl.png create mode 100644 docs/manual/html/signal_8h_source.html create mode 100644 docs/manual/html/signalgroup_8h.html create mode 100644 docs/manual/html/signalgroup_8h__dep__incl.map create mode 100644 docs/manual/html/signalgroup_8h__dep__incl.md5 create mode 100644 docs/manual/html/signalgroup_8h__dep__incl.png create mode 100644 docs/manual/html/signalgroup_8h__incl.map create mode 100644 docs/manual/html/signalgroup_8h__incl.md5 create mode 100644 docs/manual/html/signalgroup_8h__incl.png create mode 100644 docs/manual/html/signalgroup_8h_source.html create mode 100644 docs/manual/html/signalobserver_8h.html create mode 100644 docs/manual/html/signalobserver_8h__incl.map create mode 100644 docs/manual/html/signalobserver_8h__incl.md5 create mode 100644 docs/manual/html/signalobserver_8h__incl.png create mode 100644 docs/manual/html/signalobserver_8h_source.html create mode 100644 docs/manual/html/splitbar.png create mode 100644 docs/manual/html/splitbard.png create mode 100644 docs/manual/html/structdbc_1_1_extended_mux-members.html create mode 100644 docs/manual/html/structdbc_1_1_extended_mux.html create mode 100644 docs/manual/html/structdbc_1_1_signal_value-members.html create mode 100644 docs/manual/html/structdbc_1_1_signal_value.html create mode 100644 docs/manual/html/sync_off.png create mode 100644 docs/manual/html/sync_on.png create mode 100644 docs/manual/html/tab_a.png create mode 100644 docs/manual/html/tab_ad.png create mode 100644 docs/manual/html/tab_b.png create mode 100644 docs/manual/html/tab_bd.png create mode 100644 docs/manual/html/tab_h.png create mode 100644 docs/manual/html/tab_hd.png create mode 100644 docs/manual/html/tab_s.png create mode 100644 docs/manual/html/tab_sd.png create mode 100644 docs/manual/html/tabs.css create mode 100644 doxygen/dbclib.css create mode 100644 img/document.ico create mode 100644 img/mdflib.ico create mode 100644 img/mdflib.png diff --git a/README.md b/README.md index 2a7a7a8..c92c230 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,22 @@ -# dbclib -C++ library that parses CAN DBC files. Under development. +# DBC Library version 1.0 + +## Summary + +The DBC library repository include a **C++ Library** that parses CAN database files (DBC) and a simple **DBC +Viewer**. The release 1.0 of the project support reading of DBC file. The DBC viewer can also read in MDF +CAN logger files and view its data. + +## Building + +The project uses CMAKE for building. The following third-party libraries are used and +needs to be downloaded and pre-built. + +- Boost Library. Required for the GUI applications. +- Flex and Bison. Required for the C++ library. +- WxWidgets Library. Required if the GUI applications should be built. +- Doxygen's application. Is required if the documentation should be built. +- Google Test Library. Is required for running and build the unit tests. + +## License + +The project uses the MIT license. See external LICENSE file in project root. diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..f40fbd8 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,5 @@ +_site +.sass-cache +.jekyll-cache +.jekyll-metadata +vendor diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000..086a5c9 --- /dev/null +++ b/docs/404.html @@ -0,0 +1,25 @@ +--- +permalink: /404.html +layout: default +--- + + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 0000000..d0ebacd --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,39 @@ +source "https://rubygems.org" +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +# gem "jekyll", "~> 4.2.2" +# This is the default theme for new Jekyll sites. You may change this to anything you like. +# remote_theme: pages-themes/minimal@v0.2.0 +# plugins: +# - jekyll-remote-theme # add this line to the plugins list if you already have one + +gem "jekyll-theme-minimal", "~> 0.2" +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +gem "github-pages", group: :jekyll_plugins +# If you have any plugins, put them here! +# group :jekyll_plugins do +# gem "jekyll-feed", "~> 0.12" +#end + +# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem +# and associated library. +platforms :mingw, :x64_mingw, :mswin, :jruby do + gem "tzinfo", "~> 1.2" + gem "tzinfo-data" +end + +# Performance-booster for watching directories on Windows +gem 'wdm', '~> 0.1.0', :platforms => [:mingw, :x64_mingw, :mswin] + +# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem +# do not have a Java counterpart. +gem 'http_parser.rb', '~> 0.6.0', :platforms => [:jruby] + +gem 'webrick', '~> 1.7' diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock new file mode 100644 index 0000000..9003dad --- /dev/null +++ b/docs/Gemfile.lock @@ -0,0 +1,268 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (6.0.5) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.23.5) + concurrent-ruby (1.1.10) + dnsruby (1.61.9) + simpleidn (~> 0.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + ethon (0.15.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + execjs (2.8.1) + faraday (2.3.0) + faraday-net_http (~> 2.0) + ruby2_keywords (>= 0.0.4) + faraday-net_http (2.0.3) + ffi (1.15.5-x64-mingw-ucrt) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (226) + github-pages-health-check (= 1.17.9) + jekyll (= 3.9.2) + jekyll-avatar (= 0.7.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.2.0) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.15.1) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.13.0) + jekyll-include-cache (= 0.2.1) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.3) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.8.0) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.2.0) + jekyll-theme-cayman (= 0.2.0) + jekyll-theme-dinky (= 0.2.0) + jekyll-theme-hacker (= 0.2.0) + jekyll-theme-leap-day (= 0.2.0) + jekyll-theme-merlot (= 0.2.0) + jekyll-theme-midnight (= 0.2.0) + jekyll-theme-minimal (= 0.2.0) + jekyll-theme-modernist (= 0.2.0) + jekyll-theme-primer (= 0.6.0) + jekyll-theme-slate (= 0.2.0) + jekyll-theme-tactile (= 0.2.0) + jekyll-theme-time-machine (= 0.2.0) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.12.0) + kramdown (= 2.3.2) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.3) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.13.4, < 2.0) + rouge (= 3.26.0) + terminal-table (~> 1.4) + github-pages-health-check (1.17.9) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (>= 3.0, < 5.0) + typhoeus (~> 1.3) + html-pipeline (2.14.1) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.8.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.9.2) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.2.0) + commonmarker (~> 0.23.4) + jekyll (~> 3.9.0) + jekyll-commonmark (~> 1.4.0) + rouge (>= 2.0, < 4.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) + octokit (~> 4.0, != 4.4.0) + jekyll-include-cache (0.2.1) + jekyll (>= 3.7, < 5.0) + jekyll-mentions (1.6.0) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.6.0) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.12.0) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + kramdown (2.3.2) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.3) + listen (3.7.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.15.0) + nokogiri (1.13.6-x64-mingw-ucrt) + racc (~> 1.4) + octokit (4.24.0) + faraday (>= 1, < 3) + sawyer (~> 0.9) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.7) + racc (1.6.0) + rb-fsevent (0.11.1) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.5) + rouge (3.26.0) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.9.2) + addressable (>= 2.3.5) + faraday (>= 0.17.3, < 3) + simpleidn (0.2.1) + unf (~> 0.1.4) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (1.2.9) + thread_safe (~> 0.1) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) + unicode-display_width (1.8.0) + webrick (1.7.0) + zeitwerk (2.5.4) + +PLATFORMS + x64-mingw-ucrt + +DEPENDENCIES + github-pages + http_parser.rb (~> 0.6.0) + jekyll-theme-minimal (~> 0.2) + tzinfo (~> 1.2) + tzinfo-data + wdm (~> 0.1.0) + webrick (~> 1.7) + +BUNDLED WITH + 2.3.13 diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..2c51aa7 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,7 @@ +title: DBC Library +author: Ingemar Hedvall +logo: /assets/img/logo.png + +description: General DBC library. + +theme: jekyll-theme-minimal diff --git a/docs/_includes/head-custom.html b/docs/_includes/head-custom.html index 9499fce..80171cc 100644 --- a/docs/_includes/head-custom.html +++ b/docs/_includes/head-custom.html @@ -4,12 +4,9 @@
diff --git a/docs/assets/img/dbcviewer.png b/docs/assets/img/dbcviewer.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2c94a866ac63248f648ab6030a1bb47061ac52 GIT binary patch literal 115347 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 z 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 X^8dMO)ymfk7=Xaj)z4*}Q$iB}U@tZ$ diff --git a/docs/dbclib.md b/docs/dbclib.md new file mode 100644 index 0000000..892d5a9 --- /dev/null +++ b/docs/dbclib.md @@ -0,0 +1,19 @@ +--- +layout: default +title: DBC C++ Library +--- + +# Overview of the DBC C++ Library + +The library is used to read in and parse a DBC file. The DBC file describes devices, messages and signals for a CAN +network. The following interface exist. + +- **DbcFile**. Main object that reads in and parse a DBC file. The DBC file may contain one or more networks. +- **Network**. Information about the CAN network. Basic is the CAN Protocol (ProtocolType) in use (example J1939). +- **Node**. Defines a device (ECU) on the network. +- **Message**. One message defines the data bytes transmitted on the CAN bus. +- **Signal**. One message consist of one or more signals. +- **SignalGroup**. Defines a signal group. Seldom in use. +- **Attribute**. All DBC objects may have none or more attributes. +- **EnvVar**. A Network may define none or more environment variables. Seldom in use. +- **SignalObserver**. Saves sample values. Used when streaming CAN messages. diff --git a/docs/dbcviewer.md b/docs/dbcviewer.md new file mode 100644 index 0000000..f21aadc --- /dev/null +++ b/docs/dbcviewer.md @@ -0,0 +1,14 @@ +--- +layout: default +title: DBC Viewer +--- + +# DBC Viewer + +The DBC Viewer is a simple GUI application that show the content of a DBC file. + +![Sample DBC viewer](/assets/img/dbcviewer.png) + +It can display signal and message information. If the user have an CAN MDF logger file, it can be imported and +measured data can be shown in a list or in a graph. The Gnuplot application is +used as plotting tool, so it needs to be installed. \ No newline at end of file diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3b1610ec9a5a48239e19210e67c35f43ee3d7f27 GIT binary patch literal 3259 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 N*xNV~O09^u{sp6h)*=7^ literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..900cdd3 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,18 @@ +--- +layout: default +title: Summary +--- +# Summary + +The DBC C++ library implements an interface against a CAN DBC File. It supports reading and +parsing of CAN messages. The application DBC Viewer can also read in a CAN bus MDF measurement file and present its +values in either tabular form or plotting. + +The project include the following application and library. +- **[DBC C++ Library](dbclib.html)**. C++ Library that parses DBC files and CAN messages. +- **[DBC Viewer](dbcviewer.html)**. GUI application that show contents of DBC files. + +Detailed library documentation can be found here: [API Documentation](/manual/html/index.html). + +Source code and installation kit can be found here: [GitHub Repository](https://github.com/ihedvall/dbclib) + diff --git a/docs/manual/html/annotated.html b/docs/manual/html/annotated.html new file mode 100644 index 0000000..3cae063 --- /dev/null +++ b/docs/manual/html/annotated.html @@ -0,0 +1,101 @@ + + + + + + + +DbcLib: Class List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12]
+ + + + + + + + + + + + + + +
 NdbcMain namespace for the DBC library
 CAttributeSupport class for handling attributes of network objects
 CDbcFileMain user object that is an interface against a DBC file
 CDbcMessageWrapper class around a CAN message
 CEnvVarWrapper around an environment DBC variable
 CExtendedMuxSupport function for the extended multiplexor functionality
 CISampleObserverInterface that handles samples. Internal usage
 CMessageDBC message configuration object
 CNetworkInterface against a DBC network configuration
 CNodeInterface against a DBC node which normally is an ECU
 CSignalInterface against a DBC signal configuration
 CSignalGroupInterface against a signal group
 CSignalObserverThe sample observer hold a number of samples
 CSignalValueSupport function that holds the channel value for a signal
+
+
+ + + + diff --git a/docs/manual/html/attribute_8h.html b/docs/manual/html/attribute_8h.html new file mode 100644 index 0000000..841cec5 --- /dev/null +++ b/docs/manual/html/attribute_8h.html @@ -0,0 +1,164 @@ + + + + + + + +DbcLib: include/dbc/attribute.h File Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
attribute.h File Reference
+
+
+ +

All DBC network objects may have attributes attached to them. +More...

+
#include <string>
+#include <vector>
+#include <sstream>
+
+Include dependency graph for attribute.h:
+
+
+ + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  dbc::Attribute
 Support class for handling attributes of network objects. More...
 
+ + + + +

+Namespaces

namespace  dbc
 Main namespace for the DBC library.
 
+ + + + + + + +

+Enumerations

enum class  dbc::AttributeType : int {
+  dbc::DbcNetwork +, dbc::DbcNode +, dbc::DbcMessage +, dbc::DbcSignal +,
+  dbc::EnvironmentVariable +, dbc::NodeSignalRelation +, dbc::NodeMessageRelation +
+ }
 Define what type of network object the attribute is valid for. More...
 
enum class  dbc::AttributeValueType : int {
+  dbc::IntegerValue +, dbc::FloatValue +, dbc::StringValue +, dbc::EnumValue +,
+  dbc::HexValue +
+ }
 Data type of the attribute. More...
 
+
+ + + + diff --git a/docs/manual/html/attribute_8h__dep__incl.map b/docs/manual/html/attribute_8h__dep__incl.map new file mode 100644 index 0000000..c92fb55 --- /dev/null +++ b/docs/manual/html/attribute_8h__dep__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/manual/html/attribute_8h__dep__incl.md5 b/docs/manual/html/attribute_8h__dep__incl.md5 new file mode 100644 index 0000000..7b4e9ea --- /dev/null +++ b/docs/manual/html/attribute_8h__dep__incl.md5 @@ -0,0 +1 @@ +c67836ff0cfc8e447fede1d731375009 \ No newline at end of file diff --git a/docs/manual/html/attribute_8h__dep__incl.png b/docs/manual/html/attribute_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd37daa922b22dfcd9cbaff85cd17ca53204f6b GIT binary patch literal 20348 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 + + + + + diff --git a/docs/manual/html/attribute_8h__incl.md5 b/docs/manual/html/attribute_8h__incl.md5 new file mode 100644 index 0000000..eed19a5 --- /dev/null +++ b/docs/manual/html/attribute_8h__incl.md5 @@ -0,0 +1 @@ +b5bbf36aec9ecea2decca0f95d92a8c8 \ No newline at end of file diff --git a/docs/manual/html/attribute_8h__incl.png b/docs/manual/html/attribute_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..635401f6510f284989ddbf358de0a2ea935bad53 GIT binary patch literal 3934 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 literal 0 HcmV?d00001 diff --git a/docs/manual/html/attribute_8h_source.html b/docs/manual/html/attribute_8h_source.html new file mode 100644 index 0000000..ca0791c --- /dev/null +++ b/docs/manual/html/attribute_8h_source.html @@ -0,0 +1,248 @@ + + + + + + + +DbcLib: include/dbc/attribute.h Source File + + + + + + + + + + + +
+
attribute.h
+
+
+Go to the documentation of this file.
1/*
+
2 * Copyright 2022 Ingemar Hedvall
+
3 * SPDX-License-Identifier: MIT
+
4 */
+
8#pragma once
+
9
+
10#include <string>
+
11#include <vector>
+
12#include <sstream>
+
13namespace dbc {
+
17enum class AttributeType : int {
+ +
19 DbcNode,
+ +
21 DbcSignal,
+ + + +
25};
+
26
+
30enum class AttributeValueType : int {
+ + + +
34 EnumValue,
+ +
36};
+
37
+
49class Attribute {
+
50 public:
+
52 Attribute( AttributeType type, const std::string& name );
+
53
+
55 void Name(const std::string& name) { name_ = name; }
+
57 [[nodiscard]] const std::string& Name() const { return name_; }
+
58
+
60 void Type(AttributeType type ) { type_ = type; }
+
62 [[nodiscard]] AttributeType Type() const { return type_; }
+
63
+
65 void ValueType(AttributeValueType type ) { value_type_ = type; }
+
67 [[nodiscard]] AttributeValueType ValueType() const { return value_type_; }
+
69 [[nodiscard]] std::string ValueTypeAsString() const;
+
70
+
71 void Min(double min ) { min_ = min; }
+
72 [[nodiscard]] double Min() const { return min_; }
+
73
+
74 void Max(double max ) { max_ = max; }
+
75 [[nodiscard]] double Max() const { return max_; }
+
76
+
78 void EnumList(const std::vector<std::string>& list);
+
80 [[nodiscard]] const std::vector<std::string>& EnumList() const;
+
81
+
83 template <typename T>
+
84 void Value(const T& value);
+
85
+
87 template <typename T>
+
88 [[nodiscard]] T Value() const;
+
89 private:
+ +
91 std::string name_;
+
92 AttributeValueType value_type_ =
+ +
94 double value_float_ = 0.0;
+
95 std::string value_string_;
+
96 std::vector<std::string> enum_list_;
+
97 double min_ = 0.0;
+
98 double max_ = 0.0;
+
99};
+
100
+
101
+
102template <typename T>
+
103void Attribute::Value(const T& value) {
+
104 try {
+
105 value_float_ = static_cast<double>(value);
+
106 switch (value_type_) {
+ +
108 value_string_ = std::to_string(static_cast<int64_t>(value));
+
109 break;
+
110
+ +
112 value_string_ = std::to_string(static_cast<double>(value));
+
113 break;
+
114
+ +
116 const auto index = static_cast<size_t>(value_float_);
+
117 if ( index < enum_list_.size()) {
+
118 value_string_ = enum_list_[index];
+
119 }
+
120 break;
+
121 }
+
122
+
123 default:
+
124 value_string_ = std::to_string(value);
+
125 break;
+
126 }
+
127
+
128 } catch (const std::exception&) {
+
129 value_float_ = 0.0;
+
130 value_string_ = "Conversion error";
+
131 }
+
132}
+
133
+
135template<>
+
136void Attribute::Value(const std::string& value);
+
137
+
138
+
139template <typename T>
+ +
141 T value = {};
+
142 switch (ValueType()) {
+ +
144 std::istringstream temp(value_string_);
+
145 try {
+
146 temp >> value;
+
147 } catch (const std::exception& ) {
+
148 }
+
149 break;
+
150 }
+
151
+
152 default:
+
153 value = static_cast<T>(value_float_);
+
154 break;
+
155 }
+
156 return value;
+
157}
+
158
+
160template <>
+
161[[nodiscard]] std::string Attribute::Value() const;
+
162
+
163
+
164} // namespace dbc
+
Support class for handling attributes of network objects.
Definition: attribute.h:49
+
T Value() const
Returns the attribute value.
Definition: attribute.h:140
+
std::string ValueTypeAsString() const
Returns the attribute data type as string.
+
void ValueType(AttributeValueType type)
Sets the attribute data type.
Definition: attribute.h:65
+
void Min(double min)
Sets the min range.
Definition: attribute.h:71
+
double Max() const
Max range.
Definition: attribute.h:75
+
void Type(AttributeType type)
Sets the type of attribute.
Definition: attribute.h:60
+
const std::vector< std::string > & EnumList() const
Returns an enumerated string list.
+
void EnumList(const std::vector< std::string > &list)
Sets an enumerate string list.
+
AttributeType Type() const
Return type of attribute.
Definition: attribute.h:62
+
void Name(const std::string &name)
Sets the name of the attribute.
Definition: attribute.h:55
+
double Min() const
Min range.
Definition: attribute.h:72
+
Attribute(AttributeType type, const std::string &name)
Constructor for an attribute or definition.
+
AttributeValueType ValueType() const
Returns the attribute data type.
Definition: attribute.h:67
+
const std::string & Name() const
Retuns the attribute name.
Definition: attribute.h:57
+
void Max(double max)
Sets the max range.
Definition: attribute.h:74
+
Wrapper class around a CAN message.
Definition: dbcmessage.h:21
+
Main namespace for the DBC library.
Definition: attribute.h:13
+
AttributeType
Define what type of network object the attribute is valid for.
Definition: attribute.h:17
+
@ DbcNode
Node/Device attribute.
+
@ NodeSignalRelation
Node signal relation attribute.
+
@ NodeMessageRelation
Node message relation attribute.
+
@ DbcNetwork
Network attribute.
+
@ DbcSignal
Signal attribute.
+
@ EnvironmentVariable
Environment attribute.
+
AttributeValueType
Data type of the attribute.
Definition: attribute.h:30
+
@ HexValue
Hexa-decimal value.
+
@ EnumValue
Enumerate value.
+
@ IntegerValue
Integer value.
+
@ FloatValue
Floating point value.
+
@ StringValue
Text value.
+
+ + + + diff --git a/docs/manual/html/bc_s.png b/docs/manual/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/docs/manual/html/bc_sd.png b/docs/manual/html/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca888dc71049713b35c351933a8d0f36180bf1 GIT binary patch literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ literal 0 HcmV?d00001 diff --git a/docs/manual/html/bdwn.png b/docs/manual/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::Attribute Member List
+
+
+ +

This is the complete list of members for dbc::Attribute, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
Attribute(AttributeType type, const std::string &name)dbc::Attribute
EnumList(const std::vector< std::string > &list)dbc::Attribute
EnumList() constdbc::Attribute
Max(double max)dbc::Attributeinline
Max() constdbc::Attributeinline
Min(double min)dbc::Attributeinline
Min() constdbc::Attributeinline
Name(const std::string &name)dbc::Attributeinline
Name() constdbc::Attributeinline
Type(AttributeType type)dbc::Attributeinline
Type() constdbc::Attributeinline
Value(const T &value)dbc::Attribute
Value() constdbc::Attribute
Value(const std::string &value)dbc::Attribute
Value() constdbc::Attribute
ValueType(AttributeValueType type)dbc::Attributeinline
ValueType() constdbc::Attributeinline
ValueTypeAsString() constdbc::Attribute
+ + + + diff --git a/docs/manual/html/classdbc_1_1_attribute.html b/docs/manual/html/classdbc_1_1_attribute.html new file mode 100644 index 0000000..eb5c1e8 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_attribute.html @@ -0,0 +1,182 @@ + + + + + + + +DbcLib: dbc::Attribute Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::Attribute Class Reference
+
+
+ +

Support class for handling attributes of network objects. + More...

+ +

#include <attribute.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Attribute (AttributeType type, const std::string &name)
 Constructor for an attribute or definition.
 
+void Name (const std::string &name)
 Sets the name of the attribute.
 
+const std::string & Name () const
 Retuns the attribute name.
 
+void Type (AttributeType type)
 Sets the type of attribute.
 
+AttributeType Type () const
 Return type of attribute.
 
+void ValueType (AttributeValueType type)
 Sets the attribute data type.
 
+AttributeValueType ValueType () const
 Returns the attribute data type.
 
+std::string ValueTypeAsString () const
 Returns the attribute data type as string.
 
+void Min (double min)
 Sets the min range.
 
+double Min () const
 Min range.
 
+void Max (double max)
 Sets the max range.
 
+double Max () const
 Max range.
 
+void EnumList (const std::vector< std::string > &list)
 Sets an enumerate string list.
 
+const std::vector< std::string > & EnumList () const
 Returns an enumerated string list.
 
+template<typename T >
void Value (const T &value)
 Sets the attribute value.
 
+template<typename T >
Value () const
 Returns the attribute value.
 
+template<>
void Value (const std::string &value)
 Sets an attribute string value.
 
+template<>
std::string Value () const
 Returns an attribute string value.
 
+

Detailed Description

+

The Attribute class is a support class for handling attributes attached to DBC objects.

+

The DBC file first specify a definition of an attribute. This definition defines range and data type i.e. a sort of template.

+

Then the DBC file define the attribute that references a definition and has a value (constant).

+

The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_dbc_file-members.html b/docs/manual/html/classdbc_1_1_dbc_file-members.html new file mode 100644 index 0000000..8dbf796 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_dbc_file-members.html @@ -0,0 +1,104 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::DbcFile Member List
+
+
+ +

This is the complete list of members for dbc::DbcFile, including all inherited members.

+ + + + + + + + + + + + + + + +
AddMessage(size_t index, const DbcMessage &message)dbc::DbcFile
BaseTime(uint64_t ns1970)dbc::DbcFileinline
BaseTime() constdbc::DbcFileinline
Filename(const std::string &filename)dbc::DbcFileinline
Filename() constdbc::DbcFileinline
GetNetwork()dbc::DbcFileinline
GetNetwork() constdbc::DbcFileinline
LastError() constdbc::DbcFileinline
Name() constdbc::DbcFile
ParseFile()dbc::DbcFile
ParseMessage(const DbcMessage &message)dbc::DbcFile
ReparseMessageList()dbc::DbcFile
ResetSampleCounter() constdbc::DbcFile
SetMessageSize(size_t nof_messages)dbc::DbcFile
+ + + + diff --git a/docs/manual/html/classdbc_1_1_dbc_file.html b/docs/manual/html/classdbc_1_1_dbc_file.html new file mode 100644 index 0000000..0ae9843 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_dbc_file.html @@ -0,0 +1,209 @@ + + + + + + + +DbcLib: dbc::DbcFile Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::DbcFile Class Reference
+
+
+ +

Main user object that is an interface against a DBC file. + More...

+ +

#include <dbcfile.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+void Filename (const std::string &filename)
 Sets the file name. Full path required.
 
+const std::string & Filename () const
 Returns the file name with full path.
 
+std::string Name () const
 Returns the File name without path and extension.
 
+const std::string & LastError () const
 Returns the last (parser) error text.
 
+NetworkGetNetwork ()
 Returns the network object.
 
+const NetworkGetNetwork () const
 Returns the network object.
 
+bool ParseFile ()
 Parses the DBC file. Returns true on success.
 
void BaseTime (uint64_t ns1970)
 Start time of messages.
 
+uint64_t BaseTime () const
 Returns the base (start) time of first message.
 
+void SetMessageSize (size_t nof_messages)
 Sets the maximum message queue size.
 
+void AddMessage (size_t index, const DbcMessage &message)
 Adds q message to the message queue.
 
+bool ParseMessage (const DbcMessage &message)
 Parses the message into signal values.
 
+void ResetSampleCounter () const
 Resets the sample counter for all signals.
 
void ReparseMessageList ()
 Reparse the message queue.
 
+

Detailed Description

+

The DBC file is the only object the user shall create. It handle the parsing of the file. A DBC file defines nodes, messages and signals for one CAN network.

+

Member Function Documentation

+ +

◆ BaseTime()

+ +
+
+ + + + + +
+ + + + + + + + +
void dbc::DbcFile::BaseTime (uint64_t ns1970)
+
+inline
+
+

The base time is the time of the first message. If not set, the AddMessage will set it to the first DBCMessage.

Parameters
+ + +
ns1970Nano-seconds since 1970.
+
+
+ +
+
+ +

◆ ReparseMessageList()

+ +
+
+ + + + + + + +
void dbc::DbcFile::ReparseMessageList ()
+
+

This function is used to reparse the message queue. This function is used when the first parse message round just count number of samples while the next round, the user selects signals (SignalObserver) and reparse the message queue.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_dbc_message-members.html b/docs/manual/html/classdbc_1_1_dbc_message-members.html new file mode 100644 index 0000000..9dfff56 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_dbc_message-members.html @@ -0,0 +1,106 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::DbcMessage Member List
+
+
+ +

This is the complete list of members for dbc::DbcMessage, including all inherited members.

+ + + + + + + + + + + + + + + + + +
CanId(uint32_t can_id)dbc::DbcMessageinline
CanId() constdbc::DbcMessageinline
Data(const std::vector< uint8_t > &data)dbc::DbcMessageinline
Data() constdbc::DbcMessageinline
DataPage() constdbc::DbcMessage
DbcMessage()=defaultdbc::DbcMessage
DbcMessage(uint64_t time, uint32_t can_id, std::vector< uint8_t > data)dbc::DbcMessage
DbcMessage(const DbcMessage &message)=defaultdbc::DbcMessage
ExtendedDataPage() constdbc::DbcMessage
PduFormat() constdbc::DbcMessage
PduSpecific() constdbc::DbcMessage
Pgn() constdbc::DbcMessage
Priority() constdbc::DbcMessage
Source() constdbc::DbcMessage
Time(uint64_t ns1970)dbc::DbcMessageinline
Time() constdbc::DbcMessageinline
+ + + + diff --git a/docs/manual/html/classdbc_1_1_dbc_message.html b/docs/manual/html/classdbc_1_1_dbc_message.html new file mode 100644 index 0000000..da22c89 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_dbc_message.html @@ -0,0 +1,210 @@ + + + + + + + +DbcLib: dbc::DbcMessage Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::DbcMessage Class Reference
+
+
+ +

Wrapper class around a CAN message. + More...

+ +

#include <dbcmessage.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

DbcMessage ()=default
 Default constructor.
 
 DbcMessage (uint64_t time, uint32_t can_id, std::vector< uint8_t > data)
 Constructor that wraps a CAN message.
 
DbcMessage (const DbcMessage &message)=default
 Default destructor.
 
+void Time (uint64_t ns1970)
 Sets the time.
 
+uint64_t Time () const
 Message time.
 
+void CanId (uint32_t can_id)
 Sets the CAN ID.
 
+uint32_t CanId () const
 CAN ID.
 
+void Data (const std::vector< uint8_t > &data)
 Sets the CAN data bytes.
 
+const std::vector< uint8_t > & Data () const
 Returns the CAN data bytes.
 
+uint32_t Pgn () const
 PGN Program number.
 
+uint8_t Priority () const
 Priority (0-8)
 
+bool ExtendedDataPage () const
 True if extended data page.
 
+bool DataPage () const
 True if data page.
 
+uint8_t PduFormat () const
 PDU format.
 
+uint8_t PduSpecific () const
 PDU specific.
 
+uint8_t Source () const
 Source number.
 
+

Detailed Description

+

Simple support class that holds a CAN message. CAN message has a time, ID and none or more data bytes. This sound simple but there are several protocols on top of CAN that treat the CAN ID and its data bytes differently.

+

Constructor & Destructor Documentation

+ +

◆ DbcMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
dbc::DbcMessage::DbcMessage (uint64_t time,
uint32_t can_id,
std::vector< uint8_t > data 
)
+
+

Constructor that wraps a CAN message.

Parameters
+ + + + +
timeNano-seconds since 1970.
can_id11/29-bit CAN ID.
dataCAN data bytes.
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_env_var-members.html b/docs/manual/html/classdbc_1_1_env_var-members.html new file mode 100644 index 0000000..ab8977c --- /dev/null +++ b/docs/manual/html/classdbc_1_1_env_var-members.html @@ -0,0 +1,113 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::EnvVar Member List
+
+
+ +

This is the complete list of members for dbc::EnvVar, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Access(AccessType type)dbc::EnvVarinline
Access() constdbc::EnvVarinline
Comment(const std::string &comment)dbc::EnvVarinline
Comment() constdbc::EnvVarinline
EnumList(const std::map< int64_t, std::string > &enum_list)dbc::EnvVar
EnumList() constdbc::EnvVar
Ident(uint64_t ident)dbc::EnvVarinline
Ident() constdbc::EnvVarinline
InitValue(double value)dbc::EnvVarinline
InitValue() constdbc::EnvVarinline
Max(double max)dbc::EnvVarinline
Max() constdbc::EnvVarinline
Min(double min)dbc::EnvVarinline
Min() constdbc::EnvVarinline
Name(const std::string &name)dbc::EnvVarinline
Name() constdbc::EnvVarinline
NodeList(const std::vector< std::string > &node_list)dbc::EnvVarinline
NodeList() constdbc::EnvVarinline
Type(EnvType type)dbc::EnvVarinline
Type() constdbc::EnvVarinline
TypeAsString() constdbc::EnvVar
Unit(const std::string &unit)dbc::EnvVarinline
Unit() constdbc::EnvVarinline
+ + + + diff --git a/docs/manual/html/classdbc_1_1_env_var.html b/docs/manual/html/classdbc_1_1_env_var.html new file mode 100644 index 0000000..bbfefce --- /dev/null +++ b/docs/manual/html/classdbc_1_1_env_var.html @@ -0,0 +1,194 @@ + + + + + + + +DbcLib: dbc::EnvVar Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::EnvVar Class Reference
+
+
+ +

Wrapper around an environment DBC variable. +

+ +

#include <envvar.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+void Name (const std::string &name)
 Sets the name.
 
+const std::string & Name () const
 Retuns the name.
 
+void Comment (const std::string &comment)
 Sets the descriptive text.
 
+const std::string & Comment () const
 Return the descriptive text.
 
+void Type (EnvType type)
 Sets the data type.
 
+EnvType Type () const
 Returns the data type.
 
+std::string TypeAsString () const
 Returns the data type as string.
 
+void Min (double min)
 Sets the min range.
 
+double Min () const
 Min range.
 
+void Max (double max)
 Sets the max range.
 
+double Max () const
 Max range.
 
+void Unit (const std::string &unit)
 Sets the unit.
 
+const std::string & Unit () const
 Unit.
 
+void InitValue (double value)
 Sets the initial value.
 
+double InitValue () const
 Returns the initial value.
 
+void Ident (uint64_t ident)
 Sets the identity.
 
+uint64_t Ident () const
 Identity.
 
+void Access (AccessType type)
 Sets the access.
 
+AccessType Access () const
 Access.
 
+void NodeList (const std::vector< std::string > &node_list)
 Sets the node list.
 
+const std::vector< std::string > & NodeList () const
 Returns the node list.
 
+void EnumList (const std::map< int64_t, std::string > &enum_list)
 Sets the enumerate list.
 
+const std::map< int64_t, std::string > & EnumList () const
 Returns the node list.
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_i_sample_observer-members.html b/docs/manual/html/classdbc_1_1_i_sample_observer-members.html new file mode 100644 index 0000000..e360dbe --- /dev/null +++ b/docs/manual/html/classdbc_1_1_i_sample_observer-members.html @@ -0,0 +1,94 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::ISampleObserver Member List
+
+
+ +

This is the complete list of members for dbc::ISampleObserver, including all inherited members.

+ + + + + +
DetachObserver()=0dbc::ISampleObserverpure virtual
ISampleObserver()=defaultdbc::ISampleObserver
OnSample()=0dbc::ISampleObserverpure virtual
~ISampleObserver()=defaultdbc::ISampleObservervirtual
+ + + + diff --git a/docs/manual/html/classdbc_1_1_i_sample_observer.html b/docs/manual/html/classdbc_1_1_i_sample_observer.html new file mode 100644 index 0000000..8164a2d --- /dev/null +++ b/docs/manual/html/classdbc_1_1_i_sample_observer.html @@ -0,0 +1,180 @@ + + + + + + + +DbcLib: dbc::ISampleObserver Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::ISampleObserver Class Referenceabstract
+
+
+ +

Interface that handles samples. Internal usage. +

+ +

#include <isampleobserver.h>

+
+Inheritance diagram for dbc::ISampleObserver:
+
+
Inheritance graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + +

+Public Member Functions

ISampleObserver ()=default
 Default constructor.
 
+virtual ~ISampleObserver ()=default
 Default destructor.
 
virtual void OnSample ()=0
 Handle a sample.
 
virtual void DetachObserver ()=0
 Detach the observer object.
 
+

Member Function Documentation

+ +

◆ DetachObserver()

+ +
+
+ + + + + +
+ + + + + + + +
virtual void dbc::ISampleObserver::DetachObserver ()
+
+pure virtual
+
+ +

Implemented in dbc::SignalObserver.

+ +
+
+ +

◆ OnSample()

+ +
+
+ + + + + +
+ + + + + + + +
virtual void dbc::ISampleObserver::OnSample ()
+
+pure virtual
+
+ +

Implemented in dbc::SignalObserver.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.map b/docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.map new file mode 100644 index 0000000..c65eaa0 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.md5 b/docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.md5 new file mode 100644 index 0000000..717d9f5 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.md5 @@ -0,0 +1 @@ +358739f02f3885d82c5ae4e3862d2bc4 \ No newline at end of file diff --git a/docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.png b/docs/manual/html/classdbc_1_1_i_sample_observer__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a19632576038e1179c0c8ed6baa4d0a79ac010b8 GIT binary patch literal 1525 zcmbtUdoZu(JWS{`8Xe%HIG$sv2Ws~1(UqmdAXAL&J_rQjJdrOZ2?PSS3`Cwu zS}9it76*dh=2HX8;KjgnW_UW&!_Q*`Mgzb`*@2z-@Te$6yvd0A!`Y$MHkTMRn@Ypv z@-zu;tej@mNrf)oy5J3S4s?D=Xg3+a{>-6$P=B}BCL5XKTbG*DsnK>t^<^k!F~Q}W z?AaL^&(7(KJvDh)4pr9)gSOzQ;}Zv6!fphVSD+TiU#cj8sHw#iNa_iq2#%Q3SLQQEdKA;Cf-Z>N&@s zT$C9-7&bjD_ii<7rggwPgR5oXC8Xb`)s%)zM8VPX72*z8Bgu6X3eQL@GgXM0T~?ho z87;bkjUx^2v+_9H=D;U()S zu{4Y{uxfE3Z`eI}hb}A*FIHJ`wKP{tLFRUn5Jv0sqNDvG+T$jtSe0D!g}$sg-M;ax zkKfpSkphOgS$>_tNmzrbTLgLcoOJ%-;p$AG<~*ZLw$M1UXK3u_6zUu?pqx# zaM_sDmc29Fm1qRv%XDYUXCC&`>8d8%IXUQs_Yf4ocT8eJyjuv6RXy@Zh@8KE%Cas0 zQA3b6X_+zh0w3NDL5Zx2z23~Al4C~Ygidsbo|XIey8k)n006W9KTQ1Z5teW9oW*25*~&Xz45Y_icPd z#E=?-;x^2C%!H}5OxJl)s0_CfUiO|;S%laH3$~#588p|{v2@&uA|5FhX6uE(hTnM{ z)w=-rz}d~Hro`(>ij7+J?Y)Eoo{`prUJUubv$&coY((G|IfpT`!d*4Ta|I9TJ`H|q zyvd6P_5COg&Nz?ry&pM$hxrD?Jf`{3odpx`D~ zc1Lz*eu{YqHsvg!bm_OoZ|8sm+lR6U*L;6*!GMTI-9CoxugD>n^V=*CSeW@r(U z-WlLT&Tq92J*?`6Gj%lGezj0M<91o@Jj));@VEp=PN5d>-OAqxU-r3+9UoOu%X&#M z@QYAwJU6WDy#_;F>NG+kwdx=ZMKt-d&MtlH`M8?Id*_V>aI-@^S^S;*lx+7GL!@y! zM`9<`Jfb$TyFBYJ8QbO^J96r=zhM{N%n>WwpPZ7CLgl4M>cXaZJRVxb=Btqf7CS4T UJqQCz^tO%z7_^fO-P)h@2kUa;2LJ#7 literal 0 HcmV?d00001 diff --git a/docs/manual/html/classdbc_1_1_message-members.html b/docs/manual/html/classdbc_1_1_message-members.html new file mode 100644 index 0000000..80f62cd --- /dev/null +++ b/docs/manual/html/classdbc_1_1_message-members.html @@ -0,0 +1,130 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + + +
+
dbc::Message Member List
+
+
+ +

This is the complete list of members for dbc::Message, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Attributes() constdbc::Messageinline
CanId() constdbc::Message
Comment(const std::string &comment)dbc::Messageinline
Comment() constdbc::Messageinline
CreateAttribute(const Attribute &definition)dbc::Message
CreateSignal(const std::string &name)dbc::Message
Data() constdbc::Messageinline
DataPage() constdbc::Message
ExtendedDataPage() constdbc::Message
GetAttribute(const std::string &name) constdbc::Message
GetMultiplexor()dbc::Message
GetSignal(const std::string &name)dbc::Message
GetSignal(const std::string &name) constdbc::Message
Ident(uint64_t ident)dbc::Messageinline
Ident() constdbc::Messageinline
IsExtended() constdbc::Message
IsJ1939() constdbc::Message
IsNodeSender(const std::string &node_name) constdbc::Message
IsPdu1() constdbc::Message
IsPdu2() constdbc::Message
Name(const std::string &name)dbc::Messageinline
Name() constdbc::Messageinline
NextSequenceNumber() constdbc::Messageinline
Node(const std::string &node)dbc::Messageinline
NodeName() constdbc::Messageinline
NofBytes(size_t bytes)dbc::Message
NofBytes() constdbc::Message
ParseMessage(uint64_t ns1970, uint32_t can_id)dbc::Message
PduFormat() constdbc::Message
PduSpecific() constdbc::Message
Pgn() constdbc::Message
Priority() constdbc::Message
ResetSampleCounter() constdbc::Message
ResetSequenceNumber()dbc::Messageinline
SampleCounter() constdbc::Messageinline
Senders() constdbc::Messageinline
Signals() constdbc::Messageinline
Source() constdbc::Message
StepSampleCounter() constdbc::Messageinline
UpdateData(const std::vector< uint8_t > &message, size_t offset=0, size_t data_index=0)dbc::Message
+ + + + diff --git a/docs/manual/html/classdbc_1_1_message.html b/docs/manual/html/classdbc_1_1_message.html new file mode 100644 index 0000000..a2c9e51 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_message.html @@ -0,0 +1,355 @@ + + + + + + + +DbcLib: dbc::Message Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::Message Class Reference
+
+
+ +

DBC message configuration object. +

+ +

#include <message.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void Ident (uint64_t ident)
 
uint64_t Ident () const
 
+bool IsExtended () const
 True if 29-bit ID.
 
+bool IsJ1939 () const
 True if it is a J1939 message.
 
+uint32_t CanId () const
 Returns CAN ID.
 
+uint8_t Priority () const
 J1939 Priority.
 
+uint32_t Pgn () const
 J1939 PGN.
 
+uint8_t Source () const
 J1939 Source.
 
+bool ExtendedDataPage () const
 J1938 Data Page Flag.
 
+bool DataPage () const
 J1938 Data Page Flag.
 
+uint8_t PduFormat () const
 J1939 PF.
 
+uint8_t PduSpecific () const
 J1939 PS.
 
+bool IsPdu1 () const
 True if PDU1.
 
+bool IsPdu2 () const
 True if PDU2.
 
+void Name (const std::string &name)
 Sets the message name.
 
+const std::string & Name () const
 Returns the message name.
 
+void Comment (const std::string &comment)
 Sets the descriptive text.
 
+const std::string & Comment () const
 Returns the descriptive text.
 
+void NofBytes (size_t bytes)
 Sets the number of bytes.
 
+size_t NofBytes () const
 Returns the number of bytes.
 
+void Node (const std::string &node)
 Sets a node name.
 
+std::string NodeName () const
 Returns the node name.
 
+SignalGetSignal (const std::string &name)
 Returns a signal by its name.
 
+const SignalGetSignal (const std::string &name) const
 Returns a signal by its name.
 
+SignalGetMultiplexor ()
 Returns the multiplexer signal object.
 
+const AttributeGetAttribute (const std::string &name) const
 Returns an attribute by its name.
 
+const SignalListSignals () const
 Returns the signal list.
 
+const std::vector< std::string > & Senders () const
 Returns a list of sender names.
 
+const std::vector< Attribute > & Attributes () const
 Returns a list of attributes.
 
+bool IsNodeSender (const std::string &node_name) const
 Returns true if the node is a sender.
 
+const std::vector< uint8_t > & Data () const
 Returns the last message data buffer.
 
bool UpdateData (const std::vector< uint8_t > &message, size_t offset=0, size_t data_index=0)
 Update the internal data buffer.
 
+void ParseMessage (uint64_t ns1970, uint32_t can_id)
 Parses the message. Internal usage.
 
+void ResetSequenceNumber ()
 Reset the internal sequence counter.
 
+uint8_t NextSequenceNumber () const
 Returns the next sequence number.
 
+void ResetSampleCounter () const
 Reset the sample counters.
 
+void StepSampleCounter () const
 Increments the internal sample counters.
 
+size_t SampleCounter () const
 Returns number of samples.
 
+AttributeCreateAttribute (const Attribute &definition)
 Creates an attributes by using its definition.
 
+SignalCreateSignal (const std::string &name)
 Create a new signal by its name.
 
+

Member Function Documentation

+ +

◆ Ident() [1/2]

+ +
+
+ + + + + +
+ + + + + + + +
uint64_t dbc::Message::Ident () const
+
+inline
+
+

< Returns the message ID.

+ +
+
+ +

◆ Ident() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + +
void dbc::Message::Ident (uint64_t ident)
+
+inline
+
+

< Sets the message ID (29-bit)

+ +
+
+ +

◆ UpdateData()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool dbc::Message::UpdateData (const std::vector< uint8_t > & message,
size_t offset = 0,
size_t data_index = 0 
)
+
+

Sets the internal last message data buffer. Note that the input offset and destination offset is used if the message requires more than one CAN data message before it is complete.

+
Parameters
+ + + + +
messageMessage data.
offsetOffset in the message data buffer (input index).
data_indexOffset in the last message data buffer (dest index).
+
+
+
Returns
Returns true if this was the last byte (complete message).
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_network-members.html b/docs/manual/html/classdbc_1_1_network-members.html new file mode 100644 index 0000000..6722bad --- /dev/null +++ b/docs/manual/html/classdbc_1_1_network-members.html @@ -0,0 +1,137 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::Network Member List
+
+
+ +

This is the complete list of members for dbc::Network, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddSignalGroup(const SignalGroup &group)dbc::Network
AddValueTable(const std::string &name, const EnumMap &list)dbc::Network
Attributes() constdbc::Networkinline
Bus(BusType type)dbc::Network
Bus() constdbc::Network
BusAsString() constdbc::Network
Comment(const std::string &comment)dbc::Networkinline
Comment() constdbc::Networkinline
CreateAttribute(const Attribute &definition)dbc::Network
CreateDefinition(const std::string &name)dbc::Network
CreateMessage(uint64_t message_id)dbc::Network
CreateNode(const std::string &name)dbc::Network
Enums() constdbc::Networkinline
EnvVars() constdbc::Networkinline
Filename(const std::string &filename)dbc::Networkinline
Filename() constdbc::Networkinline
GetAttribute(const std::string &name)dbc::Network
GetAttribute(const std::string &name) constdbc::Network
GetEnvVar(const std::string &name)dbc::Network
GetMessage(uint64_t message_id)dbc::Network
GetMessage(uint64_t message_id) constdbc::Network
GetMessageByCanId(uint64_t can_id)dbc::Network
GetMessageByCanId(uint64_t can_id) constdbc::Network
GetMessageByName(const std::string &name) constdbc::Network
GetMessageByPgn(uint32_t pgn)dbc::Network
GetMessageByPgnAndSource(uint32_t pgn, uint8_t source)dbc::Network
GetNode(const std::string &name)dbc::Network
GetNode(const std::string &name) constdbc::Network
GetNodeBySource(uint8_t source) constdbc::Network
GetSignal(uint64_t message_id, const std::string &signal_name)dbc::Network
GetSignal(uint64_t message_id, const std::string &signal_name) constdbc::Network
GetSignalByCanId(uint64_t can_id, const std::string &signal_name) constdbc::Network
GetSignalByName(const std::string &signal_name) constdbc::Network
GetSignalGroup(uint64_t message_id, const std::string &name) constdbc::Network
GetSignalGroupByName(const std::string &name) constdbc::Network
J1939(bool j1939)dbc::Networkinline
J1939() constdbc::Networkinline
LastMessage()dbc::Network
Messages() constdbc::Networkinline
Name() constdbc::Network
Nodes() constdbc::Networkinline
Protocol(ProtocolType type)dbc::Network
Protocol() constdbc::Network
ProtocolAsString() constdbc::Network
SignalGroups() constdbc::Networkinline
Version(const std::string &version)dbc::Networkinline
Version() constdbc::Networkinline
+ + + + diff --git a/docs/manual/html/classdbc_1_1_network.html b/docs/manual/html/classdbc_1_1_network.html new file mode 100644 index 0000000..91e6cae --- /dev/null +++ b/docs/manual/html/classdbc_1_1_network.html @@ -0,0 +1,314 @@ + + + + + + + +DbcLib: dbc::Network Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::Network Class Reference
+
+
+ +

Interface against a DBC network configuration. +

+ +

#include <network.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+std::string Name () const
 Network name.
 
+void Filename (const std::string &filename)
 Sets the file name.
 
+std::string Filename () const
 Returns the file name.
 
void Protocol (ProtocolType type)
 Sets the protocol type. Should be included in the file but sometimes is missing.
 
+ProtocolType Protocol () const
 Returns what type of protocol the bus is using.
 
+std::string ProtocolAsString () const
 Returns the network protocol as text.
 
+void Bus (BusType type)
 Sets the type of bus.
 
+BusType Bus () const
 Returns the type of bus.
 
+std::string BusAsString () const
 Returns the type of bus as text.
 
+void Version (const std::string &version)
 Sets the DBC (file) version.
 
+const std::string & Version () const
 Returns the DBC file version.
 
+void Comment (const std::string &comment)
 Sets the descriptive text for the DBC file.
 
+const std::string & Comment () const
 Returns the desciptive text.
 
+NodeGetNode (const std::string &name)
 Returns the node by its name.
 
+const NodeGetNode (const std::string &name) const
 Returns the node by its name.
 
+const NodeGetNodeBySource (uint8_t source) const
 Returns the node by its source number.
 
+void J1939 (bool j1939)
 Set to true if this is a J1939 bus.
 
+bool J1939 () const
 Returns true if this is a J1939 bus.
 
+MessageGetMessage (uint64_t message_id)
 Returns a message object by its message ID.
 
+const MessageGetMessage (uint64_t message_id) const
 Returns a message object by its message ID.
 
+MessageGetMessageByCanId (uint64_t can_id)
 Returns a message object by its CAN ID.
 
+const MessageGetMessageByCanId (uint64_t can_id) const
 Returns a message object by its CAN ID.
 
+const MessageGetMessageByName (const std::string &name) const
 Returns a message object by its name.
 
+MessageGetMessageByPgn (uint32_t pgn)
 Returns a message object by its PGN.
 
+MessageGetMessageByPgnAndSource (uint32_t pgn, uint8_t source)
 Returns a message object by its PGN and source number.
 
+SignalGetSignal (uint64_t message_id, const std::string &signal_name)
 Returns a signal by its message ID and signal name.
 
+const SignalGetSignal (uint64_t message_id, const std::string &signal_name) const
 Returns a signal by its message ID and signal name.
 
+const SignalGetSignalByCanId (uint64_t can_id, const std::string &signal_name) const
 Returns a signal by its CAN ID and signal name.
 
+const SignalGetSignalByName (const std::string &signal_name) const
 Returns a signal by its name.
 
+const SignalGroupGetSignalGroup (uint64_t message_id, const std::string &name) const
 Returns a signal group by its message ID and group name.
 
+const SignalGroupGetSignalGroupByName (const std::string &name) const
 Returns a signal group by its group name.
 
+const std::map< std::string, EnvVar > & EnvVars () const
 Returns the list of environment variables.
 
+const MessageListMessages () const
 Returns the list of messages.
 
+const std::map< std::string, Node > & Nodes () const
 Returns the list of Nodes.
 
+const std::vector< SignalGroup > & SignalGroups () const
 Returns the list of signal groups.
 
+const std::map< std::string, EnumMap > & Enums () const
 Returns the list of enumerates.
 
+const std::vector< Attribute > & Attributes () const
 Returns the list of attributes.
 
+AttributeGetAttribute (const std::string &name)
 Returns an attribute by its name.
 
+const AttributeGetAttribute (const std::string &name) const
 Returns an attribute by its name.
 
+void AddValueTable (const std::string &name, const EnumMap &list)
 Adds a enumerate.
 
+void AddSignalGroup (const SignalGroup &group)
 Adds a signal group.
 
+EnvVarGetEnvVar (const std::string &name)
 Parser function that gets/creates an environment variable.
 
+NodeCreateNode (const std::string &name)
 Parser function that creates a node.
 
+AttributeCreateDefinition (const std::string &name)
 Parser function that creates a definition.
 
+AttributeCreateAttribute (const Attribute &definition)
 Parser function that creates an attribute.
 
+MessageCreateMessage (uint64_t message_id)
 Parser function that creates a message.
 
+MessageLastMessage ()
 Returns the last message.
 
+

Member Function Documentation

+ +

◆ Protocol()

+ +
+
+ + + + + + + + +
void dbc::Network::Protocol (ProtocolType type)
+
+
Parameters
+ + +
typeType of protocol.
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_node-members.html b/docs/manual/html/classdbc_1_1_node-members.html new file mode 100644 index 0000000..1a6b76d --- /dev/null +++ b/docs/manual/html/classdbc_1_1_node-members.html @@ -0,0 +1,99 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::Node Member List
+
+
+ +

This is the complete list of members for dbc::Node, including all inherited members.

+ + + + + + + + + + +
Attributes() constdbc::Nodeinline
Comment(const std::string &comment)dbc::Nodeinline
Comment() constdbc::Nodeinline
CreateAttribute(const Attribute &definition)dbc::Node
GetAttribute(const std::string &name) constdbc::Node
Name(const std::string &name)dbc::Nodeinline
Name() constdbc::Nodeinline
Source(uint8_t source)dbc::Nodeinline
Source() constdbc::Node
+ + + + diff --git a/docs/manual/html/classdbc_1_1_node.html b/docs/manual/html/classdbc_1_1_node.html new file mode 100644 index 0000000..823072f --- /dev/null +++ b/docs/manual/html/classdbc_1_1_node.html @@ -0,0 +1,139 @@ + + + + + + + +DbcLib: dbc::Node Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::Node Class Reference
+
+
+ +

Interface against a DBC node which normally is an ECU. + More...

+ +

#include <node.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+void Name (const std::string &name)
 Sets the name.
 
+const std::string & Name () const
 Returns the name.
 
+void Source (uint8_t source)
 Source number is used in J1939 and is included in the CAN ID.
 
+uint8_t Source () const
 Source number (J1939).
 
+void Comment (const std::string &comment)
 Sets the descriptive text.
 
+const std::string & Comment () const
 Returns the descriptive text.
 
+const std::vector< Attribute > & Attributes () const
 Returns the attribute list.
 
+AttributeCreateAttribute (const Attribute &definition)
 Creates an attribute. Parser function.
 
+const AttributeGetAttribute (const std::string &name) const
 Returns an attribute by its name.
 
+

Detailed Description

+

The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_signal-members.html b/docs/manual/html/classdbc_1_1_signal-members.html new file mode 100644 index 0000000..f1c8976 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_signal-members.html @@ -0,0 +1,147 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::Signal Member List
+
+
+ +

This is the complete list of members for dbc::Signal, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttachObserver(ISampleObserver *observer) constdbc::Signal
Attributes() constdbc::Signalinline
BitLength(size_t length)dbc::Signalinline
BitLength() constdbc::Signalinline
BitStart(size_t start)dbc::Signalinline
BitStart() constdbc::Signalinline
ChannelValue(T &value) constdbc::Signal
ChannelValue(std::string &value) constdbc::Signal
ChannelValue(SignalValue &value) constdbc::Signal
Comment(const std::string &comment)dbc::Signalinline
Comment() constdbc::Signalinline
CreateAttribute(const Attribute &definition)dbc::Signal
DataType(SignalDataType type)dbc::Signalinline
DataType() constdbc::Signalinline
DataTypeAsString() constdbc::Signal
DetachObserver(const ISampleObserver *observer) constdbc::Signal
EngValue(T &value) constdbc::Signal
EngValue(std::string &value) constdbc::Signal
EnumList(const std::map< int64_t, std::string > &enum_list)dbc::Signal
EnumList() constdbc::Signal
GetEnumString(int64_t index) constdbc::Signal
GetExtendedMux()dbc::Signal
IsMultiplexed() constdbc::Signal
LittleEndian(bool endian)dbc::Signalinline
LittleEndian() constdbc::Signalinline
Max(double max)dbc::Signalinline
Max() constdbc::Signalinline
MessageId(uint64_t message_id)dbc::Signalinline
MessageId() constdbc::Signalinline
Min(double min)dbc::Signalinline
Min() constdbc::Signalinline
Mux(MuxType type)dbc::Signalinline
Mux() constdbc::Signalinline
MuxAsString() constdbc::Signal
MuxValue(int value)dbc::Signalinline
MuxValue() constdbc::Signalinline
Name(const std::string &name)dbc::Signalinline
Name() constdbc::Signalinline
Offset(double offset)dbc::Signalinline
Offset() constdbc::Signalinline
ParseMessage(const std::vector< uint8_t > &message, uint64_t ns1970, uint32_t can_id)dbc::Signal
Receivers(const std::vector< std::string > &receiver_list)dbc::Signal
Receivers() constdbc::Signal
ResetSampleCounter() constdbc::Signalinline
SampleCanId(uint32_t can_id)dbc::Signalinline
SampleCanId() constdbc::Signalinline
SampleCounter() constdbc::Signalinline
SampleTime(uint64_t ns1970)dbc::Signalinline
SampleTime() constdbc::Signalinline
Scale(double scale)dbc::Signalinline
Scale() constdbc::Signalinline
StepSampleCounter() constdbc::Signalinline
Unit(const std::string &unit)dbc::Signalinline
Unit() constdbc::Signalinline
Valid(bool valid)dbc::Signalinline
Valid() constdbc::Signalinline
~Signal()dbc::Signalvirtual
+ + + + diff --git a/docs/manual/html/classdbc_1_1_signal.html b/docs/manual/html/classdbc_1_1_signal.html new file mode 100644 index 0000000..92ae81d --- /dev/null +++ b/docs/manual/html/classdbc_1_1_signal.html @@ -0,0 +1,336 @@ + + + + + + + +DbcLib: dbc::Signal Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::Signal Class Reference
+
+
+ +

Interface against a DBC signal configuration. + More...

+ +

#include <signal.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+virtual ~Signal ()
 Destructor.
 
+void Name (const std::string &name)
 Sets the signal name.
 
+const std::string & Name () const
 Returns the signal name.
 
+void Unit (const std::string &unit)
 Sets the unit of measure.
 
+const std::string & Unit () const
 Returns the unit of measure.
 
+void Comment (const std::string &comment)
 Sets the descriptive text.
 
+const std::string & Comment () const
 Returns the descriptive text.
 
+void DataType (SignalDataType type)
 Sets the data type.
 
+SignalDataType DataType () const
 Returns the data type.
 
+std::string DataTypeAsString () const
 Returns the data type as text.
 
+void Mux (MuxType type)
 Sets the multiplexer type.
 
+MuxType Mux () const
 Returns the multiplexer type.
 
+std::string MuxAsString () const
 Returns the multiplexer type as text.
 
+void MuxValue (int value)
 Sets the multiplexor value.
 
+int MuxValue () const
 Returns the multiplexor value.
 
+void BitStart (size_t start)
 Sets the start bit.
 
+size_t BitStart () const
 Returns the start bit.
 
+void BitLength (size_t length)
 Sets the bit length.
 
+size_t BitLength () const
 Returns the bit length.
 
+void LittleEndian (bool endian)
 Set true if little endian byte order.
 
+bool LittleEndian () const
 Return true if little endian byte order.
 
+void Scale (double scale)
 Sets the scaling constant.
 
+double Scale () const
 Scaling constant.
 
+void Offset (double offset)
 Sets the offset.
 
+double Offset () const
 Return offset.
 
+void Min (double min)
 Sets min range.
 
+double Min () const
 Min range.
 
+void Max (double max)
 Sets the max range.
 
+double Max () const
 Max range.
 
+void EnumList (const std::map< int64_t, std::string > &enum_list)
 Sets the enumeration.
 
+const std::map< int64_t, std::string > & EnumList () const
 Returns the enumeration.
 
+void Receivers (const std::vector< std::string > &receiver_list)
 Sets the receiver list.
 
+const std::vector< std::string > & Receivers () const
 Return the receiver list.
 
+const std::vector< Attribute > & Attributes () const
 Returns the attribute list.
 
+void MessageId (uint64_t message_id)
 Sets the signals message ID.
 
+uint64_t MessageId () const
 Returns the message ID that the signal belongs to.
 
+bool IsMultiplexed () const
 True if multiplexed signal.
 
+AttributeCreateAttribute (const Attribute &definition)
 Creates an attribute.
 
+ExtendedMuxGetExtendedMux ()
 Creates an extended multiplexor struct.
 
+std::string GetEnumString (int64_t index) const
 Returns the enumerate text for an index.
 
+void ParseMessage (const std::vector< uint8_t > &message, uint64_t ns1970, uint32_t can_id)
 Parse out the signal value from a message data buffer.
 
+void ResetSampleCounter () const
 Resets the sample counter.
 
+void StepSampleCounter () const
 Steps the sample counter.
 
+size_t SampleCounter () const
 Returns the sample counter.
 
+void SampleTime (uint64_t ns1970)
 Sets the sample time.
 
+uint64_t SampleTime () const
 Returns the sample time.
 
+void SampleCanId (uint32_t can_id)
 Sets the CAN ID for the sample.
 
+uint64_t SampleCanId () const
 Returns the CAN ID for latest sample.
 
+void Valid (bool valid)
 Set to true if valid value.
 
+bool Valid () const
 Trie if value is valid.
 
+template<typename T >
bool ChannelValue (T &value) const
 Returns the channel value.
 
+template<typename T >
bool EngValue (T &value) const
 Returns the scaled engineering value.
 
+void AttachObserver (ISampleObserver *observer) const
 Attach a sample observer.
 
+void DetachObserver (const ISampleObserver *observer) const
 Detach a sample observer.
 
+template<>
bool ChannelValue (std::string &value) const
 Returns the signal value as a string.
 
+template<>
bool ChannelValue (SignalValue &value) const
 Returns the signal value as a signal value.
 
+template<>
bool EngValue (std::string &value) const
 Returns the engineering value as a string value.
 
+

Detailed Description

+

The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_signal_group-members.html b/docs/manual/html/classdbc_1_1_signal_group-members.html new file mode 100644 index 0000000..b04c726 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_signal_group-members.html @@ -0,0 +1,98 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::SignalGroup Member List
+
+
+ +

This is the complete list of members for dbc::SignalGroup, including all inherited members.

+ + + + + + + + + +
MessageId(uint64_t message_id)dbc::SignalGroupinline
MessageId() constdbc::SignalGroupinline
Name(const std::string &name)dbc::SignalGroupinline
Name() constdbc::SignalGroupinline
Repetition(size_t rep)dbc::SignalGroupinline
Repetition() constdbc::SignalGroupinline
Signals(const std::vector< std::string > &signals)dbc::SignalGroup
Signals() constdbc::SignalGroup
+ + + + diff --git a/docs/manual/html/classdbc_1_1_signal_group.html b/docs/manual/html/classdbc_1_1_signal_group.html new file mode 100644 index 0000000..5d28be1 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_signal_group.html @@ -0,0 +1,134 @@ + + + + + + + +DbcLib: dbc::SignalGroup Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::SignalGroup Class Reference
+
+
+ +

Interface against a signal group. +

+ +

#include <signalgroup.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+void MessageId (uint64_t message_id)
 Sets the message ID.
 
+uint64_t MessageId () const
 Returns the message ID.
 
+void Name (const std::string &name)
 Sets the name.
 
+const std::string & Name () const
 Name.
 
+void Repetition (size_t rep)
 Sets the repetition.
 
+size_t Repetition () const
 Repetition.
 
+void Signals (const std::vector< std::string > &signals)
 Returns a list of signal names.
 
+const std::vector< std::string > & Signals () const
 Returns a list of signal names.
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_signal_observer-members.html b/docs/manual/html/classdbc_1_1_signal_observer-members.html new file mode 100644 index 0000000..1782ae3 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_signal_observer-members.html @@ -0,0 +1,113 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc::SignalObserver Member List
+
+
+ +

This is the complete list of members for dbc::SignalObserver, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
CanId(size_t index) constdbc::SignalObserver
ChannelValue(size_t index, uint64_t &ns1970, V &value) constdbc::SignalObserver
ChannelValue(size_t index, uint64_t &ns1970, std::string &value) constdbc::SignalObserver
DetachObserver() overridedbc::SignalObservervirtual
EngValue(size_t index, uint64_t &ns1970, V &value) constdbc::SignalObserver
EngValue(size_t index, uint64_t &ns1970, std::string &value) constdbc::SignalObserver
FirstIndex() constdbc::SignalObserver
GetSignal() constdbc::SignalObserverinline
ISampleObserver()=defaultdbc::ISampleObserver
LastIndex() constdbc::SignalObserver
MaxSamples(size_t max_nof_samples)dbc::SignalObserver
MaxSamples() constdbc::SignalObserverinline
NofSamples() constdbc::SignalObserverinline
NofValidSamples() constdbc::SignalObserver
OnSample() overridedbc::SignalObservervirtual
ResetSampleIndex()dbc::SignalObserver
SampleToIndex(size_t sample) constdbc::SignalObserver
SignalObserver(const Signal &signal)dbc::SignalObserverexplicit
SignalObserver()=deletedbc::SignalObserver
Time(size_t index) constdbc::SignalObserver
TimeToIndex(uint64_t time) constdbc::SignalObserver
~ISampleObserver()=defaultdbc::ISampleObservervirtual
~SignalObserver() overridedbc::SignalObserver
+ + + + diff --git a/docs/manual/html/classdbc_1_1_signal_observer.html b/docs/manual/html/classdbc_1_1_signal_observer.html new file mode 100644 index 0000000..4d9e3cf --- /dev/null +++ b/docs/manual/html/classdbc_1_1_signal_observer.html @@ -0,0 +1,379 @@ + + + + + + + +DbcLib: dbc::SignalObserver Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbc::SignalObserver Class Reference
+
+
+ +

The sample observer hold a number of samples. + More...

+ +

#include <signalobserver.h>

+
+Inheritance diagram for dbc::SignalObserver:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dbc::SignalObserver:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

SignalObserver (const Signal &signal)
 Constructor.
 
SignalObserver ()=delete
 Default constructor.
 
~SignalObserver () override
 Default destructor.
 
+void MaxSamples (size_t max_nof_samples)
 Sets the maximum number of samples.
 
+size_t MaxSamples () const
 Returns the max number of samples.
 
+const SignalGetSignal () const
 Returns the signal object.
 
+uint64_t Time (size_t index) const
 Returns the absolute time for a sample.
 
+uint32_t CanId (size_t index) const
 Returns the CAN ID for a sample.
 
template<typename V >
bool ChannelValue (size_t index, uint64_t &ns1970, V &value) const
 Returns the unscaled signal value.
 
template<typename V >
bool EngValue (size_t index, uint64_t &ns1970, V &value) const
 Returns the scaled signal value.
 
+void ResetSampleIndex ()
 Reset the sample index.
 
+size_t FirstIndex () const
 First sample.
 
+size_t LastIndex () const
 Last sample.
 
+size_t NofSamples () const
 Returns number of samples.
 
+size_t NofValidSamples () const
 Returns number of valid samples.
 
+size_t SampleToIndex (size_t sample) const
 Sample number (0..) to internal index.
 
+std::pair< size_t, bool > TimeToIndex (uint64_t time) const
 Sample time to internal index.
 
void DetachObserver () override
 Detach an observer.
 
void OnSample () override
 On sample callback handler.
 
+template<>
bool ChannelValue (size_t index, uint64_t &ns1970, std::string &value) const
 Returns the unscaled signal value as a string.
 
+template<>
bool EngValue (size_t index, uint64_t &ns1970, std::string &value) const
 Returns the scaled signal value as a string'.
 
- Public Member Functions inherited from dbc::ISampleObserver
ISampleObserver ()=default
 Default constructor.
 
+virtual ~ISampleObserver ()=default
 Default destructor.
 
virtual void OnSample ()=0
 Handle a sample.
 
virtual void DetachObserver ()=0
 Detach the observer object.
 
+

Detailed Description

+

The observer holds signal values in a circular buffer of a maximum number of samples size. The user shall access the samples in normal sample order i.e the first sample is 0 while the internal circular index might be something else.

+

Member Function Documentation

+ +

◆ ChannelValue()

+ +
+
+
+template<typename V >
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool dbc::SignalObserver::ChannelValue (size_t index,
uint64_t & ns1970,
V & value 
) const
+
+

Returns the unscaled signal value for a specific sample.

Template Parameters
+ + +
VValue type.
+
+
+
Parameters
+ + + + +
indexSample index (0..).
ns1970Sample time nano-seconds since 1970.
valueSample value.
+
+
+
Returns
True if value is valid.
+ +
+
+ +

◆ DetachObserver()

+ +
+
+ + + + + +
+ + + + + + + +
void dbc::SignalObserver::DetachObserver ()
+
+overridevirtual
+
+ +

Implements dbc::ISampleObserver.

+ +
+
+ +

◆ EngValue()

+ +
+
+
+template<typename V >
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool dbc::SignalObserver::EngValue (size_t index,
uint64_t & ns1970,
V & value 
) const
+
+

Returns the scaled signal value for a specific sample.

Template Parameters
+ + +
VValue type.
+
+
+
Parameters
+ + + + +
indexSample index (0..).
ns1970Sample time nano-seconds since 1970.
valueSample value.
+
+
+
Returns
True if value is valid.
+ +
+
+ +

◆ OnSample()

+ +
+
+ + + + + +
+ + + + + + + +
void dbc::SignalObserver::OnSample ()
+
+overridevirtual
+
+ +

Implements dbc::ISampleObserver.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/manual/html/classdbc_1_1_signal_observer__coll__graph.map b/docs/manual/html/classdbc_1_1_signal_observer__coll__graph.map new file mode 100644 index 0000000..c34a163 --- /dev/null +++ b/docs/manual/html/classdbc_1_1_signal_observer__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/manual/html/classdbc_1_1_signal_observer__coll__graph.md5 b/docs/manual/html/classdbc_1_1_signal_observer__coll__graph.md5 new file mode 100644 index 0000000..507aaac --- /dev/null +++ b/docs/manual/html/classdbc_1_1_signal_observer__coll__graph.md5 @@ -0,0 +1 @@ +b6515fa95c5227ef276186c016c6a8a1 \ No newline at end of file diff --git a/docs/manual/html/classdbc_1_1_signal_observer__coll__graph.png b/docs/manual/html/classdbc_1_1_signal_observer__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..660b3feeed9bedd540c7271147a42ede5db69a8d GIT binary patch literal 1511 zcmb_c{Xf$Q9RE6I3|Fsoj9G}HM3$3>NDm(8d12Z-MG~_ZnUIIesWXPl$xcGaL$q0* zpQW(7eIO{q1cmfiGX9sI4p;06_V6mS^2=$|oh#jAl{}df-6n>M{wW1evkDo!H_c^f{|VvchK|7N+lh6?OO3zHvIo+(*;C zbYv}>*dG&3EKvRV%ECZFbWouQ|MkgWv4bLnz}$W4O-(x$s3npmqIR^F6-^`(R}^w} zbB$0)Z&ze|Zq>1nUvU62O{M@c{l-t<)<>?+ren%TkAIn#yeKWJmg*1K?H9LwbXUUV zNZ{wwOy~%MTQ%X&SZC@8lp|^;K}M-42xfVjyY}3TW5&J@!O{WjU@ePE*&v0;6jkw> z#?ylz@Ci~Qva`ySt$J6m+0A-j|I7!t2bBpUxM-g59SkO1kX{c@pNSpW;xf3ajhG8D z^HRYK8e?Pu^2DH4h{jjBXLv8->Qc1lJ^Ly)6+&^k?ptJ~=-oim$oK&`Y}*T^(lTS` zlRp&E>KrITkVnnuNkXjUNKpdxI-@}v8C7Rx-T;N4SNTe-r=+wCx4>$ zfJZxyYl;iUpQ3gfUVF7wa!+Y+OYjrby>Z<3bxIZfCdacTVZt?mmX+tgrl_-@h@|}C z_r%$=h-tdY`aP}} zdgDX>^%Ht#UpLV2mnby>N1}&9S$iJgI~aC~>-Sa9;>i7l7RcOTPiK$|E*>1z(dqPk z^N8z>03lAhL@QCao|EUWy_3#}sV^9$6@H-&^&H>DJFLQhqU7lI7-ylL7fM5*Oh0Je z83b4Z)|BZB?_={w27Vx;uw}0B!h|?IwtcY^m%BRL7iDHt5+VuQ@iWp?ZEs7J4aATJ>er>mN;f%eM7>t@;>1&*1ipj?_e0^K%82t7~Xs z^?_O6ZRhb+OpnefG_y@5$`Bs(+(pCd{HS0lKg|9&R*!C53&Ebh+n@>SPtqiP_5Pn7 z{^t2zZOJT4#Q)s_eUWd&VzHn3w)X4GVPe3WsYEICiNyMbhUDr%;hsuI7K=5=BMM>l zJ)L8!Z3Ur9k#lo%5@0a6lVby-b9nwyQOpi?S2Z8;{|X%YZj`@8o+^WueGaVDU~aeP zo!bmfD{q;OVe_{TP}%%m$K^=&<;oiJ=q>qb5MCcz8_Uu`Dxbmj3aESVg%8905fY^f z6g>m)!(A-nw4(t#89998+aC&1)e2r_pYUK> zCSD!#)}rK??kMYa#mX`#VfP1v^WASKGmdryGm_Rdg0+3rhf2@#`&lPA4z72+*x~IL z<5{MUtE?1{CN-_-IZ}@vLSyqcHjq=~0io#H3~HB*X~IypFG36H;H_TQ*pow%%kE2R z&r}Y@cQYeyD*joI@McGh@B&UNr;ZKOPHtW-32s}y(KUH}CnTF9SDc_$$6nT5&kPWV z&y2z0@JnG~$G5?#g?3PxX1th_3{id`?f}MxQ)ik4oY$f~ZDMBDB@hrQ wFjvLW8MEcQWbyL4zb+Z8SSwn7gWI}AK_W~o2RL + + + diff --git a/docs/manual/html/classdbc_1_1_signal_observer__inherit__graph.md5 b/docs/manual/html/classdbc_1_1_signal_observer__inherit__graph.md5 new file mode 100644 index 0000000..507aaac --- /dev/null +++ b/docs/manual/html/classdbc_1_1_signal_observer__inherit__graph.md5 @@ -0,0 +1 @@ +b6515fa95c5227ef276186c016c6a8a1 \ No newline at end of file diff --git a/docs/manual/html/classdbc_1_1_signal_observer__inherit__graph.png b/docs/manual/html/classdbc_1_1_signal_observer__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..660b3feeed9bedd540c7271147a42ede5db69a8d GIT binary patch literal 1511 zcmb_c{Xf$Q9RE6I3|Fsoj9G}HM3$3>NDm(8d12Z-MG~_ZnUIIesWXPl$xcGaL$q0* zpQW(7eIO{q1cmfiGX9sI4p;06_V6mS^2=$|oh#jAl{}df-6n>M{wW1evkDo!H_c^f{|VvchK|7N+lh6?OO3zHvIo+(*;C zbYv}>*dG&3EKvRV%ECZFbWouQ|MkgWv4bLnz}$W4O-(x$s3npmqIR^F6-^`(R}^w} zbB$0)Z&ze|Zq>1nUvU62O{M@c{l-t<)<>?+ren%TkAIn#yeKWJmg*1K?H9LwbXUUV zNZ{wwOy~%MTQ%X&SZC@8lp|^;K}M-42xfVjyY}3TW5&J@!O{WjU@ePE*&v0;6jkw> z#?ylz@Ci~Qva`ySt$J6m+0A-j|I7!t2bBpUxM-g59SkO1kX{c@pNSpW;xf3ajhG8D z^HRYK8e?Pu^2DH4h{jjBXLv8->Qc1lJ^Ly)6+&^k?ptJ~=-oim$oK&`Y}*T^(lTS` zlRp&E>KrITkVnnuNkXjUNKpdxI-@}v8C7Rx-T;N4SNTe-r=+wCx4>$ zfJZxyYl;iUpQ3gfUVF7wa!+Y+OYjrby>Z<3bxIZfCdacTVZt?mmX+tgrl_-@h@|}C z_r%$=h-tdY`aP}} zdgDX>^%Ht#UpLV2mnby>N1}&9S$iJgI~aC~>-Sa9;>i7l7RcOTPiK$|E*>1z(dqPk z^N8z>03lAhL@QCao|EUWy_3#}sV^9$6@H-&^&H>DJFLQhqU7lI7-ylL7fM5*Oh0Je z83b4Z)|BZB?_={w27Vx;uw}0B!h|?IwtcY^m%BRL7iDHt5+VuQ@iWp?ZEs7J4aATJ>er>mN;f%eM7>t@;>1&*1ipj?_e0^K%82t7~Xs z^?_O6ZRhb+OpnefG_y@5$`Bs(+(pCd{HS0lKg|9&R*!C53&Ebh+n@>SPtqiP_5Pn7 z{^t2zZOJT4#Q)s_eUWd&VzHn3w)X4GVPe3WsYEICiNyMbhUDr%;hsuI7K=5=BMM>l zJ)L8!Z3Ur9k#lo%5@0a6lVby-b9nwyQOpi?S2Z8;{|X%YZj`@8o+^WueGaVDU~aeP zo!bmfD{q;OVe_{TP}%%m$K^=&<;oiJ=q>qb5MCcz8_Uu`Dxbmj3aESVg%8905fY^f z6g>m)!(A-nw4(t#89998+aC&1)e2r_pYUK> zCSD!#)}rK??kMYa#mX`#VfP1v^WASKGmdryGm_Rdg0+3rhf2@#`&lPA4z72+*x~IL z<5{MUtE?1{CN-_-IZ}@vLSyqcHjq=~0io#H3~HB*X~IypFG36H;H_TQ*pow%%kE2R z&r}Y@cQYeyD*joI@McGh@B&UNr;ZKOPHtW-32s}y(KUH}CnTF9SDc_$$6nT5&kPWV z&y2z0@JnG~$G5?#g?3PxX1th_3{id`?f}MxQ)ik4oY$f~ZDMBDB@hrQ wFjvLW8MEcQWbyL4zb+Z8SSwn7gWI}AK_W~o2RL + + + + + + +DbcLib: Class Index + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
A | D | E | I | M | N | S
+ +
+ + + + diff --git a/docs/manual/html/closed.png b/docs/manual/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/docs/manual/html/dbcfile_8h.html b/docs/manual/html/dbcfile_8h.html new file mode 100644 index 0000000..561f3ff --- /dev/null +++ b/docs/manual/html/dbcfile_8h.html @@ -0,0 +1,135 @@ + + + + + + + +DbcLib: include/dbc/dbcfile.h File Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbcfile.h File Reference
+
+
+ +

The DBC file object is the main user object. +More...

+
#include <string>
+#include <memory>
+#include "dbc/network.h"
+#include "dbc/dbcmessage.h"
+
+Include dependency graph for dbcfile.h:
+
+
+ + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  dbc::DbcFile
 Main user object that is an interface against a DBC file. More...
 
+ + + + +

+Namespaces

namespace  dbc
 Main namespace for the DBC library.
 
+
+ + + + diff --git a/docs/manual/html/dbcfile_8h__incl.map b/docs/manual/html/dbcfile_8h__incl.map new file mode 100644 index 0000000..7aabf9e --- /dev/null +++ b/docs/manual/html/dbcfile_8h__incl.map @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/manual/html/dbcfile_8h__incl.md5 b/docs/manual/html/dbcfile_8h__incl.md5 new file mode 100644 index 0000000..439c624 --- /dev/null +++ b/docs/manual/html/dbcfile_8h__incl.md5 @@ -0,0 +1 @@ +d4d73d9519c449a38bd965dfb382a3e6 \ No newline at end of file diff --git a/docs/manual/html/dbcfile_8h__incl.png b/docs/manual/html/dbcfile_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..08dc407008079ccd11924764f3fabea9b136426b GIT binary patch literal 102282 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 OOI})8s#3x*@c#pLT4%-p literal 0 HcmV?d00001 diff --git a/docs/manual/html/dbcfile_8h_source.html b/docs/manual/html/dbcfile_8h_source.html new file mode 100644 index 0000000..55c2964 --- /dev/null +++ b/docs/manual/html/dbcfile_8h_source.html @@ -0,0 +1,154 @@ + + + + + + + +DbcLib: include/dbc/dbcfile.h Source File + + + + + + + + + + + +
+
dbcfile.h
+
+
+Go to the documentation of this file.
1/*
+
2* Copyright 2022 Ingemar Hedvall
+
3* SPDX-License-Identifier: MIT
+
4 */
+
8#pragma once
+
9#include <string>
+
10#include <memory>
+
11#include "dbc/network.h"
+
12#include "dbc/dbcmessage.h"
+
13
+
14namespace dbc {
+
15
+
22class DbcFile {
+
23 public:
+
25 void Filename(const std::string& filename) {filename_ = filename; }
+
27 [[nodiscard]] const std::string& Filename() const {return filename_; }
+
28
+
30 [[nodiscard]] std::string Name() const;
+
31
+
33 [[nodiscard]] const std::string& LastError() const { return last_error_; }
+
34
+
36 [[nodiscard]] Network* GetNetwork() { return network_.get(); }
+
38 [[nodiscard]] const Network* GetNetwork() const { return network_.get(); }
+
39
+
41 [[nodiscard]] bool ParseFile();
+
42
+
49 void BaseTime(uint64_t ns1970) {base_time_ = ns1970;}
+
51 [[nodiscard]] uint64_t BaseTime() const {return base_time_;}
+
52
+
54 void SetMessageSize(size_t nof_messages);
+
56 void AddMessage(size_t index, const DbcMessage& message);
+
58 bool ParseMessage(const DbcMessage& message);
+
60 void ResetSampleCounter() const;
+ +
70
+
71 private:
+
73 bool ParseStandardCAN(const DbcMessage& message);
+
75 bool ParseJ1939(const DbcMessage& message);
+
77 bool ParseNMEA2000(const DbcMessage& message);
+
78 std::string filename_;
+
79 mutable std::string last_error_;
+
80 std::unique_ptr<Network> network_;
+
81 std::vector<DbcMessage> message_list_;
+
82 uint64_t base_time_ = 0;
+
83};
+
84
+
85} // namespace dbc
+
Main user object that is an interface against a DBC file.
Definition: dbcfile.h:22
+
uint64_t BaseTime() const
Returns the base (start) time of first message.
Definition: dbcfile.h:51
+
void ReparseMessageList()
Reparse the message queue.
+
bool ParseMessage(const DbcMessage &message)
Parses the message into signal values.
+
void SetMessageSize(size_t nof_messages)
Sets the maximum message queue size.
+
void ResetSampleCounter() const
Resets the sample counter for all signals.
+
const std::string & Filename() const
Returns the file name with full path.
Definition: dbcfile.h:27
+
std::string Name() const
Returns the File name without path and extension.
+
void Filename(const std::string &filename)
Sets the file name. Full path required.
Definition: dbcfile.h:25
+
const std::string & LastError() const
Returns the last (parser) error text.
Definition: dbcfile.h:33
+
Network * GetNetwork()
Returns the network object.
Definition: dbcfile.h:36
+
const Network * GetNetwork() const
Returns the network object.
Definition: dbcfile.h:38
+
bool ParseFile()
Parses the DBC file. Returns true on success.
+
void BaseTime(uint64_t ns1970)
Start time of messages.
Definition: dbcfile.h:49
+
void AddMessage(size_t index, const DbcMessage &message)
Adds q message to the message queue.
+
Wrapper class around a CAN message.
Definition: dbcmessage.h:21
+
Interface against a DBC network configuration.
Definition: network.h:39
+
Wrapper around a CAN message.
+
Main namespace for the DBC library.
Definition: attribute.h:13
+
Defines a DBC network configuration object.
+
+ + + + diff --git a/doxygen/utillib.css b/docs/manual/html/dbclib.css similarity index 100% rename from doxygen/utillib.css rename to docs/manual/html/dbclib.css diff --git a/docs/manual/html/dbcmessage_8h.html b/docs/manual/html/dbcmessage_8h.html new file mode 100644 index 0000000..362df1b --- /dev/null +++ b/docs/manual/html/dbcmessage_8h.html @@ -0,0 +1,129 @@ + + + + + + + +DbcLib: include/dbc/dbcmessage.h File Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dbcmessage.h File Reference
+
+
+ +

Wrapper around a CAN message. +More...

+
#include <cstdint>
+#include <vector>
+
+Include dependency graph for dbcmessage.h:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  dbc::DbcMessage
 Wrapper class around a CAN message. More...
 
+ + + + +

+Namespaces

namespace  dbc
 Main namespace for the DBC library.
 
+
+ + + + diff --git a/docs/manual/html/dbcmessage_8h__dep__incl.map b/docs/manual/html/dbcmessage_8h__dep__incl.map new file mode 100644 index 0000000..b41eb9e --- /dev/null +++ b/docs/manual/html/dbcmessage_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/manual/html/dbcmessage_8h__dep__incl.md5 b/docs/manual/html/dbcmessage_8h__dep__incl.md5 new file mode 100644 index 0000000..c586f3f --- /dev/null +++ b/docs/manual/html/dbcmessage_8h__dep__incl.md5 @@ -0,0 +1 @@ +657dc13139969afb15a190bf4bb662f1 \ No newline at end of file diff --git a/docs/manual/html/dbcmessage_8h__dep__incl.png b/docs/manual/html/dbcmessage_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..edf8cf27991c8d98092bbcfabe51afc0c06ca45d GIT binary patch literal 1513 zcmchX_fr!F6vtDLAw!fyhM_DKC|a-(2wR1)L~yVUkT61k90WuNONNL{8A5zGdL}*siR=%`H&d@Qg1E>R z`%);Bv{4SLL_!5N3xu`sXo|%~KtSAvMWI+~Bpi-UjLNyCQbcGJoF;zJkjhKf@lZ~< znJL7nqXz*OBt0ES%(lWJdaEEQxqS|KxS`O;O;sjcgRW;x+gaFqk zu8w>k;Z^MA(D$NXsZ&PBDA_TYAML)FFp9BbA|JQ)nd8{_`dP7Rb>*Tq>}zy77!FD*4$=>4Grbi`ob5ZJ*M(Pz!YiEk8$+g0!t6f z&z*1tfmC{yw$Ib$yuS$e#1UZfe_7&gzH#>&r#s~nU^(MsVIcE8CZlO!7ZTaAZi^_M zO$mE;yV57`_2`h>Q?l}&sXoH-qP@vW^A2PbObMv+i0oSSN1U z=1A81r%5iKL=}obA(870ut~9~yq$P!YsyhrFq_ilUqQNR!)e4-hwyS>7kw^8B2x{b zU|BT)z=;*!wjVQQO}}y2xG&UjLWXo{?&N9^e`hV)T5Ohli9OkkPaiNUi z1!JaZ@E~YihCYW)xi$1PP~wPln)Pr}x7w$XApuGyd+Jx)6URo^?sWgPHFCBk;{E$F{`-1yu1J+=zk5HxXZ$L{3TxmRdYI>is#}yL{zPR|MdTaXuki-zTgXOtm2_Q#WeRrM;8F_k>fAIsY`);csv)j zUyS45ZPBatg+j;p{2p3}YXjIe{)tCieEiFDtqH8-4E$*c##a~-$z8v^rhfLEFy zuV0f=51dnWT=G%kw)=+fl>-fkdd@h5aEmC?b@xFRtHeKlBj*$$59obKNX&V7A*&hX zTv^9Gk71$6ab-QPCiAw5xcbJWx3NI2Amb1?!K`)1By3rxCfFhXCDA#}OH?vMrj;$N zJ(X1=D>CX9i44sSR_AA5%vgFlagI%z#ON2;(lDUTTSS{(x%d{5wO0k#so8NspcizzKOi)Kes6@shhblEbMN8lbtK1#U|kX-^6+LbpQYW literal 0 HcmV?d00001 diff --git a/docs/manual/html/dbcmessage_8h__incl.map b/docs/manual/html/dbcmessage_8h__incl.map new file mode 100644 index 0000000..046d46a --- /dev/null +++ b/docs/manual/html/dbcmessage_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/manual/html/dbcmessage_8h__incl.md5 b/docs/manual/html/dbcmessage_8h__incl.md5 new file mode 100644 index 0000000..41b3c9e --- /dev/null +++ b/docs/manual/html/dbcmessage_8h__incl.md5 @@ -0,0 +1 @@ +6748effdec789ea0113e6d30eff21933 \ No newline at end of file diff --git a/docs/manual/html/dbcmessage_8h__incl.png b/docs/manual/html/dbcmessage_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe476fad84110a7a0b56b939b0f603a3940dad9 GIT binary patch literal 2950 zcmV;13wiX3P)CkkWK9jI*v$f;}kp7`e+q|*3xQ?v4SDV zp8gTyEXnR>cXMC6_k3nDv-ke)J?FdUe)o5O_m{hO!7vQNFbu;mjAB9tu87Cu6GY?! zKg1Y@lc?&>rlzL-sq4xHZX_ZXh{z`IWEqBQTm@`ST`|b;{Y;-e-E}pF;TG-f?P=FX zJl0_tzG8+qLWLRL2o+{{BUCtI`1<;K-(uvuU#9I-*AMsoc#)%&akDm#82<6cA9o^* zVYp7HhBWo{^{#(7y~tq{PR4ood`LaW{jd8^O9Kyn>gg(zF$S6@-EyY=bBUizoNVoW z=EzjvLbSTs)~_+$aZ9&fI)3~v{VN0V#MJ@D+5&ydCmEnea4EREZr`2P5A&YXCe!^t?= zV&C&Z(L}ZiQ9&8L3KmRAu-rkO?UbSxBx})xg57j@O40j2_Md?tK+(oP5A5IO$+{6rT zI7$#ro{9}=j8I{QH$sIO-UtjaJPst9*A&6RuH(im234DT?Dx9NC< zABeCfU$X-=&6oWs_o(v2Yk#eubwgvAF~d7dS%e2r-tDR2!9rtqN}3V?De>?4L?lG}mq@*Zw; zI(8T_!w-`s+x09_u1C3beT{TD9sjBM(h1xK+^~3?p5t`|BJx{om zW8yAafR`f?9&sy2SgaXAQo{^i0P*cQ0ayjx)iOu^=~dpQS#khagRnZbO;7eJZz*AhFN6pW0{{W@?l!VL`#lJr~8AVgH)M&N?@ zZ&~EGoSk1kWBIju(#|4*7~g_S0+^QDDXE`9`IXBP%*=&A>O8!sq$4|dE>cKG|zWzsF5Cp zn}M$_ZB<`yeF!Rc(K>*J9a^^kFfXg}W^=84#cw@@5KHLOz^T#WnNmz2STC?1egJQG zaic1y_eNOhx0XWDGHwP=>3x^)_^l;qnBh~nu1!xAxE;8E{TzA2Z#{+5GE3eRcnG*- z@irarx1JyoO2aQ{(}@i`bkMW$yOp~|_^7h7_#a{#>E>>rBN`q2tel1&TDGK3C;A}E zcS33Sh_Y(`VP2_AXifjR*mj)?EFsCtpVY|ze3a)1N515}8i*}z)${t-*Cn)O|6yK< zgmk_>lozda34ICSTu}trN;%8vW}`y1WiA&YlJD=-1QS(>wec)aPB~Z8&4a)dDk#by zTWV#7&k8*!bUpmS%^DRr=ZM(>7SO{Rz^RgCRmqqgKty|!+yYFXn^%D^0f-_3UtG9Z zqy7r?p3oWo*kd^z7?HB79Hm^~1fu-1E}_@@rOjz#ZMq;TYynQ9?>(2NG*^xu%W3{7 z^N-LOUZPAz8Fbg9LK(`5qWmnD(C1=pdbS_>oFLYwXVeKMW#mS z`!KXi85bRSa&J-b)O_jeE@P&^P9Wp2h6q%k*hOneqbdSZGPjdd_*G{o7ae)ZS5dNI zmb^DI$z{MM7(9Ff`sU|^sbTw;RHzIeYvc0@$EImgKoRbrxQm5b7Re#6wK>h&`O?)q zmu~{M0;-bsC&7mwA9LGRW3#8ntqg=?q` zPlV|xqDrp_J9|ekW!>fSy5F+AqGgu6*;~mB;05}oB}Ihke(Um*&=`K%Gdc-n41fq5 zBcEcn8$Uu8bk^5M$HYozBdh~J855>ECtaD6YHV!WqN-QA5xY=2Mpg6r3A35_{!4tO zbGK`G>g(&>s_7zC-Q;AT4(KoGDijYZ#dO;j62wj~a5ME@x`nvuDqc`{kN5Tg+0z zjXLMD925f8!>5w1Sh*H*sO^GyK%AoAq)@o|hEt!Q);2Ibd^S=KUjMRDI6)k0ctued z9w>^_Ww8+E+68tXD5ZK9ajVY7Qmeoi z9tyiqO}9RmZ3k|Xt*w~Jr#{)*3axX{2<(u?FxgS5#lgZ?ZU0q!qI8d~|DNqn1?maXs wnN04BL?XW^<(j%#Kf^E#!!QiPFp87^1D%xY5Cu(?r~m)}07*qoM6N<$f>W)t>Hq)$ literal 0 HcmV?d00001 diff --git a/docs/manual/html/dbcmessage_8h_source.html b/docs/manual/html/dbcmessage_8h_source.html new file mode 100644 index 0000000..a9eb840 --- /dev/null +++ b/docs/manual/html/dbcmessage_8h_source.html @@ -0,0 +1,145 @@ + + + + + + + +DbcLib: include/dbc/dbcmessage.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbcmessage.h
+
+
+Go to the documentation of this file.
1/*
+
2* Copyright 2022 Ingemar Hedvall
+
3* SPDX-License-Identifier: MIT
+
4 */
+
8#pragma once
+
9#include <cstdint>
+
10#include <vector>
+
11
+
12namespace dbc {
+
13
+ +
22 public:
+
23 DbcMessage() = default;
+
31 DbcMessage(uint64_t time, uint32_t can_id, std::vector<uint8_t> data);
+
32 DbcMessage(const DbcMessage& message) = default;
+
33
+
34
+
35 void Time(uint64_t ns1970) {time_ = ns1970;}
+
36 [[nodiscard]] uint64_t Time() const {return time_;}
+
37
+
38 void CanId(uint32_t can_id) {can_id_ = can_id;}
+
39 [[nodiscard]] uint32_t CanId() const {return can_id_;}
+
40
+
42 void Data(const std::vector<uint8_t>& data) {data_ = data;}
+
44 [[nodiscard]] const std::vector<uint8_t>& Data() const {return data_;}
+
45
+
46 [[nodiscard]] uint32_t Pgn() const;
+
47 [[nodiscard]] uint8_t Priority() const;
+
48 [[nodiscard]] bool ExtendedDataPage() const;
+
49 [[nodiscard]] bool DataPage() const;
+
50 [[nodiscard]] uint8_t PduFormat() const;
+
51 [[nodiscard]] uint8_t PduSpecific() const;
+
52 [[nodiscard]] uint8_t Source() const;
+
53 private:
+
54 uint64_t time_ = 0;
+
55 uint32_t can_id_ = 0;
+
56 std::vector<uint8_t> data_;
+
57};
+
58
+
59} // namespace dbc
+
Wrapper class around a CAN message.
Definition: dbcmessage.h:21
+
const std::vector< uint8_t > & Data() const
Returns the CAN data bytes.
Definition: dbcmessage.h:44
+
DbcMessage()=default
Default constructor.
+
uint8_t PduSpecific() const
PDU specific.
+
bool DataPage() const
True if data page.
+
uint8_t PduFormat() const
PDU format.
+
uint8_t Source() const
Source number.
+
uint64_t Time() const
Message time.
Definition: dbcmessage.h:36
+
DbcMessage(uint64_t time, uint32_t can_id, std::vector< uint8_t > data)
Constructor that wraps a CAN message.
+
void Time(uint64_t ns1970)
Sets the time.
Definition: dbcmessage.h:35
+
DbcMessage(const DbcMessage &message)=default
Default destructor.
+
uint8_t Priority() const
Priority (0-8)
+
void Data(const std::vector< uint8_t > &data)
Sets the CAN data bytes.
Definition: dbcmessage.h:42
+
uint32_t Pgn() const
PGN Program number.
+
bool ExtendedDataPage() const
True if extended data page.
+
uint32_t CanId() const
CAN ID.
Definition: dbcmessage.h:39
+
void CanId(uint32_t can_id)
Sets the CAN ID.
Definition: dbcmessage.h:38
+
Main namespace for the DBC library.
Definition: attribute.h:13
+
+ + + + diff --git a/docs/manual/html/dir_4e8d938e9ddb5a617c200d5739d1f41a.html b/docs/manual/html/dir_4e8d938e9ddb5a617c200d5739d1f41a.html new file mode 100644 index 0000000..6788286 --- /dev/null +++ b/docs/manual/html/dir_4e8d938e9ddb5a617c200d5739d1f41a.html @@ -0,0 +1,87 @@ + + + + + + + +DbcLib: doxygen Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
doxygen Directory Reference
+
+
+
+ + + + diff --git a/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e.html b/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e.html new file mode 100644 index 0000000..81d29d8 --- /dev/null +++ b/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e.html @@ -0,0 +1,133 @@ + + + + + + + +DbcLib: include/dbc Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dbc Directory Reference
+
+
+
+Directory dependency graph for dbc:
+
+
include/dbc
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  attribute.h [code]
 All DBC network objects may have attributes attached to them.
 
file  dbcfile.h [code]
 The DBC file object is the main user object.
 
file  dbcmessage.h [code]
 Wrapper around a CAN message.
 
file  envvar.h [code]
 Wrapper wrong environment variables.
 
file  isampleobserver.h [code]
 Internal object that define an observer interface that handle samples.
 
file  message.h [code]
 DBC message configuration object.
 
file  network.h [code]
 Defines a DBC network configuration object.
 
file  node.h [code]
 Interface against a DBC node (Device(ECU).
 
file  signal.h [code]
 Interface against a DBC signal configuration.
 
file  signalgroup.h [code]
 Defines a signal group.
 
file  signalobserver.h [code]
 The sample observer holds sample values for a signal.
 
+
+ + + + diff --git a/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.map b/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.map new file mode 100644 index 0000000..e6e6944 --- /dev/null +++ b/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.md5 b/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.md5 new file mode 100644 index 0000000..741f1ef --- /dev/null +++ b/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.md5 @@ -0,0 +1 @@ +092bd50415c60cd8a01166558e54b497 \ No newline at end of file diff --git a/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.png b/docs/manual/html/dir_67453f04da784cdd04890da01913ef0e_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..43d09f1062bcbfdc58ef671b1dd1f2a5b5429d56 GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0vp^2|%2|!3HGxPJayrQfx`y?k)`fL2$v|<&zm0m`-}S zIEGZrd3)C}@3Mo)v5(?M)OLGlhA$8`&+t-B@4VtQae;VaQ0F%9pd}_xl^9zR4jN5s z_{McW^p?lXRLL;W+|>T&<8}GR{{9d1JpS18Z>3t<8&4OYRba3p_Vn_i{rBrF=lb2> zJA{o}{a+m}M+ zs{WR%=g(yn`}m5{bCQo)wSW8$ri@*A%inJ0l@Iyq6u`$Qq0ErXlHg<8kheT{Tc6gg zb+f7%Hve?meR4sitW#&lnP=S33rl2o%`IE0aQfP5pxI9!{W;#gXtJgFWyKf23b$WA zCnLA+|2rwGchgdB&#&Hp>euUMrD`#)v#V3@Jzn!X_1fIEi<^awT>G8wor99y(UPM}L;J^KSQFqh+i1k@KjuNmjOHBx?*F9KtG#=d zX>H#2%|mW|{*`-uUJUX3YbJf3f8TW0Dxdu9=(xRhYxc^vDI~utcg=VcYIn}hKjd~W z|AOsX*WP_nZ)trsw_owZjBtj`S?}&XFK+ml5n(ZLH;3(k2ouH>-!~ae8B7^kOa@|a z?p{>--!^NH_4LoDoOisg3_Zy9VAlPqp>a>|82JYBI7UhbWamZR-NWQDDJAGjt(EV# z`ht)jt^TfyUNHJz`@!I3pU&~k_lD_yZQi>cujVpi5d3~*kI`4BD?b!9N>~zr zo-edLz=jAcPl>myYg=H6|5^M=o4Ru|uA zW*b9$g(9$SSkPtJ^K0zNUHU@6?8~oxKNQU$%NH?26Pm-p_>iB12QG78=KzU#y85}S Ib4q9e0N!|CFaQ7m literal 0 HcmV?d00001 diff --git a/docs/manual/html/dir_d44c64559bbebec7f509842c48db8b23.html b/docs/manual/html/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 0000000..2ebc9be --- /dev/null +++ b/docs/manual/html/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,93 @@ + + + + + + + +DbcLib: include Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
include Directory Reference
+
+
+ + + + +

+Directories

directory  dbc
 
+
+ + + + diff --git a/docs/manual/html/doc.png b/docs/manual/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/docs/manual/html/docd.png b/docs/manual/html/docd.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c94fda9bf08ecc02c7190d968452b7a2dbf04b GIT binary patch literal 756 zcmV1wr-rhpn+wxm%q2)IkAYsr{iGq<}_z5JCD4J;FN?6Qh;@TCubdp(_XdD-^ zG_#)IP7_z6hKNdx5^+FGArwLWTWCG!j+oKji?U!hxA#d-ljgkN`+e^@-P+RWG{Bx= z2iQyYTtEf*o~ySWrIVW}HWHi0_hd4~$E6Jx1U`>Owo}EYJ1O>iZvS?!z8}B}QwLMA zC3Keqf1c}K@?C`X>68b(EUzYUYAS&OH^VPteZLPr{S&|nQvp@6W4GH-1U8!u&7l~A zx~RUSNH+>7@q38W6!BzirtjLFCzc|XGx)EF#G%^pWION*k@?vP<2O>|XkCD3ujl%1 z{55JSVkw{~HbX>iEZ2%yJ2eHj5Yh8OTpzs0A2;tZ^x!#5D+y-es{k1&0|Ns9-|+Xt ziGiTsZ8(^nUo#wdTpIDkb-Zp(3|A*FzW}GZ5SQD-r^R`&X@`26E3W|GyrwDIZjtQ& z$g5f8Sv=VgVtDien@J(!^BK+#l;s-LgP--p7C;7;E!ysXcXK6?+9D>_-B(?Wm(U zQbNm-5TyYxIU=rs0+)!ixqzhuxw(AqKc3?KKX32{D~Qibp*r0x&Wux5-9WCMMRi3U zTd6dOCQlj>a;gr;gLwRKulT&(m@^L{&HkSC(qH05HSSf$YEhynGvH zWNez``Z8FJXE+BSg=%ak{OR z+Nylcb{?evLYLuE1_HngYw0g%LC#=$a@?4~Tx>F9295Q>9UJ|_6v-KMw;!YZSgGj@ zR8fRov=hJ#QvsO@xw*{0%zH@OKVEUrsummary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + diff --git a/docs/manual/html/doxygen.svg b/docs/manual/html/doxygen.svg new file mode 100644 index 0000000..d42dad5 --- /dev/null +++ b/docs/manual/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/manual/html/dynsections.js b/docs/manual/html/dynsections.js new file mode 100644 index 0000000..f579fbf --- /dev/null +++ b/docs/manual/html/dynsections.js @@ -0,0 +1,123 @@ +/* + @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 toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +DbcLib: include/dbc/envvar.h File Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
envvar.h File Reference
+
+
+ +

Wrapper wrong environment variables. +More...

+
#include <cstdint>
+#include <string>
+#include <vector>
+#include <map>
+
+Include dependency graph for envvar.h:
+
+
+ + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  dbc::EnvVar
 Wrapper around an environment DBC variable. More...
 
+ + + + +

+Namespaces

namespace  dbc
 Main namespace for the DBC library.
 
+ + + + + + + +

+Enumerations

enum class  dbc::EnvType : int { dbc::IntegerType = 0 +, dbc::FloatType = 1 +, dbc::StringType = 2 +, dbc::DataType = 3 + }
 The variable data type. More...
 
enum class  dbc::AccessType : int { dbc::Unrestricted = 0 +, dbc::ReadOnly = 1 +, dbc::WriteOnly = 2 +, dbc::ReadWrite = 3 + }
 Type of access. More...
 
+
+ + + + diff --git a/docs/manual/html/envvar_8h__dep__incl.map b/docs/manual/html/envvar_8h__dep__incl.map new file mode 100644 index 0000000..7a26936 --- /dev/null +++ b/docs/manual/html/envvar_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/manual/html/envvar_8h__dep__incl.md5 b/docs/manual/html/envvar_8h__dep__incl.md5 new file mode 100644 index 0000000..fbe8e31 --- /dev/null +++ b/docs/manual/html/envvar_8h__dep__incl.md5 @@ -0,0 +1 @@ +c93fd3426949cabd5a2c6369ead8c412 \ No newline at end of file diff --git a/docs/manual/html/envvar_8h__dep__incl.png b/docs/manual/html/envvar_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..46f1168898b7b1595575da66364c571b2c386cce GIT binary patch literal 2339 zcmb`JcU03^7RP^}L$3->Xd)`2qCk|skcbA5K|n?!Aax8P#ZZT8Xo84TM>GL}Fgi#C zgjgU5319>XML=3G353K@211KSh_o!ayJy`!^WW}$=e_&Rx&OR(@BO~dyM5l#R#r+? z3IG6EyR)#Lw|(jMtd|hmUS%e-iQ7)>vb`+~5PluMH{tRDK;nZP%<5un@%&g%sJgYP z*b=Tide1I)j-tp;HS251yG6BOR#Wy8DSPBlx7#M9Mdb3+cZi=VekIU9<*BnfJU#i< zv7Pz~lgVwJk(?WDDy~*U3CTdYxfg9^K60_=PtN33F4QCv{jsHK1q+qiyXnFj>~oGt z#0R;KEb?G1X&)u)AjGQ>%rLZ}d6qX64nYMs z+Jv&XEAh?g<&xl)!4M^Drq5xAxdX7AbHqO=&PtEH>9*Wuy>$*Uusd$>YQMmkGf{`3 z*;2td^)z*Etnd*JIlJ7mc4n&bE`IANC9wNSdvB1gDm1jXG56tPeB&O13zs=>9ObeU2j#qwXK*weUUu>ZsP|PovexeF$1R??M3{jSj_b?BaexkW zTo+_EQRE<{-fVA=J9!pkM;u!qN=r+N3v^vB`Wb*u!LYNd>o;5aMj8V#<>IZjLI2K@ z0jeyWeZWY@=LhIDq8%~qcXweL!c^USv*_LJ`e)KVu0m5nA=kwf`fCoIb!BsZH4kkI z->6xbW3a zh^Y&fQe6DQMc9 zfm_*RbdQVLpR9}^=akC=^-g(#TJo2+O0xrQ@iW;Qc2(u)!KmDiAlrVjO+*R6NStM9 zRX;fWcFD|?7ehNLmUqU$g!-$qOm3x;vO#*El|>c>D09HSRIrHtoc#`0>nxVumjY0L zwm_sdNYglOqdx^c^uz0z;oHs zb5SOJ`qrNRO1x&pFM_kOe_50NJrvpLL!XN#+P4?P7-mX#l?p{^4VqI~t981PZ#wgJ z^gAz2t7lg7=7OoS2-T>^Yat`6Rrq(G%j)t-k>Es4H-7Uoq-xVA?M1jv zxAA5dVbapz^j~UG?YFR%;yyvPWcdHPI zNy87$6z6dSO=MqI-4oW>r->ZieJtr{l5(mg;G2B4mMf{;3co>ntq9uq#1IXcPdsd*i%~k5j+aTrX%#R$ z8^gl)+;ZVcDz#1r#JPm*xI-F1g5Ols%cS@HCL*`v1IQzxHL~gj{15CMFiH<5lZ;Cl z$Bp)^yn3(b*i-|8h*O~C5}<}yM)sAK!MeLEVx7b-+~p2BmPFV_Zv;aZ0$*U?gHdSL z-p;wHO{S*}MivoP*7@KxWy#%KcyccgcEu56h6wwU6-XPn=cIL5PF3p)WyaSx}UGMq<0HuIYBf-dzTbEPhPeKt@5@?F6{u|a63G`jvx2z;t zw9Vl5P0+b`u`Qh)_rmGgMl#>G??2)2e^;MUBG*sJIxAegWdH`YqD76=@s8&$&Y%Qz zTl(W#=azA(+YoL^KmRMu!n=JNONh4-7Q=h!-?%=WM`y{e>$gkcV^NgnZTQRt$9&zu=i6#MbC+^tY1Zmgff3)G@vhtbB~)ClH~>p$doY5gpgF(F)TuPbr&T0;+a z#Nf4kHr?|E(cRf4!>)#jOw%ZhGh^!tidB(Q@z`a)7tW^Ki}A5)Z`oI}8GR*Nz-3K{ zVN{U;Z`_=;>=RS&`R2wtU!64V} zBfF)~Fin9Ilt2dL8sB5Z!P|?J)M1h6Yu#P5*;U&>l02;H6RFAJdi4^K&{FcX;adB_ zn_qeL-!QiqX+gc&v!2_(9>C7p5ms~B H_r~7=n&qUW literal 0 HcmV?d00001 diff --git a/docs/manual/html/envvar_8h__incl.map b/docs/manual/html/envvar_8h__incl.map new file mode 100644 index 0000000..412d22d --- /dev/null +++ b/docs/manual/html/envvar_8h__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/manual/html/envvar_8h__incl.md5 b/docs/manual/html/envvar_8h__incl.md5 new file mode 100644 index 0000000..46c2e3f --- /dev/null +++ b/docs/manual/html/envvar_8h__incl.md5 @@ -0,0 +1 @@ +b49be6abc962456a25e88093880a7f20 \ No newline at end of file diff --git a/docs/manual/html/envvar_8h__incl.png b/docs/manual/html/envvar_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..389595086c3d0060c4d4652d4cf8786f2eeab173 GIT binary patch literal 5460 zcma)AXE+;P`xdGysG2paKci^vy;s%V#1=DJvqGYR8ZB*YLX6tfCaE1nrBo5KHPRYI zZEDo0+W-9CFYon!`(Ni=_cu!d++GJP%j-t+rbTTp)YJF`@tB}0yxiFa3WGDXj?yk`tAcvW@IsPXF zij`r$5-!Y|O`X}^et!xMx-b2((l&nL@#NIsN^5Tx9!h;@hleY=ydZlig*^C%K3XFzuzvjsZ;nt{UO0#^lY>ruyIRDtPy@H2f zmi8#par?`Emr{=J}rz9ZqsG(*484;D<1yxmHME?cDKh-MP_E>Dk9(7Dv(O z(v*S-(<6nfhOp@=hm#EgbdxP~M&79{r@#FC2l%N@;*K<*I8Xnf@fcCwP!3~yylQk5 zF4mXoN4{S516^7!V3_$XTr8dKtbHyZlO4hC#WKy@za0YH4oND=S%$m=Jt?J@U(%N~ zmH}qv$g!q{CmGDD6s8+<=iGU^CR6W&s45sN^X*agTwZZ^8l8iwjd*l9ww4**+aLf! zMJmMM3i%oxnS}$tnWrn8x+D`A+I^>L?bhP@OFi|uO69o?e~Mu0>SVVN5WEp5UC*9C zI*#`Li9xZ?3sjD0gTSv-rRSc?g!Z%Ba&BsF4>>Ei-1v2V_YBw=p0Dc35q_#Rwb~Ws z{pX1Ng9kEe(CWx*VFuinMx(lyU97Y-OY?mzin{%v=k~X-znu*ibKLBm!DG=BN3}e2 zeivtDeIcGu-X*1DW$!lyl2`tS1JmRF&$#{w`1yyHUTod*4;gg{!zu9(GIt9j0 zfk_a%+|J~W;zPujiE~zUV}M|48&@dmzJnP$0Yq^Bp26TXq0I1sA~893xu+J)NqlX7 zkJju%_^y@L$hs_Ds0e_yIIpOiHyHZ-LJ?_RB6~iNcOa!!aX(Ebzd&S#g+;8-^CMYq zX``_th%S_^n~MQGDhCC;8J@h+6MQ{8cf-fcas|UzxF{3*M(DPlA|`f8iEpNz?n;7B zoFZ!PzN#itL|cI}#MS`Y;E(hjF00jZ_F_=B*g<|wgc#0%o_BzbSNoBzU^k@M(!(9S@`&@uh-Hc#RiFAP zNc8cD{aj634v`^(lZH^H*vm*9XJL&CV3VVn{iz0CTMxo#Q$GVh!LD8Er-pe`ch$9N=srA$Vt=%bp z@i?hZj2}2?2nZ7av8Yu~G~f?yQ@~402>Aqvz!TjUtz0Ab#H(1+0{PLiOBYHPXqSBk$5ea zCg5=g;)|yOI^|7ZpxkYg=L1G!A;sK=qXC= zrO>MGeEo!a!-{@R^u(9SC1zGQxOT?A`NkDL(fG|AbFG|7}0VH#X!0jI5;BSKxt@YjeV@fuk%2{4{n1;QR9Poeui=Bm!0YY-|i!X%bgFJsndTT_gi)feFV#OYM)CR+w71WWP#} z>+rM*6;qTZ+0)@-q)ajzx3r`bcjJ7L?i3L~Lal4cP=GC9mBM{qH3wJA@moW$fTyj% zlDVYBaqO#`b*<1fQcXp-Rz==c_ zC0tX+OcV{s&gbKKy8+_M7PbWHRAXF;2T308aywhLQL)`8aL3B9Y_LIawCA#{ z$b-)03QGm_JYxuL!nnKTvaq;&4r&ZDvmM!W5uK}>d2rxpgOm+@tmY>|CcPBu$dBGK zDt8j?)$_i8|^j!m0Km;0u(UiBH)&gP9hXe{5@GJf6LoV6MEhe`<%sV%)S2G z-R{T<$`z7MiT>mBn|X&Rn_R_X#&KtbO0>71Uz{GM_$7>KZ21%8kbnHABXI1&TR$Cj z70_E;vLNb-7|JIo zA6Z11phnG& zNxp*O5%D$Ua`AC|k>)uF)$0C_V&7JX6ieLJBfJHtN%&p<(J*dP)Am~1->M6vEyHCe zm&w)hq>O%%ERelRo@}-lp>9Io4ZT3)RjrZr&5sASNY_e&;`nXp!#QXM?7*+bbDwCX zw4!>+mxkk6zDo`aYTm|t{Q_7K6dGr-w&=#4>hEU~p^yjXF*~9wII+F0_SB(cr2^kr z&Ld`q0xbnW)(jSK-*~Q={O3;UCycHUPG*^5+&0D11A~Cun8}aPe;gv6uHz`r@o{0a zp#pEmD66#{4B57c0;zn|POkzTEt#DE3_fSC`5Efc@O&jTf!TVRFk6Od7}&xBQEgTw z^h#MSH)ReuBxtbhRdJ;kNUW0B%fBz4XwjRmoRwIe$wC1)9O-B=l?%w78Be+OF?Ju= z8!Fc_5EC-8S4-+)MjZL;Oj{hI-^6Aco&65nH@2T2!$s=*L&HoV;35;0AbA}ZJI%mc zY=oj_#lNX*C8xu2WFyU_)Np{9@dUgd;2^ls_iQyL%eL$Q{MU`Ff;gL0W-D#%yK@En z@;1Dpy#8&D6laoP6i;=)iAh3McMU9_2xZ}r_8a;-6qDREt*(jFb4kKOA{>b-$gz4M zae)5axc3?^b@zQl7CA{twgFFkK8e`58Diy{f8$vRtu8~1gWEsQ!<`@gZ{*f*IA9H9 zf>^BW<+3J>QKH~J(2b#fno9dRs^b>ZHO8ULeWic~0izn40T1-P_6>L&CxV&Z%grjXrV!K9WnsRwG~^;(xCR7)prYL;c^q4t)5l<%$UFY_u{C1b13Cv%kv@cVx=WM(A-p$HR_R?+lAl*_ zJphD#r^erW5(v}45ROhQZrqG^LiCxrkEYl;nC`u?YsUR5wOA3#WFgBtRp_Y_#OUqeXb-o8 zYZ3P(>So?-NdpCdx~p3zLtyij^*NJ?R>8(r-^IVv!VO<`ux%Li1|>uG7%@z{S^Ss@3R?L7BURv_jS5Z#PmhXk7#ANnG3N?X>ugu#}BwTp$F_%(~ zR|Ifb@Op3Gzfd#rIzcJfcJgO=dr^4B>NS1%&Du&*ZF*{T!m%f;RnsIW=`4sTV}jT; zaV9_vA}`b3!vb;W@Q zt+?a?{mDshKgA@z$yNRZ{tQe>IORV@W4s1r|3o!>@S=MB7cx+^6Kn{Um6ctq^46R^ zLyIFV2sJ$)K8`dz7dDLO{xQ7U`1nBXdQ$`*pGhxdyc6+EgyAF@1e%nR|0$diJSX*6 zyTv+jW$)Np@(EF$>w%4SrVR*W{Hzx5pDAMZbDd+iE?V{E?9x)-zKrW2#aY=7HZuDw z@_0%O=4!YB?mB-L9;qfeQ^*}gTPh%tTC5CSNu?*YnU|GX9AWNsVG%=;mj#TG*|X^k zzL0tROvV^oqWNjx=4iFvtiX#al6tLFXzJ9(Ufs~{ieqigW!8z zK%wk)CMwMfFFYFR4vu%uDjx7n`bZ0pk4pJ!+u$vVWs?xZrhe?9=ABx!;*au%Z#PGFm7JsBQX?hUFN4>S$n@G zzdx%#g!zJT&Q4w3AAEE-!+kwIH{~D1KZk9Ug}3^FKisjZeYhDe;kPC-9Bm##7Y5$tbMP!N@P|scQbvv$uSF7}$93k8(99W!vNDK_C&n4BzRI zIHf%AE3Fl4bi8hj!QY$o%LQF8#BwiD z{toDiiQR^6`OZ%Ie1FcMG;ejAAwJPkY|atxR8g8z>YPCOo8uSh0r?+^OZ&;t_GB6T z%l7|ZsETVL#zFE(zV{oNC-NK$-u&L=#q^(8aOx$bTwp3Ln;rHW{K6U`c7taQf(#74 zGe3S=pY;AfxA>_qd7kh#;Hs*G#gAVfzSxM|Xq)Sz?UDHJEWLHE&Is}!U#14OlD + + + + + + +DbcLib: include/dbc/envvar.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
envvar.h
+
+
+Go to the documentation of this file.
1/*
+
2 * Copyright 2022 Ingemar Hedvall
+
3 * SPDX-License-Identifier: MIT
+
4 */
+
5
+
9#pragma once
+
10
+
11#include <cstdint>
+
12#include <string>
+
13#include <vector>
+
14#include <map>
+
15
+
16namespace dbc {
+
18enum class EnvType : int {
+
19 IntegerType = 0,
+
20 FloatType = 1,
+
21 StringType = 2,
+
22 DataType = 3
+
23};
+
24
+
26enum class AccessType : int {
+
27 Unrestricted = 0,
+
28 ReadOnly = 1,
+
29 WriteOnly = 2,
+
30 ReadWrite = 3
+
31};
+
32
+
34class EnvVar {
+
35 public:
+
37 void Name(const std::string& name) { name_ = name; }
+
39 [[nodiscard]] const std::string& Name() const { return name_; }
+
40
+
42 void Comment(const std::string& comment) { comment_ = comment;}
+
44 [[nodiscard]] const std::string& Comment() const { return comment_; }
+
45
+
47 void Type(EnvType type) { type_ = type; }
+
49 [[nodiscard]] EnvType Type() const { return type_; }
+
51 [[nodiscard]] std::string TypeAsString() const;
+
52
+
53 void Min(double min) { min_ = min; }
+
54 [[nodiscard]] double Min() const { return min_;}
+
55
+
56 void Max(double max) {max_ = max;}
+
57 [[nodiscard]] double Max() const { return max_;}
+
58
+
59 void Unit(const std::string& unit) { unit_ = unit; }
+
60 [[nodiscard]] const std::string& Unit() const { return unit_; }
+
61
+
63 void InitValue(double value) {init_value_ = value;}
+
65 [[nodiscard]] double InitValue() const { return init_value_; }
+
66
+
67 void Ident(uint64_t ident) {ident_ = ident;}
+
68 [[nodiscard]] uint64_t Ident() const { return ident_;}
+
69
+
70 void Access(AccessType type) { access_type_ = type; }
+
71 [[nodiscard]] AccessType Access() const { return access_type_; }
+
72
+
74 void NodeList(const std::vector<std::string>& node_list) {
+
75 node_list_ = node_list;
+
76 }
+
78 [[nodiscard]] const std::vector<std::string>& NodeList() const {
+
79 return node_list_;
+
80 }
+
81
+
83 void EnumList(const std::map<int64_t, std::string>& enum_list);
+
85 [[nodiscard]] const std::map<int64_t, std::string>& EnumList() const;
+
86
+
87 private:
+
88 std::string name_;
+
89 std::string comment_;
+ +
91 double min_ = 0.0;
+
92 double max_ = 0.0;
+
93 std::string unit_;
+
94 double init_value_ = 0.0;
+
95 uint64_t ident_ = 0;
+ +
97 std::vector<std::string> node_list_;
+
98 std::map<int64_t, std::string> enum_list_;
+
99};
+
100
+
101} // namespace dbc
+
Wrapper around an environment DBC variable.
Definition: envvar.h:34
+
EnvType Type() const
Returns the data type.
Definition: envvar.h:49
+
void EnumList(const std::map< int64_t, std::string > &enum_list)
Sets the enumerate list.
+
const std::string & Comment() const
Return the descriptive text.
Definition: envvar.h:44
+
void Max(double max)
Sets the max range.
Definition: envvar.h:56
+
const std::vector< std::string > & NodeList() const
Returns the node list.
Definition: envvar.h:78
+
void Name(const std::string &name)
Sets the name.
Definition: envvar.h:37
+
void NodeList(const std::vector< std::string > &node_list)
Sets the node list.
Definition: envvar.h:74
+
void Access(AccessType type)
Sets the access.
Definition: envvar.h:70
+
void Comment(const std::string &comment)
Sets the descriptive text.
Definition: envvar.h:42
+
const std::string & Name() const
Retuns the name.
Definition: envvar.h:39
+
void Unit(const std::string &unit)
Sets the unit.
Definition: envvar.h:59
+
uint64_t Ident() const
Identity.
Definition: envvar.h:68
+
double Max() const
Max range.
Definition: envvar.h:57
+
const std::map< int64_t, std::string > & EnumList() const
Returns the node list.
+
std::string TypeAsString() const
Returns the data type as string.
+
void InitValue(double value)
Sets the initial value.
Definition: envvar.h:63
+
void Min(double min)
Sets the min range.
Definition: envvar.h:53
+
void Ident(uint64_t ident)
Sets the identity.
Definition: envvar.h:67
+
AccessType Access() const
Access.
Definition: envvar.h:71
+
double InitValue() const
Returns the initial value.
Definition: envvar.h:65
+
const std::string & Unit() const
Unit.
Definition: envvar.h:60
+
double Min() const
Min range.
Definition: envvar.h:54
+
void Type(EnvType type)
Sets the data type.
Definition: envvar.h:47
+
Main namespace for the DBC library.
Definition: attribute.h:13
+
EnvType
The variable data type.
Definition: envvar.h:18
+
@ FloatType
Floating point variable.
+
@ IntegerType
Integer variable.
+
@ DataType
Data type variable.
+
@ StringType
Text variable.
+
AccessType
Type of access.
Definition: envvar.h:26
+
@ ReadOnly
Read-only access.
+
@ WriteOnly
Write-only access.
+
@ ReadWrite
Read and write access.
+
@ Unrestricted
Unrestricted access.
+
+ + + + diff --git a/docs/manual/html/files.html b/docs/manual/html/files.html new file mode 100644 index 0000000..c564ea1 --- /dev/null +++ b/docs/manual/html/files.html @@ -0,0 +1,100 @@ + + + + + + + +DbcLib: File List + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + + + +
  include
  dbc
 attribute.hAll DBC network objects may have attributes attached to them
 dbcfile.hThe DBC file object is the main user object
 dbcmessage.hWrapper around a CAN message
 envvar.hWrapper wrong environment variables
 isampleobserver.hInternal object that define an observer interface that handle samples
 message.hDBC message configuration object
 network.hDefines a DBC network configuration object
 node.hInterface against a DBC node (Device(ECU)
 signal.hInterface against a DBC signal configuration
 signalgroup.hDefines a signal group
 signalobserver.hThe sample observer holds sample values for a signal
+
+
+ + + + diff --git a/docs/manual/html/folderclosed.png b/docs/manual/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/docs/manual/html/functions.html b/docs/manual/html/functions.html new file mode 100644 index 0000000..b73e5ae --- /dev/null +++ b/docs/manual/html/functions.html @@ -0,0 +1,92 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+
+ + + + diff --git a/docs/manual/html/functions_b.html b/docs/manual/html/functions_b.html new file mode 100644 index 0000000..7edd388 --- /dev/null +++ b/docs/manual/html/functions_b.html @@ -0,0 +1,89 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- b -

+
+ + + + diff --git a/docs/manual/html/functions_c.html b/docs/manual/html/functions_c.html new file mode 100644 index 0000000..32c76ba --- /dev/null +++ b/docs/manual/html/functions_c.html @@ -0,0 +1,93 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- c -

+
+ + + + diff --git a/docs/manual/html/functions_d.html b/docs/manual/html/functions_d.html new file mode 100644 index 0000000..f9dcb2a --- /dev/null +++ b/docs/manual/html/functions_d.html @@ -0,0 +1,90 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- d -

+
+ + + + diff --git a/docs/manual/html/functions_e.html b/docs/manual/html/functions_e.html new file mode 100644 index 0000000..319aa5d --- /dev/null +++ b/docs/manual/html/functions_e.html @@ -0,0 +1,89 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- e -

+
+ + + + diff --git a/docs/manual/html/functions_f.html b/docs/manual/html/functions_f.html new file mode 100644 index 0000000..03b8b56 --- /dev/null +++ b/docs/manual/html/functions_f.html @@ -0,0 +1,87 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- f -

+
+ + + + diff --git a/docs/manual/html/functions_func.html b/docs/manual/html/functions_func.html new file mode 100644 index 0000000..c514622 --- /dev/null +++ b/docs/manual/html/functions_func.html @@ -0,0 +1,91 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- a -

+
+ + + + diff --git a/docs/manual/html/functions_func_b.html b/docs/manual/html/functions_func_b.html new file mode 100644 index 0000000..183c260 --- /dev/null +++ b/docs/manual/html/functions_func_b.html @@ -0,0 +1,89 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- b -

+
+ + + + diff --git a/docs/manual/html/functions_func_c.html b/docs/manual/html/functions_func_c.html new file mode 100644 index 0000000..240ae6f --- /dev/null +++ b/docs/manual/html/functions_func_c.html @@ -0,0 +1,93 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- c -

+
+ + + + diff --git a/docs/manual/html/functions_func_d.html b/docs/manual/html/functions_func_d.html new file mode 100644 index 0000000..971595d --- /dev/null +++ b/docs/manual/html/functions_func_d.html @@ -0,0 +1,90 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- d -

+
+ + + + diff --git a/docs/manual/html/functions_func_e.html b/docs/manual/html/functions_func_e.html new file mode 100644 index 0000000..532d010 --- /dev/null +++ b/docs/manual/html/functions_func_e.html @@ -0,0 +1,89 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- e -

+
+ + + + diff --git a/docs/manual/html/functions_func_f.html b/docs/manual/html/functions_func_f.html new file mode 100644 index 0000000..e74f291 --- /dev/null +++ b/docs/manual/html/functions_func_f.html @@ -0,0 +1,86 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- f -

+
+ + + + diff --git a/docs/manual/html/functions_func_g.html b/docs/manual/html/functions_func_g.html new file mode 100644 index 0000000..2ab15d3 --- /dev/null +++ b/docs/manual/html/functions_func_g.html @@ -0,0 +1,102 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- g -

+
+ + + + diff --git a/docs/manual/html/functions_func_i.html b/docs/manual/html/functions_func_i.html new file mode 100644 index 0000000..efd0f88 --- /dev/null +++ b/docs/manual/html/functions_func_i.html @@ -0,0 +1,94 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- i -

+
+ + + + diff --git a/docs/manual/html/functions_func_j.html b/docs/manual/html/functions_func_j.html new file mode 100644 index 0000000..3a89afd --- /dev/null +++ b/docs/manual/html/functions_func_j.html @@ -0,0 +1,85 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- j -

+
+ + + + diff --git a/docs/manual/html/functions_func_l.html b/docs/manual/html/functions_func_l.html new file mode 100644 index 0000000..a09c480 --- /dev/null +++ b/docs/manual/html/functions_func_l.html @@ -0,0 +1,88 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- l -

+
+ + + + diff --git a/docs/manual/html/functions_func_m.html b/docs/manual/html/functions_func_m.html new file mode 100644 index 0000000..b96f21a --- /dev/null +++ b/docs/manual/html/functions_func_m.html @@ -0,0 +1,92 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- m -

+
+ + + + diff --git a/docs/manual/html/functions_func_n.html b/docs/manual/html/functions_func_n.html new file mode 100644 index 0000000..88c5251 --- /dev/null +++ b/docs/manual/html/functions_func_n.html @@ -0,0 +1,93 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- n -

+
+ + + + diff --git a/docs/manual/html/functions_func_o.html b/docs/manual/html/functions_func_o.html new file mode 100644 index 0000000..b7f9bd9 --- /dev/null +++ b/docs/manual/html/functions_func_o.html @@ -0,0 +1,86 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- o -

+
+ + + + diff --git a/docs/manual/html/functions_func_p.html b/docs/manual/html/functions_func_p.html new file mode 100644 index 0000000..0d6c7ce --- /dev/null +++ b/docs/manual/html/functions_func_p.html @@ -0,0 +1,92 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- p -

+
+ + + + diff --git a/docs/manual/html/functions_func_r.html b/docs/manual/html/functions_func_r.html new file mode 100644 index 0000000..dd7fa3b --- /dev/null +++ b/docs/manual/html/functions_func_r.html @@ -0,0 +1,90 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- r -

+
+ + + + diff --git a/docs/manual/html/functions_func_s.html b/docs/manual/html/functions_func_s.html new file mode 100644 index 0000000..9c0f06c --- /dev/null +++ b/docs/manual/html/functions_func_s.html @@ -0,0 +1,96 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- s -

+
+ + + + diff --git a/docs/manual/html/functions_func_t.html b/docs/manual/html/functions_func_t.html new file mode 100644 index 0000000..593a8cf --- /dev/null +++ b/docs/manual/html/functions_func_t.html @@ -0,0 +1,88 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- t -

+
+ + + + diff --git a/docs/manual/html/functions_func_u.html b/docs/manual/html/functions_func_u.html new file mode 100644 index 0000000..2ad4ae9 --- /dev/null +++ b/docs/manual/html/functions_func_u.html @@ -0,0 +1,86 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- u -

+
+ + + + diff --git a/docs/manual/html/functions_func_v.html b/docs/manual/html/functions_func_v.html new file mode 100644 index 0000000..a32b191 --- /dev/null +++ b/docs/manual/html/functions_func_v.html @@ -0,0 +1,89 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- v -

+
+ + + + diff --git a/docs/manual/html/functions_func_~.html b/docs/manual/html/functions_func_~.html new file mode 100644 index 0000000..03be365 --- /dev/null +++ b/docs/manual/html/functions_func_~.html @@ -0,0 +1,87 @@ + + + + + + + +DbcLib: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- ~ -

+
+ + + + diff --git a/docs/manual/html/functions_g.html b/docs/manual/html/functions_g.html new file mode 100644 index 0000000..0cfc27a --- /dev/null +++ b/docs/manual/html/functions_g.html @@ -0,0 +1,102 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- g -

+
+ + + + diff --git a/docs/manual/html/functions_i.html b/docs/manual/html/functions_i.html new file mode 100644 index 0000000..ae19277 --- /dev/null +++ b/docs/manual/html/functions_i.html @@ -0,0 +1,94 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- i -

+
+ + + + diff --git a/docs/manual/html/functions_j.html b/docs/manual/html/functions_j.html new file mode 100644 index 0000000..d32b79c --- /dev/null +++ b/docs/manual/html/functions_j.html @@ -0,0 +1,85 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- j -

+
+ + + + diff --git a/docs/manual/html/functions_l.html b/docs/manual/html/functions_l.html new file mode 100644 index 0000000..e9364b6 --- /dev/null +++ b/docs/manual/html/functions_l.html @@ -0,0 +1,88 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- l -

+
+ + + + diff --git a/docs/manual/html/functions_m.html b/docs/manual/html/functions_m.html new file mode 100644 index 0000000..ba3f7ab --- /dev/null +++ b/docs/manual/html/functions_m.html @@ -0,0 +1,93 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- m -

+
+ + + + diff --git a/docs/manual/html/functions_n.html b/docs/manual/html/functions_n.html new file mode 100644 index 0000000..a69be1c --- /dev/null +++ b/docs/manual/html/functions_n.html @@ -0,0 +1,93 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- n -

+
+ + + + diff --git a/docs/manual/html/functions_o.html b/docs/manual/html/functions_o.html new file mode 100644 index 0000000..1a4555c --- /dev/null +++ b/docs/manual/html/functions_o.html @@ -0,0 +1,86 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- o -

+
+ + + + diff --git a/docs/manual/html/functions_p.html b/docs/manual/html/functions_p.html new file mode 100644 index 0000000..adc43cc --- /dev/null +++ b/docs/manual/html/functions_p.html @@ -0,0 +1,92 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- p -

+
+ + + + diff --git a/docs/manual/html/functions_r.html b/docs/manual/html/functions_r.html new file mode 100644 index 0000000..b855c21 --- /dev/null +++ b/docs/manual/html/functions_r.html @@ -0,0 +1,91 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- r -

+
+ + + + diff --git a/docs/manual/html/functions_s.html b/docs/manual/html/functions_s.html new file mode 100644 index 0000000..0996f3a --- /dev/null +++ b/docs/manual/html/functions_s.html @@ -0,0 +1,97 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- s -

+
+ + + + diff --git a/docs/manual/html/functions_t.html b/docs/manual/html/functions_t.html new file mode 100644 index 0000000..d0bef51 --- /dev/null +++ b/docs/manual/html/functions_t.html @@ -0,0 +1,88 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- t -

+
+ + + + diff --git a/docs/manual/html/functions_u.html b/docs/manual/html/functions_u.html new file mode 100644 index 0000000..5b19b1d --- /dev/null +++ b/docs/manual/html/functions_u.html @@ -0,0 +1,87 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- u -

+
+ + + + diff --git a/docs/manual/html/functions_v.html b/docs/manual/html/functions_v.html new file mode 100644 index 0000000..ad174eb --- /dev/null +++ b/docs/manual/html/functions_v.html @@ -0,0 +1,90 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- v -

+
+ + + + diff --git a/docs/manual/html/functions_vars.html b/docs/manual/html/functions_vars.html new file mode 100644 index 0000000..f366149 --- /dev/null +++ b/docs/manual/html/functions_vars.html @@ -0,0 +1,89 @@ + + + + + + + +DbcLib: Class Members - Variables + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ + + + diff --git a/docs/manual/html/functions_~.html b/docs/manual/html/functions_~.html new file mode 100644 index 0000000..12f1f4e --- /dev/null +++ b/docs/manual/html/functions_~.html @@ -0,0 +1,87 @@ + + + + + + + +DbcLib: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- ~ -

+
+ + + + diff --git a/docs/manual/html/graph_legend.html b/docs/manual/html/graph_legend.html new file mode 100644 index 0000000..e4f2255 --- /dev/null +++ b/docs/manual/html/graph_legend.html @@ -0,0 +1,143 @@ + + + + + + + +DbcLib: Graph Legend + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
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 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/manual/html/graph_legend.md5 b/docs/manual/html/graph_legend.md5 new file mode 100644 index 0000000..76a6899 --- /dev/null +++ b/docs/manual/html/graph_legend.md5 @@ -0,0 +1 @@ +68a0ee42d4e53d2fb70be66ebb5b1abe \ No newline at end of file diff --git a/docs/manual/html/graph_legend.png b/docs/manual/html/graph_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..8df6fb46b4ac5bc72403eba0ff70562a978e3e3e GIT binary patch literal 13520 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 LkSc$z_w7FbFnEjD literal 0 HcmV?d00001 diff --git a/docs/manual/html/hierarchy.html b/docs/manual/html/hierarchy.html new file mode 100644 index 0000000..45c4503 --- /dev/null +++ b/docs/manual/html/hierarchy.html @@ -0,0 +1,102 @@ + + + + + + + +DbcLib: Class Hierarchy + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
+

Go to the graphical class hierarchy

+This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12]
+ + + + + + + + + + + + + +
 Cdbc::AttributeSupport class for handling attributes of network objects
 Cdbc::DbcFileMain user object that is an interface against a DBC file
 Cdbc::DbcMessageWrapper class around a CAN message
 Cdbc::EnvVarWrapper around an environment DBC variable
 Cdbc::ExtendedMuxSupport function for the extended multiplexor functionality
 Cdbc::ISampleObserverInterface that handles samples. Internal usage
 Cdbc::SignalObserverThe sample observer hold a number of samples
 Cdbc::MessageDBC message configuration object
 Cdbc::NetworkInterface against a DBC network configuration
 Cdbc::NodeInterface against a DBC node which normally is an ECU
 Cdbc::SignalInterface against a DBC signal configuration
 Cdbc::SignalGroupInterface against a signal group
 Cdbc::SignalValueSupport function that holds the channel value for a signal
+
+
+ + + + diff --git a/docs/manual/html/index.html b/docs/manual/html/index.html new file mode 100644 index 0000000..4eedb2d --- /dev/null +++ b/docs/manual/html/index.html @@ -0,0 +1,94 @@ + + + + + + + +DbcLib: DBC C++ Library + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
DBC C++ Library
+
+
+

+Summary

+

The DBC C++ library is a C++ interface against CAN DBC files.

+

The project consist of the following main components.

+
    +
  • C++ Library with all main functionality.
  • +
  • DBC Viewer GUI application that simply display the content of DBC files.
  • +
+

The DBC file defines a CAN network. The network consist of devices (nodes), messages and signals.

+

The C++ library can also parse a CAN message into signal values. Additional the library support adding multiple CAN messages into signal sample values.

+
+
+ + + + diff --git a/docs/manual/html/inherit_graph_0.map b/docs/manual/html/inherit_graph_0.map new file mode 100644 index 0000000..7509d8a --- /dev/null +++ b/docs/manual/html/inherit_graph_0.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/manual/html/inherit_graph_0.md5 b/docs/manual/html/inherit_graph_0.md5 new file mode 100644 index 0000000..4edf65e --- /dev/null +++ b/docs/manual/html/inherit_graph_0.md5 @@ -0,0 +1 @@ +d758882acb28e2c6611008d1b3d040f6 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_0.png b/docs/manual/html/inherit_graph_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a3396c59e37d611a2d4e1883ccc99c658fa5b28d GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^`9Q3~!3HGTqf*WTDYhhUcNd2LAh=-f^2rPgjQO4} zjv*P1Z)aTWJ*>df_VMMh7b>w$(TR8o7vTjYPUv)ak3a9d;2q==vUr<;^99_Bxm z%K6m8?ZdGWCNqLt_qhUb@N)UO1K}l?fO00-9>Tf5xug^)tr-pj5?od-03b)KXXJ` zsr0(%znt}RC*6~syIt0fO!3^^f#A6WB?a#!0>t0VRY%u?!9_RH^z2!rxlMXP*7#MW+ XFY7sHxn>IU7ZA_W)z4*}Q$iB}9Qek} literal 0 HcmV?d00001 diff --git a/docs/manual/html/inherit_graph_1.map b/docs/manual/html/inherit_graph_1.map new file mode 100644 index 0000000..8d97fcc --- /dev/null +++ b/docs/manual/html/inherit_graph_1.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/manual/html/inherit_graph_1.md5 b/docs/manual/html/inherit_graph_1.md5 new file mode 100644 index 0000000..bced7bc --- /dev/null +++ b/docs/manual/html/inherit_graph_1.md5 @@ -0,0 +1 @@ +04f578d95f527b3d83789494a2a5d249 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_1.png b/docs/manual/html/inherit_graph_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d7094f7e5d540f2921dc68acdd87d79f0163a392 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^nLw<jA5L~c#`D6wL#$rzw z$B>N1x3ezxHXHD?<(4FuOnMi1m&xPI6hXgTmh1d|3acmBg-k6{Q{4H0CFbw_V9&0< zhyC9uII;lEo5MVf`LRXZjGt945)LLjhu0Uslk2NJVQ=_(>dgJWPBJN;-c%!eQCB8< z=9fd3*JA{JbQkwMtBmXAXU|~#&!Q&D07eQs3vVzRPySx_HQKt}<=M)!vfZ-B-WS#? z`uerb*WDY|}1No``%PH)aroVvE_ zmu<{`dT-YIjSnqCcQO|yOk%`Dlk_)VHu-vm(JW%-lfC~H7oBI`!cbM0R + + diff --git a/docs/manual/html/inherit_graph_10.md5 b/docs/manual/html/inherit_graph_10.md5 new file mode 100644 index 0000000..7bc7e24 --- /dev/null +++ b/docs/manual/html/inherit_graph_10.md5 @@ -0,0 +1 @@ +33a46a5da73b0302dd4f5d29b4631577 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_10.png b/docs/manual/html/inherit_graph_10.png new file mode 100644 index 0000000000000000000000000000000000000000..9f6518952df90dca4b4f615f176796153f19deaa GIT binary patch literal 530 zcmV+t0`2{YP)zd#2^raS(GwT$@LLk1D38PN{Ey?k|$SjeV9C1Lf{31 zmmk~nNs;dGnH|Ff1}g;s0001R9P%5cY5F9hM-MTeJzDFxG3L*0`|y86L=PhRZYK-$ zWLcIUrPP<(7MNni7*kyk=!-E%&GQ_z>keAL;J_3h0Hy!|Fa-!;gXR&4NLg!x&o%1! zxV385=KA+F)vRBODyC=wH{ou3>j~jZayDaN`w)Vgd~5CIiZ(K0rXZr|!*kcycK=%H zJBPo0a2nieZd;DVy=-an>*tO^O7js!whuo;q^@&$BewK!eRpf6mgpK9OOfioR(2E5 z6kE&XUa`3kwe=skr;i+sr2`%7UuyDdWtGzgO`n>los#7_wvCO>X@h2~fnH6v{@sD0 zOwn?prSIcT8Li*bNFcI(q>f!&AdH2@Q~={@#<6X*0Wbv!fGI!#OaTJe)5q)eYN-PZL|_VQ?XObm*+C2FfY$omTLS<9006GZKjJ$u UZYsZ!(EtDd07*qoM6N<$g0D31xBvhE literal 0 HcmV?d00001 diff --git a/docs/manual/html/inherit_graph_11.map b/docs/manual/html/inherit_graph_11.map new file mode 100644 index 0000000..b23478a --- /dev/null +++ b/docs/manual/html/inherit_graph_11.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/manual/html/inherit_graph_11.md5 b/docs/manual/html/inherit_graph_11.md5 new file mode 100644 index 0000000..20c08d7 --- /dev/null +++ b/docs/manual/html/inherit_graph_11.md5 @@ -0,0 +1 @@ +2f7c1f36071729ec05de63d94ea70ab9 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_11.png b/docs/manual/html/inherit_graph_11.png new file mode 100644 index 0000000000000000000000000000000000000000..2db0f6859b8097a55f1c8674105fb56b1c1804b2 GIT binary patch literal 508 zcmVtb#2^qwXQGsmO16gj0oW|km2F% zJ(8t0kKr0!23R5h0001hG8`6c+xEuHj~QaXIE*o$VcBa~z|0S3{um<(Or&gvi{m)@ zN&!I-JH8aH0w4`2|;-zWSpZHjeSZepnYBaVWi6xl}Ej>Oe z+l24_)MWbgvESi)xSC?`{#d2e*F$4WPp+*rmh?MXW28{uCQ=jC+PBpHdTLfmjYiEB zzxsA@+XG}sY9(t>W3p@f+yQr#o?32ehEWHzSX!PPtJilgb(NK;2+BVU80F(A>IhaafNZN%a ztc}+aOBzFyrM8Kltnhd5>fH7KSxe9K`d@e&GZ4W5C7x!R0A*kX;D8x`17-jYm;pGF yw~2k + + diff --git a/docs/manual/html/inherit_graph_2.md5 b/docs/manual/html/inherit_graph_2.md5 new file mode 100644 index 0000000..1d350c9 --- /dev/null +++ b/docs/manual/html/inherit_graph_2.md5 @@ -0,0 +1 @@ +d9051da921d12228906c1f3b6022636f \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_2.png b/docs/manual/html/inherit_graph_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1d84c37eb71cee2070557d6d3a50b6317b09653f GIT binary patch literal 532 zcmV+v0_**WP)lq8kx?ohJ+Q z#57Ic&bg1YZDEp`5W?YtKwpFq+&GSlcHck?xEL@A5P?a62uuP*4lxN4W&c}`!GCKy zw)VXz{%jO?H&-CW`0tpA7HzeZ`g%2kIQL}bCdT-ZFY##1GRgdMN;A0>PhV;p<1=|r zme@M>d|cANjkwm&k+G7-(si|%m?RZiS{tPC+<$(YdubNhG-KEHzhw-ISkA0g6D!5M z+~h=Qg<3h^YV0&?SUm8x>(f}v=au8q3)fyKt%G=J;zrPx8w)LafJqF{W(b~*wv-zS zEwyyDyV*MnEEcz%+~QE%&)WTH?{!ZfR$0X)lSo_7nv|#29~^bDs^gfDZ89KU!-500000$nggP WvtvQ}N=;D!0000 + + diff --git a/docs/manual/html/inherit_graph_3.md5 b/docs/manual/html/inherit_graph_3.md5 new file mode 100644 index 0000000..14d263b --- /dev/null +++ b/docs/manual/html/inherit_graph_3.md5 @@ -0,0 +1 @@ +83724d9e8872ecaf3e0f5e4c160187d1 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_3.png b/docs/manual/html/inherit_graph_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea27acfb8994d90e103e412943818d7cdfcd575 GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^=|HT)!3HF!^r~0`DYhhUcNd2LAh=-f^2rPgjJcjJ zjv*P1Z>JwDJfgtky7bJnjZ<@!GY=TAJL$~osc5-V{hQGF4LX|+h(*l&Q@)Aua67+~ z8WYf{V+Se^n)sHd)x{`2vln*yaqe_pC8M$ZjGx&(DiapW-n>!AJ6^M)qvKlXQURxp z?~*r&U0^s<$OA?_GX&-|&eS~i<6Dkx+mVSMP3G=>w$WX@*v+tNqg(TaZ{9tDHof6< zq?DYCXH=SB@%S2D8Ml1z^(?L4+HLv1p9R;d`W%X?JD&0NQtgy|&#kv^DPHP2;nx+v z17%f9-uLgBfAG&a&DQp)jcX^b%8bvNJnO=)8Bx)vKYU*<+$48JB3*QwNrIp9QiE&U z;Wuxsko64N7oYVisOq(;rDb)d#>LkvmpGr_-x{~Yl(W%vWm@jNbVKg!OHDF+9k%AY z^)R|{$vt=Omz>7c8`$C+E&DK$V7=4xO1YKHA{EB!$9_1w%oopK1P0gvR~yEh?2Bp- SR##L2xeT7JelF{r5}E*Mg1~$L literal 0 HcmV?d00001 diff --git a/docs/manual/html/inherit_graph_4.map b/docs/manual/html/inherit_graph_4.map new file mode 100644 index 0000000..3fc8ba2 --- /dev/null +++ b/docs/manual/html/inherit_graph_4.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/manual/html/inherit_graph_4.md5 b/docs/manual/html/inherit_graph_4.md5 new file mode 100644 index 0000000..1bb1429 --- /dev/null +++ b/docs/manual/html/inherit_graph_4.md5 @@ -0,0 +1 @@ +40f412f9a657f78a3d9427ae82058b14 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_4.png b/docs/manual/html/inherit_graph_4.png new file mode 100644 index 0000000000000000000000000000000000000000..fed33c21a73b03b7941e7caf022d398bb50c37db GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^y+EwO!3HF^`0i{5Qfx`y?k)`fL2$v|<&zm0825X+ zIEGZrc{}4`?hyq6m-4_<9;(;fr?BblRP*YXVl_!Wys&mg&D<6PZXLGf#g#!NYg+E1|SRJ;2fU@{^$ED|$<(#_S9UUL#XCE$ie_h0GN%pU>%j z#o<5yiq+PL!xFxiCd>D1v8bzlW2w{Lz1VWqU&FZMw&dl{&P@$IA9QC{-P#F{?7cr* z`{uMy>AK2R`gHD+lywnrmL?zn_4U`q^F^<_3pi)7zTf!RJwB#d;@$n(ZkvOv-#odv z+_`^p)~fBxFYdmSJ}o$X+ZC59FP5BqTD1QxzulYVJ7=^#ZmT+ExASzqmv>jlo0W#y z@9k&(EdF@?l8&usQdY3jySFR9Bxy}e{#%`~GV}7eaBDx^;HByX{D^>nh6j{#`}6$X zu65zB7|b6fNIk#9FIdZWfl2L%#AlhcjG*vez+S&gTz5+Bk*p^muBWS?%Q~loCIE=A B@yh@J literal 0 HcmV?d00001 diff --git a/docs/manual/html/inherit_graph_5.map b/docs/manual/html/inherit_graph_5.map new file mode 100644 index 0000000..43eadfa --- /dev/null +++ b/docs/manual/html/inherit_graph_5.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/manual/html/inherit_graph_5.md5 b/docs/manual/html/inherit_graph_5.md5 new file mode 100644 index 0000000..62d77c2 --- /dev/null +++ b/docs/manual/html/inherit_graph_5.md5 @@ -0,0 +1 @@ +98fa71b18955db5fc00c123fb2602c89 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_5.png b/docs/manual/html/inherit_graph_5.png new file mode 100644 index 0000000000000000000000000000000000000000..561ca56a00cdce3bef245ff51fb840bfa7158120 GIT binary patch literal 1191 zcmV;Y1X%ltP)&b}OM;kB%hM%vMg zr2T$i!7Ht1-binrR@z+*5D^g(5fKp)5fM>cNOHm2+S+F#G9MxsYByDVwzakOGIShe zbi3W9&@oVRL{YSzTsDPgqq0m_A^?IR0 z7+JU5#oXLn=rE|p_V)G=MN#Uy3D2<*5sf7lTOuM4SZs-iJYcaUBJ!Y;Vk;u4e^=E< z{5<*at!STl@rD=!Rl~=eh}+J}tEzL#l*i2TjBg_}iHJZ|t(Vt9T5NTWH-y_y^poiW z{BZ6gJh=C@ybc{t-Pz0o-}%KnKhcU}+cc(RQ`NCe#MsKN&U6$v6j+u6d;`Jc;cNU3 zfW@|9nCGWCE4J~afN2Ms)(>Ao46jQbj4}tOXkW<~(_%KgHjSyjqKfXjtaVxO5AS1} z?Ojcl#cl0en8ktuKZ@ce6w?!efeI#_bPz~g=0si_@oSRDKP%5&<#t+|ZOwBh#nu$O zX?@z?$>+%dW(|0Fr)}- z75G>bhXAG_fHwTY+YocYW*$@>V_9v@^I^_!Bcu(^HsDbPW;$Ejwq3Ni`%=Ze8=kyn z&fuerzx!CPsABO2uqJ{_0QLcN?E4WM6K$NSH({Vc$z0QN=DIbPk#+7)pc3@YyCJ(T zCGYBM6u#zClkz-ID~hd6GKDC-Rlftyy5t$PZ=dhp$qip0I{BVUZOQXm6W?hQdv~9Dj?ATqbFLFF=m)XQ*tKXLafTsYSE^h0c3$s{I zIr-|B2nJfSE3cw_&xtZ^yO@7@m-XYE=ffJE%+wCQEy+HB9RNEkyE@YWZVZ5B(W4(V zgpRMReBGj;BP_O5EB6=V4Szb{ojQ-Vq2p?!yifYcEf(8?n2`SbdQJWVz<(K1 zA?C9`jsBGm5m8gH*b)(Wz+y{8-BubK~#HD6d{VD&|y$R zohi1e`V7FW0I^WZ9p_dfsVe6L5fKp)5fKp)5fM>Kd;l*R#!*-El5zk5002ovPDHLk FV1ld6Mce=Y literal 0 HcmV?d00001 diff --git a/docs/manual/html/inherit_graph_6.map b/docs/manual/html/inherit_graph_6.map new file mode 100644 index 0000000..e09d8fb --- /dev/null +++ b/docs/manual/html/inherit_graph_6.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/manual/html/inherit_graph_6.md5 b/docs/manual/html/inherit_graph_6.md5 new file mode 100644 index 0000000..037a9d5 --- /dev/null +++ b/docs/manual/html/inherit_graph_6.md5 @@ -0,0 +1 @@ +5bd7417723070056b3448fc8b8daa899 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_6.png b/docs/manual/html/inherit_graph_6.png new file mode 100644 index 0000000000000000000000000000000000000000..b4aac3039d67ef2ab041f24627a07cc2d57f13f1 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^#XzjW!3HFEonT!Fq}Y|gW!U_%O^81FjjiH zIEGZrc{}4^VT%Ee>sp^v9;&xJq!QX@NrX=jnRNNvlQ}aAMI>8vrNjP|ADVV>{@-bC zIUGQv7%n)}B+XjJuT(Whk?lpNVcqAQ<#vuP{7S#1lsQc{Mrp)P^DPZAA{)c&o|C{AJQE;bFbCXWgXK~@@8y16P1zq)GRH_xG(+tM5FA5OIy85 zH*ZxB%QD*XJLm1ntCv6VoYpZt>9ex>%u3DVX}wOlnpcl4DV-%zpQfFbx=kg^f6X_$ z*BeXEWbGHz3r*WwaLqnoduD^%rOi|F7>%tBKm9IZO}!>)a2bJ)=9SHRKGCXy@&6eg k&A%-IcK#QbK!In_5 + + diff --git a/docs/manual/html/inherit_graph_7.md5 b/docs/manual/html/inherit_graph_7.md5 new file mode 100644 index 0000000..626c474 --- /dev/null +++ b/docs/manual/html/inherit_graph_7.md5 @@ -0,0 +1 @@ +f511c37eba2c3d03c3d467a01eac4972 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_7.png b/docs/manual/html/inherit_graph_7.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f731d7bb16244752a34353d2f589728217c547 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^xj?MK!3HFo*Khd*q}Y|gW!U_%O^81FgAI* zIEG|2zMXzH_lSZ(YkI&b57pc5Q`mHNs(E!xv6?h_^$j~8zdnIuhx-p!guUN=gXi>z zY3aviZ~#rK;I-iKx%}nanSQ~f19Hh{E=T=-ef-`bdBe}mGxx8X%&Ky&^sm|?e*104 zxrd`}#|li?chAX^tLjz2-pl87&cvQs>$o-Z zoaNQ-cyHs&Ga_RSEdHk}_igE|rMr?;t@k`TGxt)p>rJ~qJM5p>4g`ZwhwEHPutGQcY9~0Qo(k9bxvwfYtKXDk!IKobu4zpk9O{t6@4jhWBp q{8n6ao-xXSCHYM87Er`25U($|eKSAume)KWkHOQ`&t;ucLK6V6>eK`P literal 0 HcmV?d00001 diff --git a/docs/manual/html/inherit_graph_8.map b/docs/manual/html/inherit_graph_8.map new file mode 100644 index 0000000..e3f1fe7 --- /dev/null +++ b/docs/manual/html/inherit_graph_8.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/manual/html/inherit_graph_8.md5 b/docs/manual/html/inherit_graph_8.md5 new file mode 100644 index 0000000..df0e848 --- /dev/null +++ b/docs/manual/html/inherit_graph_8.md5 @@ -0,0 +1 @@ +b0c83bf69f12cd7198fdf3ac4d959671 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_8.png b/docs/manual/html/inherit_graph_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e22f130aaeb3bbf36be9d8b3e6e37f884d8335fb GIT binary patch literal 402 zcmV;D0d4+?P)gbS zzbA!q9A7VpiN*i`05~h;HneT~AfjfEWNL$%$6**gcH7+^wLYKYM#cJx7{!k zKGFAm@oZ|Q>pE}yO*xOt1L4X*xH1r~OcCKkaVxSR~_$RQS?jLr;8n zT<$5w7jNy{OL3$S+frhu2#Ikir + + diff --git a/docs/manual/html/inherit_graph_9.md5 b/docs/manual/html/inherit_graph_9.md5 new file mode 100644 index 0000000..d25b385 --- /dev/null +++ b/docs/manual/html/inherit_graph_9.md5 @@ -0,0 +1 @@ +5b1d28260fb05de65c20fc6ed2eacb57 \ No newline at end of file diff --git a/docs/manual/html/inherit_graph_9.png b/docs/manual/html/inherit_graph_9.png new file mode 100644 index 0000000000000000000000000000000000000000..ade266f81f65a7543f434e9329378ffe6fa3d331 GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^i9oEv!3HE}P7bL7Qfx`y?k)`fL2$v|<&zm07^^&8 z978f1-%d}=Yf%trP50=(IQfn3thfV5j0;=TY~6pK4t`^sQlFE<(bOPWux*dNVW2?e zuP?kpj6mc3EplcodpUPzet3r@WAd51QNLer-`lEg__=rH{$D4hx=UmCcfL5Be|zSJ z#I?D4876DCZqYft?rzKiR+a-StPo^k*f?|XZ{25{+o$w}efFLZBb(Vi^Q2|@4Y}9X zIUad1CaE2Hv|!186E83O+W&9+W0SMHUDMXOX}UZ*(cf^z_s8Fje?M6COuDhrK3uOV zDr1V1OPudWQvHu<(fTR(b+b5Q;|mbKxLKxVYPM7`Yq?(9Y_;VQcu z^Bxy<90`n2aSmervSPH^t literal 0 HcmV?d00001 diff --git a/docs/manual/html/inherits.html b/docs/manual/html/inherits.html new file mode 100644 index 0000000..acbda1c --- /dev/null +++ b/docs/manual/html/inherits.html @@ -0,0 +1,148 @@ + + + + + + + +DbcLib: Class Hierarchy + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+ + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+
+ + + + diff --git a/docs/manual/html/isampleobserver_8h.html b/docs/manual/html/isampleobserver_8h.html new file mode 100644 index 0000000..ae98685 --- /dev/null +++ b/docs/manual/html/isampleobserver_8h.html @@ -0,0 +1,131 @@ + + + + + + + +DbcLib: include/dbc/isampleobserver.h File Reference + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
isampleobserver.h File Reference
+
+
+ +

Internal object that define an observer interface that handle samples. +More...

+
#include <cstdint>
+
+Include dependency graph for isampleobserver.h:
+
+
+ + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  dbc::ISampleObserver
 Interface that handles samples. Internal usage. More...
 
+ + + + +

+Namespaces

namespace  dbc
 Main namespace for the DBC library.
 
+
+ + + + diff --git a/docs/manual/html/isampleobserver_8h__dep__incl.map b/docs/manual/html/isampleobserver_8h__dep__incl.map new file mode 100644 index 0000000..c058f2e --- /dev/null +++ b/docs/manual/html/isampleobserver_8h__dep__incl.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/manual/html/isampleobserver_8h__dep__incl.md5 b/docs/manual/html/isampleobserver_8h__dep__incl.md5 new file mode 100644 index 0000000..ad8dd76 --- /dev/null +++ b/docs/manual/html/isampleobserver_8h__dep__incl.md5 @@ -0,0 +1 @@ +c3b2a2760972d3ab0ee632c2a0c83093 \ No newline at end of file diff --git a/docs/manual/html/isampleobserver_8h__dep__incl.png b/docs/manual/html/isampleobserver_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..6e381b1f707565c2236f5fef8a85b9a8cad5fa0c GIT binary patch literal 12079 zcmdVAcQjmY*EddtM33J2A|#^*iC&TzC2FF#AbJ$CU%>>c%1O@Wwzo&XCAi};NqSOW_S zy99W>d58ym()WrE2E5^!DJy`nZtwoSwH72{Vf};k2K-9PJ9Bp);%B7YczZZf{p1ay zVv*5FBxS9|Br6fvGE@a3*QlH;wzWt_v+f7IgZZyHgO;?7z1rxd^D+y^X zePg4^=^-?J6c~o1760@pF+t71&@tu*sP}o=kcySnaMlIfgx}cRYQOc5m%8AwMQN+G z^CPnVI12fw#e@3wsQHXUW!&)+?N;{APEJlr2x08G;iK5#UNfsjeAuhpK}LKYQYN;? zR6K|gk->B-<*u1L{CYX0> zIaQFBnYo^6@dp{FYT#c85rE>;ic<)n6QAtMTZP>}73EIJ*+mgR6>)hDYJTp><&yhH ze)<-|@!~_tR*hT?b(|Pe^~Hse=8GSxai^kF6AR#7)VNyN`UP6Rc<(imasQOZV*ap- zsyVR7L3i^e&Ir1XZd}7iu&$2NMC5VCF6>jHA7OaoWk~N~}*u7|p6qZ0PA9 z&v>>txq3tIQ4YNt{T_NB50++HizZ;e3O&ZV24Fbzf z!MMt~-9;DWTd(tnxYF_%9pe`Yl;ZRAB%gCU^(dWV8R}8tPbp6DJA2Wsm`f=W@fz7* zySI^O05Vnv@y1o;mZ>~at$1VJ@kw?w)?f zUS|j`UijV59Y>*12?m3e&Bk;mNSFLF2UOO8Nt~ab_wbkDQN@q`PmL)K*oeO!e1oeD z2AjS5A7_G2$_Be zbENn0-C%z`;s@Jb5+a{BqcXhh`a&yNOhO#5AZhoa9e}$OeQ9Q)6PGO=+(XteG}pqw zT@y_D_4%{&&ip@v9gVN|7p|Jj{SdlYCoCrJo@Uogs9%)Y@*mG2udN@dCXKOqe0K|T zhB>Zr>zfOZ(1P)eXN6|7_;O(ug9&(LBDAinA2QEQ>yRdcNd{{y?nKJDBs?k@>@-eh zSJ8p+k@O0lGb)1;tY?3)MV~M25L|h8?85zRDPrzK%MBkk+%x3R3<&ts7{gO;ef}(n zPS%OigH>DIflIH8KDhol$zhkpphun=h?|Nhk-qlX?t|y*tGew4!4KIFk6srD2*OQN znr9u>NP`l*i^gK#2eTB~yb;@?g(}9S)z8)2Ic@NWsMYh#1afIrG)`Pq)eob2>Jlsl zZ|}9(O^k~~gbkdSA574yi}-dsZCo96 zvz%|5aSGaU>9M_FOFL2)JfO&Y-+!Hw()+X{P(7bN;+Dz!6+2n8ql3ky0C%g8pnqg+ zKA=i&HYZ_}?LQfAQr3t!1bL8a$!`OXM)AOOkJIe<$ zv6?lE!sISp78qAOYcYZ!5^*H^S#~9odumf2nYoX(D!_LA9@V=uaB5`G$cjbqQ2#of zs($vI`%;C+-t+j{cGHI+Bit!nF01s>8u*tKV|i&{yZAK7;G%7>ZzfUibMM9m$=aH* zY}F=06zR0gZO8Vr$T6%E*VPiZSeKFKU3clU%;>euM$D?TV|1qy% z6w3Y?7bSXovcCLED4a+qLuiTLB{@1JITXMY;;qdyFK};Odn#sQy2##OM}2(XyiUQ- z_FP^^B=viC$L4xSZAVb#76$&lI z&hc@lJquNa6`dwi)BOfZxeGem_=&IVQuFW2*}a4y)$!s5SEt|h5G*xy?UJ^O1PN{M zp7EAfu?pe?Y89A*4_c?Yks}aIAdgC0hN${KXfQ`X8lSmm9iG(8kTUHJh-cs3;!X{j4YR#? z(0jyDuc+NU^!E&-?o)S!wJ#6U?30PdbY}x2VjquZk}xWDzf&fuw|i0dMpr%sW_fZq%f#gR z*tcWVr5sm8Ut!$%CW+ zq&8NYA3v9-2A1t^ND8ncctqf)y-y$p4yv1ydC&bq`<$0ErTx%96c9&rpcwp; zCcKGAp^drQL3H8?S|Y$S1lvZtaT|UN-c29g*3X)FwnzE#U9UBU7a4) z&-K;c#9}*T^C@o2x=-5VrfHI~mG$<=W6cHPA$nTVDF&1wr#o|@G?$)6G6I2^Ud%3B zF&2aE7?M6|YGV)#%^BDF)Vw$`KQG0f?J)KH#g4BJPx3L{owPt`1w+3 znt-|dCar+bLkJ^{I9P7ZrH`rPeY5cXDF(UYHITfx(rb-H#WNE^0Ht*7jinpP6cchM zD%7z5Lm9x$@5LvuT80i-Y%3q$&dTglCL7w>c%euxA zfC_COcgjLOVDo8c<7J_&mIQ=hH~dF}R6JybTwMhSy~xDC2^T~3Vp&b9s0TFx`VcW1>BnfPT4-U+h4H#+` zct$o$t3#C|4Kkq2Q>m8pqRcRgCk(BRFH6TKJpCdqpF$Q$n8#zuZ*kw7ts%@vZIw#@g#VjI;I)oGBIyuyF>%_6a4r0MFx5B7%ha*nd|Ah z9f78SwMcd^z6bH*(!1lp9{dR0peQzr?U#pxRZC&nYpANbBxuSV>AkCxpWuhC|J<3r z?>T8aMDMxgyR_9W27np90<(_GaNc0{vI`C7aRZ=pFWLy1CCFh1)zzxv|!Dn|gaFaqSsKo7UQMVdMRsXIS4< zD2jo{J*|A<+$f@IZ?(wNLOjhL;)MkfZL#xCdBxagL*EEvV73&?FBo=un%jn$To64W zS`@KyJJ&QRZp{ZbSB0UIM+8yA{|KzSPZ#(YftMM}&?a(@kFbl;YYmVhoflmchH`7x zidp4}sKzejX!k-8qe5Pw|60*5+`#>MVpa#_>ybjv_d$c*= z-?;E0iw=LutF^SwaBTT_H0vmAgNN?;{okPAj?sfIyiiuJfGm#<05Jpktn2K?ve4W^ z7wspYmO^`IkMn{S!S^IS;3ifxpXmycdX7Lkc>2FweFOsIWExpg(**(>^gi^m#0(fk z!gaRs_;BhnFB$mENQk8+Yxh4_L@rJ!SKf=9K9O5_VzMF&c$|wu(>Eojb<+ef=VV>% zafd_+V5jsOO*P({1PkN{uG-=9S&VbjCU}OBy8R^El}nADJ-b@MI5tygkhv)Oq-NUO zYHp?1_P=J@NjuDzmOP?^;Nmgu&2s$;DdYP^{o7NaE&DZeM9}PVE|xXII$Axm4fy<0 zK3>q8ckQWx+MhTfXbtjKn@v~Sg-^)at50c>-<=W!c#x=CKs#TDKfYYM3aOMCjUf7C zmH+WP#m!Nc)$z&r4U3Zzyhq^i69ykk0_vBG4|XnC3y8h51o9s+34%*91p7s}Qwq~h zYLM^SubbFib~QV`OaozSXqvV6!`0s#&e)6TquM7^@mCud+d_kbW1I$D|4^P4)CyO?YPWjFuP0Q?lW z#BQ;ll>#y_(oLwBpF)4(&y-ccSC^h&eZH}=bb;!$)xI0ZrVyn1g+t7Fyuxax-1c+u z%wSxF@HWict9e|2Yw}xHJ%dood>q5@MY%;fi^mB@f(yoOxVO^1G}4eeywC ztwWIQ`ydTZ5L~C3qyg&*;ZpA-vI1lOuh+HZJ=96-^Cb8p0Z^3-4??H2UD>sgnq^I7 zo7HHc1o;#n;7EL*+_amds9anm9!Jvc_lXtN_n=we5C8sx4p*TV5uF1~LV%YfXd3M7 zG`!|zPGmFVqG%BjG@b!2rE z^6(jMn-bD&psvUv>H`3D{oQd}H@OL{xV4gf7X~ak($4r-UdNRvSsuIAy)L@+oOiq!WOT~sIrW^jHp6@*gnwt() zmsXyft=<^O#5kRct_z0t978eZ)^SP>ldB#2QNb2S(!NF_Z{ClVY#lx+EyhN7K{clt zD`J3pY)zkD9&Sh;>QKG*5t5_f!}&vM9YSw}%ZO!^J$$rfaP8`%fLvTc>@&sh*w^ld zBiQruLO8VZ%=7k9WHi_hO#MWX)=w-Q(QT|%HD{O`tGQ4&y57Wg`-pN?(TQ0*&DR#` zvCA^|;CL$@9ig*Bw(;P22@QwHp^k6u0eKWVdN5|p$f*nFPm@p&5$Mge|^dYQx zqDr5yOY~XVk^jHue5f2^@Uhu>QMB9Ep{ZcZAhX()=|@pAde%Rj`0yb@K>?-jUEG$3 zc?)^0Ri~i`TyrEX72~-DIUC>8(B;cDs@a`}b{AYrUE`m0?~MnQZE2nx@a{N625D$d^q_QM0i^0h zKwg;l9SF#Q{IX@kDgY-F-)NO#y0oANs-;?~bm1v_yWDG8d$0^sc8)1kB&uo_)5W5Z zYz&@c0tKpX8YP`xVJ+fiajbL$;imiZ&M(n#(3lQd8f?hDDQm$@_|Dtne(e#$vBV=G zCTTHCf@VK|=rylPaonC#qz3b4D9`U5}Kqk6w4*(x05xAW^a?{14vg2Lwx#8%8ZR zK8UzgSZspHmV`W+x@e}LpR+)em@2-~OilR_42iim7&&-^Ac_d}HQ4=Z$E$snsMXdd1r{xG#{pISTP$+@AKxkQQ2)7VXC``@nW`5LfT&_$bdnO=HqbH zBscN{pCvINc*}9?38gQ8QM6mVMY@UDRZaOMQns%U55|2Rmv$euJmhvBY$;lJ_7)=P zUgpO!4u62)AGX=Dt(<+0N*s9C@#V`F;JBi$&%btDwCl8Aq=Aeo9iXk0;)c@H`PUUC z)t$>Q|59|!s87)w$e=ZjF8z)fLe5YOMdce<`SuH_jp7{QT+9R{X)5sq&}1+$hQa7w z%OosMmCV{0pbQ9L#gDpJ9Qe_7$hlGdqIW1e=OM|izF>Zwz~|O3>KUa(FnhLvn!rb> zjZc-39NqoYzu(RE1VK!;ixO!^w*n2r%lM{eaA8Brdb7zybZhY0su8)ka;<^jI3C1s zH@f4MC(fS7>K}A+`A>8Pr&?R8VUU7QldjGVz*5R>>1|0^#|aH@Vlh7xbv)Nuubjv_ za;9r3tq=1u+n{h}-34V^e$1m2>UUip)k2j2*;+&=-xhS}25q&LqEi8{FG~O6%`54E zg0}BJ7Mmqk&a8%z?#^831h>k+z}yUe-I+03B}Y?Jc3zyGru<&g+r0(k{D<2XZ6ky* zdliOFTs#4HLDg757@sX5RzZp*Zr2v@w`4SC1=U*)aSUxC97Plw?8OQUskORz)dm$fQN$qhHWdaozKZA$#JD* zIb*$N;g0yS>!zSJ*>kLnkwrx{uj*c6$nneEtwlu2vXI@V;&nS#U}dgsmEQIOXfHjG zd`pYM(8>sz*Tbm|jktRVOzpbyUnbjrf8q``sBka4wn1?&;AUDO0v+c1yLLe)kHl$S zs>ev-&Dm9mx>JMV<@Kt<)=F=D$un{MhF}u&qK>x3Qncc_g~ZwUt$#lFm=we4#nns2 z_H=GjpRVjIQ@90Cb_~pyqPIV%iT@7xEa3%4NY6W>U-t88h*I(R=nJmTVi(}tZXJ9T zGbss&Xr?F&uJ_&ZkGk({j4D3CF%+UHxE>Q+`;z>8h)>fS!b?;9A^SeGST9A_D?{qpwKUpm^BHQhaO~ju zho9RRIuqP@1Aw`r$qfXh%j=yE&3^$&hqz!L&@T<9R%J3Al`kr7DPmanO75X|9cwYN zs6v{7WM@>b{)S&?Y&H?Gi)$W#xTK%lO<%A*V3#FIXx^kBA=(ANQ$9k-k?h|uQ*XDv z3xvWD+Mr#K`toytRq4p7p7^n9rq37?M0)naCWN4PDUZ9;Ia^8dA}&>@{SWCN2=6QQ9a{Y(7i6& zO`2G;>RA0vSiHv6P)qq_S%zS@lampt(NTB6TqwCWE2C2VXqzfUIJrMzKUzFW3 z)V6CDOK$B!bf^*&_5HYGUJ7x;hh4fB-b1j2vs!)UP01rtLfs3AYPzz{X_f|Qf&Kz0 zqti%oaoe)(zzdQGr?p7f`d4Hb8<1DNF@o&@Dn zl`&jv0L>KtqT!LvefaZd?b_>?INWJR%|X_{l83I_m?$aZ7UK~wX8biX_40zs$N5!S z*GVyn>)LdAy$)bR9W4lBTsI{J;fPs31I{k%V0HQ{uIwC|lCNH+0$jWl^b81SbY)fU`WjW2CH=m}InI*YIgbCeB@y@_}*ELvON z6Tm30`vRcLDTaryn18g@_qemSeWinA9c#Z78r2@O?X*Cu_gt8&|Kx7hI$F z{Kn};9jnF{c0p}}OQXTq3tHvYqrJfdIzvR+Z(YO=HVm3Yv>V+|Fh(Ly!<`GY-jf%; zFC6BQQPdC|#4_9Yv)%}Z;SPi&o{Qsq2o(h(=6aslB~fC(r(u91b4+BG znHa`R0xUAw!E5K@+AsuL-ehBEJwo_n6GJvO^I4?kB|vGLA%W;#C$kh{=%^EAt`zmt zRJ#$-W2#CxKMo7dUQDcJv*AwGXyeMtdCfk9*qLQ@OCaDq-)%~2Fa!Kel&TPEg!t7r z){Z9xtptG>u55Gt-|xDO=iPQt>u&Zw?>hwyd7nvO*_%wQj#pQRZAl9!zPg&|NY( zq)L6>MUyZUtYty=#F+hSB!x1V>MsnXx<243B z^$%mKOdd4u3?t|iha>3B?pn?Z~++;U-*fi(? zp304SZf~}E%n8xc6Tq(kE&{TZiOg_TY8?I-s(JkG)MOyo7fPP$fk0UC^nVmYK|R}K zG?R7ZefjV-c~XZnYxfnfHtg5r)OeKAYDd3eZLJ(nes$ z%vag2;Sm(QaJ;eb9U=DMzX&nZY@c_zoWL&BZKl5@Y;P5e(Rw2rXoY>i4_&YN_Npj$ zA)DgtUB7h7<>`=hs|Nhc&60WBjcW>hv7-q}S%>Jc-$v8zFPcm7R(;(KE59@GSof968L^*{lRAtX8HXz+E!*!*o~^+Pe`@K zA0$IDs8Ml5EHVS@KMhHMZp$$g!_3ehN~Ae`jbe=)V~uqBrBycgbL_sFrPcAWczDZl znmKLqOsegVL`@CXs=@V@PT^1cM(mH9GR~~mZk5M$8>K1i_Gooj$FV1^T6Qu5(+J)} zi-*mswK%*O;H};D(BaC(hqWa~c2%0+8dWx~Q_KBiXgFs*Yafbta(S&U%ms)g z6ekxaB$lg|O%;9yrJBwD%x|mcT|s=H@tDNIBALGH1)!r{+;yxp2}5Wo+g)Gl58bF* z)o9p-)uh?a`{m;luM2(q&R#Nh+!i*ZPgCviolF_dvhw5BZlFHl^_pEh<*!}?{%p%1 zvplE>Wr1+#q?@vmaXNA3xye~f_1A0OwFV>jtZMR)iEP3!t85#LQUGUiuIV~`_y*+n zE7m7ZD4R+~L%;Vhz8yj}4rG3Q7j2ohSx){Wg|ZVSM5M#xSo?q*=@PqnEp{QTbQth- zqg6C5iGje@O|V>_L*{N-p=$+5d8Hm&c-{qeqKoM!k4CfIa;pZnR>fbf#(ZJ!fhs>{ zYi+OMc?$8Ei82H4@(BW}5^-vj$UEUvQI6ChIylC46p=2S;2u20OR@a2+-nqUPWr|jw@;@Q|zevm=Cl^}y>_eo-6 z14-|GWwEfFY2znhAU!girZsU&M4CoiY0~>-Oo4E={o-CPe>3W%y$^X$=t8ze zLNBi#P!vxYddET@XR%@YN$U6>`q=pc|IG{c?|N^5Fd~zkal>3^s=#sU8g%+oobQpg z!WYm!E^^*SKoBwKL!j$ETm>XREB~Y&?WZ4Z!1mW+@83g-VG3X_2c@Ct&X%1L3g|th+f0N|(QZ}3ho^J=iuowmL$a+ts;{03(meDFp zpR_?U`}L+f6SJMo+y3HjbB%33Y1?Kl4-j9s0@meX9c`U!Fh*_YG zXmrVsPEowp=pgtfV_p24%fxux%W8?K$C`81&(@s@AC+=h!pcQU_A+F-0AvD4VD6wi zw_Op@Htb${UfSLTeH6{EZQIJK*CjU>tUUd$a*oH_j(XliUI^6Ka=<(<`eUnW$k;z1 zo(MZEiR{`s7u(cveHm~iLCiN5g+=}}#T9HwWT=ui`+iDfY>(LHN-RVIiGN#~%jXW7 z*Vbf-2U->P8uvb8a1P8JGT%W3Y@U4{5NxiW^ySJZ69D@8|F*78AK1ag(ND(p`pT6WGSI|uVVs-Kho1MZ0#bpP^TYd1rz!BL!U z)v(nAsPQwx@1LC2{0-1$tBNAfc{w#wi=Am0#41cxTQ(xurn*tr{fqPEfkj9bsJMP_uD5!oiMHP%NJ1meYE?z+1>o_-SNNK zEjgL{gX;WK_AT_8v6#OGuqaGi%9%9(n@4?n|Lm*=8Tbjo&NeB>USjtQLB$C8dd)-u zQX7bC8&W3gcun~+v6Tgbs05(JLTUOBJuejo6TCJ(M2pHNp%Dm8lD_#ZO$vtdRmTpdK5t>r4-YY9{{WB_`HZSoB+Hz!az?TEvdCi13qk)47W3+aLetVEe2)A1Ug z-w9;Qr6=Gz?*I{w7QHteIFH9i04tzWQ^XWAsr8DU-Bky2jw2OMH9Dfx_QcR`5x68V zNud3QFzYH|ag+O5>JDq$cU#_LTt7qrNXc;9S4s}ydA#WHQJ-iRqqbZ7&U0AT8~@Tj zOyUWVS|V{3W_FkUe$)+8uJC%(u)d=J{isN{pgym(&flZ@;M_~wPgLf8B_|t&WM^hX z4zT5GT|_N$j?nscgW>gV)O{I|)y*twj2htNHLjm`Mptg5kUq?Nv|Gnh7dd4W#}5RIY==OyW$sH_+cz)P36quh?Z@h#HLP|O+%_01RE6kKHryE) z^#MN)07QO!SF(-MWJ2sIViaDZu&2K+sr*yT`m5(o6O!7K$%)B2g6qmbKc101^ck`_ zCs!d|^((3$b{~F828x!~d%;tQlZ_P+@1~3*SY*|T?-!-;i{69|YkPsIIm|KZtC2 zxOxNEf$JW^<#O|ZOf5LC6#Y#sW=^b>eZ5b&Xfe!IhDellRqK7o8!#t;xf6*1cM$Dj zw$@VLJk0#m+62gYzc;3tG#t;ug)?*!aB!})%_nUIpkVoY2~l#`iq?i}ieZp-X`V~G zGxxK(t!3CWWPrRx=#KxbtqjI6-PEW;LkC?*OMQO%7Xvhu0ICgwb^Vp!P#7_s5C^i@A0 zW@DLlkG$xoY*lIUdR_nS`U^KTZl1EQ!thE?-JnmdJ!fa8sK-CGS)J`(w`-PFC^)rs z2Y8H+C@~4d&s}E$hewWEEk~$CvU>^9ZTj_5v)t zyv~kB#lUuQvYS|w7R#Ms|5aYbj-loyV0x9iu}KS!jO+%A&;RSJlQ_f~7-CuJNZB;+ zy`A6}P=(Qqp8AnVFrd4OVbdtrs)$}Qp0e&p&5ZsOsRG6=?oHF5iLvLnd_?xHgX_26 zxUH4&hT@0g<3@S1|J5t_ZpdE1H6!tsrPZ&bZ*`r%yz~&s=*$#%1ulw!iyE=9E6}Z8 zLrVI3YNQsbqL3q#YM`^6QO`O5-{s1zV#izDx=v*Hvg{?~17|pnRV;pC4%yqGo+YT5 znTX2Er#;f~jI42|4WpTjM;pzhk)QI&bciFzYqa}ITzp|*3uP|77yqdJ2>z`9qUQ;@ zb2@oRh3jpK$K_UARFF(%uw8__o~7{7`LB(>ixS z*R-Fo*Mu6Cjq)@yRId}g-vUp(NqTY!y}Rpaw7yRN05wIei6Tp$FYnQO-Sku)rHl+& z;s5OQ`_I0=|8@Q5)t(QR`#rKk-OH7Ohd^B9?&TE`|8BC%4e?>-dVbnX{Sy#%dC241 zfBjbrU+uBTNI+8C%B0DmluQ%b^+>iku*ycYbyBC-LYP;|;~?*49~- zrf#aGtTlP!WsbStmsFq^hcUhb8}%Y#zYA#X13m_d@IF3fG9>pr8JUwv(_P%B!E74N zKz&h0KORq*M8@v<>QA3vtsslXWQF`(dV)E?KLfD|Shr8#s=2udMSN1`U^|t^Rpy+K zjB8{*j7}U$6R7Ef2ZM8+fWn~@qVJjCkfr>+0*|}K!7$Az zMJA1oFD@Qs2TVbsF666a7NgI)$x`lQQNmU3O>s11mNyF_^p@LTG|W+C)9BNxurS*5 zd!8^!wAy|LJu^5_k&$cMX|B%d7gxa6$-S}p#KFc^2{gX^KYBLJ!O<#4Ak;`4^<}6$nievJQ`D6#$k(BS1X-|8G6C*{qUo!(aY4;MkKM+F8HloHYgoc(MUMR;~cg zoz|8r2?(_=0Lo=A5!Z|&g-}tFfgVtmkki@Q*_|X$_OGw)= z;ICg|m0Pgn)X^j!0Pd(__z7{WU*-tVr}0bsrE4ut?5tYtX`*^tlGKXOeCtU$Z71 + + + diff --git a/docs/manual/html/isampleobserver_8h__incl.md5 b/docs/manual/html/isampleobserver_8h__incl.md5 new file mode 100644 index 0000000..0f10e4a --- /dev/null +++ b/docs/manual/html/isampleobserver_8h__incl.md5 @@ -0,0 +1 @@ +4f0360609a92a827e911f5c60a4b443f \ No newline at end of file diff --git a/docs/manual/html/isampleobserver_8h__incl.png b/docs/manual/html/isampleobserver_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..332085da8ae701d669be9d47cc9f2ec027e19d08 GIT binary patch literal 1464 zcmb_cYg7^j6vm}yrgJWPBHDDmDm35o5ov;oA}pUNMQS=E11Drkiuj;1@{yU6mS&}r z37LrE1EZJWHjO2v72+c;6*EOLC%&dT+iCm1bI-lsx#ym9zjN+)?>+w`(o0)&hb903 z(1v?M{Z~=6>Ua(H)uZ9+-4(QYwnokJcB;MfIlR zFqy1fpZ38|$H<$1=u^z@HlX`AP{pte&R1eb*29kB{Md5_{PUmn%rUN6QL12?PxfxT zt~`qClfw8@qrHx{qE14;l}6N0W#qD{&JWnp*M>NgRd&D?jAe5qnLO__+E-{wS9x=s zL{cD$QUvh~=_8#)Fhjr}Jn7I8{r>iCWLqU*)8OEsTXJ&pF@gd89k8u%Y312pMb9LFEp(^SRi9HUz%ps)`mRqdNIUD@HX1x(P(td zk_sqNi|g@D-1x`k=sqy12{Li2q|bri6ss)krRJw{8n=Rs*&l5vRiz>uy!d#%!S!eX zN4Rw$_~gnSnBk`Aid65@26F5GcR&b6E0L0-UTX0E1bvU5R5B&ErlI3Lt|2J&LS-)Z z9qZl}wnf~^F06V3LPFn?*q>=$PwjyNdHqDKXiEhDNI&G4$PUwI2_K%HOUa_TT@iW`e!if#R6JRPEJ1S@NFG< z`mVo5kI=0;5%ISOwDo(9T+?)iRI>dA5%*eKft;_y-)7T<$t$H5Jm76L>r}Zkgfca& z<8qWu1gF{b3q~1`rcsJGVJE1T3^4v8=a)_zI^ocy|Fd*htmYQB{AT|I>Juh%*7s6> z{-^kqN|KT?Q6kX@0(Ms}^XM8(@ymzfaZ2y*0HpKwyK@+?XX6F0W=yQ`K1QzK2VAzA z114TbR37NAW>{)dN9-7fiWDs`PqzKwkrehw=OnuOFtXl@x>y}|;6-K%jcG#QSI3#` z>x?0eR8Cqk`f#^PF6K;g&yX3cdp?2cHzI@onUk@gmTX-le zwWBf92)vs4`T4E*vR)=TeUM{Fm&AEKIHA=R~`6(_Cn= z8}wix`MP=D>eTQ@Q!F40aS%H}ZJ8MlCFrwUaPVo+_!_>|Ra6u_fc(fj@d0{ii zwgwe=!3EXDG2p`tUy&y@yltBls&;(f6NYuO1}YpEV2d!Q!rKokipSeanUSFZ^?V$9 z5qbGUY`c^VS!F76-0+lb)$Q=wG!}TLovZ!Nvj2BQMP$vao8Aix3w{jU&Y__Qu?a%; wQNd%UMBc#E(I%?!#NKUvaV={f7~n=)R+;%wuDWBBMb=slhasVN4}@p@33KPfEdT%j literal 0 HcmV?d00001 diff --git a/docs/manual/html/isampleobserver_8h_source.html b/docs/manual/html/isampleobserver_8h_source.html new file mode 100644 index 0000000..edc9852 --- /dev/null +++ b/docs/manual/html/isampleobserver_8h_source.html @@ -0,0 +1,109 @@ + + + + + + + +DbcLib: include/dbc/isampleobserver.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
DbcLib 1.0 +
+
CAN DBC C++ library.
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
isampleobserver.h
+
+
+Go to the documentation of this file.
1/*
+
2* Copyright 2022 Ingemar Hedvall
+
3* SPDX-License-Identifier: MIT
+
4 */
+
8#pragma once
+
9#include <cstdint>
+
10namespace dbc {
+ +
14 public:
+
15 ISampleObserver() = default;
+
16 virtual ~ISampleObserver() = default;
+
17 virtual void OnSample() = 0;
+
18 virtual void DetachObserver() = 0;
+
19};
+
20
+
21} // namespace dbc
+
Interface that handles samples. Internal usage.
Definition: isampleobserver.h:13
+
virtual void DetachObserver()=0
Detach the observer object.
+
ISampleObserver()=default
Default constructor.
+
virtual void OnSample()=0
Handle a sample.
+
virtual ~ISampleObserver()=default
Default destructor.
+
Main namespace for the DBC library.
Definition: attribute.h:13
+
+ + + + diff --git a/docs/manual/html/jquery.js b/docs/manual/html/jquery.js new file mode 100644 index 0000000..1dffb65 --- /dev/null +++ b/docs/manual/html/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/docs/manual/html/menu.js b/docs/manual/html/menu.js new file mode 100644 index 0000000..b0b2693 --- /dev/null +++ b/docs/manual/html/menu.js @@ -0,0 +1,136 @@ +/* + @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 searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#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(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/docs/manual/html/menudata.js b/docs/manual/html/menudata.js new file mode 100644 index 0000000..377a75b --- /dev/null +++ b/docs/manual/html/menudata.js @@ -0,0 +1,82 @@ +/* + @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 menudata={children:[ +{text:"Main Page",url:"index.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:"Typedefs",url:"namespacemembers_type.html"}, +{text:"Enumerations",url:"namespacemembers_enum.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions_b.html#index_b"}, +{text:"c",url:"functions_c.html#index_c"}, +{text:"d",url:"functions_d.html#index_d"}, +{text:"e",url:"functions_e.html#index_e"}, +{text:"f",url:"functions_f.html#index_f"}, +{text:"g",url:"functions_g.html#index_g"}, +{text:"i",url:"functions_i.html#index_i"}, +{text:"j",url:"functions_j.html#index_j"}, +{text:"l",url:"functions_l.html#index_l"}, +{text:"m",url:"functions_m.html#index_m"}, +{text:"n",url:"functions_n.html#index_n"}, +{text:"o",url:"functions_o.html#index_o"}, +{text:"p",url:"functions_p.html#index_p"}, +{text:"r",url:"functions_r.html#index_r"}, +{text:"s",url:"functions_s.html#index_s"}, +{text:"t",url:"functions_t.html#index_t"}, +{text:"u",url:"functions_u.html#index_u"}, +{text:"v",url:"functions_v.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_b.html#index_b"}, +{text:"c",url:"functions_func_c.html#index_c"}, +{text:"d",url:"functions_func_d.html#index_d"}, +{text:"e",url:"functions_func_e.html#index_e"}, +{text:"f",url:"functions_func_f.html#index_f"}, +{text:"g",url:"functions_func_g.html#index_g"}, +{text:"i",url:"functions_func_i.html#index_i"}, +{text:"j",url:"functions_func_j.html#index_j"}, +{text:"l",url:"functions_func_l.html#index_l"}, +{text:"m",url:"functions_func_m.html#index_m"}, +{text:"n",url:"functions_func_n.html#index_n"}, +{text:"o",url:"functions_func_o.html#index_o"}, +{text:"p",url:"functions_func_p.html#index_p"}, +{text:"r",url:"functions_func_r.html#index_r"}, +{text:"s",url:"functions_func_s.html#index_s"}, +{text:"t",url:"functions_func_t.html#index_t"}, +{text:"u",url:"functions_func_u.html#index_u"}, +{text:"v",url:"functions_func_v.html#index_v"}, +{text:"~",url:"functions_func_~.html#index__7E"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/docs/manual/html/message_8h.html b/docs/manual/html/message_8h.html new file mode 100644 index 0000000..788beb7 --- /dev/null +++ b/docs/manual/html/message_8h.html @@ -0,0 +1,148 @@ + + + + + + + +DbcLib: include/dbc/message.h File Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    message.h File Reference
    +
    +
    + +

    DBC message configuration object. +More...

    +
    #include <cstdint>
    +#include <vector>
    +#include <map>
    +#include <string>
    +#include "dbc/attribute.h"
    +#include "dbc/signal.h"
    +
    +Include dependency graph for message.h:
    +
    +
    + + + + + + + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  dbc::Message
     DBC message configuration object. More...
     
    + + + + +

    +Namespaces

    namespace  dbc
     Main namespace for the DBC library.
     
    + + + + +

    +Typedefs

    +using dbc::SignalList = std::map< std::string, Signal >
     Sorted list of signal objects.
     
    +
    + + + + diff --git a/docs/manual/html/message_8h__dep__incl.map b/docs/manual/html/message_8h__dep__incl.map new file mode 100644 index 0000000..b093765 --- /dev/null +++ b/docs/manual/html/message_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/manual/html/message_8h__dep__incl.md5 b/docs/manual/html/message_8h__dep__incl.md5 new file mode 100644 index 0000000..476a2dc --- /dev/null +++ b/docs/manual/html/message_8h__dep__incl.md5 @@ -0,0 +1 @@ +7dffc1d56cd33b20cf54f2bb507c92b9 \ No newline at end of file diff --git a/docs/manual/html/message_8h__dep__incl.png b/docs/manual/html/message_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6e12748d88af539ae6f6a8344353493fb5e095 GIT binary patch literal 2380 zcmchZc{tSDAIHZfB$NteYq{0fi^>dH!YIp)glySHija{zi}_i)LlVl(mO_J=VQ7RH z#MqKVs2Qd)mZq`9*BEKWGE@BAZugJh^Zfq({XXY8=k+}2{Bxf7=kq?FbLYI{SveUM z84w60XJ-q$uu0& z7kT`?J#d`_+%d}o&M$Q;G@VUz?w`Y*&q}^5W|xIo)R9RW3-Nd+ovfI*wrvON;k}wy zN^t8>ziC`lvaP&=3fmDZYlxH98rHS7GL2MMdT5mW2s_&3Mp>Ah_a#D3_h@^oH2^9$sED-ZBa| z0Y(*PZm6O$JmFsGfg7(78J@D>hh3X^nizFL#Rhn?5NE?8G9YGnqgR1miKdK;9gX$% z!)G8cyrBzC7<@uzJ%Qe3aK(l#%14&q|Lo!POqq*drNlpq!3H9U89ik#?|rL-MG%+V zt*NpNA7@>E?pmKJr}_Jm>)q1yiyaTMm51j!%|Uo->Ig}A6d=BhdVR`qEY6y8a&I>& z&`9C37g~=zYe#3ch7B$ai}J0<4M;h$S%Ul5YgbL_3X^a4(oRfhDGxo43pwVA3ef>* zlpKA5em*Vc_$RDQpKlTH8xT%^pIwFqisDVc-)}c3$RlMLD?UEm&+PV9lZy*{jVlO+ z#oQPci3}q2MirZ0?Q=Vgrm{XHiU-wnmak`f zlSXQ&rmWuTVtpyd74WxoG6z%hn)bJ8DX4w$u1gi`hv|{Pd-{|3W--cb@M}Xj&763w zr^T)c0@WX?YQHnT3-n?ZDWfJt+yuji=*qHJ#gDH0ZYO;V(Nr=#2XR9f**lwcAdLR( z<7k1RX)C6?oeEkiQ;owXli6XX|A+!*G#iOcN9>Aeok0qXA8ZU< zxKU_pp0VT_jR$u(RNO2PomvV{G@L4XyYtFWUkXQ!Xvku*8g5Lb(CYiyrdWO%+7cE* zW>1Fx$CYu3E+tDoIR9AsSXHoyFC@&+USSeliB$c8!?w`u3B@68fGra8>Q)J0&#N0XmT$dz zQS#B@JQDQp9keH1cMeW z<}|;`z^uDA%g8bwZ~-XxHKtWPIMS=nTC2}Ciw^n@(wryu8@zE9xIkj4$e;v`<9y4G zhp|g3BTG5J^%>g5nKNai4U_KRP~A%_0(F+r<5r{GN5gmC|CdaMy=xs$_pxk+whnB* zR7y4X$|vE9Y9kl?pM<4nvT<(Dma5C74w#f%cck_v@y~k3CsbMS!_F^ z{xm955|?h_*(Tn};8R~87W~r5lx+WcUUyz^tid>)<_yekO{y)*mW$nST4*1AI?Lr> zs++EpfXewpYK1x$BZI#h%+2mfs@>`)wrGk7wV&`#R~4V4kMHhewyjYRzqI*?R3xPK zV*-$F##A}PqRQYQv^^gBZ6y#>(u)-)vH8!1_xgD)5X9w;aWzP_sri_|^%GxG&iG3%V-l-C$tBMFdd=+ucY{HbqZLw-(OR z*0(i_RQ*F{8$V=w)YR4{aJk`Cu`Ti3<=_)bW7$_;Pfruj(6vXIeQ;=xZqg4_I(BGX z5UE!T3(H>ky<46YoErf14PcYQc*6I(FQaR7lMXdmegm|<3bSu9QC?27pYCv7Fjhc} z7v8kr@zm^caeec8N=`4KpS12H)Cx^Urtv=zHuM1oa)ewP?p++S5+s~+=0hWxL|$<{ zX}wn%0;r9cCy`96OfF|P!nn7@=;ZOv%q|2u*<+ISzvg1ntBpCJw`lC zJ0^cz*>OBA2Cnj|oj->Cj9=j2wJrl!^aj2hvDoe6-ruuL$gk-|QNx1*v;e8o0T#pe z*f&NAkfNgB*N?<3zpVJ_up_0Ujoj|n t0sCg9b&I%Mhp|R_%XWL%-*I?ds + + + + + + + + + + diff --git a/docs/manual/html/message_8h__incl.md5 b/docs/manual/html/message_8h__incl.md5 new file mode 100644 index 0000000..60eb8c6 --- /dev/null +++ b/docs/manual/html/message_8h__incl.md5 @@ -0,0 +1 @@ +ec5861429bae9b1c69fbb681e168a440 \ No newline at end of file diff --git a/docs/manual/html/message_8h__incl.png b/docs/manual/html/message_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..72cd9df63d96feabe01423f1f6a7ab7ae0588b92 GIT binary patch literal 32937 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 + + + + + + +DbcLib: include/dbc/message.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    message.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2* Copyright 2022 Ingemar Hedvall
    +
    3* SPDX-License-Identifier: MIT
    +
    4 */
    +
    8#pragma once
    +
    9#include <cstdint>
    +
    10#include <vector>
    +
    11#include <map>
    +
    12#include <string>
    +
    13
    +
    14#include "dbc/attribute.h"
    +
    15#include "dbc/signal.h"
    +
    16
    +
    17namespace dbc {
    +
    19using SignalList = std::map<std::string, Signal>;
    +
    20
    +
    22class Message {
    +
    23 public:
    +
    24 void Ident(uint64_t ident) {
    +
    25 ident_ = ident;
    +
    26 }
    +
    27 [[nodiscard]] uint64_t Ident() const {
    +
    28 return ident_;
    +
    29 }
    +
    30
    +
    31 [[nodiscard]] bool IsExtended() const;
    +
    32 [[nodiscard]] bool IsJ1939() const;
    +
    33 [[nodiscard]] uint32_t CanId() const;
    +
    34 [[nodiscard]] uint8_t Priority() const;
    +
    35 [[nodiscard]] uint32_t Pgn() const;
    +
    36 [[nodiscard]] uint8_t Source() const;
    +
    37 [[nodiscard]] bool ExtendedDataPage() const;
    +
    38 [[nodiscard]] bool DataPage() const;
    +
    39 [[nodiscard]] uint8_t PduFormat() const;
    +
    40 [[nodiscard]] uint8_t PduSpecific() const;
    +
    41 [[nodiscard]] bool IsPdu1() const;
    +
    42 [[nodiscard]] bool IsPdu2() const;
    +
    43
    +
    45 void Name(const std::string& name) { name_ = name; }
    +
    47 [[nodiscard]] const std::string& Name() const { return name_; }
    +
    48
    +
    50 void Comment(const std::string& comment) { comment_ = comment; }
    +
    52 [[nodiscard]] const std::string& Comment() const { return comment_; }
    +
    53
    +
    54 void NofBytes(size_t bytes);
    +
    55 [[nodiscard]] size_t NofBytes() const;
    +
    56
    +
    58 void Node(const std::string& node) {
    +
    59 if (node_.empty()) {
    +
    60 node_ = node;
    +
    61 }
    +
    62 sender_list_.push_back(node);
    +
    63 }
    +
    65 [[nodiscard]] std::string NodeName() const {
    +
    66 return node_;
    +
    67 }
    +
    68
    +
    70 [[nodiscard]] Signal* GetSignal(const std::string& name);
    +
    72 [[nodiscard]] const Signal* GetSignal(const std::string& name) const;
    +
    74 [[nodiscard]] Signal* GetMultiplexor();
    +
    75
    +
    77 [[nodiscard]] const Attribute* GetAttribute(const std::string& name) const;
    +
    78
    +
    80 [[nodiscard]] const SignalList& Signals() const {
    +
    81 return signal_list_;
    +
    82 }
    +
    83
    +
    85 [[nodiscard]] const std::vector<std::string>& Senders() const {
    +
    86 return sender_list_;
    +
    87 }
    +
    88
    +
    90 [[nodiscard]] const std::vector<Attribute>& Attributes() const {
    +
    91 return attribute_list_;
    +
    92 }
    +
    93
    +
    95 [[nodiscard]] bool IsNodeSender(const std::string& node_name) const;
    +
    96
    +
    98 [[nodiscard]] const std::vector<uint8_t>& Data() const {return data_;}
    +
    99
    +
    111 bool UpdateData(const std::vector<uint8_t>& message,
    +
    112 size_t offset = 0, size_t data_index = 0);
    +
    114 void ParseMessage(uint64_t ns1970, uint32_t can_id);
    +
    116 void ResetSequenceNumber() {sequence_number_ = 0;}
    +
    118 uint8_t NextSequenceNumber() const {return sequence_number_;}
    +
    119
    +
    120 void ResetSampleCounter() const;
    +
    122 void StepSampleCounter() const {++sample_counter_;}
    +
    124 size_t SampleCounter() const {return sample_counter_;}
    +
    125
    + +
    128
    +
    130 Signal& CreateSignal(const std::string& name);
    +
    131
    +
    132 private:
    +
    133 uint64_t ident_;
    +
    134 std::string name_;
    +
    135 std::string comment_;
    +
    136 std::string node_;
    +
    137 std::vector<std::string> sender_list_;
    +
    138
    +
    139 std::vector<Attribute> attribute_list_;
    +
    140
    +
    141 SignalList signal_list_;
    +
    142
    +
    143 mutable size_t sample_counter_ = 0;
    +
    144 std::vector<uint8_t> data_;
    +
    145 uint8_t sequence_number_ = 0;
    +
    146};
    +
    147
    +
    148} // namespace dbc
    +
    All DBC network objects may have attributes attached to them.
    +
    Support class for handling attributes of network objects.
    Definition: attribute.h:49
    +
    DBC message configuration object.
    Definition: message.h:22
    +
    uint32_t Pgn() const
    J1939 PGN.
    +
    const std::string & Comment() const
    Returns the descriptive text.
    Definition: message.h:52
    +
    bool IsExtended() const
    True if 29-bit ID.
    +
    const std::vector< Attribute > & Attributes() const
    Returns a list of attributes.
    Definition: message.h:90
    +
    void ResetSampleCounter() const
    Reset the sample counters.
    +
    void Name(const std::string &name)
    Sets the message name.
    Definition: message.h:45
    +
    void StepSampleCounter() const
    Increments the internal sample counters.
    Definition: message.h:122
    +
    void Node(const std::string &node)
    Sets a node name.
    Definition: message.h:58
    +
    Attribute & CreateAttribute(const Attribute &definition)
    Creates an attributes by using its definition.
    +
    uint8_t NextSequenceNumber() const
    Returns the next sequence number.
    Definition: message.h:118
    +
    uint32_t CanId() const
    Returns CAN ID.
    +
    bool UpdateData(const std::vector< uint8_t > &message, size_t offset=0, size_t data_index=0)
    Update the internal data buffer.
    +
    bool IsNodeSender(const std::string &node_name) const
    Returns true if the node is a sender.
    +
    void ParseMessage(uint64_t ns1970, uint32_t can_id)
    Parses the message. Internal usage.
    +
    void NofBytes(size_t bytes)
    Sets the number of bytes.
    +
    uint64_t Ident() const
    Definition: message.h:27
    +
    void Ident(uint64_t ident)
    Definition: message.h:24
    +
    bool IsPdu1() const
    True if PDU1.
    +
    uint8_t Source() const
    J1939 Source.
    +
    std::string NodeName() const
    Returns the node name.
    Definition: message.h:65
    +
    const SignalList & Signals() const
    Returns the signal list.
    Definition: message.h:80
    +
    bool ExtendedDataPage() const
    J1938 Data Page Flag.
    +
    uint8_t Priority() const
    J1939 Priority.
    +
    size_t SampleCounter() const
    Returns number of samples.
    Definition: message.h:124
    +
    const Signal * GetSignal(const std::string &name) const
    Returns a signal by its name.
    +
    uint8_t PduSpecific() const
    J1939 PS.
    +
    Signal * GetMultiplexor()
    Returns the multiplexer signal object.
    +
    Signal * GetSignal(const std::string &name)
    Returns a signal by its name.
    +
    bool IsJ1939() const
    True if it is a J1939 message.
    +
    void Comment(const std::string &comment)
    Sets the descriptive text.
    Definition: message.h:50
    +
    const std::vector< std::string > & Senders() const
    Returns a list of sender names.
    Definition: message.h:85
    +
    const std::string & Name() const
    Returns the message name.
    Definition: message.h:47
    +
    bool IsPdu2() const
    True if PDU2.
    +
    bool DataPage() const
    J1938 Data Page Flag.
    +
    size_t NofBytes() const
    Returns the number of bytes.
    +
    const Attribute * GetAttribute(const std::string &name) const
    Returns an attribute by its name.
    +
    uint8_t PduFormat() const
    J1939 PF.
    +
    const std::vector< uint8_t > & Data() const
    Returns the last message data buffer.
    Definition: message.h:98
    +
    void ResetSequenceNumber()
    Reset the internal sequence counter.
    Definition: message.h:116
    +
    Signal & CreateSignal(const std::string &name)
    Create a new signal by its name.
    +
    Interface against a DBC signal configuration.
    Definition: signal.h:68
    +
    Main namespace for the DBC library.
    Definition: attribute.h:13
    +
    std::map< std::string, Signal > SignalList
    Sorted list of signal objects.
    Definition: message.h:19
    +
    Interface against a DBC signal configuration.
    +
    + + + + diff --git a/docs/manual/html/namespacedbc.html b/docs/manual/html/namespacedbc.html new file mode 100644 index 0000000..ab42a3b --- /dev/null +++ b/docs/manual/html/namespacedbc.html @@ -0,0 +1,484 @@ + + + + + + + +DbcLib: dbc Namespace Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    dbc Namespace Reference
    +
    +
    + +

    Main namespace for the DBC library. +More...

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  Attribute
     Support class for handling attributes of network objects. More...
     
    class  DbcFile
     Main user object that is an interface against a DBC file. More...
     
    class  DbcMessage
     Wrapper class around a CAN message. More...
     
    class  EnvVar
     Wrapper around an environment DBC variable. More...
     
    struct  ExtendedMux
     Support function for the extended multiplexor functionality. More...
     
    class  ISampleObserver
     Interface that handles samples. Internal usage. More...
     
    class  Message
     DBC message configuration object. More...
     
    class  Network
     Interface against a DBC network configuration. More...
     
    class  Node
     Interface against a DBC node which normally is an ECU. More...
     
    class  Signal
     Interface against a DBC signal configuration. More...
     
    class  SignalGroup
     Interface against a signal group. More...
     
    class  SignalObserver
     The sample observer hold a number of samples. More...
     
    struct  SignalValue
     Support function that holds the channel value for a signal. More...
     
    + + + + + + + + + + + + + + + + +

    +Typedefs

    +using SignalList = std::map< std::string, Signal >
     Sorted list of signal objects.
     
    +using EnumMap = std::map< int64_t, std::string >
     Enumerate list.
     
    +using MessageList = std::map< uint64_t, Message >
     Sorted message of messages. Message ID is the key.
     
    +using RangePair = std::pair< size_t, size_t >
     Min and Max range definition.
     
    +using SignalObserverList = std::vector< std::unique_ptr< SignalObserver > >
     List of observer.
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Enumerations

    enum class  AttributeType : int {
    +  DbcNetwork +, DbcNode +, DbcMessage +, DbcSignal +,
    +  EnvironmentVariable +, NodeSignalRelation +, NodeMessageRelation +
    + }
     Define what type of network object the attribute is valid for. More...
     
    enum class  AttributeValueType : int {
    +  IntegerValue +, FloatValue +, StringValue +, EnumValue +,
    +  HexValue +
    + }
     Data type of the attribute. More...
     
    enum class  EnvType : int { IntegerType = 0 +, FloatType = 1 +, StringType = 2 +, DataType = 3 + }
     The variable data type. More...
     
    enum class  AccessType : int { Unrestricted = 0 +, ReadOnly = 1 +, WriteOnly = 2 +, ReadWrite = 3 + }
     Type of access. More...
     
    enum class  ProtocolType : int { StandardCAN = 0 +, J1939 = 1 +, NMEA2000 = 2 +, OBD2 = 3 + }
     Type of CAN protocol. More...
     
    enum class  BusType : int { CAN = 0 + }
     Type of bus. More...
     
    enum class  SignalDataType : int { SignedData +, UnsignedData +, FloatData +, DoubleData + }
     Signal data type. More...
     
    enum class  MuxType : int { NotMultiplexed +, Multiplexor +, Multiplexed +, ExtendedMultiplexor + }
     Multiplexer type. More...
     
    +

    Detailed Description

    +

    Main namespace for the DBC C++ library classes and functions.

    +

    Enumeration Type Documentation

    + +

    ◆ AccessType

    + +
    +
    + + + + + +
    + + + + +
    enum class dbc::AccessType : int
    +
    +strong
    +
    + + + + + +
    Enumerator
    Unrestricted 

    Unrestricted access.

    +
    ReadOnly 

    Read-only access.

    +
    WriteOnly 

    Write-only access.

    +
    ReadWrite 

    Read and write access.

    +
    + +
    +
    + +

    ◆ AttributeType

    + +
    +
    + + + + + +
    + + + + +
    enum class dbc::AttributeType : int
    +
    +strong
    +
    + + + + + + + + +
    Enumerator
    DbcNetwork 

    Network attribute.

    +
    DbcNode 

    Node/Device attribute.

    +
    DbcMessage 

    Message attribute.

    +
    DbcSignal 

    Signal attribute.

    +
    EnvironmentVariable 

    Environment attribute.

    +
    NodeSignalRelation 

    Node signal relation attribute.

    +
    NodeMessageRelation 

    Node message relation attribute.

    +
    + +
    +
    + +

    ◆ AttributeValueType

    + +
    +
    + + + + + +
    + + + + +
    enum class dbc::AttributeValueType : int
    +
    +strong
    +
    + + + + + + +
    Enumerator
    IntegerValue 

    Integer value.

    +
    FloatValue 

    Floating point value.

    +
    StringValue 

    Text value.

    +
    EnumValue 

    Enumerate value.

    +
    HexValue 

    Hexa-decimal value.

    +
    + +
    +
    + +

    ◆ BusType

    + +
    +
    + + + + + +
    + + + + +
    enum class dbc::BusType : int
    +
    +strong
    +
    + + +
    Enumerator
    CAN 

    CAN bus.

    +
    + +
    +
    + +

    ◆ EnvType

    + +
    +
    + + + + + +
    + + + + +
    enum class dbc::EnvType : int
    +
    +strong
    +
    + + + + + +
    Enumerator
    IntegerType 

    Integer variable.

    +
    FloatType 

    Floating point variable.

    +
    StringType 

    Text variable.

    +
    DataType 

    Data type variable.

    +
    + +
    +
    + +

    ◆ MuxType

    + +
    +
    + + + + + +
    + + + + +
    enum class dbc::MuxType : int
    +
    +strong
    +
    +

    A signal may be multiplexed i.e. have different value depending on another multiplexor signal.Then someone invented the extended multiplexed value which makes every thing confusing.

    + + + + + +
    Enumerator
    NotMultiplexed 

    Normal signal.

    +
    Multiplexor 

    Multiplexor signal.

    +
    Multiplexed 

    Multiplexed signal.

    +
    ExtendedMultiplexor 

    Extended multiplexor signal.

    +
    + +
    +
    + +

    ◆ ProtocolType

    + +
    +
    + + + + + +
    + + + + +
    enum class dbc::ProtocolType : int
    +
    +strong
    +
    + + + + + +
    Enumerator
    StandardCAN 

    Standard CAN.

    +
    J1939 

    J1939 protocol.

    +
    NMEA2000 

    NMEA protocol.

    +
    OBD2 

    OBD2 protocol.

    +
    + +
    +
    + +

    ◆ SignalDataType

    + +
    +
    + + + + + +
    + + + + +
    enum class dbc::SignalDataType : int
    +
    +strong
    +
    + + + + + +
    Enumerator
    SignedData 

    Signed integer.

    +
    UnsignedData 

    Unsigned integer.

    +
    FloatData 

    Float value.

    +
    DoubleData 

    Double value.

    +
    + +
    +
    +
    + + + + diff --git a/docs/manual/html/namespacemembers.html b/docs/manual/html/namespacemembers.html new file mode 100644 index 0000000..c2e3dd5 --- /dev/null +++ b/docs/manual/html/namespacemembers.html @@ -0,0 +1,95 @@ + + + + + + + +DbcLib: Namespace Members + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace members with links to the namespaces they belong to:
      +
    • AccessType : dbc
    • +
    • AttributeType : dbc
    • +
    • AttributeValueType : dbc
    • +
    • BusType : dbc
    • +
    • EnumMap : dbc
    • +
    • EnvType : dbc
    • +
    • MessageList : dbc
    • +
    • MuxType : dbc
    • +
    • ProtocolType : dbc
    • +
    • RangePair : dbc
    • +
    • SignalDataType : dbc
    • +
    • SignalList : dbc
    • +
    • SignalObserverList : dbc
    • +
    +
    + + + + diff --git a/docs/manual/html/namespacemembers_enum.html b/docs/manual/html/namespacemembers_enum.html new file mode 100644 index 0000000..ad92add --- /dev/null +++ b/docs/manual/html/namespacemembers_enum.html @@ -0,0 +1,90 @@ + + + + + + + +DbcLib: Namespace Members + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
      +
    • AccessType : dbc
    • +
    • AttributeType : dbc
    • +
    • AttributeValueType : dbc
    • +
    • BusType : dbc
    • +
    • EnvType : dbc
    • +
    • MuxType : dbc
    • +
    • ProtocolType : dbc
    • +
    • SignalDataType : dbc
    • +
    +
    + + + + diff --git a/docs/manual/html/namespacemembers_type.html b/docs/manual/html/namespacemembers_type.html new file mode 100644 index 0000000..465fcc2 --- /dev/null +++ b/docs/manual/html/namespacemembers_type.html @@ -0,0 +1,87 @@ + + + + + + + +DbcLib: Namespace Members + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
      +
    • EnumMap : dbc
    • +
    • MessageList : dbc
    • +
    • RangePair : dbc
    • +
    • SignalList : dbc
    • +
    • SignalObserverList : dbc
    • +
    +
    + + + + diff --git a/docs/manual/html/namespaces.html b/docs/manual/html/namespaces.html new file mode 100644 index 0000000..35fd49d --- /dev/null +++ b/docs/manual/html/namespaces.html @@ -0,0 +1,101 @@ + + + + + + + +DbcLib: Namespace List + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Namespace List
    +
    +
    +
    Here is a list of all documented namespaces with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + + + + + + + +
     NdbcMain namespace for the DBC library
     CAttributeSupport class for handling attributes of network objects
     CDbcFileMain user object that is an interface against a DBC file
     CDbcMessageWrapper class around a CAN message
     CEnvVarWrapper around an environment DBC variable
     CExtendedMuxSupport function for the extended multiplexor functionality
     CISampleObserverInterface that handles samples. Internal usage
     CMessageDBC message configuration object
     CNetworkInterface against a DBC network configuration
     CNodeInterface against a DBC node which normally is an ECU
     CSignalInterface against a DBC signal configuration
     CSignalGroupInterface against a signal group
     CSignalObserverThe sample observer hold a number of samples
     CSignalValueSupport function that holds the channel value for a signal
    +
    +
    + + + + diff --git a/docs/manual/html/nav_f.png b/docs/manual/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/docs/manual/html/nav_fd.png b/docs/manual/html/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S literal 0 HcmV?d00001 diff --git a/docs/manual/html/nav_g.png b/docs/manual/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} literal 0 HcmV?d00001 diff --git a/docs/manual/html/network_8h.html b/docs/manual/html/network_8h.html new file mode 100644 index 0000000..f8063d6 --- /dev/null +++ b/docs/manual/html/network_8h.html @@ -0,0 +1,172 @@ + + + + + + + +DbcLib: include/dbc/network.h File Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    network.h File Reference
    +
    +
    + +

    Defines a DBC network configuration object. +More...

    +
    #include <vector>
    +#include <map>
    +#include "dbc/envvar.h"
    +#include "dbc/attribute.h"
    +#include "dbc/node.h"
    +#include "dbc/message.h"
    +#include "dbc/signal.h"
    +#include "dbc/signalgroup.h"
    +
    +Include dependency graph for network.h:
    +
    +
    + + + + + + + + + + + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  dbc::Network
     Interface against a DBC network configuration. More...
     
    + + + + +

    +Namespaces

    namespace  dbc
     Main namespace for the DBC library.
     
    + + + + + + + +

    +Typedefs

    +using dbc::EnumMap = std::map< int64_t, std::string >
     Enumerate list.
     
    +using dbc::MessageList = std::map< uint64_t, Message >
     Sorted message of messages. Message ID is the key.
     
    + + + + + + + +

    +Enumerations

    enum class  dbc::ProtocolType : int { dbc::StandardCAN = 0 +, dbc::J1939 = 1 +, dbc::NMEA2000 = 2 +, dbc::OBD2 = 3 + }
     Type of CAN protocol. More...
     
    enum class  dbc::BusType : int { dbc::CAN = 0 + }
     Type of bus. More...
     
    +
    + + + + diff --git a/docs/manual/html/network_8h__dep__incl.map b/docs/manual/html/network_8h__dep__incl.map new file mode 100644 index 0000000..5b78002 --- /dev/null +++ b/docs/manual/html/network_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/manual/html/network_8h__dep__incl.md5 b/docs/manual/html/network_8h__dep__incl.md5 new file mode 100644 index 0000000..7fd0967 --- /dev/null +++ b/docs/manual/html/network_8h__dep__incl.md5 @@ -0,0 +1 @@ +a1cc5b38a3f1371a7e49f848cfd3d3c3 \ No newline at end of file diff --git a/docs/manual/html/network_8h__dep__incl.png b/docs/manual/html/network_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..d44df3b5475dc4fad6ac44722e137cc8001a0fa8 GIT binary patch literal 1425 zcmbtUe>l?#82{>NB%JHo(rC|#R* zv)@@O*q&F1bco_RXgkruPIs74JhoW7+iuI^YsgGQxT)&${iMx)ab67-0M8FOBXU?&a&t%>CnlrO zTwCFk^+jqka$Vn0D68CpTZKYy&pL)aQSO>k5xKIZX3d?ADU6O?&5ySqUq6{OE)p@`6RR-xl=$(9rb)_=Q(M_>g|D#p>!xM4zSz!`m4LcciDsJ@c21=j=2E)1=$I0dhCHJ5-5_CTmI_eLks2tp{bXdK_BJk+NjfL=c+9eaZM(q)1c{^^O&4+Cwa6XX2OM7Gr`}Wn%hR1igc++G^q1@Aeft7Jy`D@GIBPbtnI~7 z@=_Zt?VRS9<&wnrJ#1wcqjT=3#PUeQJxrKV>`*ErbIsn(@uUQzqP;1o*Ya8uRqv7_ ztw%-!v3Ait#Ut@iAkhD!L + + + + + + + + + + + + + + diff --git a/docs/manual/html/network_8h__incl.md5 b/docs/manual/html/network_8h__incl.md5 new file mode 100644 index 0000000..7c58e73 --- /dev/null +++ b/docs/manual/html/network_8h__incl.md5 @@ -0,0 +1 @@ +a80f6bc677120cd58856ad1ed19f3a81 \ No newline at end of file diff --git a/docs/manual/html/network_8h__incl.png b/docs/manual/html/network_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..47f5a61958de64335e8587e6365c28979b345f96 GIT binary patch literal 80859 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 SYVrsNdnwAP$<|5(L;eqx)Z< + + + + + + +DbcLib: include/dbc/network.h Source File + + + + + + + + + + + +
    +
    network.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2* Copyright 2022 Ingemar Hedvall
    +
    3* SPDX-License-Identifier: MIT
    +
    4*/
    +
    8#pragma once
    +
    9#include <vector>
    +
    10#include <map>
    +
    11#include "dbc/envvar.h"
    +
    12#include "dbc/attribute.h"
    +
    13#include "dbc/node.h"
    +
    14#include "dbc/message.h"
    +
    15#include "dbc/signal.h"
    +
    16#include "dbc/signalgroup.h"
    +
    17
    +
    18namespace dbc {
    +
    20using EnumMap = std::map<int64_t, std::string>;
    +
    21
    +
    23enum class ProtocolType : int {
    +
    24 StandardCAN = 0,
    +
    25 J1939 = 1,
    +
    26 NMEA2000 = 2,
    +
    27 OBD2 = 3
    +
    28};
    +
    29
    +
    31enum class BusType : int {
    +
    32 CAN = 0
    +
    33};
    +
    34
    +
    36using MessageList = std::map<uint64_t, Message>;
    +
    37
    +
    39class Network {
    +
    40 public:
    +
    41 [[nodiscard]] std::string Name() const;
    +
    42
    +
    44 void Filename(const std::string& filename) { filename_ = filename;}
    +
    46 [[nodiscard]] std::string Filename() const {return filename_;};
    +
    47
    + +
    54 [[nodiscard]] ProtocolType Protocol() const;
    +
    56 [[nodiscard]] std::string ProtocolAsString() const;
    +
    57
    +
    59 void Bus(BusType type);
    +
    61 [[nodiscard]] BusType Bus() const;
    +
    63 [[nodiscard]] std::string BusAsString() const;
    +
    64
    +
    66 void Version(const std::string& version) { version_ = version; }
    +
    68 [[nodiscard]] const std::string& Version() const {
    +
    69 return version_;
    +
    70 }
    +
    72 void Comment(const std::string& comment) {
    +
    73 comment_ = comment;
    +
    74 }
    +
    76 [[nodiscard]] const std::string& Comment() const { return comment_; }
    +
    77
    +
    79 [[nodiscard]] Node* GetNode(const std::string& name);
    +
    81 [[nodiscard]] const Node* GetNode(const std::string& name) const;
    +
    83 [[nodiscard]] const Node* GetNodeBySource(uint8_t source) const;
    +
    84
    +
    86 void J1939(bool j1939) {j1939_ = j1939;}
    +
    88 [[nodiscard]] bool J1939() const {return j1939_;}
    +
    89
    +
    91 [[nodiscard]] Message* GetMessage(uint64_t message_id);
    +
    93 [[nodiscard]] const Message* GetMessage(uint64_t message_id) const;
    +
    95 [[nodiscard]] Message* GetMessageByCanId(uint64_t can_id);
    +
    97 [[nodiscard]] const Message* GetMessageByCanId(uint64_t can_id) const;
    +
    99 [[nodiscard]] const Message* GetMessageByName(const std::string &name) const;
    +
    101 [[nodiscard]] Message* GetMessageByPgn(uint32_t pgn);
    +
    103 [[nodiscard]] Message* GetMessageByPgnAndSource(uint32_t pgn, uint8_t source);
    +
    104
    +
    106 [[nodiscard]] Signal* GetSignal(uint64_t message_id,
    +
    107 const std::string& signal_name);
    +
    109 [[nodiscard]] const Signal* GetSignal(uint64_t message_id,
    +
    110 const std::string& signal_name) const;
    +
    112 [[nodiscard]] const Signal* GetSignalByCanId(uint64_t can_id,
    +
    113 const std::string& signal_name) const;
    +
    115 [[nodiscard]] const Signal* GetSignalByName(
    +
    116 const std::string& signal_name) const;
    +
    117
    +
    119 [[nodiscard]] const SignalGroup* GetSignalGroup(uint64_t message_id,
    +
    120 const std::string& name) const;
    +
    122 [[nodiscard]] const SignalGroup* GetSignalGroupByName(
    +
    123 const std::string& name) const;
    +
    124
    +
    126 [[nodiscard]] const std::map<std::string, EnvVar>& EnvVars() const {
    +
    127 return env_var_list_;
    +
    128 }
    +
    129
    +
    131 [[nodiscard]] const MessageList& Messages() const {
    +
    132 return message_list_;
    +
    133 }
    +
    134
    +
    136 [[nodiscard]] const std::map<std::string, Node>& Nodes() const {
    +
    137 return node_list_;
    +
    138 }
    +
    139
    +
    141 [[nodiscard]] const std::vector<SignalGroup>& SignalGroups() const {
    +
    142 return signal_group_list_;
    +
    143 }
    +
    144
    +
    146 [[nodiscard]] const std::map<std::string, EnumMap>& Enums() const {
    +
    147 return value_table_list_;
    +
    148 }
    +
    149
    +
    151 [[nodiscard]] const std::vector<Attribute>& Attributes() const {
    +
    152 return attribute_list_;
    +
    153 }
    +
    155 [[nodiscard]] Attribute* GetAttribute(const std::string& name);
    +
    157 [[nodiscard]] const Attribute* GetAttribute(const std::string& name) const;
    +
    158
    +
    160 void AddValueTable(const std::string& name, const EnumMap& list);
    +
    161
    +
    163 void AddSignalGroup(const SignalGroup& group);
    +
    164
    +
    165 // Parser only functions
    +
    167 [[nodiscard]] EnvVar& GetEnvVar(const std::string& name);
    +
    169 [[nodiscard]] Node& CreateNode(const std::string& name);
    +
    171 [[nodiscard]] Attribute& CreateDefinition(const std::string& name);
    +
    173 [[nodiscard]] Attribute& CreateAttribute(const Attribute& definition);
    +
    175 [[nodiscard]] Message& CreateMessage(uint64_t message_id);
    +
    177 [[nodiscard]] Message* LastMessage();
    +
    178 private:
    +
    179 std::string filename_;
    +
    180 std::string version_;
    +
    181 std::string comment_;
    +
    182 std::map<std::string, EnvVar> env_var_list_;
    +
    183 uint64_t last_message_id_ = 0;
    +
    184 bool j1939_ = false;
    +
    185
    +
    186 // Only define the name and type of value
    +
    187 std::map<std::string, Attribute> definition_list_;
    +
    188 std::vector<Attribute> attribute_list_;
    +
    189
    +
    190 using NodeList = std::map<std::string, Node>;
    +
    191 NodeList node_list_;
    +
    192 MessageList message_list_;
    +
    193
    +
    194 std::map<std::string, EnumMap> value_table_list_;
    +
    195 std::vector<SignalGroup> signal_group_list_;
    +
    196};
    +
    197
    +
    198} // namespace dbc
    +
    All DBC network objects may have attributes attached to them.
    +
    Support class for handling attributes of network objects.
    Definition: attribute.h:49
    +
    Wrapper around an environment DBC variable.
    Definition: envvar.h:34
    +
    DBC message configuration object.
    Definition: message.h:22
    +
    Interface against a DBC network configuration.
    Definition: network.h:39
    +
    std::string ProtocolAsString() const
    Returns the network protocol as text.
    +
    const Attribute * GetAttribute(const std::string &name) const
    Returns an attribute by its name.
    +
    const Node * GetNode(const std::string &name) const
    Returns the node by its name.
    +
    Attribute & CreateDefinition(const std::string &name)
    Parser function that creates a definition.
    +
    const SignalGroup * GetSignalGroupByName(const std::string &name) const
    Returns a signal group by its group name.
    +
    ProtocolType Protocol() const
    Returns what type of protocol the bus is using.
    +
    const Signal * GetSignalByName(const std::string &signal_name) const
    Returns a signal by its name.
    +
    void Protocol(ProtocolType type)
    Sets the protocol type. Should be included in the file but sometimes is missing.
    +
    const std::map< std::string, EnvVar > & EnvVars() const
    Returns the list of environment variables.
    Definition: network.h:126
    +
    const MessageList & Messages() const
    Returns the list of messages.
    Definition: network.h:131
    +
    const Message * GetMessageByName(const std::string &name) const
    Returns a message object by its name.
    +
    bool J1939() const
    Returns true if this is a J1939 bus.
    Definition: network.h:88
    +
    Attribute & CreateAttribute(const Attribute &definition)
    Parser function that creates an attribute.
    +
    Message * GetMessageByCanId(uint64_t can_id)
    Returns a message object by its CAN ID.
    +
    Node * GetNode(const std::string &name)
    Returns the node by its name.
    +
    void Bus(BusType type)
    Sets the type of bus.
    +
    Message * GetMessageByPgn(uint32_t pgn)
    Returns a message object by its PGN.
    +
    EnvVar & GetEnvVar(const std::string &name)
    Parser function that gets/creates an environment variable.
    +
    Message & CreateMessage(uint64_t message_id)
    Parser function that creates a message.
    +
    void Filename(const std::string &filename)
    Sets the file name.
    Definition: network.h:44
    +
    const Signal * GetSignalByCanId(uint64_t can_id, const std::string &signal_name) const
    Returns a signal by its CAN ID and signal name.
    +
    Message * GetMessage(uint64_t message_id)
    Returns a message object by its message ID.
    +
    Signal * GetSignal(uint64_t message_id, const std::string &signal_name)
    Returns a signal by its message ID and signal name.
    +
    const std::string & Version() const
    Returns the DBC file version.
    Definition: network.h:68
    +
    const std::vector< SignalGroup > & SignalGroups() const
    Returns the list of signal groups.
    Definition: network.h:141
    +
    void Comment(const std::string &comment)
    Sets the descriptive text for the DBC file.
    Definition: network.h:72
    +
    const std::string & Comment() const
    Returns the desciptive text.
    Definition: network.h:76
    +
    void AddSignalGroup(const SignalGroup &group)
    Adds a signal group.
    +
    BusType Bus() const
    Returns the type of bus.
    +
    const Signal * GetSignal(uint64_t message_id, const std::string &signal_name) const
    Returns a signal by its message ID and signal name.
    +
    const Message * GetMessage(uint64_t message_id) const
    Returns a message object by its message ID.
    +
    std::string BusAsString() const
    Returns the type of bus as text.
    +
    const std::map< std::string, Node > & Nodes() const
    Returns the list of Nodes.
    Definition: network.h:136
    +
    Message * LastMessage()
    Returns the last message.
    +
    void AddValueTable(const std::string &name, const EnumMap &list)
    Adds a enumerate.
    +
    const Node * GetNodeBySource(uint8_t source) const
    Returns the node by its source number.
    +
    std::string Name() const
    Network name.
    +
    std::string Filename() const
    Returns the file name.
    Definition: network.h:46
    +
    const SignalGroup * GetSignalGroup(uint64_t message_id, const std::string &name) const
    Returns a signal group by its message ID and group name.
    +
    const std::vector< Attribute > & Attributes() const
    Returns the list of attributes.
    Definition: network.h:151
    +
    void Version(const std::string &version)
    Sets the DBC (file) version.
    Definition: network.h:66
    +
    void J1939(bool j1939)
    Set to true if this is a J1939 bus.
    Definition: network.h:86
    +
    const Message * GetMessageByCanId(uint64_t can_id) const
    Returns a message object by its CAN ID.
    +
    Attribute * GetAttribute(const std::string &name)
    Returns an attribute by its name.
    +
    Node & CreateNode(const std::string &name)
    Parser function that creates a node.
    +
    const std::map< std::string, EnumMap > & Enums() const
    Returns the list of enumerates.
    Definition: network.h:146
    +
    Message * GetMessageByPgnAndSource(uint32_t pgn, uint8_t source)
    Returns a message object by its PGN and source number.
    +
    Interface against a DBC node which normally is an ECU.
    Definition: node.h:16
    +
    Interface against a signal group.
    Definition: signalgroup.h:15
    +
    Interface against a DBC signal configuration.
    Definition: signal.h:68
    +
    Wrapper wrong environment variables.
    +
    DBC message configuration object.
    +
    Main namespace for the DBC library.
    Definition: attribute.h:13
    +
    BusType
    Type of bus.
    Definition: network.h:31
    +
    @ CAN
    CAN bus.
    +
    std::map< int64_t, std::string > EnumMap
    Enumerate list.
    Definition: network.h:20
    +
    std::map< uint64_t, Message > MessageList
    Sorted message of messages. Message ID is the key.
    Definition: network.h:36
    +
    ProtocolType
    Type of CAN protocol.
    Definition: network.h:23
    +
    @ StandardCAN
    Standard CAN.
    +
    @ OBD2
    OBD2 protocol.
    +
    @ NMEA2000
    NMEA protocol.
    +
    @ J1939
    J1939 protocol.
    +
    Interface against a DBC node (Device(ECU).
    +
    Interface against a DBC signal configuration.
    +
    Defines a signal group.
    +
    + + + + diff --git a/docs/manual/html/node_8h.html b/docs/manual/html/node_8h.html new file mode 100644 index 0000000..69ad83e --- /dev/null +++ b/docs/manual/html/node_8h.html @@ -0,0 +1,133 @@ + + + + + + + +DbcLib: include/dbc/node.h File Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    node.h File Reference
    +
    +
    + +

    Interface against a DBC node (Device(ECU). +More...

    +
    #include <string>
    +#include <vector>
    +#include "dbc/attribute.h"
    +
    +Include dependency graph for node.h:
    +
    +
    + + + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  dbc::Node
     Interface against a DBC node which normally is an ECU. More...
     
    + + + + +

    +Namespaces

    namespace  dbc
     Main namespace for the DBC library.
     
    +
    + + + + diff --git a/docs/manual/html/node_8h__dep__incl.map b/docs/manual/html/node_8h__dep__incl.map new file mode 100644 index 0000000..f7cbbdd --- /dev/null +++ b/docs/manual/html/node_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/manual/html/node_8h__dep__incl.md5 b/docs/manual/html/node_8h__dep__incl.md5 new file mode 100644 index 0000000..0ab0fa0 --- /dev/null +++ b/docs/manual/html/node_8h__dep__incl.md5 @@ -0,0 +1 @@ +36ece122d9141185a47ce87772fc5cdd \ No newline at end of file diff --git a/docs/manual/html/node_8h__dep__incl.png b/docs/manual/html/node_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..80eed7d642bb9a4d1dd171f9061bc63621715fd1 GIT binary patch literal 2302 zcmbtWeLT}^8~=5Z5Yh{&7CmHi^3Dl)OgclQNRk}$o|kPFdrlj%kqTi^=}392oM_Be zUPg==WqE6PS!46sNNBdUXIh-*%=3IceR|IG=eh3BeP5r?bzOg4_jO(0?|o;U@^sfw z+oc8ofX1<-(9;TCs@M%G%8FBcn$WCJ%3&VvP+)a!J!q-O0|1rUV^Ehf2}Odjp4{_3 zpp7CSaZ#@qTBvh1#6bP*5kl9|B-d*pQ`$DDpeuSaHBS$dVwNqmc=zw0vw5Lh<^cZhE7O3xj#)oC@!8sf$|nIl)HmuqHyUM8IB4`O2)qfK!w zK@=j{M5_qv4)s2>vi@-<${}{y6fsd=OcPM?cXno1 zzJB(kx+#I)1v@M5FU2^bMk)j(l&fI2-e<-^R_DWZ(2@EZ*TXqWNrQkllgp;aMAY*G>UfeVNb_c4QePJwja(Y8bVEnml_~Cy~9IQ@y zzaULq-A$q)pORcKBl$bhX;|Pql|SHKLc`)%&rZfl67U6eJVC3Ion1qQKJgJF1lV$k zHX(FODWOOQ&2LyJu5XF^J$=gXCv|;dsO+dlhdV;Ib!+m-zpAmSE)uyaGtS;r>R8Aq zY~C7$bZ`hpK`M4vC&*n5p%N^EbKBTcRV&|h`b+4doPKb*BMo17y*0R9=0&gA8#(#vcllJOb!(y}PO^PRv7fl)5?MShsPjPOnklYzP{8aKDags}-*Olfhj z*Zr0I*Fx<(T`oS&hZ(o!J0EHct|~ueh0`p-dmYSX7;5zrVh$N9Z}iPl)9skuThiG9 z43u-=DteFvSfmftTREMT3SCpdx5Vk_IOq2O zqng>JY1ttuU$y(80kHhEj-EeEeRtyC|4-e&P2~T#&ZQvz3;3k$4$dyp_VoM!QRHootdg#x!gVk@_LrGM7O2`;^5r&GpB zZRMn)20z#YixVTlMFGHCR`qfc3|O}1DJ)r2l90D?fO5)e^X1)5 z`mZqEMjJAxB%vZDC7T703f75mI>KoUTxRAyH-Ou$i-m-^c_~BWVBMAsAPuW1iHZJL z#LzbDbXMB+bs{Cv#GU3=y$Z*6B1gMpc2Z>AsNEJ3g|Zx0x@vqk{~CYp^3|Ec?}qlr zcTk1#{2cIt>Yk1$_?*qXAo_S=*KkCiE-1RD{EY%mp7OLL09H`jL$Dfd_*@W!s9ZBI zY3@zx-T+)@e5tK%Yg(>n+n747@0J#Qh4&78M92<%HC=YYlQ!a0h++vzTD#>7E zYnkrz%VG#M^4;>H(f&G`78~Wp>+hhsM&Fa%_k;Ww{`;G*?a2%0x4TNvAo>v0%H_G3 z>cL;oe@>Jz4(KE94!C_yPKoV@q@~=m&EX3=3!EI|#hb8lq1R-EU20+Mcv;}FLiLQF zNo4Xb0_4{ybeW0R{5qJ~-JOMzCG;uS`CE2FTOr|U6AWUt28Um>o1-Q5X4NgE85*(r3BC|3 zrXr=cK)mVIO9HNEmHEmtV!D}gJ6BHP!FwR6DAWOjGo`rl^}~4x^aY|9#&n zz|{#}+83C^+C5Y!h0MNz>SLnktwTT3F*RL&v8cD5Xx$ajr?Ayv6e#0t%NoY+(JUzo zucK==SM#eLE%!E{8AUMa2rE7yNLS2VcXPy(xBPUj;bS(fa!3xAe8|)`YhIkK?VE8u z?7eayPawzdjOTrwSC6bJ54>;s-K+JjF6Zd1hMJnwQG0B`F)666aVo*|iO)Z#U;mFh cL9YUTjQ;Ro7p%KM@u2~Zxq3p$M?$Xr336hj0RR91 literal 0 HcmV?d00001 diff --git a/docs/manual/html/node_8h__incl.map b/docs/manual/html/node_8h__incl.map new file mode 100644 index 0000000..dc32530 --- /dev/null +++ b/docs/manual/html/node_8h__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/manual/html/node_8h__incl.md5 b/docs/manual/html/node_8h__incl.md5 new file mode 100644 index 0000000..7a82789 --- /dev/null +++ b/docs/manual/html/node_8h__incl.md5 @@ -0,0 +1 @@ +ce2e32c9787f1adec61504983ee57f15 \ No newline at end of file diff --git a/docs/manual/html/node_8h__incl.png b/docs/manual/html/node_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..8f5c71df416db0b0d1d41e4a87840d1e16199329 GIT binary patch literal 8209 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 + + + + + + +DbcLib: include/dbc/node.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    node.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2* Copyright 2022 Ingemar Hedvall
    +
    3* SPDX-License-Identifier: MIT
    +
    4 */
    +
    8#pragma once
    +
    9#include <string>
    +
    10#include <vector>
    +
    11#include "dbc/attribute.h"
    +
    12namespace dbc {
    +
    16class Node {
    +
    17 public:
    +
    19 void Name(const std::string& name) { name_ = name; }
    +
    21 [[nodiscard]] const std::string& Name() const {
    +
    22 return name_;
    +
    23 }
    +
    24
    +
    26 void Source(uint8_t source) {source_ = source;};
    +
    28 [[nodiscard]] uint8_t Source() const;
    +
    29
    +
    31 void Comment(const std::string& comment) { comment_ = comment; }
    +
    33 [[nodiscard]] const std::string& Comment() const { return comment_; }
    +
    34
    +
    36 [[nodiscard]] const std::vector<Attribute>& Attributes() const {
    +
    37 return attribute_list_;
    +
    38 }
    +
    40 Attribute& CreateAttribute(const Attribute& definition);
    +
    42 const Attribute* GetAttribute(const std::string& name) const;
    +
    43
    +
    44 private:
    +
    45 std::string name_;
    +
    46 std::string comment_;
    +
    47 std::vector<Attribute> attribute_list_;
    +
    48 uint8_t source_ = 254;
    +
    49};
    +
    50
    +
    51} // namespace dbc
    +
    All DBC network objects may have attributes attached to them.
    +
    Support class for handling attributes of network objects.
    Definition: attribute.h:49
    +
    Interface against a DBC node which normally is an ECU.
    Definition: node.h:16
    +
    const std::vector< Attribute > & Attributes() const
    Returns the attribute list.
    Definition: node.h:36
    +
    const std::string & Comment() const
    Returns the descriptive text.
    Definition: node.h:33
    +
    Attribute & CreateAttribute(const Attribute &definition)
    Creates an attribute. Parser function.
    +
    void Comment(const std::string &comment)
    Sets the descriptive text.
    Definition: node.h:31
    +
    const std::string & Name() const
    Returns the name.
    Definition: node.h:21
    +
    const Attribute * GetAttribute(const std::string &name) const
    Returns an attribute by its name.
    +
    void Source(uint8_t source)
    Source number is used in J1939 and is included in the CAN ID.
    Definition: node.h:26
    +
    uint8_t Source() const
    Source number (J1939).
    +
    void Name(const std::string &name)
    Sets the name.
    Definition: node.h:19
    +
    Main namespace for the DBC library.
    Definition: attribute.h:13
    +
    + + + + diff --git a/docs/manual/html/open.png b/docs/manual/html/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + image/svg+xml + + + + + + + + diff --git a/docs/manual/html/search/enums_0.js b/docs/manual/html/search/enums_0.js new file mode 100644 index 0000000..3165c8b --- /dev/null +++ b/docs/manual/html/search/enums_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['accesstype_0',['AccessType',['../namespacedbc.html#a3630e17ac2912c7a312d723666a91b3a',1,'dbc']]], + ['attributetype_1',['AttributeType',['../namespacedbc.html#a20f7a54a056b67f80f3297d04e55afab',1,'dbc']]], + ['attributevaluetype_2',['AttributeValueType',['../namespacedbc.html#a9093a2c86a10837735a8adc071970581',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enums_1.js b/docs/manual/html/search/enums_1.js new file mode 100644 index 0000000..b6541b4 --- /dev/null +++ b/docs/manual/html/search/enums_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bustype_0',['BusType',['../namespacedbc.html#a18071d022cdcebdc6ef437aa8a6a8ed5',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enums_2.js b/docs/manual/html/search/enums_2.js new file mode 100644 index 0000000..4b4d96d --- /dev/null +++ b/docs/manual/html/search/enums_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['envtype_0',['EnvType',['../namespacedbc.html#a09f7cbcb108be9c76a53eb37b984a6bc',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enums_3.js b/docs/manual/html/search/enums_3.js new file mode 100644 index 0000000..9804057 --- /dev/null +++ b/docs/manual/html/search/enums_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['muxtype_0',['MuxType',['../namespacedbc.html#ad3b31547481daad52074143cebeba268',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enums_4.js b/docs/manual/html/search/enums_4.js new file mode 100644 index 0000000..095c4d7 --- /dev/null +++ b/docs/manual/html/search/enums_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['protocoltype_0',['ProtocolType',['../namespacedbc.html#af39fa6901e3e2620b2e2f437cd87a527',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enums_5.js b/docs/manual/html/search/enums_5.js new file mode 100644 index 0000000..e1fafd0 --- /dev/null +++ b/docs/manual/html/search/enums_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['signaldatatype_0',['SignalDataType',['../namespacedbc.html#a66501163b0993a0a1bc31cfbe73bf11a',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_0.js b/docs/manual/html/search/enumvalues_0.js new file mode 100644 index 0000000..233dfc2 --- /dev/null +++ b/docs/manual/html/search/enumvalues_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['can_0',['CAN',['../namespacedbc.html#a18071d022cdcebdc6ef437aa8a6a8ed5a6d5050f7a97e7e2e881a4e09dfbd6087',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_1.js b/docs/manual/html/search/enumvalues_1.js new file mode 100644 index 0000000..3ccf545 --- /dev/null +++ b/docs/manual/html/search/enumvalues_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['datatype_0',['DataType',['../namespacedbc.html#a09f7cbcb108be9c76a53eb37b984a6bcaaa2aaa59ac1a7c24e5e86c068bda3d20',1,'dbc']]], + ['dbcmessage_1',['DbcMessage',['../namespacedbc.html#a20f7a54a056b67f80f3297d04e55afabab9479e671e56c92f3b818eaeb2f78cf7',1,'dbc']]], + ['dbcnetwork_2',['DbcNetwork',['../namespacedbc.html#a20f7a54a056b67f80f3297d04e55afabac8deca8ce87749f14ede9c06848b54d5',1,'dbc']]], + ['dbcnode_3',['DbcNode',['../namespacedbc.html#a20f7a54a056b67f80f3297d04e55afaba29e407d59ca1c2fec4b916cf20e9bf7d',1,'dbc']]], + ['dbcsignal_4',['DbcSignal',['../namespacedbc.html#a20f7a54a056b67f80f3297d04e55afabadba628aba406574c3bbacf7c56bea06e',1,'dbc']]], + ['doubledata_5',['DoubleData',['../namespacedbc.html#a66501163b0993a0a1bc31cfbe73bf11aa89a7a61af77c580fccc274c7a3962c17',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_2.js b/docs/manual/html/search/enumvalues_2.js new file mode 100644 index 0000000..c78397f --- /dev/null +++ b/docs/manual/html/search/enumvalues_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['enumvalue_0',['EnumValue',['../namespacedbc.html#a9093a2c86a10837735a8adc071970581a29785ae7827639b31b629cc7f9c150e0',1,'dbc']]], + ['environmentvariable_1',['EnvironmentVariable',['../namespacedbc.html#a20f7a54a056b67f80f3297d04e55afabafbbda721c455f5e43e3a3cde92db5fb3',1,'dbc']]], + ['extendedmultiplexor_2',['ExtendedMultiplexor',['../namespacedbc.html#ad3b31547481daad52074143cebeba268af49808ad35223d1e28a900df724cd2b1',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_3.js b/docs/manual/html/search/enumvalues_3.js new file mode 100644 index 0000000..a480b3e --- /dev/null +++ b/docs/manual/html/search/enumvalues_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['floatdata_0',['FloatData',['../namespacedbc.html#a66501163b0993a0a1bc31cfbe73bf11aaff35af20aaa94b8181d05696abcef71b',1,'dbc']]], + ['floattype_1',['FloatType',['../namespacedbc.html#a09f7cbcb108be9c76a53eb37b984a6bca909eb2f2282643673abdd584be0bff4d',1,'dbc']]], + ['floatvalue_2',['FloatValue',['../namespacedbc.html#a9093a2c86a10837735a8adc071970581ab8a545944c6b2e9d568d1045b5f5e598',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_4.js b/docs/manual/html/search/enumvalues_4.js new file mode 100644 index 0000000..78463a1 --- /dev/null +++ b/docs/manual/html/search/enumvalues_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hexvalue_0',['HexValue',['../namespacedbc.html#a9093a2c86a10837735a8adc071970581a04ed81262ab890fbfabef50912978cc0',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_5.js b/docs/manual/html/search/enumvalues_5.js new file mode 100644 index 0000000..5063e02 --- /dev/null +++ b/docs/manual/html/search/enumvalues_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['integertype_0',['IntegerType',['../namespacedbc.html#a09f7cbcb108be9c76a53eb37b984a6bca97a28f98bc67732c13cc3d7469f3f0df',1,'dbc']]], + ['integervalue_1',['IntegerValue',['../namespacedbc.html#a9093a2c86a10837735a8adc071970581a4316e849fb60a763447555f31bd5a97f',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_6.js b/docs/manual/html/search/enumvalues_6.js new file mode 100644 index 0000000..9f8b5a3 --- /dev/null +++ b/docs/manual/html/search/enumvalues_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['j1939_0',['J1939',['../namespacedbc.html#af39fa6901e3e2620b2e2f437cd87a527afb03489612df8be2047792bd8588bb20',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_7.js b/docs/manual/html/search/enumvalues_7.js new file mode 100644 index 0000000..5df036b --- /dev/null +++ b/docs/manual/html/search/enumvalues_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['multiplexed_0',['Multiplexed',['../namespacedbc.html#ad3b31547481daad52074143cebeba268a4a76083a736ef8df89bb44c6c2c18e34',1,'dbc']]], + ['multiplexor_1',['Multiplexor',['../namespacedbc.html#ad3b31547481daad52074143cebeba268a3cdc513e16e770f0c8b3e36b91223129',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_8.js b/docs/manual/html/search/enumvalues_8.js new file mode 100644 index 0000000..eae8466 --- /dev/null +++ b/docs/manual/html/search/enumvalues_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['nmea2000_0',['NMEA2000',['../namespacedbc.html#af39fa6901e3e2620b2e2f437cd87a527a6b59788e3ec98979e0ce5c58aa018ab6',1,'dbc']]], + ['nodemessagerelation_1',['NodeMessageRelation',['../namespacedbc.html#a20f7a54a056b67f80f3297d04e55afaba93f1795ac5fe5bde0694593b007bf80d',1,'dbc']]], + ['nodesignalrelation_2',['NodeSignalRelation',['../namespacedbc.html#a20f7a54a056b67f80f3297d04e55afaba7320d32ec1ebee49c8c02de03bf9a6e1',1,'dbc']]], + ['notmultiplexed_3',['NotMultiplexed',['../namespacedbc.html#ad3b31547481daad52074143cebeba268a7b082f71405476c4406a23f2018ba6d8',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_9.js b/docs/manual/html/search/enumvalues_9.js new file mode 100644 index 0000000..3c13f64 --- /dev/null +++ b/docs/manual/html/search/enumvalues_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['obd2_0',['OBD2',['../namespacedbc.html#af39fa6901e3e2620b2e2f437cd87a527a5c5336b52a35f0d8cbc0667b8ae6e799',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_a.js b/docs/manual/html/search/enumvalues_a.js new file mode 100644 index 0000000..8925b3f --- /dev/null +++ b/docs/manual/html/search/enumvalues_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['readonly_0',['ReadOnly',['../namespacedbc.html#a3630e17ac2912c7a312d723666a91b3aa131fb182a881796e7606ed6da27f1197',1,'dbc']]], + ['readwrite_1',['ReadWrite',['../namespacedbc.html#a3630e17ac2912c7a312d723666a91b3aa70a2a84088d405a2e3f1e3accaa16723',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_b.js b/docs/manual/html/search/enumvalues_b.js new file mode 100644 index 0000000..de0f5b9 --- /dev/null +++ b/docs/manual/html/search/enumvalues_b.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['signeddata_0',['SignedData',['../namespacedbc.html#a66501163b0993a0a1bc31cfbe73bf11aa574943f4b82f6c06170bb92eeac2a567',1,'dbc']]], + ['standardcan_1',['StandardCAN',['../namespacedbc.html#af39fa6901e3e2620b2e2f437cd87a527a01c6de10167101aa3a5d2820b0fb33b9',1,'dbc']]], + ['stringtype_2',['StringType',['../namespacedbc.html#a09f7cbcb108be9c76a53eb37b984a6bcab900a78030fdadc18121e26865e75791',1,'dbc']]], + ['stringvalue_3',['StringValue',['../namespacedbc.html#a9093a2c86a10837735a8adc071970581af6d2b0e17b94cf73adf2a5be1f0ca160',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_c.js b/docs/manual/html/search/enumvalues_c.js new file mode 100644 index 0000000..4749c7f --- /dev/null +++ b/docs/manual/html/search/enumvalues_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['unrestricted_0',['Unrestricted',['../namespacedbc.html#a3630e17ac2912c7a312d723666a91b3aa89c6caacc7047b0a535412d7f939f870',1,'dbc']]], + ['unsigneddata_1',['UnsignedData',['../namespacedbc.html#a66501163b0993a0a1bc31cfbe73bf11aaf590fd4e359bcba6ed603e0c9c7355bb',1,'dbc']]] +]; diff --git a/docs/manual/html/search/enumvalues_d.js b/docs/manual/html/search/enumvalues_d.js new file mode 100644 index 0000000..372d30d --- /dev/null +++ b/docs/manual/html/search/enumvalues_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['writeonly_0',['WriteOnly',['../namespacedbc.html#a3630e17ac2912c7a312d723666a91b3aa53dfe5089ae9e65887cb0215cb0098f5',1,'dbc']]] +]; diff --git a/docs/manual/html/search/files_0.js b/docs/manual/html/search/files_0.js new file mode 100644 index 0000000..57e3881 --- /dev/null +++ b/docs/manual/html/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['attribute_2eh_0',['attribute.h',['../attribute_8h.html',1,'']]] +]; diff --git a/docs/manual/html/search/files_1.js b/docs/manual/html/search/files_1.js new file mode 100644 index 0000000..972535e --- /dev/null +++ b/docs/manual/html/search/files_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['dbcfile_2eh_0',['dbcfile.h',['../dbcfile_8h.html',1,'']]], + ['dbcmessage_2eh_1',['dbcmessage.h',['../dbcmessage_8h.html',1,'']]] +]; diff --git a/docs/manual/html/search/files_2.js b/docs/manual/html/search/files_2.js new file mode 100644 index 0000000..2dc7b05 --- /dev/null +++ b/docs/manual/html/search/files_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['envvar_2eh_0',['envvar.h',['../envvar_8h.html',1,'']]] +]; diff --git a/docs/manual/html/search/files_3.js b/docs/manual/html/search/files_3.js new file mode 100644 index 0000000..6cb3da9 --- /dev/null +++ b/docs/manual/html/search/files_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['isampleobserver_2eh_0',['isampleobserver.h',['../isampleobserver_8h.html',1,'']]] +]; diff --git a/docs/manual/html/search/files_4.js b/docs/manual/html/search/files_4.js new file mode 100644 index 0000000..1fc8f61 --- /dev/null +++ b/docs/manual/html/search/files_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['message_2eh_0',['message.h',['../message_8h.html',1,'']]] +]; diff --git a/docs/manual/html/search/files_5.js b/docs/manual/html/search/files_5.js new file mode 100644 index 0000000..7c5e3d3 --- /dev/null +++ b/docs/manual/html/search/files_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['network_2eh_0',['network.h',['../network_8h.html',1,'']]], + ['node_2eh_1',['node.h',['../node_8h.html',1,'']]] +]; diff --git a/docs/manual/html/search/files_6.js b/docs/manual/html/search/files_6.js new file mode 100644 index 0000000..4d61a6d --- /dev/null +++ b/docs/manual/html/search/files_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['signal_2eh_0',['signal.h',['../signal_8h.html',1,'']]], + ['signalgroup_2eh_1',['signalgroup.h',['../signalgroup_8h.html',1,'']]], + ['signalobserver_2eh_2',['signalobserver.h',['../signalobserver_8h.html',1,'']]] +]; diff --git a/docs/manual/html/search/functions_0.js b/docs/manual/html/search/functions_0.js new file mode 100644 index 0000000..aedbc2e --- /dev/null +++ b/docs/manual/html/search/functions_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['access_0',['Access',['../classdbc_1_1_env_var.html#a79239ae79ec1056997ee165b765059fc',1,'dbc::EnvVar::Access(AccessType type)'],['../classdbc_1_1_env_var.html#ad62d4fe3f7728d08c29826d8ab10de97',1,'dbc::EnvVar::Access() const']]], + ['addmessage_1',['AddMessage',['../classdbc_1_1_dbc_file.html#afacfeebff269681bebcd614d26feab3a',1,'dbc::DbcFile']]], + ['addsignalgroup_2',['AddSignalGroup',['../classdbc_1_1_network.html#a92bbcbe05d0da6d335ef9638abf7f1d9',1,'dbc::Network']]], + ['addvaluetable_3',['AddValueTable',['../classdbc_1_1_network.html#aaf42e33bed4a6f3056ecef60505cfb8a',1,'dbc::Network']]], + ['attachobserver_4',['AttachObserver',['../classdbc_1_1_signal.html#a4b18b0db771df46c7a8110803ff74225',1,'dbc::Signal']]], + ['attribute_5',['Attribute',['../classdbc_1_1_attribute.html#abf822a12453ee7c8764d1c517f27171b',1,'dbc::Attribute']]], + ['attributes_6',['Attributes',['../classdbc_1_1_message.html#a12cce0c46d1e4876f5451af1c95e02bb',1,'dbc::Message::Attributes()'],['../classdbc_1_1_network.html#ac62186664c919852cea4158614a63087',1,'dbc::Network::Attributes()'],['../classdbc_1_1_node.html#a119f08897cdf9681c0000ffcd622bf25',1,'dbc::Node::Attributes()'],['../classdbc_1_1_signal.html#a3528ccd87e018332245d26406fda8e89',1,'dbc::Signal::Attributes()']]] +]; diff --git a/docs/manual/html/search/functions_1.js b/docs/manual/html/search/functions_1.js new file mode 100644 index 0000000..9ec939d --- /dev/null +++ b/docs/manual/html/search/functions_1.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['basetime_0',['BaseTime',['../classdbc_1_1_dbc_file.html#aeee8b7bdafaf4fa5a26ca6c0108bebee',1,'dbc::DbcFile::BaseTime(uint64_t ns1970)'],['../classdbc_1_1_dbc_file.html#a34cd3ce1172b96e20381b435a4483ddb',1,'dbc::DbcFile::BaseTime() const']]], + ['bitlength_1',['BitLength',['../classdbc_1_1_signal.html#a05aa8ffb910b01f8ae781472ddb117f3',1,'dbc::Signal::BitLength(size_t length)'],['../classdbc_1_1_signal.html#a0ba00d06ebfed01c36f19f13b3169e45',1,'dbc::Signal::BitLength() const']]], + ['bitstart_2',['BitStart',['../classdbc_1_1_signal.html#a89abd98147909cae90d4a4c0af194c0e',1,'dbc::Signal::BitStart(size_t start)'],['../classdbc_1_1_signal.html#a725685123dfa2fc49187fd5aa633e22e',1,'dbc::Signal::BitStart() const']]], + ['bus_3',['Bus',['../classdbc_1_1_network.html#a54e9cab19df54e2b643f0dc7d6e02ef1',1,'dbc::Network::Bus(BusType type)'],['../classdbc_1_1_network.html#a9861e8ad88c2012762290db1c764de4d',1,'dbc::Network::Bus() const']]], + ['busasstring_4',['BusAsString',['../classdbc_1_1_network.html#aa20e1fed790c7a00ee76f110c42a5469',1,'dbc::Network']]] +]; diff --git a/docs/manual/html/search/functions_10.js b/docs/manual/html/search/functions_10.js new file mode 100644 index 0000000..65467f6 --- /dev/null +++ b/docs/manual/html/search/functions_10.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['time_0',['Time',['../classdbc_1_1_dbc_message.html#a75ba550efd6ffebb0b3b79abe4a13081',1,'dbc::DbcMessage::Time(uint64_t ns1970)'],['../classdbc_1_1_dbc_message.html#a6ea21e7c72c470de7090268503a17830',1,'dbc::DbcMessage::Time() const'],['../classdbc_1_1_signal_observer.html#a3f89efc13d2d6f2131ee8af17374fbfb',1,'dbc::SignalObserver::Time(size_t index) const']]], + ['timetoindex_1',['TimeToIndex',['../classdbc_1_1_signal_observer.html#acc5c5f6479fae15099523a197fce9b50',1,'dbc::SignalObserver']]], + ['type_2',['Type',['../classdbc_1_1_attribute.html#a3bffedfaa30cf911beb593b2aa68b494',1,'dbc::Attribute::Type(AttributeType type)'],['../classdbc_1_1_attribute.html#a87de3889f093829ac622f0377357a0cc',1,'dbc::Attribute::Type() const'],['../classdbc_1_1_env_var.html#afe0ed219594f382657411fde16a269b4',1,'dbc::EnvVar::Type(EnvType type)'],['../classdbc_1_1_env_var.html#a0cca9d1c8ffaad2de548b8a54f99c12b',1,'dbc::EnvVar::Type() const']]], + ['typeasstring_3',['TypeAsString',['../classdbc_1_1_env_var.html#abc98292c2fcf0b597a688ef21e06f7bb',1,'dbc::EnvVar']]] +]; diff --git a/docs/manual/html/search/functions_11.js b/docs/manual/html/search/functions_11.js new file mode 100644 index 0000000..7a3cbb2 --- /dev/null +++ b/docs/manual/html/search/functions_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['unit_0',['Unit',['../classdbc_1_1_env_var.html#aa0c5f967bb464f6dd77a75fcdadf59f3',1,'dbc::EnvVar::Unit(const std::string &unit)'],['../classdbc_1_1_env_var.html#adf5bbe345a6422290a64431b9e841c73',1,'dbc::EnvVar::Unit() const'],['../classdbc_1_1_signal.html#a486f838fc7ad7252716741b2eb3ba140',1,'dbc::Signal::Unit(const std::string &unit)'],['../classdbc_1_1_signal.html#a79fc6c90168b724b29afb647f9aa5be7',1,'dbc::Signal::Unit() const']]], + ['updatedata_1',['UpdateData',['../classdbc_1_1_message.html#a41ea6c26bbc05ba0d2c12e7b3472efbd',1,'dbc::Message']]] +]; diff --git a/docs/manual/html/search/functions_12.js b/docs/manual/html/search/functions_12.js new file mode 100644 index 0000000..235b8e6 --- /dev/null +++ b/docs/manual/html/search/functions_12.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['valid_0',['Valid',['../classdbc_1_1_signal.html#a96d69980646c30b63678ee58d0f0ecc1',1,'dbc::Signal::Valid(bool valid)'],['../classdbc_1_1_signal.html#a3b1c5a81a43d009ee0f81f747fc9bff3',1,'dbc::Signal::Valid() const']]], + ['value_1',['Value',['../classdbc_1_1_attribute.html#a9ad873753f9c6f2d01b75c70cf1256ea',1,'dbc::Attribute::Value(const T &value)'],['../classdbc_1_1_attribute.html#a010a2cab86b51ee7c09a6a0fd3c5f6c5',1,'dbc::Attribute::Value() const'],['../classdbc_1_1_attribute.html#a04dbc71d22ea6d8c2f18bc23644a38c0',1,'dbc::Attribute::Value(const std::string &value)'],['../classdbc_1_1_attribute.html#a9cfe2335d94037f7625eedcf614331c0',1,'dbc::Attribute::Value() const']]], + ['valuetype_2',['ValueType',['../classdbc_1_1_attribute.html#a0859f19ef869c6cb5d1aed215f7dc811',1,'dbc::Attribute::ValueType(AttributeValueType type)'],['../classdbc_1_1_attribute.html#ac23c9671f0353e58baa447d1328d07f0',1,'dbc::Attribute::ValueType() const']]], + ['valuetypeasstring_3',['ValueTypeAsString',['../classdbc_1_1_attribute.html#a069729816334653b2c4407d941fc21b1',1,'dbc::Attribute']]], + ['version_4',['Version',['../classdbc_1_1_network.html#ac75c0cdf521f666bfbab15b7400386fa',1,'dbc::Network::Version(const std::string &version)'],['../classdbc_1_1_network.html#a7bbb6e8f3e0be88bcd2c6dfe40ffb1ab',1,'dbc::Network::Version() const']]] +]; diff --git a/docs/manual/html/search/functions_13.js b/docs/manual/html/search/functions_13.js new file mode 100644 index 0000000..2328b6a --- /dev/null +++ b/docs/manual/html/search/functions_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['_7eisampleobserver_0',['~ISampleObserver',['../classdbc_1_1_i_sample_observer.html#ae5f44c7e2a92905a838980399b1e8b79',1,'dbc::ISampleObserver']]], + ['_7esignal_1',['~Signal',['../classdbc_1_1_signal.html#a649b014c0da7a35358d8991cccc74f93',1,'dbc::Signal']]], + ['_7esignalobserver_2',['~SignalObserver',['../classdbc_1_1_signal_observer.html#a9487724b544e14cc1287e753823314c7',1,'dbc::SignalObserver']]] +]; diff --git a/docs/manual/html/search/functions_2.js b/docs/manual/html/search/functions_2.js new file mode 100644 index 0000000..0b2f506 --- /dev/null +++ b/docs/manual/html/search/functions_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['canid_0',['CanId',['../classdbc_1_1_dbc_message.html#af5777d84563cf62346fa9a9c00ad776b',1,'dbc::DbcMessage::CanId(uint32_t can_id)'],['../classdbc_1_1_dbc_message.html#ae4543dcd8b90b3aeaf0c4c0d2aded383',1,'dbc::DbcMessage::CanId() const'],['../classdbc_1_1_message.html#a3fae8e0b72aa1d213358910e9325dd82',1,'dbc::Message::CanId()'],['../classdbc_1_1_signal_observer.html#ae5a0b4b32dcfe397f10aea47f2bb2486',1,'dbc::SignalObserver::CanId()']]], + ['channelvalue_1',['ChannelValue',['../classdbc_1_1_signal.html#a5ed59d80e1f1750c847d285c45d24341',1,'dbc::Signal::ChannelValue()'],['../classdbc_1_1_signal_observer.html#a4ac0be1f04b6c48204cab1d12f43fd68',1,'dbc::SignalObserver::ChannelValue()'],['../classdbc_1_1_signal.html#a5bbbe1b0c97ffece106c9df433c37ccf',1,'dbc::Signal::ChannelValue(std::string &value) const'],['../classdbc_1_1_signal.html#a487f1025da4057bb8327551b291d749a',1,'dbc::Signal::ChannelValue(SignalValue &value) const'],['../classdbc_1_1_signal_observer.html#a36c14c021ec8f8dc88b56893243cbb2c',1,'dbc::SignalObserver::ChannelValue()']]], + ['clear_2',['Clear',['../structdbc_1_1_signal_value.html#a41478b12e57a27f5f77f0de92feb9aa9',1,'dbc::SignalValue']]], + ['comment_3',['Comment',['../classdbc_1_1_env_var.html#a9293b7ef7ef5cef4ac0cf70824195fbf',1,'dbc::EnvVar::Comment(const std::string &comment)'],['../classdbc_1_1_env_var.html#a1880d86ccaa8d8594164e29154bc84da',1,'dbc::EnvVar::Comment() const'],['../classdbc_1_1_message.html#ab2e2c9ca8d445f3d3628c301c0b72025',1,'dbc::Message::Comment(const std::string &comment)'],['../classdbc_1_1_message.html#a0622959ee0cec270be17a0e3ab1048dc',1,'dbc::Message::Comment() const'],['../classdbc_1_1_network.html#a909329e459b83d590f1a61f53d8820af',1,'dbc::Network::Comment(const std::string &comment)'],['../classdbc_1_1_network.html#a924dddbeb027b1e59ee51a53e69615c6',1,'dbc::Network::Comment() const'],['../classdbc_1_1_node.html#a7a4632ce225397c9e5f00a393ea464c8',1,'dbc::Node::Comment(const std::string &comment)'],['../classdbc_1_1_node.html#a37eaf3c423935028241943a8a9a2e0a2',1,'dbc::Node::Comment() const'],['../classdbc_1_1_signal.html#adb9eeaea40057d12857fbefdd4e8ca5d',1,'dbc::Signal::Comment(const std::string &comment)'],['../classdbc_1_1_signal.html#a9aa375c1bc2634cfe28df4d1a1c661ce',1,'dbc::Signal::Comment() const']]], + ['createattribute_4',['CreateAttribute',['../classdbc_1_1_message.html#a345bee598253a84a879cfdd2af13902d',1,'dbc::Message::CreateAttribute()'],['../classdbc_1_1_network.html#a34748784742ebc4e58846cbdca1aa8c5',1,'dbc::Network::CreateAttribute()'],['../classdbc_1_1_node.html#a429e13e1834213142a486aa2a6adb2fd',1,'dbc::Node::CreateAttribute()'],['../classdbc_1_1_signal.html#a270538416420900f91a8a15eb7a73f78',1,'dbc::Signal::CreateAttribute()']]], + ['createdefinition_5',['CreateDefinition',['../classdbc_1_1_network.html#a0ad6cbe91a471223eab349ae017205b9',1,'dbc::Network']]], + ['createmessage_6',['CreateMessage',['../classdbc_1_1_network.html#a68f6259cbdaa02f4997b6acb7fc5810e',1,'dbc::Network']]], + ['createnode_7',['CreateNode',['../classdbc_1_1_network.html#ad9e9f9494a1fc0ef432fd97e72be55fc',1,'dbc::Network']]], + ['createsignal_8',['CreateSignal',['../classdbc_1_1_message.html#af487d9e44abe134898219d13f3e0bd43',1,'dbc::Message']]] +]; diff --git a/docs/manual/html/search/functions_3.js b/docs/manual/html/search/functions_3.js new file mode 100644 index 0000000..b4a4c49 --- /dev/null +++ b/docs/manual/html/search/functions_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['data_0',['Data',['../classdbc_1_1_dbc_message.html#abcc52930f4952f0b00cb41faf06caf88',1,'dbc::DbcMessage::Data(const std::vector< uint8_t > &data)'],['../classdbc_1_1_dbc_message.html#a197434bef562e327fbbbf37473b16d9f',1,'dbc::DbcMessage::Data() const'],['../classdbc_1_1_message.html#aded1dd8c8ef1134e5361690041082a5e',1,'dbc::Message::Data()']]], + ['datapage_1',['DataPage',['../classdbc_1_1_dbc_message.html#a3be69693e55cec930519bb6a1d474bbe',1,'dbc::DbcMessage::DataPage()'],['../classdbc_1_1_message.html#ac8d74c2597021f21792ae9988baf8f68',1,'dbc::Message::DataPage()']]], + ['datatype_2',['DataType',['../classdbc_1_1_signal.html#aac84b06cae30203a1ac24709008e6012',1,'dbc::Signal::DataType(SignalDataType type)'],['../classdbc_1_1_signal.html#a910ba3ee2a4718528e73dd39e761b502',1,'dbc::Signal::DataType() const']]], + ['datatypeasstring_3',['DataTypeAsString',['../classdbc_1_1_signal.html#a0eb29adc82621fb99bcdd1357604ca1b',1,'dbc::Signal']]], + ['dbcmessage_4',['DbcMessage',['../classdbc_1_1_dbc_message.html#a1f831c506d21ce48764615eef9677271',1,'dbc::DbcMessage::DbcMessage()=default'],['../classdbc_1_1_dbc_message.html#a743faa818417f8c5a95d2b35322cf83c',1,'dbc::DbcMessage::DbcMessage(uint64_t time, uint32_t can_id, std::vector< uint8_t > data)'],['../classdbc_1_1_dbc_message.html#a79e1b0e7d31be7292fb102b55eb61f8c',1,'dbc::DbcMessage::DbcMessage(const DbcMessage &message)=default']]], + ['detachobserver_5',['DetachObserver',['../classdbc_1_1_i_sample_observer.html#a053ec00bd84eb554e760c2c2cdfd25d5',1,'dbc::ISampleObserver::DetachObserver()'],['../classdbc_1_1_signal.html#a8048ec5ef09804028cf8235f54539c1f',1,'dbc::Signal::DetachObserver()'],['../classdbc_1_1_signal_observer.html#aac7f01c6e4deba313a8cc0ce9d92db1a',1,'dbc::SignalObserver::DetachObserver()']]] +]; diff --git a/docs/manual/html/search/functions_4.js b/docs/manual/html/search/functions_4.js new file mode 100644 index 0000000..88f2b6a --- /dev/null +++ b/docs/manual/html/search/functions_4.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['engvalue_0',['EngValue',['../classdbc_1_1_signal.html#a0c1313c8eab5a019bb21ae52468e44d5',1,'dbc::Signal::EngValue()'],['../classdbc_1_1_signal_observer.html#ae889044234fe7696b0ac1217be9fd7e4',1,'dbc::SignalObserver::EngValue()'],['../classdbc_1_1_signal.html#a7ef11e3f396f54d1854d373473023e0a',1,'dbc::Signal::EngValue()'],['../classdbc_1_1_signal_observer.html#a7994073aa3e0d64c3be6e89c024dc922',1,'dbc::SignalObserver::EngValue()']]], + ['enumlist_1',['EnumList',['../classdbc_1_1_attribute.html#a4a1bc65da61d6a93dad0a7c2d959a52a',1,'dbc::Attribute::EnumList(const std::vector< std::string > &list)'],['../classdbc_1_1_attribute.html#a4035455892b1db39b14c800752f3eb32',1,'dbc::Attribute::EnumList() const'],['../classdbc_1_1_env_var.html#a178f51c4928ca2cf6773e5ca181e5204',1,'dbc::EnvVar::EnumList(const std::map< int64_t, std::string > &enum_list)'],['../classdbc_1_1_env_var.html#abbd6188697511e6d6fcd3834e35e14f8',1,'dbc::EnvVar::EnumList() const'],['../classdbc_1_1_signal.html#a8d45969cf78494a91aad69045d1970a2',1,'dbc::Signal::EnumList(const std::map< int64_t, std::string > &enum_list)'],['../classdbc_1_1_signal.html#aa3dde456d7de1854ac9111cc6ef8da11',1,'dbc::Signal::EnumList() const']]], + ['enums_2',['Enums',['../classdbc_1_1_network.html#adad3cb33f36d4c14601b067531a3c6f1',1,'dbc::Network']]], + ['envvars_3',['EnvVars',['../classdbc_1_1_network.html#a20be0169601361defa49e39571192125',1,'dbc::Network']]], + ['extendeddatapage_4',['ExtendedDataPage',['../classdbc_1_1_dbc_message.html#ad582604c307e5c4a233393796e1a3bdf',1,'dbc::DbcMessage::ExtendedDataPage()'],['../classdbc_1_1_message.html#aa4f803feac2e49d0bd0c0124d7e43087',1,'dbc::Message::ExtendedDataPage()']]] +]; diff --git a/docs/manual/html/search/functions_5.js b/docs/manual/html/search/functions_5.js new file mode 100644 index 0000000..b74daac --- /dev/null +++ b/docs/manual/html/search/functions_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['filename_0',['Filename',['../classdbc_1_1_dbc_file.html#ab90e89005e79033325912b1fa754937d',1,'dbc::DbcFile::Filename(const std::string &filename)'],['../classdbc_1_1_dbc_file.html#a80f96154e90c9e401e8f492ba645dc9b',1,'dbc::DbcFile::Filename() const'],['../classdbc_1_1_network.html#a694c5f045e9c54d98d7a3abcec354c8f',1,'dbc::Network::Filename(const std::string &filename)'],['../classdbc_1_1_network.html#abcbc402004e3a88de9379fe4836710e4',1,'dbc::Network::Filename() const']]], + ['firstindex_1',['FirstIndex',['../classdbc_1_1_signal_observer.html#a5af74b4b57829909a3cb7aa55272c4b7',1,'dbc::SignalObserver']]] +]; diff --git a/docs/manual/html/search/functions_6.js b/docs/manual/html/search/functions_6.js new file mode 100644 index 0000000..4799526 --- /dev/null +++ b/docs/manual/html/search/functions_6.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['getattribute_0',['GetAttribute',['../classdbc_1_1_message.html#add99b1aad19d7fba01af8037fc4fbeb9',1,'dbc::Message::GetAttribute()'],['../classdbc_1_1_network.html#ad126aa858052fa6fe7fddbcff601819f',1,'dbc::Network::GetAttribute(const std::string &name)'],['../classdbc_1_1_network.html#a04524384810ade55d6b3f5ad56bda962',1,'dbc::Network::GetAttribute(const std::string &name) const'],['../classdbc_1_1_node.html#ac59a1a2889e765e3ffcdaeaee7ed8de5',1,'dbc::Node::GetAttribute()']]], + ['getenumstring_1',['GetEnumString',['../classdbc_1_1_signal.html#a3a1c613477b42e060f140654e84294ef',1,'dbc::Signal']]], + ['getenvvar_2',['GetEnvVar',['../classdbc_1_1_network.html#a577490ed666c8c71d3b620b5efa65d46',1,'dbc::Network']]], + ['getextendedmux_3',['GetExtendedMux',['../classdbc_1_1_signal.html#a667dfb14a8a97088ad0e265f717817ec',1,'dbc::Signal']]], + ['getmessage_4',['GetMessage',['../classdbc_1_1_network.html#a7144c11f46345f8666f63927aed221c8',1,'dbc::Network::GetMessage(uint64_t message_id)'],['../classdbc_1_1_network.html#a9eeb1de6ec7f29af95afed10ffe35541',1,'dbc::Network::GetMessage(uint64_t message_id) const']]], + ['getmessagebycanid_5',['GetMessageByCanId',['../classdbc_1_1_network.html#a41a403dec86f79706f1746c37b31e08b',1,'dbc::Network::GetMessageByCanId(uint64_t can_id)'],['../classdbc_1_1_network.html#acfdfed4f93e4ec55a91a197c42c01d80',1,'dbc::Network::GetMessageByCanId(uint64_t can_id) const']]], + ['getmessagebyname_6',['GetMessageByName',['../classdbc_1_1_network.html#a2676d5fd2919aa12f10c81babdc80397',1,'dbc::Network']]], + ['getmessagebypgn_7',['GetMessageByPgn',['../classdbc_1_1_network.html#a55a243417b99d89858e03b3b086cda9f',1,'dbc::Network']]], + ['getmessagebypgnandsource_8',['GetMessageByPgnAndSource',['../classdbc_1_1_network.html#aeabc7aaeb4acc25e6e23a4ed47291c4d',1,'dbc::Network']]], + ['getmultiplexor_9',['GetMultiplexor',['../classdbc_1_1_message.html#aaee2e8851577deb2a1e747766db59331',1,'dbc::Message']]], + ['getnetwork_10',['GetNetwork',['../classdbc_1_1_dbc_file.html#ad1b93b85d8fd38c68801beb5cfa3033f',1,'dbc::DbcFile::GetNetwork()'],['../classdbc_1_1_dbc_file.html#ad327f66e5420f555cf266d4169c057f6',1,'dbc::DbcFile::GetNetwork() const']]], + ['getnode_11',['GetNode',['../classdbc_1_1_network.html#a4ca71a9c205d112604c8fb8ab128271b',1,'dbc::Network::GetNode(const std::string &name)'],['../classdbc_1_1_network.html#a059b9eed96971794ef1850efdf83f18c',1,'dbc::Network::GetNode(const std::string &name) const']]], + ['getnodebysource_12',['GetNodeBySource',['../classdbc_1_1_network.html#ab74544eb60585f441bfd29cf2cfbf469',1,'dbc::Network']]], + ['getsignal_13',['GetSignal',['../classdbc_1_1_message.html#aaf1f7ee3caf6b953ba759f2aa3a3b058',1,'dbc::Message::GetSignal(const std::string &name)'],['../classdbc_1_1_message.html#aa7e1dc587ff2843b53f3823db7e0b8e7',1,'dbc::Message::GetSignal(const std::string &name) const'],['../classdbc_1_1_network.html#a7ae64bba8c481112a8d8b111ebe5b190',1,'dbc::Network::GetSignal(uint64_t message_id, const std::string &signal_name)'],['../classdbc_1_1_network.html#a9a3b72b468db9b3e60a0e51cd3ea93ef',1,'dbc::Network::GetSignal(uint64_t message_id, const std::string &signal_name) const'],['../classdbc_1_1_signal_observer.html#abd76954ced3f7d37d539b2605a875435',1,'dbc::SignalObserver::GetSignal()']]], + ['getsignalbycanid_14',['GetSignalByCanId',['../classdbc_1_1_network.html#a6ad87b4a82372c3c6b57bf867d344b56',1,'dbc::Network']]], + ['getsignalbyname_15',['GetSignalByName',['../classdbc_1_1_network.html#a1d17c1127c3e7a60613e37e412e7b48e',1,'dbc::Network']]], + ['getsignalgroup_16',['GetSignalGroup',['../classdbc_1_1_network.html#abf979ce023012f2484902b2485186759',1,'dbc::Network']]], + ['getsignalgroupbyname_17',['GetSignalGroupByName',['../classdbc_1_1_network.html#a0d050366ffebb6aa761be31083293397',1,'dbc::Network']]] +]; diff --git a/docs/manual/html/search/functions_7.js b/docs/manual/html/search/functions_7.js new file mode 100644 index 0000000..61286d5 --- /dev/null +++ b/docs/manual/html/search/functions_7.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['ident_0',['Ident',['../classdbc_1_1_env_var.html#acf24b01738dddd29ef84eae40735d9a2',1,'dbc::EnvVar::Ident(uint64_t ident)'],['../classdbc_1_1_env_var.html#aa1ea3dc52c6abad1e3519e2607747813',1,'dbc::EnvVar::Ident() const'],['../classdbc_1_1_message.html#a601971c6efc02e67e5fc44aaf28638e0',1,'dbc::Message::Ident(uint64_t ident)'],['../classdbc_1_1_message.html#a5592774264da46753877bed5947d062b',1,'dbc::Message::Ident() const']]], + ['initvalue_1',['InitValue',['../classdbc_1_1_env_var.html#abd05b5ba9228fd03d279a2d38c317331',1,'dbc::EnvVar::InitValue(double value)'],['../classdbc_1_1_env_var.html#ad909847cf49bd4a7ac20d261984dfe55',1,'dbc::EnvVar::InitValue() const']]], + ['inrange_2',['InRange',['../structdbc_1_1_extended_mux.html#a00b2ca5b9a59b94ce2ed5b5f2bd50f1a',1,'dbc::ExtendedMux']]], + ['isampleobserver_3',['ISampleObserver',['../classdbc_1_1_i_sample_observer.html#a5eeb28313e73358151fd6d1b3375bd95',1,'dbc::ISampleObserver']]], + ['isextended_4',['IsExtended',['../classdbc_1_1_message.html#a0e6f7b00cd196b0d4eb722bbdbe2fe8b',1,'dbc::Message']]], + ['isj1939_5',['IsJ1939',['../classdbc_1_1_message.html#ab20f97b18313af74491211891091d8a5',1,'dbc::Message']]], + ['ismultiplexed_6',['IsMultiplexed',['../classdbc_1_1_signal.html#a2c65a42d76bcd2e74978bd32faa70ff8',1,'dbc::Signal']]], + ['isnodesender_7',['IsNodeSender',['../classdbc_1_1_message.html#a43a854be6a2cf46aebf49168b4c0c4ae',1,'dbc::Message']]], + ['ispdu1_8',['IsPdu1',['../classdbc_1_1_message.html#a69c8f4aad3e0f9660e89db0f07e87e78',1,'dbc::Message']]], + ['ispdu2_9',['IsPdu2',['../classdbc_1_1_message.html#ac5ff5de61dd0eddf0016c46ec9655d91',1,'dbc::Message']]] +]; diff --git a/docs/manual/html/search/functions_8.js b/docs/manual/html/search/functions_8.js new file mode 100644 index 0000000..47c40b3 --- /dev/null +++ b/docs/manual/html/search/functions_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['j1939_0',['J1939',['../classdbc_1_1_network.html#aca3e5ba15743f4700d8f33b45abf00ba',1,'dbc::Network::J1939(bool j1939)'],['../classdbc_1_1_network.html#a276739da3736954c9c7d7363c02671b4',1,'dbc::Network::J1939() const']]] +]; diff --git a/docs/manual/html/search/functions_9.js b/docs/manual/html/search/functions_9.js new file mode 100644 index 0000000..30f6116 --- /dev/null +++ b/docs/manual/html/search/functions_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['lasterror_0',['LastError',['../classdbc_1_1_dbc_file.html#abb38a985e71a48f3a46cc93b017a90d7',1,'dbc::DbcFile']]], + ['lastindex_1',['LastIndex',['../classdbc_1_1_signal_observer.html#afce368371f4e8ec3816c6e2676383356',1,'dbc::SignalObserver']]], + ['lastmessage_2',['LastMessage',['../classdbc_1_1_network.html#aa766424be60f60b5c3b4cfaaa95630c8',1,'dbc::Network']]], + ['littleendian_3',['LittleEndian',['../classdbc_1_1_signal.html#afde5650bd65e5cb8fd2f91d512910bd1',1,'dbc::Signal::LittleEndian(bool endian)'],['../classdbc_1_1_signal.html#ab330029718ce776d028d0f1009350179',1,'dbc::Signal::LittleEndian() const']]] +]; diff --git a/docs/manual/html/search/functions_a.js b/docs/manual/html/search/functions_a.js new file mode 100644 index 0000000..572c5d2 --- /dev/null +++ b/docs/manual/html/search/functions_a.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['max_0',['Max',['../classdbc_1_1_attribute.html#ac60bca3bfc1b6b66f695d63d469488be',1,'dbc::Attribute::Max(double max)'],['../classdbc_1_1_attribute.html#a29153cd6ee99b926301e8acf46d4bc57',1,'dbc::Attribute::Max() const'],['../classdbc_1_1_env_var.html#a2d489efdbd8f60f39c4c2253550ea98f',1,'dbc::EnvVar::Max(double max)'],['../classdbc_1_1_env_var.html#ab46a250b8f6fa6bb62175b2a7e71e56b',1,'dbc::EnvVar::Max() const'],['../classdbc_1_1_signal.html#a19ac6bf5e9907cd958da73d9faf0b69f',1,'dbc::Signal::Max(double max)'],['../classdbc_1_1_signal.html#ac8b370b896d24997d344fd7f4a6462ee',1,'dbc::Signal::Max() const']]], + ['maxsamples_1',['MaxSamples',['../classdbc_1_1_signal_observer.html#a8dd32af99693b219a3306305ef3058bf',1,'dbc::SignalObserver::MaxSamples(size_t max_nof_samples)'],['../classdbc_1_1_signal_observer.html#add60e52b747139a31fe3f7ceab9c75b2',1,'dbc::SignalObserver::MaxSamples() const']]], + ['messageid_2',['MessageId',['../classdbc_1_1_signal.html#ae0703449ddf019a1662d694949b5e3bd',1,'dbc::Signal::MessageId(uint64_t message_id)'],['../classdbc_1_1_signal.html#a3447e8f86922b46809613d57f657f3b6',1,'dbc::Signal::MessageId() const'],['../classdbc_1_1_signal_group.html#ada6544f8beef8d46ae4fb68afe3b8a7c',1,'dbc::SignalGroup::MessageId(uint64_t message_id)'],['../classdbc_1_1_signal_group.html#a282bd834b426404969bf38f5712f955e',1,'dbc::SignalGroup::MessageId() const']]], + ['messages_3',['Messages',['../classdbc_1_1_network.html#a2293bc84fbff2dac32ffecd731a75f2b',1,'dbc::Network']]], + ['min_4',['Min',['../classdbc_1_1_attribute.html#a267553e1e3ff710de464f341efa656a1',1,'dbc::Attribute::Min(double min)'],['../classdbc_1_1_attribute.html#a9d536c4353fe55a3df63fef87f452776',1,'dbc::Attribute::Min() const'],['../classdbc_1_1_env_var.html#ac7044e057f3631dd05796c2841ac7d12',1,'dbc::EnvVar::Min(double min)'],['../classdbc_1_1_env_var.html#ae3e109e6403dfd95fa5373a0e20659e9',1,'dbc::EnvVar::Min() const'],['../classdbc_1_1_signal.html#a9494844695ad20e71cbc8e3a6301a3bb',1,'dbc::Signal::Min(double min)'],['../classdbc_1_1_signal.html#ad707d80faa92a5e0ecbafd38a78a842e',1,'dbc::Signal::Min() const']]], + ['mux_5',['Mux',['../classdbc_1_1_signal.html#a166b7ebdeef130c50c0f45ebfbf38e85',1,'dbc::Signal::Mux(MuxType type)'],['../classdbc_1_1_signal.html#a818ebca69114d0269067ca858f6b480b',1,'dbc::Signal::Mux() const']]], + ['muxasstring_6',['MuxAsString',['../classdbc_1_1_signal.html#ab121f68010a0682fda964fb18a8a433c',1,'dbc::Signal']]], + ['muxvalue_7',['MuxValue',['../classdbc_1_1_signal.html#a41390f96b26c6db6adeb23ddff472bef',1,'dbc::Signal::MuxValue(int value)'],['../classdbc_1_1_signal.html#a0669927ef77e4a4f451628ba540d4483',1,'dbc::Signal::MuxValue() const']]] +]; diff --git a/docs/manual/html/search/functions_b.js b/docs/manual/html/search/functions_b.js new file mode 100644 index 0000000..0305b0a --- /dev/null +++ b/docs/manual/html/search/functions_b.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['name_0',['Name',['../classdbc_1_1_attribute.html#a92611f349733d73f692884bc91949758',1,'dbc::Attribute::Name(const std::string &name)'],['../classdbc_1_1_attribute.html#ac29bdc26715f4074d757833d41b2e6a7',1,'dbc::Attribute::Name() const'],['../classdbc_1_1_dbc_file.html#ab5d3031c0cb673e00483b38db255c68f',1,'dbc::DbcFile::Name()'],['../classdbc_1_1_env_var.html#a47c89f86f34559755b447c13d1425025',1,'dbc::EnvVar::Name(const std::string &name)'],['../classdbc_1_1_env_var.html#a9860520454f5130051e812cdc0a98743',1,'dbc::EnvVar::Name() const'],['../classdbc_1_1_message.html#a18fa6fc9658d21871ac620d31cbbb01d',1,'dbc::Message::Name(const std::string &name)'],['../classdbc_1_1_message.html#abf394eae5ae141f6e9a2eed611412f73',1,'dbc::Message::Name() const'],['../classdbc_1_1_network.html#abb0833b474ba8dcfea7c31c9d4bc0e82',1,'dbc::Network::Name()'],['../classdbc_1_1_node.html#afe3fc600c2689ce1e815db719de3de19',1,'dbc::Node::Name(const std::string &name)'],['../classdbc_1_1_node.html#a7ff5323d8951d5ed5658f98b658752f6',1,'dbc::Node::Name() const'],['../classdbc_1_1_signal.html#a82d1cac9cbf031dac2e0d52d8fbd1399',1,'dbc::Signal::Name(const std::string &name)'],['../classdbc_1_1_signal.html#ac16d9dd0c25b91a32df72608f94b8328',1,'dbc::Signal::Name() const'],['../classdbc_1_1_signal_group.html#ab7962addf3a3a867053967a2e68a0b4f',1,'dbc::SignalGroup::Name(const std::string &name)'],['../classdbc_1_1_signal_group.html#a7f7c878f0daf3aa0b99cbc24f9145f5f',1,'dbc::SignalGroup::Name() const']]], + ['nextsequencenumber_1',['NextSequenceNumber',['../classdbc_1_1_message.html#a3cc215ee151d0e333e66379cabb9aece',1,'dbc::Message']]], + ['node_2',['Node',['../classdbc_1_1_message.html#a3355dd76d9740ecf7b13a57e89c6e4ab',1,'dbc::Message']]], + ['nodelist_3',['NodeList',['../classdbc_1_1_env_var.html#a4e1157eaee4b1b80828f24543baf1b2e',1,'dbc::EnvVar::NodeList(const std::vector< std::string > &node_list)'],['../classdbc_1_1_env_var.html#a35d67583dadcb305811cbf42d6262d45',1,'dbc::EnvVar::NodeList() const']]], + ['nodename_4',['NodeName',['../classdbc_1_1_message.html#a88dcc39e025f00fdd8ae990d828d9a29',1,'dbc::Message']]], + ['nodes_5',['Nodes',['../classdbc_1_1_network.html#aa69bb65d09b5a9d2cba9848d08d98c42',1,'dbc::Network']]], + ['nofbytes_6',['NofBytes',['../classdbc_1_1_message.html#a548d12b10a5dc39f5aa5f3b7333ad9a4',1,'dbc::Message::NofBytes(size_t bytes)'],['../classdbc_1_1_message.html#add73384ebbba3d8a164c88972c56cfa6',1,'dbc::Message::NofBytes() const']]], + ['nofsamples_7',['NofSamples',['../classdbc_1_1_signal_observer.html#ae4620426add2d7bf3dea96868027db46',1,'dbc::SignalObserver']]], + ['nofvalidsamples_8',['NofValidSamples',['../classdbc_1_1_signal_observer.html#a3cce45d3f0fe62059551a5550b29f0d9',1,'dbc::SignalObserver']]] +]; diff --git a/docs/manual/html/search/functions_c.js b/docs/manual/html/search/functions_c.js new file mode 100644 index 0000000..ccac362 --- /dev/null +++ b/docs/manual/html/search/functions_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['offset_0',['Offset',['../classdbc_1_1_signal.html#a107d48664579e53a86ccec6995787fc9',1,'dbc::Signal::Offset(double offset)'],['../classdbc_1_1_signal.html#a1025aadb18fd8bef81a5f154c4df16f3',1,'dbc::Signal::Offset() const']]], + ['onsample_1',['OnSample',['../classdbc_1_1_i_sample_observer.html#a6295f36c65a0e1f811886c10992f4199',1,'dbc::ISampleObserver::OnSample()'],['../classdbc_1_1_signal_observer.html#a35cc79762b1dc934f1cd77c5f26d8239',1,'dbc::SignalObserver::OnSample()']]] +]; diff --git a/docs/manual/html/search/functions_d.js b/docs/manual/html/search/functions_d.js new file mode 100644 index 0000000..d8f2609 --- /dev/null +++ b/docs/manual/html/search/functions_d.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['parsefile_0',['ParseFile',['../classdbc_1_1_dbc_file.html#adfe3085eb6216c981419305a338902ba',1,'dbc::DbcFile']]], + ['parsemessage_1',['ParseMessage',['../classdbc_1_1_dbc_file.html#a5fd82d19df1d70578a6a16ac0215926e',1,'dbc::DbcFile::ParseMessage()'],['../classdbc_1_1_message.html#a49d01da6a489142ab1c14044c92c8c64',1,'dbc::Message::ParseMessage()'],['../classdbc_1_1_signal.html#afda726e8acb411216c9cad57e02949ea',1,'dbc::Signal::ParseMessage()']]], + ['pduformat_2',['PduFormat',['../classdbc_1_1_dbc_message.html#a44046d858ef2c3fa5bbe8682653149f8',1,'dbc::DbcMessage::PduFormat()'],['../classdbc_1_1_message.html#adecf3c05e813c5c883f0b990c66f79f7',1,'dbc::Message::PduFormat()']]], + ['pduspecific_3',['PduSpecific',['../classdbc_1_1_dbc_message.html#a36b7dab6848608597ee230f8903b2419',1,'dbc::DbcMessage::PduSpecific()'],['../classdbc_1_1_message.html#aaa293b4c75e1d5207eb761fbc3a29234',1,'dbc::Message::PduSpecific()']]], + ['pgn_4',['Pgn',['../classdbc_1_1_dbc_message.html#abd1c9af0e020bf17c66feae7861449b0',1,'dbc::DbcMessage::Pgn()'],['../classdbc_1_1_message.html#a034cabb0a78d17794e5802a627a54105',1,'dbc::Message::Pgn()']]], + ['priority_5',['Priority',['../classdbc_1_1_dbc_message.html#a9f56d675550dea296129fcfeb3342389',1,'dbc::DbcMessage::Priority()'],['../classdbc_1_1_message.html#aa516d095d2e76eab079e12bdf7b5fd0c',1,'dbc::Message::Priority()']]], + ['protocol_6',['Protocol',['../classdbc_1_1_network.html#a1e819d7eebd1474cdaf38a6b4a8be81b',1,'dbc::Network::Protocol(ProtocolType type)'],['../classdbc_1_1_network.html#a1b935f056c692649bc19eb7f5070abb6',1,'dbc::Network::Protocol() const']]], + ['protocolasstring_7',['ProtocolAsString',['../classdbc_1_1_network.html#a018021f90cf6c1f443ad05f285e24aca',1,'dbc::Network']]] +]; diff --git a/docs/manual/html/search/functions_e.js b/docs/manual/html/search/functions_e.js new file mode 100644 index 0000000..8996ce4 --- /dev/null +++ b/docs/manual/html/search/functions_e.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['receivers_0',['Receivers',['../classdbc_1_1_signal.html#a91f3a18b3a3cd17310a6042a71f192f0',1,'dbc::Signal::Receivers(const std::vector< std::string > &receiver_list)'],['../classdbc_1_1_signal.html#a4c7d611cb85c43b9f4c007717eec8cad',1,'dbc::Signal::Receivers() const']]], + ['reparsemessagelist_1',['ReparseMessageList',['../classdbc_1_1_dbc_file.html#a42d1a7b6a82af6e844ecd113c34a7fef',1,'dbc::DbcFile']]], + ['repetition_2',['Repetition',['../classdbc_1_1_signal_group.html#abe0ecddf376e3f02dafb1aa70e79cd04',1,'dbc::SignalGroup::Repetition(size_t rep)'],['../classdbc_1_1_signal_group.html#aeee51c68921ff02179a94283727f6eb0',1,'dbc::SignalGroup::Repetition() const']]], + ['resetsamplecounter_3',['ResetSampleCounter',['../classdbc_1_1_dbc_file.html#a7ed3d50dfb96e257dbf56d99ca9535e5',1,'dbc::DbcFile::ResetSampleCounter()'],['../classdbc_1_1_message.html#a1725d6e1a04c7929d45a6cf88e8ad335',1,'dbc::Message::ResetSampleCounter()'],['../classdbc_1_1_signal.html#a6b569a70fafd7460327c80c953f344a7',1,'dbc::Signal::ResetSampleCounter()']]], + ['resetsampleindex_4',['ResetSampleIndex',['../classdbc_1_1_signal_observer.html#a438cebb9332a7fa5100ea56662bf8181',1,'dbc::SignalObserver']]], + ['resetsequencenumber_5',['ResetSequenceNumber',['../classdbc_1_1_message.html#ae94cbffb939dfbb20b853e6001e430f6',1,'dbc::Message']]] +]; diff --git a/docs/manual/html/search/functions_f.js b/docs/manual/html/search/functions_f.js new file mode 100644 index 0000000..9215e45 --- /dev/null +++ b/docs/manual/html/search/functions_f.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['samplecanid_0',['SampleCanId',['../classdbc_1_1_signal.html#a1bf4531f27949895ff242ef10f204ef5',1,'dbc::Signal::SampleCanId(uint32_t can_id)'],['../classdbc_1_1_signal.html#a2b8b2d2289d9d3df959e2178b3088b19',1,'dbc::Signal::SampleCanId() const']]], + ['samplecounter_1',['SampleCounter',['../classdbc_1_1_message.html#aa79b4def32c809c79653eae26f57a8f6',1,'dbc::Message::SampleCounter()'],['../classdbc_1_1_signal.html#a390aa7058f873c46bc89e4bb5353cde4',1,'dbc::Signal::SampleCounter() const']]], + ['sampletime_2',['SampleTime',['../classdbc_1_1_signal.html#a2627086d63747403263dcb3996b91d5f',1,'dbc::Signal::SampleTime(uint64_t ns1970)'],['../classdbc_1_1_signal.html#a739aac045c5f29a6d3ac74c6185e7bd5',1,'dbc::Signal::SampleTime() const']]], + ['sampletoindex_3',['SampleToIndex',['../classdbc_1_1_signal_observer.html#aede221d4974746371c75ece420bd99b3',1,'dbc::SignalObserver']]], + ['scale_4',['Scale',['../classdbc_1_1_signal.html#a684f972a119ab5e0ffae27e61957ee72',1,'dbc::Signal::Scale(double scale)'],['../classdbc_1_1_signal.html#a8d975f981a7a0c860701fc2dc5210891',1,'dbc::Signal::Scale() const']]], + ['senders_5',['Senders',['../classdbc_1_1_message.html#ab347aebc6f9adeaaad3cbc83883818fe',1,'dbc::Message']]], + ['setmessagesize_6',['SetMessageSize',['../classdbc_1_1_dbc_file.html#a79829227309764bde202dd7f4d4e3551',1,'dbc::DbcFile']]], + ['signalgroups_7',['SignalGroups',['../classdbc_1_1_network.html#a8837f5355ff4fb70b48255677cb6689c',1,'dbc::Network']]], + ['signalobserver_8',['SignalObserver',['../classdbc_1_1_signal_observer.html#af4adc266e432ea5d7aaba16ae6aa49ad',1,'dbc::SignalObserver::SignalObserver(const Signal &signal)'],['../classdbc_1_1_signal_observer.html#a76a3ccf7438b90f648f11e5a7a721a6a',1,'dbc::SignalObserver::SignalObserver()=delete']]], + ['signals_9',['Signals',['../classdbc_1_1_message.html#a92a54b54be5674cd3f53f82f61826d52',1,'dbc::Message::Signals()'],['../classdbc_1_1_signal_group.html#a3acfcfe0e0a9be47dee7826efd9853ef',1,'dbc::SignalGroup::Signals(const std::vector< std::string > &signals)'],['../classdbc_1_1_signal_group.html#a595d2694d37a961eeef0a3d457cb418b',1,'dbc::SignalGroup::Signals() const']]], + ['source_10',['Source',['../classdbc_1_1_dbc_message.html#a646c5d5e0433b1fd936cbca43dee95a7',1,'dbc::DbcMessage::Source()'],['../classdbc_1_1_message.html#a71940aef5644a0f2762489c2475fc05d',1,'dbc::Message::Source()'],['../classdbc_1_1_node.html#acce31e612f3cfa7f61b86b6f2d83a39a',1,'dbc::Node::Source(uint8_t source)'],['../classdbc_1_1_node.html#ade44d0764f366cc5042dcd8195f5db36',1,'dbc::Node::Source() const']]], + ['stepsamplecounter_11',['StepSampleCounter',['../classdbc_1_1_message.html#a1e9f36dc823b7372faa7fedcf762a1e2',1,'dbc::Message::StepSampleCounter()'],['../classdbc_1_1_signal.html#abbaf69c053d6062bcdb6062247ec74ac',1,'dbc::Signal::StepSampleCounter()']]] +]; diff --git a/docs/manual/html/search/mag.svg b/docs/manual/html/search/mag.svg new file mode 100644 index 0000000..9f46b30 --- /dev/null +++ b/docs/manual/html/search/mag.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/docs/manual/html/search/mag_d.svg b/docs/manual/html/search/mag_d.svg new file mode 100644 index 0000000..b9a814c --- /dev/null +++ b/docs/manual/html/search/mag_d.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/docs/manual/html/search/mag_sel.svg b/docs/manual/html/search/mag_sel.svg new file mode 100644 index 0000000..03626f6 --- /dev/null +++ b/docs/manual/html/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/docs/manual/html/search/mag_seld.svg b/docs/manual/html/search/mag_seld.svg new file mode 100644 index 0000000..6e720dc --- /dev/null +++ b/docs/manual/html/search/mag_seld.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/docs/manual/html/search/namespaces_0.js b/docs/manual/html/search/namespaces_0.js new file mode 100644 index 0000000..7a485f4 --- /dev/null +++ b/docs/manual/html/search/namespaces_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['dbc_0',['dbc',['../namespacedbc.html',1,'']]] +]; diff --git a/docs/manual/html/search/pages_0.js b/docs/manual/html/search/pages_0.js new file mode 100644 index 0000000..d55bc2d --- /dev/null +++ b/docs/manual/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['dbc_20c_2b_2b_20library_0',['DBC C++ Library',['../index.html',1,'']]] +]; diff --git a/docs/manual/html/search/search.css b/docs/manual/html/search/search.css new file mode 100644 index 0000000..19f76f9 --- /dev/null +++ b/docs/manual/html/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#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 box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 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: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -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 { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + 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 var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + 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 var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + 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: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + 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/manual/html/search/search.js b/docs/manual/html/search/search.js new file mode 100644 index 0000000..e103a26 --- /dev/null +++ b/docs/manual/html/search/search.js @@ -0,0 +1,816 @@ +/* + @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 jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + searchResults.Search(searchValue); + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- 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'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + 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 + { + searchBox.CloseResultsWindow(); + 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 + { + searchBox.CloseResultsWindow(); + 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(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +DbcLib: include/dbc/signal.h File Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    signal.h File Reference
    +
    +
    + +

    Interface against a DBC signal configuration. +More...

    +
    #include <cstdint>
    +#include <string>
    +#include <vector>
    +#include <map>
    +#include "dbc/attribute.h"
    +#include "dbc/isampleobserver.h"
    +
    +Include dependency graph for signal.h:
    +
    +
    + + + + + + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + +

    +Classes

    struct  dbc::SignalValue
     Support function that holds the channel value for a signal. More...
     
    struct  dbc::ExtendedMux
     Support function for the extended multiplexor functionality. More...
     
    class  dbc::Signal
     Interface against a DBC signal configuration. More...
     
    + + + + +

    +Namespaces

    namespace  dbc
     Main namespace for the DBC library.
     
    + + + + +

    +Typedefs

    +using dbc::RangePair = std::pair< size_t, size_t >
     Min and Max range definition.
     
    + + + + + + + +

    +Enumerations

    enum class  dbc::SignalDataType : int { dbc::SignedData +, dbc::UnsignedData +, dbc::FloatData +, dbc::DoubleData + }
     Signal data type. More...
     
    enum class  dbc::MuxType : int { dbc::NotMultiplexed +, dbc::Multiplexor +, dbc::Multiplexed +, dbc::ExtendedMultiplexor + }
     Multiplexer type. More...
     
    +
    + + + + diff --git a/docs/manual/html/signal_8h__dep__incl.map b/docs/manual/html/signal_8h__dep__incl.map new file mode 100644 index 0000000..ded3ab1 --- /dev/null +++ b/docs/manual/html/signal_8h__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/manual/html/signal_8h__dep__incl.md5 b/docs/manual/html/signal_8h__dep__incl.md5 new file mode 100644 index 0000000..d2aa229 --- /dev/null +++ b/docs/manual/html/signal_8h__dep__incl.md5 @@ -0,0 +1 @@ +89c4642702c70d3b26cf4af3f4025da2 \ No newline at end of file diff --git a/docs/manual/html/signal_8h__dep__incl.png b/docs/manual/html/signal_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e17d2607955bf79379ff56f3b56e921c0fe8a7 GIT binary patch literal 8667 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

    W$$^Lqb`s6vXFzza%JldwNYdFLaf*1-+RBN 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 + + + + + + + + + diff --git a/docs/manual/html/signal_8h__incl.md5 b/docs/manual/html/signal_8h__incl.md5 new file mode 100644 index 0000000..5502e1d --- /dev/null +++ b/docs/manual/html/signal_8h__incl.md5 @@ -0,0 +1 @@ +0573eb44d5674e82e4c8c5991aa021ac \ No newline at end of file diff --git a/docs/manual/html/signal_8h__incl.png b/docs/manual/html/signal_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..d7fa5a8905eb29f826ec2a567874d8d72c14ebd1 GIT binary patch literal 15799 zcmZvDby!qi)GjFvf~1sybPCcbUD8803@9PP0FnYDpduwLjdTv(H4Y#+lyo-((j_Hz zkH7Ev?mzcF@W9~=&pv1Gz1G@mz3;ms^>oxo2p2jfS>yx zh(7?o9@uNCDP!FK`^xPoPQ<`?f}x@O!pJXke=#t~5Pgd{9=Ukxj_I!d;`qZFl|H#3 zm-P(CBXx6?kVoHNa)uR93VO9l3VL}>x$C6OGdPqa6+Ia)&7Ef$;|N{3{Y+zIID9Iz<&O{|?*9LL6NX7JhT0XZ zC1?pqN>D@+`$&eaAe9%oSJRh%SUp;#{uKF{iZ_$ATS)i^R0`w2XC^pPG~3aBu-jlsM34Y? z*vQgw-T;5o`u9JDVdNO~2G zvurS)rqQV$2oo#_K?jq#4TZBM>hwR_(WZeZnn&I1CvRlHs3frrmyD1c?MEIK^1c(4 zOJ-M*N#motr4#XkftnXvvu17|?Dht=-`jax@ElE&tTklrf#G*8&1J%9f z-FgyUrG2pbDhrbl-_|K>q2aP8<& zAJAF~3V(NA-*w$L)sEdxP@(L@tO6n! zPf^L>g%BWor)x*E1^u~)Zu%k2x4JV3db_uS-{t6sX93|lEy3h5L7ZEH$ z5;Rs+b?C))qkMVSg)Af~R&7_fR{Bfk)GSC$q#3jI6sdrqI$$$R)Q4AK~1o5Jvfd;M<+*@{(K9^bKt09|jW!VRS0^ zk*&U~Nvo_j;9H8Ltb-2Y&mM!!fSrc4Xk&@j3M|pw8Qd^G^ayT}1g#jsJTTVtHLLtW z{)&{z#2&rM`Z)bizt~=!Flt-v`PlG9b&3mFEM-PMe-zBc3#UeUC+w5e^Es|^a$`)7 z$ZDR)U{GXK6NUTxin6kFtcB$7P4U)n)<1~xUrW~x9VgTE)Ri57pR5Y9w0G=JYoWgU z7%ENPKY)>Dg`er*i*+t13o)+uC=2|XOFL}6ck}sxeKXH8&R>k(&_Y(ehCCT_LzY9Z zh(LZd;6rTS)M?kBq~c+DDE&NQV+qZbS1StoICk_X9x7uqNE}IdDCjLgx%tw|Vk8>M zAFIr|RlJqu7@P7(U}{~E;it7)cFaIWc~H%!e#7SjjycETa?)#y=>>)LDcwr75YTA@ zjc!Yi!-aG}MZ;100KSJ-0A<6uY>@8aZSFu`u}vV(yj-BZ@!hVR*{PzntP>jAVm$vUDCJY)<0XN>YcFfifVCL z`Q+c<%A_Fiz8MImm>L@cKZL6$3c<1B9+8~a4zEsNT`G|dyZ4^nL`EsLYSkDJSYrRt zM<1w%+YB+XF&DN807jvfM#YtCVcxZAQE>fvDCA)o7E_D#q*TxgMs5f_gcwp~Zt0wz zs$(??<*%Lgs^t%|ND>LP3nfBJ+I}NE^RYHtg?v?w1w3a)D@GekLPqZp0JMj3;+l^rJ$syRoeOzYWb$Z|l|g z>#t-qSo_zO`^07x_jUw|=qE2fyoN7O^V_AjeA0RZI_BTRNfOZ?rj)>ZWnjvR4C}SK z^Vu>xX&JYBJS;-co>5|6fv3!x`2>p4qe7=uYE>;X7a&1i6_d^?!1DIZFhctn0d@uUyjfZ-R?d4?k8JoU}A== z%4Iyyu5z>gI0u#!H1SWFW!~*4J-hA}to%<|P0T8OLVIg=;~q=z(r~OprPQYyke>}vfhBg zyIo{Ya=d@&nN?lSBS}~Yi%&ZNZ@uXN}o*E&v$^6K2IwZG&eA3C8o+2?$_L;Zfj z_oTlJZPQ3Dn!9C8MO5d4;lH?OIbd7yo~QMG(@P9nwRA;Dp%qH|5#w?sPhy40*4mc? zD&t@*OL#SCB@Qk$o+YPY{NM~TJkLBXbAGn5GuK)W;-f)udq~S-Awrc{^+Gp(MxkjH zpR6_SW>DrZ(~Ks$1q~yR6N|{*{lJcuDv=1eRkiWR^UH*v}9@-Lj+`-17KE1M+Jh=9S-f zn=iwin-5-seOf`G7ps0NN-J`? zVk^lZ(hS-0s=&-Y?SOagUg7o4Qg`EaenW91mK2m%M5(e3(f%e$TTY-OcuU?e-@T%& z-r|jN63>drO57-g)8?GIYlxmW{!Q%^uL#9#r*J_-Sy2AH7jYRprT!(ycs4Mq^?bN) zvP&-I*KaWkZss3r9ZpzfjopKDk7R8HZA+0^cu7Z)GyF&i#+*@64w!U-3+((efh1( zDoN0&q~ugxiS_zYDd0KEHN`-#+)^gdr zswypsld$ipz{ZB*W@%q7`};`~5p^4YfAQ8x{51H$mRVGTOQspB`!HM4-#on7MeVe< zrEOSlnL_rf(DdgO?5R(X-MiiiH1vHM<-|I_pGGp<4hjs)yS@r*rJNx@(o}iS?K&RL zK3B|zoJ1re@VL70{rrCgZPjtgNiVA)$YAeqQ_7CE5U-e?g?zlRr||n=X<7wlM{b*D zvY?tGD;+8k8HhxLq5Y|{dqjoL^Ivb?K=tBk9Y!EF7!?Lz0~82C2GBi=gESL0Sf}~y ze>96;cL|qlaou#YGi*;lQ;*dcLj)Art1XjUT?f$5IPJILKZeHFmI|Xms}%O)l!q9; zNl6d;H=d}mz0=0hO^h6<|2Wytjph6#lRTtg0JmM$Z7iZsFMD_jhgr3cLtx^&0FB8b ztpyM6g+{Q*#pd|ar=1Tv%)^;++sEY7Zh^DL+)Mb73um|eq+7c;6+c8h&KOM%tHVi| zIWiQ%^EHXX;GlAaW+#Y^}>mLw-@!KHzzZAiax7LbQva08-sne5DIv z5U!RlrnQwc;NqPBd~VJ4m*GP=jl?5U*vWj*Vc;3wnO%gtk9EtF*>~$+O;uEvph}aw zFOioCMLc&;wpbRh{+O)76NDz6iV%Bk?bce2W|@KzS;$w#4zQP(dxXrEx7&~VuQ*FE z&(jHzIZDG`pG7kQ>8ZeWMEg+L@3~NV@>M1dVOB_dc9GaLL1y7mG=38`%9b%iFEyV} z%g3n!_29OS(Ai^Ykfmk9N3X#$YL7(Q0Bxf1Oh_~}yW>#jU$*#~&Vl`{TJU=wEg1bS z3e8>Y04(kO;}E?I1xY2l0(^(iccGJId=#d6FL8!MDq2RSbGymmR1!q!*L+0}WNH!H z&0{~AC*sK85czGKQ(nkZniit`eb6Uy&p%Fsj|?Q7nai~3D3S02&q*f#Z=QvJYE;|+2mAgV6CH!y>GM7X_` zQf2czek~n>O|0Z^9znm;UOTwmEL>P?ePI$MYD!ENol3a?lnB zo;~n0gv}WsnBKd!$ovR%$Vk9S+oYg4J^whgiSFq`5{KE@?$KF+f>{ zZ9Q984({FJzJG|;g+Z@gO05l~?6@>c5j*f94?|^PUCovYYZHI>78jfS=jtk=nK8RC z?xLU_bX8v@aT5`o0^^Gnsy_&{F?6u+%8$fXm_+IfgI(n`%8z(q-Q-LZQS`2AKP`0n zHYr2YL--*&m1?mXTK+Gx2rcXVMX*nf;jb5D_yu^^DRLiw!fHCJy)qOKP#kCM>3elU zec6e~$1)i{L1`AR^E~&@Lag5kF2{22dto*q?e#ZX&o^@ZRe0Xfsyk&VuKJF$%ZW1% z%6OO;578i`qT!_Nqo`p!Hd`$@Jg2=^!r zU;OZ%uc4@XkS=lO%p#@t`HDK#fw#rYSbc1Pt~CebpM8D%JR>u88(Iu&vl7_M5LCPS zR}pFrT*46~2pHm4KguQprg^_kwxgsVv66gPRIY6kHcYdc8*1_axGpxD+P!Opgy9D# znS|~V9(y8#9(IlXm4jr2@}s~F=o4RHia7p>h;<^NBwkAap~t5DC`+xD;v&T*FDbeF z-T#h&jx^dFK6}9x%+#Tmn}^pvce!%#qW~!ywn+Kq>jIwQspNsWZJucjU>52FDxxR} z7`uLRqjYRqKki-b0SlxJi4$=>vH5wHs&;t0`NV9P6SCZG?sB#gSY}B;{8@MSnfodA z-5V!I9^&H{Mu{rT=EhCGK?9z zgLxp2kzsHyc@dfq!$)|NM1we*D$VdIHc_3vq$;QwOxLpDV~g7jf)Y`QTJEtAK(Kj8 zFlNLv{Y$m%3lnAn7Qj3>4~wQ^QsS~=`KPbK{-z;bHdv>{Z$bsJcHCB1W|_#uFN%$>dB-F~Nq>gRDo+CtEyIs0eBb?}8bs{wo8@G9fVfPlnHeFn|XE|zL zlk~rd(3C{KoQ<9u{vg)59-7k!E!?;L^+e;%)1#Sa^Q{tS2O<(-Z)<+P^-3sTjYuts zU_dK!(X$N(r1@xMz{Hg!l49SG(yjyFc_P5^b?d-I#2;1t;0?m@E~jWWUEiw~)+MYz zO7>b#Z>Uy_Zlg*?M1-A8Zf1|^VL4btpV=-4DQY7<#bD*11$&w=U#+vjLP~pw7GJAY z9@zdHnPC%31;^l98D7IT9D0$SUiO8F9JE9MR(Ee{PdPXdB;B^QLu0R;gqpaFTLr^Q zfqEcc<%Y7E!ZZe|)LBK96UQ;R+hi$l0AhC`Sk6GlJ7>lM5i|wyj)k8F?PQA&>B8+2 zCHqU0@-J!sRHqtll%aufCExm&hD)UB|nb*^xUFK_0FS?46vY1uPB4%;&1tXDT7RjCXff!}BkCW$JYtn9e ztBfWg^>AihZK&u;wtUI7j%AUo)SQny8%d&4fJ>tyzp`&Odk&sVW)vg~X%wR84C0?= zEnY`a(P^xJi0V_jUfjRxb$WSiv`9>vG~m(N`lcq{40yfrili>q!GCMo*p%fF$+YMC zD@|b4O8*DO^m#2E?GftvsrWEfA>~*QoZ&T>%@p8R?!h~s)MN>1j$Ll-4*JWqw zFXJdkS*9xPyiC{*jXu=7EXcUOiw~=M(UmVWX1r6b7@&O4Ch&yy@lpRFtSjS$0KcfiZy z?{bHe@yl^kKSRv!FBzN68lMF|edN2Mu=onD+?+83&2*oxY)*dTjkkniWOH;y@EUg8 zJt!T^MMc*NTc3*mZr*e+OD(kspU0q|VJD2!0k9BB8Xr4+KX%#}VFtU9fi*KPyQE

    7a`dp>082CXtHgYhWJ(} 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 + + + + + + +DbcLib: include/dbc/signal.h Source File + + + + + + + + + + +

    +
    +
    signal.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2* Copyright 2022 Ingemar Hedvall
    +
    3* SPDX-License-Identifier: MIT
    +
    4 */
    +
    8#pragma once
    +
    9#include <cstdint>
    +
    10#include <string>
    +
    11#include <vector>
    +
    12#include <map>
    +
    13#include "dbc/attribute.h"
    +
    14#include "dbc/isampleobserver.h"
    +
    15
    +
    16namespace dbc {
    + +
    19 bool valid = false;
    +
    20 int64_t signed_value = 0;
    +
    21 uint64_t unsigned_value = 0;
    +
    22 double float_value = 0;
    +
    23 std::vector<uint8_t> array_value;
    +
    25 void Clear() {
    +
    26 valid = false;
    +
    27 signed_value = 0;
    + +
    29 float_value = 0;
    +
    30 array_value.clear();
    +
    31 }
    +
    32};
    +
    33
    +
    35enum class SignalDataType : int {
    + + +
    38 FloatData,
    + +
    40};
    +
    41
    +
    48enum class MuxType : int {
    + + + + +
    53};
    +
    54
    +
    56using RangePair = std::pair<size_t, size_t>;
    +
    57
    + +
    60 std::string multiplexor;
    +
    61 std::vector<RangePair> range_list;
    +
    62 [[nodiscard]] bool InRange(size_t value) const;
    +
    63};
    +
    64
    +
    68class Signal {
    +
    69 public:
    +
    70 virtual ~Signal();
    +
    71
    +
    73 void Name(const std::string& name) { name_ = name; }
    +
    75 [[nodiscard]] const std::string& Name() const { return name_; }
    +
    76
    +
    78 void Unit(const std::string& unit) { unit_ = unit; }
    +
    80 [[nodiscard]] const std::string& Unit() const { return unit_; }
    +
    81
    +
    83 void Comment(const std::string& comment) { comment_ = comment; }
    +
    85 [[nodiscard]] const std::string& Comment() const { return comment_; }
    +
    86
    +
    88 void DataType(SignalDataType type) { data_type_ = type; }
    +
    90 [[nodiscard]] SignalDataType DataType() const { return data_type_; }
    +
    92 [[nodiscard]] std::string DataTypeAsString() const;
    +
    93
    +
    95 void Mux(MuxType type) { mux_type_ = type; }
    +
    97 [[nodiscard]] MuxType Mux() const { return mux_type_; }
    +
    99 [[nodiscard]] std::string MuxAsString() const;
    +
    101 void MuxValue(int value) { mux_value_ = value; }
    +
    103 [[nodiscard]] int MuxValue() const { return mux_value_; }
    +
    104
    +
    106 void BitStart(size_t start) { bit_start_ = start; }
    +
    108 [[nodiscard]] size_t BitStart() const { return bit_start_; }
    +
    109
    +
    111 void BitLength(size_t length) { bit_length_ = length; }
    +
    113 [[nodiscard]] size_t BitLength() const { return bit_length_; }
    +
    114
    +
    116 void LittleEndian(bool endian) { little_endian_ = endian; }
    +
    118 [[nodiscard]] bool LittleEndian() const { return little_endian_; }
    +
    119
    +
    120 void Scale(double scale) { scale_ = scale; }
    +
    121 [[nodiscard]] double Scale() const { return scale_; }
    +
    122
    +
    123 void Offset(double offset) { offset_ = offset; }
    +
    124 [[nodiscard]] double Offset() const { return offset_; }
    +
    125
    +
    126 void Min(double min) { min_ = min; }
    +
    127 [[nodiscard]] double Min() const { return min_; }
    +
    128
    +
    129 void Max(double max) { max_ = max; }
    +
    130 [[nodiscard]] double Max() const { return max_; }
    +
    131
    +
    133 void EnumList(const std::map<int64_t, std::string>& enum_list);
    +
    135 [[nodiscard]] const std::map<int64_t, std::string>& EnumList() const;
    +
    136
    +
    138 void Receivers(const std::vector<std::string>& receiver_list);
    +
    140 [[nodiscard]] const std::vector<std::string>& Receivers() const;
    +
    141
    +
    143 [[nodiscard]] const std::vector<Attribute>& Attributes() const {
    +
    144 return attribute_list_;
    +
    145 }
    +
    146
    +
    148 void MessageId(uint64_t message_id) { message_id_ = message_id;}
    +
    150 [[nodiscard]] uint64_t MessageId() const { return message_id_; }
    +
    151
    +
    152 [[nodiscard]] bool IsMultiplexed() const;
    +
    154 [[nodiscard]] Attribute& CreateAttribute(const Attribute& definition);
    +
    156 [[nodiscard]] ExtendedMux& GetExtendedMux();
    +
    157
    +
    159 [[nodiscard]] std::string GetEnumString(int64_t index) const;
    +
    160
    +
    162 void ParseMessage(const std::vector<uint8_t>& message, uint64_t ns1970,
    +
    163 uint32_t can_id);
    +
    165 void ResetSampleCounter() const {sample_counter_ = 0;}
    +
    167 void StepSampleCounter() const {++sample_counter_;}
    +
    169 size_t SampleCounter() const {return sample_counter_;}
    +
    170
    +
    172 void SampleTime(uint64_t ns1970) {sample_time_ = ns1970;}
    +
    174 [[nodiscard]] uint64_t SampleTime() const {return sample_time_;}
    +
    175
    +
    177 void SampleCanId(uint32_t can_id) {sample_can_id_ = can_id;}
    +
    179 [[nodiscard]] uint64_t SampleCanId() const {return sample_can_id_;}
    +
    180
    +
    181 void Valid(bool valid) {valid_ = valid;}
    +
    182 [[nodiscard]] bool Valid() const {return valid_;}
    +
    183
    +
    185 template <typename T>
    +
    186 bool ChannelValue( T& value ) const;
    +
    187
    +
    189 template <typename T>
    +
    190 bool EngValue( T& value ) const;
    +
    191
    +
    193 void AttachObserver(ISampleObserver* observer) const;
    +
    195 void DetachObserver(const ISampleObserver* observer) const;
    +
    196 private:
    +
    197 std::string name_;
    +
    198 std::string comment_;
    +
    199 std::string unit_;
    +
    200
    +
    201 std::vector<std::string> receiver_list_;
    +
    202
    +
    203 MuxType mux_type_ = MuxType::NotMultiplexed;
    +
    204 int mux_value_ = 0;
    +
    205 size_t bit_start_ = 0;
    +
    206 size_t bit_length_ = 0;
    +
    207 bool little_endian_ = true;
    + +
    209 double scale_ = 1.0;
    +
    210 double offset_ = 0.0;
    +
    211 double min_ = 0.0;
    +
    212 double max_ = 0.0;
    +
    213 ExtendedMux extended_mux_;
    +
    214
    +
    215 std::vector<Attribute> attribute_list_;
    +
    216 std::map<int64_t, std::string> enum_list_;
    +
    217
    +
    218 SignalValue channel_value_;
    +
    219
    +
    220 uint64_t message_id_ = 0;
    +
    221 mutable size_t sample_counter_ = 0;
    +
    222 bool valid_ = true;
    +
    223 uint64_t sample_time_ = 0;
    +
    224 uint32_t sample_can_id_ = 0;
    +
    225
    +
    226 mutable std::vector<ISampleObserver*> observer_list_;
    +
    227 void FireOnSample();
    +
    228
    +
    229};
    +
    230
    +
    231template <typename T>
    +
    232bool Signal::ChannelValue(T& value) const {
    +
    233 bool valid = channel_value_.valid && Valid();
    +
    234 value = {};
    +
    235
    +
    236 switch (data_type_) {
    + +
    238 try {
    +
    239 const auto temp = channel_value_.signed_value;
    +
    240 value = static_cast<T>(temp);
    +
    241 } catch (const std::exception&) {
    +
    242 valid = false;
    +
    243 }
    +
    244 break;
    +
    245 }
    +
    246
    + +
    248 size_t bytes = bit_length_ / 8;
    +
    249 if ((bit_length_ % 8) != 0) {
    +
    250 ++bytes;
    +
    251 }
    +
    252 if (bytes > 8) {
    +
    253 valid = false;
    +
    254 } else {
    +
    255 try {
    +
    256 const auto temp = channel_value_.unsigned_value;
    +
    257 value = static_cast<T>(temp);
    +
    258 } catch (const std::exception&) {
    +
    259 valid = false;
    +
    260 }
    +
    261 }
    +
    262 break;
    +
    263 }
    +
    264
    + + +
    267 try {
    +
    268 const auto temp = channel_value_.float_value;
    +
    269 value = static_cast<T>(temp);
    +
    270 } catch (const std::exception&) {
    +
    271 valid = false;
    +
    272 }
    +
    273 break;
    +
    274 }
    +
    275
    +
    276 default:
    +
    277 valid = false;
    +
    278 break;
    +
    279 }
    +
    280 return valid;
    +
    281}
    +
    282
    +
    284template <>
    +
    285bool Signal::ChannelValue(std::string& value) const;
    +
    286
    +
    288template <>
    + +
    290
    +
    291
    +
    292template <typename T>
    +
    293bool Signal::EngValue(T& value) const {
    +
    294 bool valid = false;
    +
    295 value = {};
    +
    296 bool need_to_convert = true;
    +
    297 // If it is an enumerate. We could convert the enum string but that's weird.
    +
    298 if (!enum_list_.empty()) {
    +
    299 need_to_convert = false;
    +
    300 }
    +
    301 // Avoid truncation
    +
    302 if (scale_ == 1.0 && offset_ == 0) {
    +
    303 need_to_convert = false;
    +
    304 }
    +
    305
    +
    306 switch (data_type_) {
    + +
    308 int64_t channel = 0;
    +
    309 valid = ChannelValue(channel);
    +
    310
    +
    311 if (need_to_convert) {
    +
    312 auto temp = static_cast<double>(channel);
    +
    313 temp *= scale_;
    +
    314 temp += offset_;
    +
    315 value = static_cast<T>(temp);
    +
    316 } else {
    +
    317 value = static_cast<T>(channel);
    +
    318 }
    +
    319 break;
    +
    320 }
    +
    321
    + +
    323 uint64_t channel = 0;
    +
    324 valid = ChannelValue(channel);
    +
    325 if (need_to_convert) {
    +
    326 auto temp = static_cast<double>(channel);
    +
    327 temp *= scale_;
    +
    328 temp += offset_;
    +
    329 value = static_cast<T>(temp);
    +
    330 } else {
    +
    331 value = static_cast<T>(channel);
    +
    332 }
    +
    333 break;
    +
    334 }
    +
    335
    + +
    337 float channel = 0;
    +
    338 valid = ChannelValue(channel);
    +
    339 if (need_to_convert) {
    +
    340 auto temp = static_cast<double>(channel);
    +
    341 temp *= scale_;
    +
    342 temp += offset_;
    +
    343 value = static_cast<T>(temp);
    +
    344 } else {
    +
    345 value = static_cast<T>(channel);
    +
    346 }
    +
    347 break;
    +
    348 }
    +
    349
    + +
    351 double channel = 0;
    +
    352 valid = ChannelValue(channel);
    +
    353 if (need_to_convert) {
    +
    354 auto temp = channel;
    +
    355 temp *= scale_;
    +
    356 temp += offset_;
    +
    357 value = static_cast<T>(temp);
    +
    358 } else {
    +
    359 value = static_cast<T>(channel);
    +
    360 }
    +
    361 break;
    +
    362 }
    +
    363
    +
    364 default:
    +
    365 break;
    +
    366 }
    +
    367 return valid;
    +
    368}
    +
    369
    +
    371template <>
    +
    372bool Signal::EngValue(std::string& value) const;
    +
    373
    +
    374} // namespace dbc
    +
    All DBC network objects may have attributes attached to them.
    +
    Support class for handling attributes of network objects.
    Definition: attribute.h:49
    +
    Interface that handles samples. Internal usage.
    Definition: isampleobserver.h:13
    +
    Interface against a DBC signal configuration.
    Definition: signal.h:68
    +
    void BitLength(size_t length)
    Sets the bit length.
    Definition: signal.h:111
    +
    int MuxValue() const
    Returns the multiplexor value.
    Definition: signal.h:103
    +
    size_t BitLength() const
    Returns the bit length.
    Definition: signal.h:113
    +
    bool EngValue(T &value) const
    Returns the scaled engineering value.
    Definition: signal.h:293
    +
    std::string DataTypeAsString() const
    Returns the data type as text.
    +
    double Offset() const
    Return offset.
    Definition: signal.h:124
    +
    void Offset(double offset)
    Sets the offset.
    Definition: signal.h:123
    +
    void Mux(MuxType type)
    Sets the multiplexer type.
    Definition: signal.h:95
    +
    void Max(double max)
    Sets the max range.
    Definition: signal.h:129
    +
    void SampleCanId(uint32_t can_id)
    Sets the CAN ID for the sample.
    Definition: signal.h:177
    +
    void SampleTime(uint64_t ns1970)
    Sets the sample time.
    Definition: signal.h:172
    +
    Attribute & CreateAttribute(const Attribute &definition)
    Creates an attribute.
    +
    uint64_t SampleCanId() const
    Returns the CAN ID for latest sample.
    Definition: signal.h:179
    +
    bool IsMultiplexed() const
    True if multiplexed signal.
    +
    uint64_t MessageId() const
    Returns the message ID that the signal belongs to.
    Definition: signal.h:150
    +
    const std::vector< Attribute > & Attributes() const
    Returns the attribute list.
    Definition: signal.h:143
    +
    size_t SampleCounter() const
    Returns the sample counter.
    Definition: signal.h:169
    +
    std::string GetEnumString(int64_t index) const
    Returns the enumerate text for an index.
    +
    bool Valid() const
    Trie if value is valid.
    Definition: signal.h:182
    +
    void MuxValue(int value)
    Sets the multiplexor value.
    Definition: signal.h:101
    +
    void Unit(const std::string &unit)
    Sets the unit of measure.
    Definition: signal.h:78
    +
    void AttachObserver(ISampleObserver *observer) const
    Attach a sample observer.
    +
    const std::vector< std::string > & Receivers() const
    Return the receiver list.
    +
    bool ChannelValue(T &value) const
    Returns the channel value.
    Definition: signal.h:232
    +
    virtual ~Signal()
    Destructor.
    +
    ExtendedMux & GetExtendedMux()
    Creates an extended multiplexor struct.
    +
    void Scale(double scale)
    Sets the scaling constant.
    Definition: signal.h:120
    +
    void ResetSampleCounter() const
    Resets the sample counter.
    Definition: signal.h:165
    +
    size_t BitStart() const
    Returns the start bit.
    Definition: signal.h:108
    +
    uint64_t SampleTime() const
    Returns the sample time.
    Definition: signal.h:174
    +
    const std::string & Unit() const
    Returns the unit of measure.
    Definition: signal.h:80
    +
    void DetachObserver(const ISampleObserver *observer) const
    Detach a sample observer.
    +
    MuxType Mux() const
    Returns the multiplexer type.
    Definition: signal.h:97
    +
    void Name(const std::string &name)
    Sets the signal name.
    Definition: signal.h:73
    +
    void BitStart(size_t start)
    Sets the start bit.
    Definition: signal.h:106
    +
    void EnumList(const std::map< int64_t, std::string > &enum_list)
    Sets the enumeration.
    +
    double Scale() const
    Scaling constant.
    Definition: signal.h:121
    +
    SignalDataType DataType() const
    Returns the data type.
    Definition: signal.h:90
    +
    void Receivers(const std::vector< std::string > &receiver_list)
    Sets the receiver list.
    +
    void Min(double min)
    Sets min range.
    Definition: signal.h:126
    +
    void Valid(bool valid)
    Set to true if valid value.
    Definition: signal.h:181
    +
    const std::string & Comment() const
    Returns the descriptive text.
    Definition: signal.h:85
    +
    const std::map< int64_t, std::string > & EnumList() const
    Returns the enumeration.
    +
    void DataType(SignalDataType type)
    Sets the data type.
    Definition: signal.h:88
    +
    std::string MuxAsString() const
    Returns the multiplexer type as text.
    +
    bool LittleEndian() const
    Return true if little endian byte order.
    Definition: signal.h:118
    +
    void StepSampleCounter() const
    Steps the sample counter.
    Definition: signal.h:167
    +
    const std::string & Name() const
    Returns the signal name.
    Definition: signal.h:75
    +
    double Max() const
    Max range.
    Definition: signal.h:130
    +
    double Min() const
    Min range.
    Definition: signal.h:127
    +
    void Comment(const std::string &comment)
    Sets the descriptive text.
    Definition: signal.h:83
    +
    void MessageId(uint64_t message_id)
    Sets the signals message ID.
    Definition: signal.h:148
    +
    void ParseMessage(const std::vector< uint8_t > &message, uint64_t ns1970, uint32_t can_id)
    Parse out the signal value from a message data buffer.
    +
    void LittleEndian(bool endian)
    Set true if little endian byte order.
    Definition: signal.h:116
    +
    Internal object that define an observer interface that handle samples.
    +
    Main namespace for the DBC library.
    Definition: attribute.h:13
    +
    SignalDataType
    Signal data type.
    Definition: signal.h:35
    +
    @ SignedData
    Signed integer.
    +
    @ DoubleData
    Double value.
    +
    @ UnsignedData
    Unsigned integer.
    +
    @ FloatData
    Float value.
    +
    MuxType
    Multiplexer type.
    Definition: signal.h:48
    +
    @ Multiplexor
    Multiplexor signal.
    +
    @ Multiplexed
    Multiplexed signal.
    +
    @ NotMultiplexed
    Normal signal.
    +
    @ ExtendedMultiplexor
    Extended multiplexor signal.
    +
    std::pair< size_t, size_t > RangePair
    Min and Max range definition.
    Definition: signal.h:56
    +
    Support function for the extended multiplexor functionality.
    Definition: signal.h:59
    +
    bool InRange(size_t value) const
    True if value is active.
    +
    std::vector< RangePair > range_list
    Active range for the multiplexor.
    Definition: signal.h:61
    +
    std::string multiplexor
    Signal name of the multiplexor.
    Definition: signal.h:60
    +
    Support function that holds the channel value for a signal.
    Definition: signal.h:18
    +
    bool valid
    True if the value is valid.
    Definition: signal.h:19
    +
    void Clear()
    Resets the value.
    Definition: signal.h:25
    +
    std::vector< uint8_t > array_value
    Array or string value.
    Definition: signal.h:23
    +
    int64_t signed_value
    Integer value.
    Definition: signal.h:20
    +
    uint64_t unsigned_value
    Unsigned value.
    Definition: signal.h:21
    +
    double float_value
    Float value.
    Definition: signal.h:22
    +
    + + + + diff --git a/docs/manual/html/signalgroup_8h.html b/docs/manual/html/signalgroup_8h.html new file mode 100644 index 0000000..cfeb4ff --- /dev/null +++ b/docs/manual/html/signalgroup_8h.html @@ -0,0 +1,132 @@ + + + + + + + +DbcLib: include/dbc/signalgroup.h File Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    signalgroup.h File Reference
    +
    +
    + +

    Defines a signal group. +More...

    +
    #include <cstdint>
    +#include <string>
    +#include <vector>
    +
    +Include dependency graph for signalgroup.h:
    +
    +
    + + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  dbc::SignalGroup
     Interface against a signal group. More...
     
    + + + + +

    +Namespaces

    namespace  dbc
     Main namespace for the DBC library.
     
    +
    + + + + diff --git a/docs/manual/html/signalgroup_8h__dep__incl.map b/docs/manual/html/signalgroup_8h__dep__incl.map new file mode 100644 index 0000000..9ba70b7 --- /dev/null +++ b/docs/manual/html/signalgroup_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/manual/html/signalgroup_8h__dep__incl.md5 b/docs/manual/html/signalgroup_8h__dep__incl.md5 new file mode 100644 index 0000000..b8e12d9 --- /dev/null +++ b/docs/manual/html/signalgroup_8h__dep__incl.md5 @@ -0,0 +1 @@ +81421218684eb70dea946a93743e501e \ No newline at end of file diff --git a/docs/manual/html/signalgroup_8h__dep__incl.png b/docs/manual/html/signalgroup_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0c068f3d4939588da7047216b51331441fe7dd GIT binary patch literal 2467 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 literal 0 HcmV?d00001 diff --git a/docs/manual/html/signalgroup_8h__incl.map b/docs/manual/html/signalgroup_8h__incl.map new file mode 100644 index 0000000..41e9033 --- /dev/null +++ b/docs/manual/html/signalgroup_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/manual/html/signalgroup_8h__incl.md5 b/docs/manual/html/signalgroup_8h__incl.md5 new file mode 100644 index 0000000..3da5a47 --- /dev/null +++ b/docs/manual/html/signalgroup_8h__incl.md5 @@ -0,0 +1 @@ +052ab1530b6a0840686f451771dc7010 \ No newline at end of file diff --git a/docs/manual/html/signalgroup_8h__incl.png b/docs/manual/html/signalgroup_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..b18e96cf4a953ebc0e11f6f1db38b2cb6df67354 GIT binary patch literal 3874 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 literal 0 HcmV?d00001 diff --git a/docs/manual/html/signalgroup_8h_source.html b/docs/manual/html/signalgroup_8h_source.html new file mode 100644 index 0000000..9348c35 --- /dev/null +++ b/docs/manual/html/signalgroup_8h_source.html @@ -0,0 +1,129 @@ + + + + + + + +DbcLib: include/dbc/signalgroup.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    signalgroup.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * Copyright 2022 Ingemar Hedvall
    +
    3 * SPDX-License-Identifier: MIT
    +
    4 */
    +
    8#pragma once
    +
    9#include <cstdint>
    +
    10#include <string>
    +
    11#include <vector>
    +
    12namespace dbc {
    +
    13
    + +
    16 public:
    +
    18 void MessageId(uint64_t message_id) { message_id_ = message_id; }
    +
    20 [[nodiscard]] uint64_t MessageId() const { return message_id_; }
    +
    21
    +
    22 void Name( const std::string& name) { name_ = name; }
    +
    23 [[nodiscard]] const std::string& Name() const { return name_; }
    +
    24
    +
    25 void Repetition(size_t rep) { repetition_ = rep; }
    +
    26 [[nodiscard]] size_t Repetition() const {return repetition_;}
    +
    27
    +
    29 void Signals(const std::vector<std::string>& signals );
    +
    31 [[nodiscard]] const std::vector<std::string>& Signals() const;
    +
    32
    +
    33 private:
    +
    34 uint64_t message_id_ = 0;
    +
    35 std::string name_;
    +
    36 size_t repetition_ = 1;
    +
    37 std::vector<std::string> signal_list_;
    +
    38};
    +
    39
    +
    40} // namespace dbc
    +
    Interface against a signal group.
    Definition: signalgroup.h:15
    +
    uint64_t MessageId() const
    Returns the message ID.
    Definition: signalgroup.h:20
    +
    void Signals(const std::vector< std::string > &signals)
    Returns a list of signal names.
    +
    const std::vector< std::string > & Signals() const
    Returns a list of signal names.
    +
    const std::string & Name() const
    Name.
    Definition: signalgroup.h:23
    +
    void Name(const std::string &name)
    Sets the name.
    Definition: signalgroup.h:22
    +
    void Repetition(size_t rep)
    Sets the repetition.
    Definition: signalgroup.h:25
    +
    void MessageId(uint64_t message_id)
    Sets the message ID.
    Definition: signalgroup.h:18
    +
    size_t Repetition() const
    Repetition.
    Definition: signalgroup.h:26
    +
    Main namespace for the DBC library.
    Definition: attribute.h:13
    +
    + + + + diff --git a/docs/manual/html/signalobserver_8h.html b/docs/manual/html/signalobserver_8h.html new file mode 100644 index 0000000..33de603 --- /dev/null +++ b/docs/manual/html/signalobserver_8h.html @@ -0,0 +1,138 @@ + + + + + + + +DbcLib: include/dbc/signalobserver.h File Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    signalobserver.h File Reference
    +
    +
    + +

    The sample observer holds sample values for a signal. +More...

    +
    #include "dbc/isampleobserver.h"
    +#include "dbc/signal.h"
    +#include <utility>
    +#include <memory>
    +
    +Include dependency graph for signalobserver.h:
    +
    +
    + + + + + + + + + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  dbc::SignalObserver
     The sample observer hold a number of samples. More...
     
    + + + + +

    +Namespaces

    namespace  dbc
     Main namespace for the DBC library.
     
    + + + + +

    +Typedefs

    +using dbc::SignalObserverList = std::vector< std::unique_ptr< SignalObserver > >
     List of observer.
     
    +
    + + + + diff --git a/docs/manual/html/signalobserver_8h__incl.map b/docs/manual/html/signalobserver_8h__incl.map new file mode 100644 index 0000000..e1f43b8 --- /dev/null +++ b/docs/manual/html/signalobserver_8h__incl.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/manual/html/signalobserver_8h__incl.md5 b/docs/manual/html/signalobserver_8h__incl.md5 new file mode 100644 index 0000000..239c99c --- /dev/null +++ b/docs/manual/html/signalobserver_8h__incl.md5 @@ -0,0 +1 @@ +db4ba0318e26f39235fd32550c5de27f \ No newline at end of file diff --git a/docs/manual/html/signalobserver_8h__incl.png b/docs/manual/html/signalobserver_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..c924a190baff003a9df60c851db4df7760181f8a GIT binary patch literal 21372 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 d?D4}tTIFT;zP+$Bpwem5=shyjuGX}R_z! + + + + + + +DbcLib: include/dbc/signalobserver.h Source File + + + + + + + + + + + +
    +
    signalobserver.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2* Copyright 2022 Ingemar Hedvall
    +
    3* SPDX-License-Identifier: MIT
    +
    4 */
    +
    8#pragma once
    + +
    10#include "dbc/signal.h"
    +
    11#include <utility>
    +
    12#include <memory>
    +
    13
    +
    14namespace dbc {
    + +
    24 public:
    +
    25 explicit SignalObserver(const Signal& signal);
    +
    26 SignalObserver() = delete;
    +
    27 ~SignalObserver() override;
    +
    28
    +
    30 void MaxSamples(size_t max_nof_samples);
    +
    32 [[nodiscard]] size_t MaxSamples() const { return value_list_.size();}
    +
    33
    +
    35 [[nodiscard]] const Signal& GetSignal() const {return signal_;}
    +
    36
    +
    38 [[nodiscard]] uint64_t Time(size_t index) const;
    +
    39
    +
    41 [[nodiscard]] uint32_t CanId(size_t index) const;
    +
    42
    +
    52 template <typename V>
    +
    53 bool ChannelValue(size_t index, uint64_t& ns1970, V& value) const;
    +
    54
    +
    64 template <typename V>
    +
    65 bool EngValue(size_t index, uint64_t& ns1970, V& value) const;
    +
    66
    + +
    68
    +
    69 [[nodiscard]] size_t FirstIndex() const;
    +
    70 [[nodiscard]] size_t LastIndex() const;
    +
    72 [[nodiscard]] size_t NofSamples() const {return nof_samples_;}
    +
    74 [[nodiscard]] size_t NofValidSamples() const;
    +
    75
    +
    77 [[nodiscard]] size_t SampleToIndex(size_t sample) const;
    +
    78
    +
    80 [[nodiscard]] std::pair<size_t, bool> TimeToIndex(uint64_t time) const;
    +
    81
    +
    82 void DetachObserver() override;
    +
    83 void OnSample() override;
    +
    84
    +
    85 protected:
    +
    86 private:
    +
    88 struct ChannelSample {
    +
    89 uint64_t ns1970 = 0;
    +
    90 uint32_t can_id = 0;
    +
    91 SignalValue value;
    +
    92
    +
    94 [[nodiscard]] uint8_t Source() const {
    +
    95 return static_cast<uint8_t>(can_id & 0xFF);
    +
    96 }
    +
    97 };
    +
    98 const Signal& signal_;
    +
    99 std::vector<ChannelSample> value_list_;
    +
    100
    +
    101 size_t sample_index_ = 0;
    +
    102 size_t nof_samples_ = 0;
    +
    103 bool attached_ = false;
    +
    104};
    +
    105
    +
    106template <typename V>
    +
    107bool SignalObserver::ChannelValue(size_t index, uint64_t& ns1970,
    +
    108 V& value) const {
    +
    109 if (index >= value_list_.size()) {
    +
    110 return false;
    +
    111 }
    +
    112 const auto& sample = value_list_[index];
    +
    113 bool valid = sample.value.valid;
    +
    114 ns1970 = sample.ns1970;
    +
    115
    +
    116 value = {};
    +
    117
    +
    118 switch (signal_.DataType()) {
    + +
    120 try {
    +
    121 const auto temp = sample.value.signed_value;
    +
    122 value = static_cast<V>(temp);
    +
    123 } catch (const std::exception&) {
    +
    124 valid = false;
    +
    125 }
    +
    126 break;
    +
    127 }
    +
    128
    + +
    130 size_t bytes = signal_.BitLength() / 8;
    +
    131 if ((signal_.BitLength() % 8) != 0) {
    +
    132 ++bytes;
    +
    133 }
    +
    134 if (bytes > 8) {
    +
    135 valid = false;
    +
    136 } else {
    +
    137 try {
    +
    138 const auto temp = sample.value.unsigned_value;
    +
    139 value = static_cast<V>(temp);
    +
    140 } catch (const std::exception&) {
    +
    141 valid = false;
    +
    142 }
    +
    143 }
    +
    144 break;
    +
    145 }
    +
    146
    + + +
    149 try {
    +
    150 const auto temp = sample.value.float_value;
    +
    151 value = static_cast<V>(temp);
    +
    152 } catch (const std::exception&) {
    +
    153 valid = false;
    +
    154 }
    +
    155 break;
    +
    156 }
    +
    157
    +
    158 default:
    +
    159 break;
    +
    160 }
    +
    161 return valid;
    +
    162}
    +
    164template <>
    +
    165bool SignalObserver::ChannelValue(size_t index, uint64_t& ns1970,
    +
    166 std::string& value) const;
    +
    167
    +
    168template <typename V>
    +
    169bool SignalObserver::EngValue(size_t index, uint64_t& ns1970,
    +
    170 V& value) const {
    +
    171 if (index >= value_list_.size()) {
    +
    172 return false;
    +
    173 }
    +
    174 const auto& sample = value_list_[index];
    +
    175 bool valid = sample.value.valid;
    +
    176 ns1970 = sample.ns1970;
    +
    177
    +
    178 value = {};
    +
    179
    +
    180 bool need_to_convert = true;
    +
    181 // If it is an enumerate. We could convert the enum string but that's weird.
    +
    182 if (!signal_.EnumList().empty()) {
    +
    183 need_to_convert = false;
    +
    184 }
    +
    185 // Avoid truncation
    +
    186 if (signal_.Scale() == 1.0 && signal_.Offset() == 0) {
    +
    187 need_to_convert = false;
    +
    188 }
    +
    189
    +
    190 switch (signal_.DataType()) {
    + +
    192 int64_t channel = 0;
    +
    193 valid = ChannelValue(index, ns1970, channel);
    +
    194
    +
    195 if (need_to_convert) {
    +
    196 auto temp = static_cast<double>(channel);
    +
    197 temp *= signal_.Scale();
    +
    198 temp += signal_.Offset();
    +
    199 value = static_cast<V>(temp);
    +
    200 } else {
    +
    201 value = static_cast<V>(channel);
    +
    202 }
    +
    203 break;
    +
    204 }
    +
    205
    + +
    207 uint64_t channel = 0;
    +
    208 valid = ChannelValue(index, ns1970, channel);
    +
    209 if (need_to_convert) {
    +
    210 auto temp = static_cast<double>(channel);
    +
    211 temp *= signal_.Scale();
    +
    212 temp += signal_.Offset();
    +
    213 value = static_cast<V>(temp);
    +
    214 } else {
    +
    215 value = static_cast<V>(channel);
    +
    216 }
    +
    217 break;
    +
    218 }
    +
    219
    + +
    221 float channel = 0;
    +
    222 valid = ChannelValue(index, ns1970, channel);
    +
    223 if (need_to_convert) {
    +
    224 auto temp = static_cast<double>(channel);
    +
    225 temp *= signal_.Scale();
    +
    226 temp += signal_.Offset();
    +
    227 value = static_cast<V>(temp);
    +
    228 } else {
    +
    229 value = static_cast<V>(channel);
    +
    230 }
    +
    231 break;
    +
    232 }
    +
    233
    + +
    235 double channel = 0;
    +
    236 valid = ChannelValue(index, ns1970, channel);
    +
    237 if (need_to_convert) {
    +
    238 auto temp = channel;
    +
    239 temp *= signal_.Scale();
    +
    240 temp += signal_.Offset();
    +
    241 value = static_cast<V>(temp);
    +
    242 } else {
    +
    243 value = static_cast<V>(channel);
    +
    244 }
    +
    245 break;
    +
    246 }
    +
    247
    +
    248 default:
    +
    249 break;
    +
    250 }
    +
    251 return valid;
    +
    252}
    +
    253
    +
    255template <>
    +
    256bool SignalObserver::EngValue(size_t index, uint64_t& ns1970,
    +
    257 std::string& value) const;
    +
    258
    +
    260using SignalObserverList = std::vector<std::unique_ptr<SignalObserver>>;
    +
    261
    +
    262} // namespace dbc
    +
    Interface that handles samples. Internal usage.
    Definition: isampleobserver.h:13
    +
    Interface against a DBC signal configuration.
    Definition: signal.h:68
    +
    void BitLength(size_t length)
    Sets the bit length.
    Definition: signal.h:111
    +
    void Offset(double offset)
    Sets the offset.
    Definition: signal.h:123
    +
    void Scale(double scale)
    Sets the scaling constant.
    Definition: signal.h:120
    +
    void EnumList(const std::map< int64_t, std::string > &enum_list)
    Sets the enumeration.
    +
    void DataType(SignalDataType type)
    Sets the data type.
    Definition: signal.h:88
    +
    The sample observer hold a number of samples.
    Definition: signalobserver.h:23
    +
    void OnSample() override
    On sample callback handler.
    +
    size_t NofValidSamples() const
    Returns number of valid samples.
    +
    uint64_t Time(size_t index) const
    Returns the absolute time for a sample.
    +
    void ResetSampleIndex()
    Reset the sample index.
    +
    bool ChannelValue(size_t index, uint64_t &ns1970, V &value) const
    Returns the unscaled signal value.
    Definition: signalobserver.h:107
    +
    size_t FirstIndex() const
    First sample.
    +
    SignalObserver()=delete
    Default constructor.
    +
    void MaxSamples(size_t max_nof_samples)
    Sets the maximum number of samples.
    +
    ~SignalObserver() override
    Default destructor.
    +
    void DetachObserver() override
    Detach an observer.
    +
    const Signal & GetSignal() const
    Returns the signal object.
    Definition: signalobserver.h:35
    +
    std::pair< size_t, bool > TimeToIndex(uint64_t time) const
    Sample time to internal index.
    +
    size_t MaxSamples() const
    Returns the max number of samples.
    Definition: signalobserver.h:32
    +
    size_t NofSamples() const
    Returns number of samples.
    Definition: signalobserver.h:72
    +
    uint32_t CanId(size_t index) const
    Returns the CAN ID for a sample.
    +
    bool EngValue(size_t index, uint64_t &ns1970, V &value) const
    Returns the scaled signal value.
    Definition: signalobserver.h:169
    +
    size_t SampleToIndex(size_t sample) const
    Sample number (0..) to internal index.
    +
    SignalObserver(const Signal &signal)
    Constructor.
    +
    size_t LastIndex() const
    Last sample.
    +
    Internal object that define an observer interface that handle samples.
    +
    Main namespace for the DBC library.
    Definition: attribute.h:13
    +
    @ SignedData
    Signed integer.
    +
    @ DoubleData
    Double value.
    +
    @ UnsignedData
    Unsigned integer.
    +
    @ FloatData
    Float value.
    +
    std::vector< std::unique_ptr< SignalObserver > > SignalObserverList
    List of observer.
    Definition: signalobserver.h:260
    +
    Interface against a DBC signal configuration.
    +
    Support function that holds the channel value for a signal.
    Definition: signal.h:18
    +
    + + + + diff --git a/docs/manual/html/splitbar.png b/docs/manual/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/docs/manual/html/splitbard.png b/docs/manual/html/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..8367416d757fd7b6dc4272b6432dc75a75abd068 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? literal 0 HcmV?d00001 diff --git a/docs/manual/html/structdbc_1_1_extended_mux-members.html b/docs/manual/html/structdbc_1_1_extended_mux-members.html new file mode 100644 index 0000000..df6a5ba --- /dev/null +++ b/docs/manual/html/structdbc_1_1_extended_mux-members.html @@ -0,0 +1,93 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dbc::ExtendedMux Member List
    +
    +
    + +

    This is the complete list of members for dbc::ExtendedMux, including all inherited members.

    + + + + +
    InRange(size_t value) constdbc::ExtendedMux
    multiplexordbc::ExtendedMux
    range_listdbc::ExtendedMux
    + + + + diff --git a/docs/manual/html/structdbc_1_1_extended_mux.html b/docs/manual/html/structdbc_1_1_extended_mux.html new file mode 100644 index 0000000..209fa83 --- /dev/null +++ b/docs/manual/html/structdbc_1_1_extended_mux.html @@ -0,0 +1,118 @@ + + + + + + + +DbcLib: dbc::ExtendedMux Struct Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dbc::ExtendedMux Struct Reference
    +
    +
    + +

    Support function for the extended multiplexor functionality. +

    + +

    #include <signal.h>

    + + + + + +

    +Public Member Functions

    +bool InRange (size_t value) const
     True if value is active.
     
    + + + + + + + +

    +Public Attributes

    +std::string multiplexor
     Signal name of the multiplexor.
     
    +std::vector< RangePairrange_list
     Active range for the multiplexor.
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/manual/html/structdbc_1_1_signal_value-members.html b/docs/manual/html/structdbc_1_1_signal_value-members.html new file mode 100644 index 0000000..3b8cffa --- /dev/null +++ b/docs/manual/html/structdbc_1_1_signal_value-members.html @@ -0,0 +1,96 @@ + + + + + + + +DbcLib: Member List + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dbc::SignalValue Member List
    +
    + + + + + diff --git a/docs/manual/html/structdbc_1_1_signal_value.html b/docs/manual/html/structdbc_1_1_signal_value.html new file mode 100644 index 0000000..d40b744 --- /dev/null +++ b/docs/manual/html/structdbc_1_1_signal_value.html @@ -0,0 +1,130 @@ + + + + + + + +DbcLib: dbc::SignalValue Struct Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    DbcLib 1.0 +
    +
    CAN DBC C++ library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dbc::SignalValue Struct Reference
    +
    +
    + +

    Support function that holds the channel value for a signal. +

    + +

    #include <signal.h>

    + + + + + +

    +Public Member Functions

    +void Clear ()
     Resets the value.
     
    + + + + + + + + + + + + + + + + +

    +Public Attributes

    +bool valid = false
     True if the value is valid.
     
    +int64_t signed_value = 0
     Integer value.
     
    +uint64_t unsigned_value = 0
     Unsigned value.
     
    +double float_value = 0
     Float value.
     
    +std::vector< uint8_t > array_value
     Array or string value.
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/manual/html/sync_off.png b/docs/manual/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/docs/manual/html/sync_on.png b/docs/manual/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/docs/manual/html/tab_a.png b/docs/manual/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/docs/manual/html/tab_ad.png b/docs/manual/html/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..e34850acfc24be58da6d2fd1ccc6b29cc84fe34d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( literal 0 HcmV?d00001 diff --git a/docs/manual/html/tab_s.png b/docs/manual/html/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..ab478c95b67371d700a20869f7de1ddd73522d50 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/docs/manual/html/tab_sd.png b/docs/manual/html/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..757a565ced4730f85c833fb2547d8e199ae68f19 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% literal 0 HcmV?d00001 diff --git a/docs/manual/html/tabs.css b/docs/manual/html/tabs.css new file mode 100644 index 0000000..71c8a47 --- /dev/null +++ b/docs/manual/html/tabs.css @@ -0,0 +1 @@ +.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:0/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:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .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:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.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:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;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{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;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{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;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{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.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:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.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:var(--nav-gradient-image);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:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) 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 var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);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 var(--nav-menu-foreground-color);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:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);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 var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) 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;-moz-border-radius:5px;-webkit-border-radius:5px;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:var(--nav-gradient-image)}.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:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/doxygen/dbclib.css b/doxygen/dbclib.css new file mode 100644 index 0000000..5c54408 --- /dev/null +++ b/doxygen/dbclib.css @@ -0,0 +1,8 @@ + +hr.footer { + display: none; +} + +.footer { + display: none; +} \ No newline at end of file diff --git a/doxygen/mainpage.dox b/doxygen/mainpage.dox index 29f7c1c..f444888 100644 --- a/doxygen/mainpage.dox +++ b/doxygen/mainpage.dox @@ -1,50 +1,22 @@ /* - * Copyright 2022 Ingemar Hedvall + * Copyright 2023 Ingemar Hedvall * SPDX-License-Identifier: MIT */ /** -\mainpage MDF Library +\mainpage DBC C++ Library ##Summary -The MDF Library is a C++ interface against ASAM MDF files. It supports version 3 and 4 of the files. -MDF files are de-facto standard for measurement data files within the automotive industry. It is well -suited for long-term storage of data. +The DBC C++ library is a C++ interface against CAN DBC files. The project consist of the following main components. - C++ Library with all main functionality. -- MDF Viewer GUI application that simply display the content of MDF files. - -## Measurement Data File -The MDF file consist of several linked file block. -For an overview of MDF files see [ASAM MDF wiki](https://www.asam.net/standards/detail/mdf/wiki/). - -The first block is an ID block of 64 bytes. The identification block, -just defines that this is a MDF file and its version. - -The next block is the important HD block. The header block is the main block of the file and holds -the links to all other blocks. It have links the following blocks. - -- Meta Data Blocks. In version 4, the meta data about the measurement can embedded into the file. -- History Blocks. Describes who and what created or modified the file. -- Measurement Data Blocks. Called DG blocks and holds data and channel information. -- Attachment Blocks. Can be referenced or embedded into the file. -- Event Blocks. Events and general messages that happened during the measurement. -- Channel Hierarchy Block. Describe the logical structure for a channel. - -##Building the project - -The project uses CMAKE for building. The following third-party libraries are used and -needs to be downloaded and built. - -- Util Library. Automatically fetched from GitHub. -- Boost Library. Set the 'Boost_ROOT' variable to the Boost root path. -- Expat Library. Set the 'EXPAT_ROOT' variable to the expat root path. -- OpenSSL Library. Set the 'OPENSSL_ROOT' variable to the OpenSSL root path. -- ZLIB Library. Set the 'ZLIB_ROOT' variable to the ZLIB root path. -- WxWidgets Library. Is required if the GUI application should be built. -- Doxygen's application. Is required if the documentation should be built. -- Google Test Library. Is required for running and build the unit +- DBC Viewer GUI application that simply display the content of DBC files. + +The DBC file defines a CAN network. The network consist of devices (nodes), messages and signals. + +The C++ library can also parse a CAN message into signal values. Additional the library support +adding multiple CAN messages into signal sample values. */ diff --git a/doxygen/namespaces.dox b/doxygen/namespaces.dox index ae66ea9..7aa7e9a 100644 --- a/doxygen/namespaces.dox +++ b/doxygen/namespaces.dox @@ -1,13 +1,13 @@ /* - * Copyright 2022 Ingemar Hedvall + * Copyright 2023 Ingemar Hedvall * SPDX-License-Identifier: MIT */ -/** \brief Main namespace for the MDF library. +/** \brief Main namespace for the DBC library. * - * Main namespace for all MDF library classes and functions. + * Main namespace for the DBC C++ library classes and functions. */ -namespace mdf { +namespace dbc { } diff --git a/img/document.ico b/img/document.ico new file mode 100644 index 0000000000000000000000000000000000000000..db23201f657d2e9bcdae338d2c3408aa2acf85bc GIT binary patch literal 43006 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 literal 0 HcmV?d00001 diff --git a/img/mdflib.ico b/img/mdflib.ico new file mode 100644 index 0000000000000000000000000000000000000000..d187a541dcca2aa7493c42c6718a85e006f75913 GIT binary patch literal 136682 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

    ~$m7I|<4q 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 x`~la4ke^+fNu;!t9mk%H z54N!Dxgp)Q%%-5lsrxJqsVibo)Ph;ekQ@@oJN z76HOLWgpyJ+yQRODsVlGy6N8%jdGQ@BnUq2eMaF7T2Ah5zhu6m3kN&^e1Jdr;AZv# z+Y1hD2%!w7IKOH?%rDHo=_+Egt!J8-8e#8$AEE2N$EYW*e>&ipB*Z6DmVmvCri3{eD zfa;_89+gb^E%1q3QioGddDm@^9>LVi^Cu`OW|B$v6a-OIZ&pMwXo>!Wqk8&@UOhG# zPJm__)HcJQ*n86lMn^{#9UVh|FPte)CK8F#{4qVf6c+{`HfZ8m`>*MGUcF*T=V7tf z>Vc7+WWU)_;N9SGIQIR`{dLbw#}ByL>vQOD(h+kf7`Ip?5^ZWy4oUPTtH_gb2lKy7 z@t7vt_3xNWromwNvY2NwnT}{e=#c1nEcrE=a3*4M)4}Q7xCb7O#}Q)ND|ezHDFwYl z>9B&H!f=3O0F5j2)zOE_5EhL~y>a+dYv zBPQS|eqkRy>X3Nj&7e!O4$m|TY=xP#6 zqSNUz{Z8MV&fGYxRwrXHn9ik+)f%P#ITj5c_U*GeJC@k)l(#9B+^#INXI0$$W?AqA zH^U|ch^tBra#e-c0EE<`2Z9Tyn+`nEz_NDjYC3mp#IRc?JQBrOpP94pb{2c%<-5vT zV)Jcs6Zd6)43G)??dDHjlzOd?ixb7$>M#Ohh-1~ENSE8~=*+aI%bm5(N+Pc($6eYR z3#HH$SSm2CltG55a7*C1YcSpcQU}@2LEKl@n+K>FX#jSy`VUdI+xx=}q5W((4BlYq z^hhFH4c|!jQ0z2*Gd2|7fM?@2G1(%dPdJnSq|p-_RW{l*wRP_EvWeB^Ec` z=sTB67w417cet=spQtlxWK%M3UArDshj$LDj_NH%*jUZYhJ=4-kI3eSYMDI2bB7-jOgSj*Ubac z&_4QlTrj+$ESQAiW0i%Gi+J;mzV4h1b#0!)x75dvl)#dsv5=pqKHhBK7Cl1YA1CSg z*_Zz8_HsRUyn=!9AD #include #include namespace dbc { - +/** \brief Define what type of network object the attribute is valid for. + * + */ enum class AttributeType : int { - DbcNetwork, - DbcNode, - DbcMessage, - DbcSignal, - EnvironmentVariable, - NodeSignalRelation, - NodeMessageRelation, + DbcNetwork, ///< Network attribute. + DbcNode, ///< Node/Device attribute. + DbcMessage, ///< Message attribute. + DbcSignal, ///< Signal attribute. + EnvironmentVariable, ///< Environment attribute + NodeSignalRelation, ///< Node signal relation attribute. + NodeMessageRelation, ///< Node message relation attribute. }; +/** \brief Data type of the attribute. + * + */ enum class AttributeValueType : int { - IntegerValue, - FloatValue, - StringValue, - EnumValue, - HexValue + IntegerValue, ///< Integer value. + FloatValue, ///< Floating point value. + StringValue, ///< Text value. + EnumValue, ///< Enumerate value. + HexValue ///< Hexa-decimal value. }; +/** \brief Support class for handling attributes of network objects. + * + * The Attribute class is a support class for handling attributes attached + * to DBC objects. + * + * The DBC file first specify a definition of an attribute. + * This definition defines range and data type i.e. a sort of template. + * + * Then the DBC file define the attribute that references a definition and + * has a value (constant). + */ class Attribute { public: + /** \brief Constructor for an attribute or definition. */ Attribute( AttributeType type, const std::string& name ); + /** \brief Sets the name of the attribute. */ void Name(const std::string& name) { name_ = name; } + /** \brief Retuns the attribute name. */ [[nodiscard]] const std::string& Name() const { return name_; } + /** \brief Sets the type of attribute. */ void Type(AttributeType type ) { type_ = type; } + /** \brief Return type of attribute. */ [[nodiscard]] AttributeType Type() const { return type_; } + /** \brief Sets the attribute data type. */ void ValueType(AttributeValueType type ) { value_type_ = type; } + /** \brief Returns the attribute data type. */ [[nodiscard]] AttributeValueType ValueType() const { return value_type_; } - std::string ValueTypeAsString() const; + /** \brief Returns the attribute data type as string. */ + [[nodiscard]] std::string ValueTypeAsString() const; - void Min(double min ) { min_ = min; } - [[nodiscard]] double Min() const { return min_; } + void Min(double min ) { min_ = min; } ///< Sets the min range + [[nodiscard]] double Min() const { return min_; } ///< Min range. - void Max(double max ) { max_ = max; } - [[nodiscard]] double Max() const { return max_; } + void Max(double max ) { max_ = max; } ///< Sets the max range. + [[nodiscard]] double Max() const { return max_; } ///< Max range. + /** \brief Sets an enumerate string list. */ void EnumList(const std::vector& list); + /** \brief Returns an enumerated string list. */ [[nodiscard]] const std::vector& EnumList() const; + /** \brief Sets the attribute value. */ template void Value(const T& value); + /** \brief Returns the attribute value. */ template - T Value() const; + [[nodiscard]] T Value() const; private: - AttributeType type_ = AttributeType::DbcNetwork; - std::string name_; - AttributeValueType value_type_ = AttributeValueType::StringValue; - double value_float_ = 0.0; - std::string value_string_; - std::vector enum_list_; - double min_ = 0.0; - double max_ = 0.0; + AttributeType type_ = AttributeType::DbcNetwork; ///< Attribute type + std::string name_; ///< Name of attribute. + AttributeValueType value_type_ = + AttributeValueType::StringValue; ///< Attribute data type. + double value_float_ = 0.0; ///< Attribute float value. + std::string value_string_; ///< Attribute text value. + std::vector enum_list_; ///< Attribute enumerate list. + double min_ = 0.0; ///< Min range. + double max_ = 0.0; ///< Max range. }; + template void Attribute::Value(const T& value) { try { @@ -99,11 +131,11 @@ void Attribute::Value(const T& value) { } } +/** \brief Sets an attribute string value. */ template<> void Attribute::Value(const std::string& value); - template T Attribute::Value() const { T value = {}; @@ -124,8 +156,7 @@ T Attribute::Value() const { return value; } - - +/** \brief Returns an attribute string value. */ template <> [[nodiscard]] std::string Attribute::Value() const; diff --git a/include/dbc/dbcfile.h b/include/dbc/dbcfile.h index f40be8d..3ec16c2 100644 --- a/include/dbc/dbcfile.h +++ b/include/dbc/dbcfile.h @@ -2,7 +2,9 @@ * Copyright 2022 Ingemar Hedvall * SPDX-License-Identifier: MIT */ - +/** \file dbcfile.h + * \brief The DBC file object is the main user object. + */ #pragma once #include #include @@ -11,35 +13,73 @@ namespace dbc { +/** \brief Main user object that is an interface against a DBC file. + * + * The DBC file is the only object the user shall create. It handle the parsing + * of the file. A DBC file defines nodes, messages and signals for one CAN + * network. + */ class DbcFile { public: + /** \brief Sets the file name. Full path required. */ void Filename(const std::string& filename) {filename_ = filename; } + /** \brief Returns the file name with full path. */ [[nodiscard]] const std::string& Filename() const {return filename_; } + /** \brief Returns the File name without path and extension. */ [[nodiscard]] std::string Name() const; + /** \brief Returns the last (parser) error text. */ [[nodiscard]] const std::string& LastError() const { return last_error_; } + + /** \brief Returns the network object. */ [[nodiscard]] Network* GetNetwork() { return network_.get(); } + /** \brief Returns the network object. */ [[nodiscard]] const Network* GetNetwork() const { return network_.get(); } + /** \brief Parses the DBC file. Returns true on success. */ [[nodiscard]] bool ParseFile(); + + /** \brief Start time of messages. + * + * The base time is the time of the first message. If not set, the + * AddMessage will set it to the first DBCMessage. + * @param ns1970 Nano-seconds since 1970. + */ void BaseTime(uint64_t ns1970) {base_time_ = ns1970;} + /** \brief Returns the base (start) time of first message. */ [[nodiscard]] uint64_t BaseTime() const {return base_time_;} + + /** \brief Sets the maximum message queue size. */ void SetMessageSize(size_t nof_messages); + /** \brief Adds q message to the message queue. */ void AddMessage(size_t index, const DbcMessage& message); + /** \brief Parses the message into signal values. */ bool ParseMessage(const DbcMessage& message); + /** \brief Resets the sample counter for all signals. */ void ResetSampleCounter() const; + /** \brief Reparse the message queue. + * + * This function is used to reparse the message queue. This function is + * used when the first parse message round just count number of samples + * while the next round, the user selects signals (SignalObserver) and + * reparse the message queue. + * + */ void ReparseMessageList(); private: + /** \brief Parses standard CAN messages. */ bool ParseStandardCAN(const DbcMessage& message); + /** \brief Parses J1939 messages. */ bool ParseJ1939(const DbcMessage& message); + /** \brief Parses NMEA2000 messages. */ bool ParseNMEA2000(const DbcMessage& message); std::string filename_; ///< Full path name mutable std::string last_error_; ///< Last error message - std::unique_ptr network_; - std::vector message_list_; - uint64_t base_time_ = 0; + std::unique_ptr network_; ///< Pointer to the network object. + std::vector message_list_; ///< List of CAN messages. + uint64_t base_time_ = 0; ///< Time that samples times are related to. }; } // namespace dbc diff --git a/include/dbc/dbcmessage.h b/include/dbc/dbcmessage.h index 62ad293..744e001 100644 --- a/include/dbc/dbcmessage.h +++ b/include/dbc/dbcmessage.h @@ -2,34 +2,54 @@ * Copyright 2022 Ingemar Hedvall * SPDX-License-Identifier: MIT */ - +/** \file dbcmessage.h + * \brief Wrapper around a CAN message. + */ #pragma once #include #include namespace dbc { +/** \brief Wrapper class around a CAN message. + * + * Simple support class that holds a CAN message. CAN message has a time, ID + * and none or more data bytes. This sound simple but there are several + * protocols on top of CAN that treat the CAN ID and its data bytes + * differently. + */ class DbcMessage { public: - DbcMessage() = default; + DbcMessage() = default; ///< Default constructor. + /** \brief Constructor that wraps a CAN message. + * + * Constructor that wraps a CAN message. + * @param time Nano-seconds since 1970. + * @param can_id 11/29-bit CAN ID. + * @param data CAN data bytes. + */ DbcMessage(uint64_t time, uint32_t can_id, std::vector data); - DbcMessage(const DbcMessage& message) = default; - void Time(uint64_t ns1970) {time_ = ns1970;} - [[nodiscard]] uint64_t Time() const {return time_;} + DbcMessage(const DbcMessage& message) = default; ///< Default destructor. + + + void Time(uint64_t ns1970) {time_ = ns1970;} ///< Sets the time. + [[nodiscard]] uint64_t Time() const {return time_;} ///< Message time. - void CanId(uint32_t can_id) {can_id_ = can_id;} - [[nodiscard]] uint32_t CanId() const {return can_id_;} + void CanId(uint32_t can_id) {can_id_ = can_id;} ///< Sets the CAN ID. + [[nodiscard]] uint32_t CanId() const {return can_id_;} ///< CAN ID. + /** \brief Sets the CAN data bytes. */ void Data(const std::vector& data) {data_ = data;} + /** \brief Returns the CAN data bytes. */ [[nodiscard]] const std::vector& Data() const {return data_;} - [[nodiscard]] uint32_t Pgn() const; - [[nodiscard]] uint8_t Priority() const; - [[nodiscard]] bool ExtendedDataPage() const; - [[nodiscard]] bool DataPage() const; - [[nodiscard]] uint8_t PduFormat() const; - [[nodiscard]] uint8_t PduSpecific() const; - [[nodiscard]] uint8_t Source() const; + [[nodiscard]] uint32_t Pgn() const; ///< PGN Program number + [[nodiscard]] uint8_t Priority() const; ///< Priority (0-8) + [[nodiscard]] bool ExtendedDataPage() const; ///< True if extended data page. + [[nodiscard]] bool DataPage() const; ///< True if data page. + [[nodiscard]] uint8_t PduFormat() const; ///< PDU format. + [[nodiscard]] uint8_t PduSpecific() const; ///< PDU specific. + [[nodiscard]] uint8_t Source() const; ///< Source number. private: uint64_t time_ = 0; ///< Nanoseconds since 1970 uint32_t can_id_ = 0; ///< 29-bit CAN ID diff --git a/include/dbc/envvar.h b/include/dbc/envvar.h index 0b8cbc0..8fd4db8 100644 --- a/include/dbc/envvar.h +++ b/include/dbc/envvar.h @@ -3,6 +3,9 @@ * SPDX-License-Identifier: MIT */ +/** \file envvar.h + * \brief Wrapper wrong environment variables. + */ #pragma once #include @@ -11,73 +14,88 @@ #include namespace dbc { - +/** \brief The variable data type. */ enum class EnvType : int { - IntegerType = 0, - FloatType = 1, - StringType = 2, - DataType = 3 + IntegerType = 0, ///< Integer variable. + FloatType = 1, ///< Floating point variable. + StringType = 2, ///< Text variable + DataType = 3 ///< Data type variable. }; +/** \brief Type of access. */ enum class AccessType : int { - Unrestricted = 0, - ReadOnly = 1, - WriteOnly = 2, - ReadWrite = 3 + Unrestricted = 0, ///< Unrestricted access. + ReadOnly = 1, ///< Read-only access. + WriteOnly = 2, ///< Write-only access. + ReadWrite = 3 ///< Read and write access. }; +/** \brief Wrapper around an environment DBC variable. */ class EnvVar { public: + /** \brief Sets the name. */ void Name(const std::string& name) { name_ = name; } + /** \brief Retuns the name. */ [[nodiscard]] const std::string& Name() const { return name_; } + /** \brief Sets the descriptive text. */ void Comment(const std::string& comment) { comment_ = comment;} + /** \brief Return the descriptive text. */ [[nodiscard]] const std::string& Comment() const { return comment_; } + /** \brief Sets the data type. */ void Type(EnvType type) { type_ = type; } + /** \brief Returns the data type. */ [[nodiscard]] EnvType Type() const { return type_; } + /** \brief Returns the data type as string. */ [[nodiscard]] std::string TypeAsString() const; - void Min(double min) { min_ = min; } - [[nodiscard]] double Min() const { return min_;} + void Min(double min) { min_ = min; } ///< Sets the min range + [[nodiscard]] double Min() const { return min_;} ///< Min range. - void Max(double max) {max_ = max;} - [[nodiscard]] double Max() const { return max_;} + void Max(double max) {max_ = max;} ///< Sets the max range. + [[nodiscard]] double Max() const { return max_;} ///< Max range. - void Unit(const std::string& unit) { unit_ = unit; } - [[nodiscard]] const std::string& Unit() const { return unit_; } + void Unit(const std::string& unit) { unit_ = unit; } ///< Sets the unit. + [[nodiscard]] const std::string& Unit() const { return unit_; } ///< Unit. + /** \brief Sets the initial value. */ void InitValue(double value) {init_value_ = value;} + /** \brief Returns the initial value. */ [[nodiscard]] double InitValue() const { return init_value_; } - void Ident(uint64_t ident) {ident_ = ident;} - [[nodiscard]] uint64_t Ident() const { return ident_;} + void Ident(uint64_t ident) {ident_ = ident;} ///< Sets the identity. + [[nodiscard]] uint64_t Ident() const { return ident_;} ///< Identity. - void Access(AccessType type) { access_type_ = type; } - [[nodiscard]] AccessType Access() const { return access_type_; } + void Access(AccessType type) { access_type_ = type; } ///< Sets the access. + [[nodiscard]] AccessType Access() const { return access_type_; } ///< Access + /** \brief Sets the node list. */ void NodeList(const std::vector& node_list) { node_list_ = node_list; } + /** \brief Returns the node list. */ [[nodiscard]] const std::vector& NodeList() const { return node_list_; } + /** \brief Sets the enumerate list. */ void EnumList(const std::map& enum_list); + /** \brief Returns the node list. */ [[nodiscard]] const std::map& EnumList() const; private: - std::string name_; - std::string comment_; - EnvType type_ = EnvType::IntegerType; - double min_ = 0.0; - double max_ = 0.0; - std::string unit_; - double init_value_ = 0.0; - uint64_t ident_ = 0; - AccessType access_type_ = AccessType::Unrestricted; - std::vector node_list_; - std::map enum_list_; + std::string name_; ///< Variable name. + std::string comment_; ///< Variable description. + EnvType type_ = EnvType::IntegerType; ///< Variable data type. + double min_ = 0.0; ///< Min range. + double max_ = 0.0; ///< Max range. + std::string unit_; ///< Unit of measure. + double init_value_ = 0.0; ///< Initial value. + uint64_t ident_ = 0; ///< Identity. + AccessType access_type_ = AccessType::Unrestricted; ///< Access type. + std::vector node_list_; ///< Node list. + std::map enum_list_; ///< Enumerate list. }; } // namespace dbc diff --git a/include/dbc/isampleobserver.h b/include/dbc/isampleobserver.h index 81936b0..b7fbe72 100644 --- a/include/dbc/isampleobserver.h +++ b/include/dbc/isampleobserver.h @@ -2,17 +2,20 @@ * Copyright 2022 Ingemar Hedvall * SPDX-License-Identifier: MIT */ - +/** \file isampleobserver.h + * \brief Internal object that define an observer interface that handle samples. + */ #pragma once #include namespace dbc { - +/** \brief Interface that handles samples. Internal usage. + */ class ISampleObserver { public: - ISampleObserver() = default; - virtual ~ISampleObserver() = default; - virtual void OnSample() = 0; - virtual void DetachObserver() = 0; + ISampleObserver() = default; ///< Default constructor. + virtual ~ISampleObserver() = default; ///< Default destructor. + virtual void OnSample() = 0; ///< Handle a sample. + virtual void DetachObserver() = 0; ///< Detach the observer object. }; } // namespace dbc diff --git a/include/dbc/message.h b/include/dbc/message.h index 30343e7..68cbd67 100644 --- a/include/dbc/message.h +++ b/include/dbc/message.h @@ -2,7 +2,9 @@ * Copyright 2022 Ingemar Hedvall * SPDX-License-Identifier: MIT */ - +/** \file message.h + * \brief DBC message configuration object. + */ #pragma once #include #include @@ -13,21 +15,22 @@ #include "dbc/signal.h" namespace dbc { - +/** \brief Sorted list of signal objects. */ using SignalList = std::map; +/** \brief DBC message configuration object. */ class Message { public: - void Ident(uint64_t ident) { + void Ident(uint64_t ident) { ///< Sets the message ID (29-bit) ident_ = ident; } - [[nodiscard]] uint64_t Ident() const { + [[nodiscard]] uint64_t Ident() const { ///< Returns the message ID. return ident_; } - [[nodiscard]] bool IsExtended() const; - [[nodiscard]] bool IsJ1939() const; - [[nodiscard]] uint32_t CanId() const; + [[nodiscard]] bool IsExtended() const; ///< True if 29-bit ID. + [[nodiscard]] bool IsJ1939() const; ///< True if it is a J1939 message. + [[nodiscard]] uint32_t CanId() const; ///< Returns CAN ID. [[nodiscard]] uint8_t Priority() const; ///< J1939 Priority [[nodiscard]] uint32_t Pgn() const; ///< J1939 PGN [[nodiscard]] uint8_t Source() const; ///< J1939 Source @@ -35,72 +38,109 @@ class Message { [[nodiscard]] bool DataPage() const; ///< J1938 Data Page Flag [[nodiscard]] uint8_t PduFormat() const; ///< J1939 PF [[nodiscard]] uint8_t PduSpecific() const; ///< J1939 PS - [[nodiscard]] bool IsPdu1() const; - [[nodiscard]] bool IsPdu2() const; + [[nodiscard]] bool IsPdu1() const; ///< True if PDU1 + [[nodiscard]] bool IsPdu2() const; ///< True if PDU2 + /** \brief Sets the message name. */ void Name(const std::string& name) { name_ = name; } + /** \brief Returns the message name. */ [[nodiscard]] const std::string& Name() const { return name_; } + /** \brief Sets the descriptive text. */ void Comment(const std::string& comment) { comment_ = comment; } + /** \brief Returns the descriptive text. */ [[nodiscard]] const std::string& Comment() const { return comment_; } - void NofBytes(size_t bytes); - [[nodiscard]] size_t NofBytes() const; + void NofBytes(size_t bytes); ///< Sets the number of bytes. + [[nodiscard]] size_t NofBytes() const; ///< Returns the number of bytes. + /** \brief Sets a node name. */ void Node(const std::string& node) { if (node_.empty()) { node_ = node; } sender_list_.push_back(node); } - + /** \brief Returns the node name. */ [[nodiscard]] std::string NodeName() const { return node_; } + /** \brief Returns a signal by its name. */ [[nodiscard]] Signal* GetSignal(const std::string& name); + /** \brief Returns a signal by its name. */ [[nodiscard]] const Signal* GetSignal(const std::string& name) const; + /** \brief Returns the multiplexer signal object. */ [[nodiscard]] Signal* GetMultiplexor(); + + /** \brief Returns an attribute by its name. */ [[nodiscard]] const Attribute* GetAttribute(const std::string& name) const; + /** \brief Returns the signal list. */ [[nodiscard]] const SignalList& Signals() const { return signal_list_; } + + /** \brief Returns a list of sender names. */ [[nodiscard]] const std::vector& Senders() const { return sender_list_; } + + /** \brief Returns a list of attributes. */ [[nodiscard]] const std::vector& Attributes() const { return attribute_list_; } + /** \brief Returns true if the node is a sender. */ [[nodiscard]] bool IsNodeSender(const std::string& node_name) const; + /** \brief Returns the last message data buffer. */ [[nodiscard]] const std::vector& Data() const {return data_;} + + /** \brief Update the internal data buffer. + * + * Sets the internal last message data buffer. Note that the input offset + * and destination offset is used if the message requires more than one + * CAN data message before it is complete. + * + * @param message Message data. + * @param offset Offset in the message data buffer (input index). + * @param data_index Offset in the last message data buffer (dest index). + * @return Returns true if this was the last byte (complete message). + */ bool UpdateData(const std::vector& message, size_t offset = 0, size_t data_index = 0); + /** \brief Parses the message. Internal usage. */ void ParseMessage(uint64_t ns1970, uint32_t can_id); + /** \brief Reset the internal sequence counter. */ void ResetSequenceNumber() {sequence_number_ = 0;} + /** \brief Returns the next sequence number. */ uint8_t NextSequenceNumber() const {return sequence_number_;} - void ResetSampleCounter() const; + void ResetSampleCounter() const; ///< Reset the sample counters. + /** \brief Increments the internal sample counters. */ void StepSampleCounter() const {++sample_counter_;} + /** \brief Returns number of samples. */ size_t SampleCounter() const {return sample_counter_;} + /** \brief Creates an attributes by using its definition. */ Attribute& CreateAttribute(const Attribute& definition); + + /** \brief Create a new signal by its name. */ Signal& CreateSignal(const std::string& name); private: uint64_t ident_; ///< Message ID - std::string name_; - std::string comment_; - std::string node_; + std::string name_; ///< Message name. + std::string comment_; ///< Message description. + std::string node_; ///< Node (ECU) sender name. std::vector sender_list_; ///< Also holds the node name - std::vector attribute_list_; + std::vector attribute_list_; ///< Attribute list. - SignalList signal_list_; + SignalList signal_list_; ///< Signal list. - mutable size_t sample_counter_ = 0; + mutable size_t sample_counter_ = 0; ///< Sample counter. std::vector data_; ///< Store last message and solve >8 byte data uint8_t sequence_number_ = 0; ///< Used to verify multibyte package }; diff --git a/include/dbc/network.h b/include/dbc/network.h index 4717974..30a0218 100644 --- a/include/dbc/network.h +++ b/include/dbc/network.h @@ -2,7 +2,9 @@ * Copyright 2022 Ingemar Hedvall * SPDX-License-Identifier: MIT */ - +/** \file network.h + * \brief Defines a DBC network configuration object. + */ #pragma once #include #include @@ -14,136 +16,183 @@ #include "dbc/signalgroup.h" namespace dbc { - +/** \brief Enumerate list. */ using EnumMap = std::map; +/** \brief Type of CAN protocol. */ enum class ProtocolType : int { - StandardCAN = 0, - J1939 = 1, - NMEA2000 = 2, - OBD2 = 3 + StandardCAN = 0, ///< Standard CAN. + J1939 = 1, ///< J1939 protocol. + NMEA2000 = 2, ///< NMEA protocol. + OBD2 = 3 ///< OBD2 protocol. }; +/** \brief Type of bus. */ enum class BusType : int { - CAN = 0 + CAN = 0 ///< CAN bus }; +/** \brief Sorted message of messages. Message ID is the key. */ using MessageList = std::map; +/** \brief Interface against a DBC network configuration. */ class Network { public: - [[nodiscard]] std::string Name() const; + [[nodiscard]] std::string Name() const; ///< Network name. + /** \brief Sets the file name. */ void Filename(const std::string& filename) { filename_ = filename;} + /** \brief Returns the file name. */ [[nodiscard]] std::string Filename() const {return filename_;}; + /** \brief Sets the protocol type. Should be included in the file but + * sometimes is missing. + * @param type Type of protocol. + */ void Protocol(ProtocolType type); + /** \brief Returns what type of protocol the bus is using. */ [[nodiscard]] ProtocolType Protocol() const; + /** \brief Returns the network protocol as text. */ [[nodiscard]] std::string ProtocolAsString() const; + /** \brief Sets the type of bus. */ void Bus(BusType type); + /** \brief Returns the type of bus. */ [[nodiscard]] BusType Bus() const; + /** \brief Returns the type of bus as text. */ [[nodiscard]] std::string BusAsString() const; + /** \brief Sets the DBC (file) version. */ void Version(const std::string& version) { version_ = version; } + /** \brief Returns the DBC file version. */ [[nodiscard]] const std::string& Version() const { return version_; } - + /** \brief Sets the descriptive text for the DBC file. */ void Comment(const std::string& comment) { comment_ = comment; } + /** \brief Returns the desciptive text. */ [[nodiscard]] const std::string& Comment() const { return comment_; } + /** \brief Returns the node by its name. */ [[nodiscard]] Node* GetNode(const std::string& name); + /** \brief Returns the node by its name. */ [[nodiscard]] const Node* GetNode(const std::string& name) const; + /** \brief Returns the node by its source number. */ [[nodiscard]] const Node* GetNodeBySource(uint8_t source) const; + /** \brief Set to true if this is a J1939 bus. */ void J1939(bool j1939) {j1939_ = j1939;} + /** \brief Returns true if this is a J1939 bus. */ [[nodiscard]] bool J1939() const {return j1939_;} + /** \brief Returns a message object by its message ID. */ [[nodiscard]] Message* GetMessage(uint64_t message_id); + /** \brief Returns a message object by its message ID. */ [[nodiscard]] const Message* GetMessage(uint64_t message_id) const; + /** \brief Returns a message object by its CAN ID. */ [[nodiscard]] Message* GetMessageByCanId(uint64_t can_id); + /** \brief Returns a message object by its CAN ID. */ [[nodiscard]] const Message* GetMessageByCanId(uint64_t can_id) const; + /** \brief Returns a message object by its name. */ [[nodiscard]] const Message* GetMessageByName(const std::string &name) const; + /** \brief Returns a message object by its PGN. */ [[nodiscard]] Message* GetMessageByPgn(uint32_t pgn); + /** \brief Returns a message object by its PGN and source number. */ [[nodiscard]] Message* GetMessageByPgnAndSource(uint32_t pgn, uint8_t source); + + /** \brief Returns a signal by its message ID and signal name. */ [[nodiscard]] Signal* GetSignal(uint64_t message_id, const std::string& signal_name); - + /** \brief Returns a signal by its message ID and signal name. */ [[nodiscard]] const Signal* GetSignal(uint64_t message_id, const std::string& signal_name) const; - + /** \brief Returns a signal by its CAN ID and signal name. */ [[nodiscard]] const Signal* GetSignalByCanId(uint64_t can_id, const std::string& signal_name) const; - + /** \brief Returns a signal by its name. */ [[nodiscard]] const Signal* GetSignalByName( const std::string& signal_name) const; + /** \brief Returns a signal group by its message ID and group name. */ [[nodiscard]] const SignalGroup* GetSignalGroup(uint64_t message_id, const std::string& name) const; - + /** \brief Returns a signal group by its group name. */ [[nodiscard]] const SignalGroup* GetSignalGroupByName( const std::string& name) const; + /** \brief Returns the list of environment variables. */ [[nodiscard]] const std::map& EnvVars() const { return env_var_list_; } + /** \brief Returns the list of messages. */ [[nodiscard]] const MessageList& Messages() const { return message_list_; } + /** \brief Returns the list of Nodes. */ [[nodiscard]] const std::map& Nodes() const { return node_list_; } + /** \brief Returns the list of signal groups. */ [[nodiscard]] const std::vector& SignalGroups() const { return signal_group_list_; } + /** \brief Returns the list of enumerates. */ [[nodiscard]] const std::map& Enums() const { return value_table_list_; } - + /** \brief Returns the list of attributes. */ [[nodiscard]] const std::vector& Attributes() const { return attribute_list_; } + /** \brief Returns an attribute by its name. */ [[nodiscard]] Attribute* GetAttribute(const std::string& name); + /** \brief Returns an attribute by its name. */ [[nodiscard]] const Attribute* GetAttribute(const std::string& name) const; + /** \brief Adds a enumerate. */ void AddValueTable(const std::string& name, const EnumMap& list); + + /** \brief Adds a signal group. */ void AddSignalGroup(const SignalGroup& group); // Parser only functions + /** \brief Parser function that gets/creates an environment variable. */ [[nodiscard]] EnvVar& GetEnvVar(const std::string& name); + /** \brief Parser function that creates a node. */ [[nodiscard]] Node& CreateNode(const std::string& name); + /** \brief Parser function that creates a definition. */ [[nodiscard]] Attribute& CreateDefinition(const std::string& name); + /** \brief Parser function that creates an attribute. */ [[nodiscard]] Attribute& CreateAttribute(const Attribute& definition); + /** \brief Parser function that creates a message. */ [[nodiscard]] Message& CreateMessage(uint64_t message_id); + /** \brief Returns the last message. */ [[nodiscard]] Message* LastMessage(); private: - std::string filename_; - std::string version_; - std::string comment_; - std::map env_var_list_; - uint64_t last_message_id_ = 0; + std::string filename_; ///< File name with path and extension. + std::string version_; ///< File version. + std::string comment_; ///< File description. + std::map env_var_list_; ///< Environment list. + uint64_t last_message_id_ = 0; ///< Parser to track current message. bool j1939_ = false; ///< Indicate if this is a J1939 network // Only define the name and type of value - std::map definition_list_; - std::vector attribute_list_; - - using NodeList = std::map; - NodeList node_list_; - + std::map definition_list_; ///< Definition list. + std::vector attribute_list_; ///< Attribute list. - MessageList message_list_; + using NodeList = std::map; ///< Sorted node list. + NodeList node_list_; ///< Node list. + MessageList message_list_; ///< Message list. - std::map value_table_list_; - std::vector signal_group_list_; + std::map value_table_list_; ///< Enum list. + std::vector signal_group_list_; ///< Signal group list. }; } // namespace dbc diff --git a/include/dbc/node.h b/include/dbc/node.h index a7cf873..cf9cb1e 100644 --- a/include/dbc/node.h +++ b/include/dbc/node.h @@ -2,36 +2,49 @@ * Copyright 2022 Ingemar Hedvall * SPDX-License-Identifier: MIT */ - +/** \file node.h + * \brief Interface against a DBC node (Device(ECU). + */ #pragma once #include #include #include "dbc/attribute.h" namespace dbc { - +/** \brief Interface against a DBC node which normally is an ECU. + * + */ class Node { public: + /** \brief Sets the name. */ void Name(const std::string& name) { name_ = name; } + /** \brief Returns the name. */ [[nodiscard]] const std::string& Name() const { return name_; } + + /** \brief Source number is used in J1939 and is included in the CAN ID. */ void Source(uint8_t source) {source_ = source;}; + /** \brief Source number (J1939). */ [[nodiscard]] uint8_t Source() const; + /** \brief Sets the descriptive text. */ void Comment(const std::string& comment) { comment_ = comment; } + /** \brief Returns the descriptive text. */ [[nodiscard]] const std::string& Comment() const { return comment_; } + /** \brief Returns the attribute list. */ [[nodiscard]] const std::vector& Attributes() const { return attribute_list_; } + /** \brief Creates an attribute. Parser function. */ Attribute& CreateAttribute(const Attribute& definition); + /** \brief Returns an attribute by its name. */ const Attribute* GetAttribute(const std::string& name) const; - private: - std::string name_; - std::string comment_; - std::vector attribute_list_; + std::string name_; ///< Node name. + std::string comment_; ///< Node description. + std::vector attribute_list_; ///< Attribute list. uint8_t source_ = 254; ///< Source Address (254-255 = not defined) }; diff --git a/include/dbc/signal.h b/include/dbc/signal.h index d3a5571..e3f99fb 100644 --- a/include/dbc/signal.h +++ b/include/dbc/signal.h @@ -2,7 +2,9 @@ * Copyright 2022 Ingemar Hedvall * SPDX-License-Identifier: MIT */ - +/** \file signal.h + * \brief Interface against a DBC signal configuration. + */ #pragma once #include #include @@ -12,13 +14,14 @@ #include "dbc/isampleobserver.h" namespace dbc { - +/** \brief Support function that holds the channel value for a signal. */ struct SignalValue { - bool valid = false; - int64_t signed_value = 0; - uint64_t unsigned_value = 0; - double float_value = 0; - std::vector array_value; + bool valid = false; ///< True if the value is valid. + int64_t signed_value = 0; ///< Integer value. + uint64_t unsigned_value = 0; ///< Unsigned value. + double float_value = 0; ///< Float value. + std::vector array_value; ///< Array or string value. + /** \brief Resets the value. */ void Clear() { valid = false; signed_value = 0; @@ -28,144 +31,200 @@ struct SignalValue { } }; +/** \brief Signal data type. */ enum class SignalDataType : int { - SignedData, - UnsignedData, - FloatData, - DoubleData + SignedData, ///< Signed integer. + UnsignedData, ///< Unsigned integer. + FloatData, ///< Float value. + DoubleData ///< Double value }; +/** \brief Multiplexer type. + * + * A signal may be multiplexed i.e. have different value depending on + * another multiplexor signal.Then someone invented the extended multiplexed + * value which makes every thing confusing. + */ enum class MuxType : int { - NotMultiplexed, - Multiplexor, - Multiplexed, - ExtendedMultiplexor + NotMultiplexed, ///< Normal signal + Multiplexor, ///< Multiplexor signal. + Multiplexed, ///< Multiplexed signal. + ExtendedMultiplexor ///< Extended multiplexor signal. }; +/** \brief Min and Max range definition. */ using RangePair = std::pair; + +/** \brief Support function for the extended multiplexor functionality. */ struct ExtendedMux { - std::string multiplexor; - std::vector range_list; - [[nodiscard]] bool InRange(size_t value) const; + std::string multiplexor; ///< Signal name of the multiplexor. + std::vector range_list; ///< Active range for the multiplexor. + [[nodiscard]] bool InRange(size_t value) const; ///< True if value is active. }; +/** \brief Interface against a DBC signal configuration. + * + */ class Signal { public: - virtual ~Signal(); + virtual ~Signal(); ///< Destructor + + /** \brief Sets the signal name. */ void Name(const std::string& name) { name_ = name; } + /** \brief Returns the signal name. */ [[nodiscard]] const std::string& Name() const { return name_; } + /** \brief Sets the unit of measure. */ void Unit(const std::string& unit) { unit_ = unit; } + /** \brief Returns the unit of measure. */ [[nodiscard]] const std::string& Unit() const { return unit_; } + /** \brief Sets the descriptive text. */ void Comment(const std::string& comment) { comment_ = comment; } + /** \brief Returns the descriptive text. */ [[nodiscard]] const std::string& Comment() const { return comment_; } + /** \brief Sets the data type. */ void DataType(SignalDataType type) { data_type_ = type; } + /** \brief Returns the data type. */ [[nodiscard]] SignalDataType DataType() const { return data_type_; } + /** \brief Returns the data type as text. */ [[nodiscard]] std::string DataTypeAsString() const; + /** \brief Sets the multiplexer type. */ void Mux(MuxType type) { mux_type_ = type; } + /** \brief Returns the multiplexer type. */ [[nodiscard]] MuxType Mux() const { return mux_type_; } + /** \brief Returns the multiplexer type as text. */ [[nodiscard]] std::string MuxAsString() const; - + /** \brief Sets the multiplexor value. */ void MuxValue(int value) { mux_value_ = value; } + /** \brief Returns the multiplexor value. */ [[nodiscard]] int MuxValue() const { return mux_value_; } + /** \brief Sets the start bit. */ void BitStart(size_t start) { bit_start_ = start; } + /** \brief Returns the start bit. */ [[nodiscard]] size_t BitStart() const { return bit_start_; } + /** \brief Sets the bit length. */ void BitLength(size_t length) { bit_length_ = length; } + /** \brief Returns the bit length. */ [[nodiscard]] size_t BitLength() const { return bit_length_; } + /** \brief Set true if little endian byte order. */ void LittleEndian(bool endian) { little_endian_ = endian; } + /** \brief Return true if little endian byte order. */ [[nodiscard]] bool LittleEndian() const { return little_endian_; } - void Scale(double scale) { scale_ = scale; } - [[nodiscard]] double Scale() const { return scale_; } + void Scale(double scale) { scale_ = scale; } ///< Sets the scaling constant. + [[nodiscard]] double Scale() const { return scale_; } ///< Scaling constant. - void Offset(double offset) { offset_ = offset; } - [[nodiscard]] double Offset() const { return offset_; } + void Offset(double offset) { offset_ = offset; } ///< Sets the offset + [[nodiscard]] double Offset() const { return offset_; } ///< Return offset. - void Min(double min) { min_ = min; } - [[nodiscard]] double Min() const { return min_; } + void Min(double min) { min_ = min; } ///< Sets min range. + [[nodiscard]] double Min() const { return min_; } ///< Min range. - void Max(double max) { max_ = max; } - [[nodiscard]] double Max() const { return max_; } + void Max(double max) { max_ = max; } ///< Sets the max range. + [[nodiscard]] double Max() const { return max_; } ///< Max range. + /** \brief Sets the enumeration. */ void EnumList(const std::map& enum_list); + /** \brief Returns the enumeration. */ [[nodiscard]] const std::map& EnumList() const; + /** \brief Sets the receiver list. */ void Receivers(const std::vector& receiver_list); + /** \brief Return the receiver list. */ [[nodiscard]] const std::vector& Receivers() const; + /** \brief Returns the attribute list. */ [[nodiscard]] const std::vector& Attributes() const { return attribute_list_; } + /** \brief Sets the signals message ID. */ void MessageId(uint64_t message_id) { message_id_ = message_id;} + /** \brief Returns the message ID that the signal belongs to. */ [[nodiscard]] uint64_t MessageId() const { return message_id_; } - [[nodiscard]] bool IsMultiplexed() const; - + [[nodiscard]] bool IsMultiplexed() const; ///< True if multiplexed signal. + /** \brief Creates an attribute. */ [[nodiscard]] Attribute& CreateAttribute(const Attribute& definition); + /** \brief Creates an extended multiplexor struct. */ [[nodiscard]] ExtendedMux& GetExtendedMux(); + + /** \brief Returns the enumerate text for an index. */ [[nodiscard]] std::string GetEnumString(int64_t index) const; + /** \brief Parse out the signal value from a message data buffer. */ void ParseMessage(const std::vector& message, uint64_t ns1970, uint32_t can_id); + /** \brief Resets the sample counter. */ void ResetSampleCounter() const {sample_counter_ = 0;} + /** \brief Steps the sample counter. */ void StepSampleCounter() const {++sample_counter_;} + /** \brief Returns the sample counter. */ size_t SampleCounter() const {return sample_counter_;} + /** \brief Sets the sample time. */ void SampleTime(uint64_t ns1970) {sample_time_ = ns1970;} + /** \brief Returns the sample time. */ [[nodiscard]] uint64_t SampleTime() const {return sample_time_;} + /** \brief Sets the CAN ID for the sample. */ void SampleCanId(uint32_t can_id) {sample_can_id_ = can_id;} + /** \brief Returns the CAN ID for latest sample. */ [[nodiscard]] uint64_t SampleCanId() const {return sample_can_id_;} - void Valid(bool valid) {valid_ = valid;} - [[nodiscard]] bool Valid() const {return valid_;} + void Valid(bool valid) {valid_ = valid;} ///< Set to true if valid value. + [[nodiscard]] bool Valid() const {return valid_;} ///< Trie if value is valid. + + /** \brief Returns the channel value. */ template bool ChannelValue( T& value ) const; + /** \brief Returns the scaled engineering value. */ template bool EngValue( T& value ) const; + /** \brief Attach a sample observer. */ void AttachObserver(ISampleObserver* observer) const; + /** \brief Detach a sample observer. */ void DetachObserver(const ISampleObserver* observer) const; private: - std::string name_; - std::string comment_; - std::string unit_; - - std::vector receiver_list_; - - MuxType mux_type_ = MuxType::NotMultiplexed; - int mux_value_ = 0; - size_t bit_start_ = 0; - size_t bit_length_ = 0; - bool little_endian_ = true; - SignalDataType data_type_ = SignalDataType::SignedData; - double scale_ = 1.0; - double offset_ = 0.0; - double min_ = 0.0; - double max_ = 0.0; - ExtendedMux extended_mux_; - - std::vector attribute_list_; - std::map enum_list_; + std::string name_; ///< Signal nsame. + std::string comment_; ///< Signal description. + std::string unit_; ///< Signal unit. + + std::vector receiver_list_; ///< Receiver list. + + MuxType mux_type_ = MuxType::NotMultiplexed; ///< Multiplexer type. + int mux_value_ = 0; ///< Temporary storage of mux value. + size_t bit_start_ = 0; ///< Bit start. + size_t bit_length_ = 0; ///< Bit length. + bool little_endian_ = true; ///< Byte order. True if little endian. + SignalDataType data_type_ = SignalDataType::SignedData; ///< Data type. + double scale_ = 1.0; ///< Scale + double offset_ = 0.0; ///< Offset + double min_ = 0.0; ///< Min range + double max_ = 0.0; ///< Max range. + ExtendedMux extended_mux_; ///< Extended mux support struct. + + std::vector attribute_list_; ///< Attribute list. + std::map enum_list_; ///< Enumeration list. SignalValue channel_value_; ///< Unscaled value (last reported value) - uint64_t message_id_ = 0; - mutable size_t sample_counter_ = 0; - bool valid_ = true; + uint64_t message_id_ = 0; ///< Message ID of last message. + mutable size_t sample_counter_ = 0; ///< Number of samples received. + bool valid_ = true; ///< Trie if valid. uint64_t sample_time_ = 0; ///< Last sample time uint32_t sample_can_id_ = 0; ///< Last Can ID - mutable std::vector observer_list_; - void FireOnSample(); + mutable std::vector observer_list_; ///< Observer list. + void FireOnSample(); ///< Fire OnSample event. }; @@ -221,12 +280,15 @@ bool Signal::ChannelValue(T& value) const { return valid; } +/** \brief Returns the signal value as a string */ template <> bool Signal::ChannelValue(std::string& value) const; +/** \brief Returns the signal value as a signal value */ template <> bool Signal::ChannelValue(SignalValue& value) const; + template bool Signal::EngValue(T& value) const { bool valid = false; @@ -305,7 +367,7 @@ bool Signal::EngValue(T& value) const { return valid; } - +/** \brief Returns the engineering value as a string value */ template <> bool Signal::EngValue(std::string& value) const; diff --git a/include/dbc/signalgroup.h b/include/dbc/signalgroup.h index d421653..e9ca7a2 100644 --- a/include/dbc/signalgroup.h +++ b/include/dbc/signalgroup.h @@ -2,32 +2,39 @@ * Copyright 2022 Ingemar Hedvall * SPDX-License-Identifier: MIT */ - +/** \file signalgroup.h + * \brief Defines a signal group. + */ #pragma once #include #include #include namespace dbc { +/** \brief Interface against a signal group. */ class SignalGroup { public: + /** \brief Sets the message ID. */ void MessageId(uint64_t message_id) { message_id_ = message_id; } + /** \brief Returns the message ID. */ [[nodiscard]] uint64_t MessageId() const { return message_id_; } - void Name( const std::string& name) { name_ = name; } - [[nodiscard]] const std::string& Name() const { return name_; } + void Name( const std::string& name) { name_ = name; } ///< Sets the name. + [[nodiscard]] const std::string& Name() const { return name_; } ///< Name - void Repetition(size_t rep) { repetition_ = rep; } - [[nodiscard]] size_t Repetition() const { return repetition_; } + void Repetition(size_t rep) { repetition_ = rep; } ///< Sets the repetition. + [[nodiscard]] size_t Repetition() const {return repetition_;} ///< Repetition + /** \brief Returns a list of signal names. */ void Signals(const std::vector& signals ); + /** \brief Returns a list of signal names. */ [[nodiscard]] const std::vector& Signals() const; private: - uint64_t message_id_ = 0; - std::string name_; - size_t repetition_ = 1; - std::vector signal_list_; + uint64_t message_id_ = 0; ///< Message eID. + std::string name_; ///< Name. + size_t repetition_ = 1; ///< Repetition. + std::vector signal_list_; ///< Signal list. }; } // namespace dbc diff --git a/include/dbc/signalobserver.h b/include/dbc/signalobserver.h index 31ff3ad..a854391 100644 --- a/include/dbc/signalobserver.h +++ b/include/dbc/signalobserver.h @@ -2,7 +2,9 @@ * Copyright 2022 Ingemar Hedvall * SPDX-License-Identifier: MIT */ - +/** \file signalobserver.h + * \brief The sample observer holds sample values for a signal. + */ #pragma once #include "dbc/isampleobserver.h" #include "dbc/signal.h" @@ -10,53 +12,95 @@ #include namespace dbc { - +/** \brief The sample observer hold a number of samples. + * + * The observer holds signal values in a circular buffer of + * a maximum number of samples size. The user shall access the samples + * in normal sample order i.e the first sample is 0 while the internal circular + * index might be something else. + * + */ class SignalObserver : public ISampleObserver { public: - explicit SignalObserver(const Signal& signal); - SignalObserver() = delete; - ~SignalObserver() override; + explicit SignalObserver(const Signal& signal); ///< Constructor + SignalObserver() = delete; ///< Default constructor. + ~SignalObserver() override; ///< Default destructor. + /** \brief Sets the maximum number of samples. */ void MaxSamples(size_t max_nof_samples); + /** \brief Returns the max number of samples. */ [[nodiscard]] size_t MaxSamples() const { return value_list_.size();} + + /** \brief Returns the signal object. */ [[nodiscard]] const Signal& GetSignal() const {return signal_;} + + /** \brief Returns the absolute time for a sample. */ [[nodiscard]] uint64_t Time(size_t index) const; + + /** \brief Returns the CAN ID for a sample. */ [[nodiscard]] uint32_t CanId(size_t index) const; + + /** \brief Returns the unscaled signal value. + * + * Returns the unscaled signal value for a specific sample. + * @tparam V Value type. + * @param index Sample index (0..). + * @param ns1970 Sample time nano-seconds since 1970. + * @param value Sample value. + * @return True if value is valid. + */ template bool ChannelValue(size_t index, uint64_t& ns1970, V& value) const; + /** \brief Returns the scaled signal value. + * + * Returns the scaled signal value for a specific sample. + * @tparam V Value type. + * @param index Sample index (0..). + * @param ns1970 Sample time nano-seconds since 1970. + * @param value Sample value. + * @return True if value is valid. + */ template bool EngValue(size_t index, uint64_t& ns1970, V& value) const; - void ResetSampleIndex(); + void ResetSampleIndex(); ///< Reset the sample index - [[nodiscard]] size_t FirstIndex() const; - [[nodiscard]] size_t LastIndex() const; + [[nodiscard]] size_t FirstIndex() const; ///< First sample. + [[nodiscard]] size_t LastIndex() const; ///< Last sample. + /** \brief Returns number of samples. */ [[nodiscard]] size_t NofSamples() const {return nof_samples_;} + /** \brief Returns number of valid samples. */ [[nodiscard]] size_t NofValidSamples() const; + /** \brief Sample number (0..) to internal index. */ [[nodiscard]] size_t SampleToIndex(size_t sample) const; + + /** \brief Sample time to internal index. */ [[nodiscard]] std::pair TimeToIndex(uint64_t time) const; - void DetachObserver() override; - void OnSample() override; + + void DetachObserver() override; ///< Detach an observer. + void OnSample() override; ///< On sample callback handler. protected: private: + /** \brief Sample value. */ struct ChannelSample { - uint64_t ns1970; - uint32_t can_id; - SignalValue value; + uint64_t ns1970 = 0; ///< Nano-seconds since 1970. + uint32_t can_id = 0; ///< CAN ID + SignalValue value; ///< Unscaled signal value. + /** \brief Returns the source number from the CAN ID. */ [[nodiscard]] uint8_t Source() const { return static_cast(can_id & 0xFF); } }; - const Signal& signal_; + const Signal& signal_; ///< Reference to the signal configuration. std::vector value_list_; ///< Channel values size_t sample_index_ = 0; ///< Points on next index - size_t nof_samples_ = 0; - bool attached_ = false; + size_t nof_samples_ = 0; ///< Number of samples. + bool attached_ = false; ///< True if the observer is attached. }; template @@ -116,7 +160,7 @@ bool SignalObserver::ChannelValue(size_t index, uint64_t& ns1970, } return valid; } - +/** \brief Returns the unscaled signal value as a string. */ template <> bool SignalObserver::ChannelValue(size_t index, uint64_t& ns1970, std::string& value) const; @@ -207,10 +251,12 @@ bool SignalObserver::EngValue(size_t index, uint64_t& ns1970, return valid; } +/** \brief Returns the scaled signal value as a string' */ template <> bool SignalObserver::EngValue(size_t index, uint64_t& ns1970, std::string& value) const; +/** \brief List of observer. */ using SignalObserverList = std::vector>; } // namespace dbc