diff --git a/docs/html/README_8md.html b/docs/html/README_8md.html new file mode 100644 index 0000000..35bda58 --- /dev/null +++ b/docs/html/README_8md.html @@ -0,0 +1,56 @@ + + + + + + + +DBC framework: README.md File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
README.md File Reference
+
+
+
+ + + + diff --git a/docs/html/annotated.html b/docs/html/annotated.html new file mode 100644 index 0000000..bfbb64b --- /dev/null +++ b/docs/html/annotated.html @@ -0,0 +1,77 @@ + + + + + + + +DBC framework: Class List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+ + + + + + + + + + + + + + + + + +
 CDbcDatabaseParsed DBC content stored in a simple internal form
 CDbcDecodeBuilderConverts parsed DBC data into runtime decode database
 CDbcDecoderRuntime CAN decoder using prebuilt decode database
 CDbcParserMinimal DBC parser
 CDbcTreeBuilderBuilds a simple tree from parsed DBC database
 CDecodeDatabaseRuntime decode database with fast lookup by CAN ID
 CDecodedFrameValueFully decoded frame
 CDecodedSignalValueOne decoded signal value
 CDecodeFrameRuntime-ready frame definition
 CDecodeSignalRuntime-ready signal definition
 CFrameInfoDescribes one CAN frame from a DBC file
 CFrameKeyKey for fast frame lookup
 CFrameKeyHasherHasher for frame key
 CRawCanFrameRaw CAN frame used for runtime or trace decoding
 CSignalInfoDescribes one signal inside a DBC frame
 CTreeNodeTree node for later use in model/view or other hierarchy consumers
+
+
+ + + + diff --git a/docs/html/bc_s.png b/docs/html/bc_s.png new file mode 100644 index 0000000..224b29a Binary files /dev/null and b/docs/html/bc_s.png differ diff --git a/docs/html/bdwn.png b/docs/html/bdwn.png new file mode 100644 index 0000000..940a0b9 Binary files /dev/null and b/docs/html/bdwn.png differ diff --git a/docs/html/classDbcDecodeBuilder-members.html b/docs/html/classDbcDecodeBuilder-members.html new file mode 100644 index 0000000..79f5a08 --- /dev/null +++ b/docs/html/classDbcDecodeBuilder-members.html @@ -0,0 +1,61 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DbcDecodeBuilder Member List
+
+
+ +

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

+ + +
Build(const DbcDatabase &source) constDbcDecodeBuilder
+ + + + diff --git a/docs/html/classDbcDecodeBuilder.html b/docs/html/classDbcDecodeBuilder.html new file mode 100644 index 0000000..c69d60b --- /dev/null +++ b/docs/html/classDbcDecodeBuilder.html @@ -0,0 +1,114 @@ + + + + + + + +DBC framework: DbcDecodeBuilder Class Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Public Member Functions | +List of all members
+
DbcDecodeBuilder Class Reference
+
+
+ +

Converts parsed DBC data into runtime decode database. + More...

+ +

#include <dbc_decode_builder.h>

+ + + + + +

+Public Member Functions

DecodeDatabase Build (const DbcDatabase &source) const
 Build runtime decode database. More...
 
+

Detailed Description

+

Converts parsed DBC data into runtime decode database.

+ +

Definition at line 21 of file dbc_decode_builder.h.

+

Member Function Documentation

+ +

◆ Build()

+ +
+
+ + + + + + + + +
DecodeDatabase DbcDecodeBuilder::Build (const DbcDatabasesource) const
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classDbcDecoder-members.html b/docs/html/classDbcDecoder-members.html new file mode 100644 index 0000000..550ff86 --- /dev/null +++ b/docs/html/classDbcDecoder-members.html @@ -0,0 +1,66 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DbcDecoder Member List
+
+
+ +

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

+ + + + + + + +
Decode(const DecodeDatabase &database, const RawCanFrame &frame) constDbcDecoder
ExtractIntel(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)DbcDecoderprivatestatic
ExtractMotorola(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)DbcDecoderprivatestatic
ExtractUnsigned(const std::vector< std::uint8_t > &data, const DecodeSignal &signal, std::uint64_t &value)DbcDecoderprivatestatic
FindFrame(const DecodeDatabase &database, std::uint32_t canId, bool isExtended) constDbcDecoder
SignExtend(std::uint64_t value, std::uint32_t bitLength)DbcDecoderprivatestatic
+ + + + diff --git a/docs/html/classDbcDecoder.html b/docs/html/classDbcDecoder.html new file mode 100644 index 0000000..7c48056 --- /dev/null +++ b/docs/html/classDbcDecoder.html @@ -0,0 +1,383 @@ + + + + + + + +DBC framework: DbcDecoder Class Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Public Member Functions | +Static Private Member Functions | +List of all members
+
DbcDecoder Class Reference
+
+
+ +

Runtime CAN decoder using prebuilt decode database. + More...

+ +

#include <dbc_decoder.h>

+ + + + + + + + +

+Public Member Functions

const DecodeFrameFindFrame (const DecodeDatabase &database, std::uint32_t canId, bool isExtended) const
 Find frame definition by CAN ID. More...
 
DecodedFrameValue Decode (const DecodeDatabase &database, const RawCanFrame &frame) const
 Decode one raw CAN frame. More...
 
+ + + + + + + + + +

+Static Private Member Functions

static bool ExtractUnsigned (const std::vector< std::uint8_t > &data, const DecodeSignal &signal, std::uint64_t &value)
 
static bool ExtractIntel (const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)
 
static bool ExtractMotorola (const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)
 
static std::int64_t SignExtend (std::uint64_t value, std::uint32_t bitLength)
 
+

Detailed Description

+

Runtime CAN decoder using prebuilt decode database.

+ +

Definition at line 70 of file dbc_decoder.h.

+

Member Function Documentation

+ +

◆ Decode()

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

◆ ExtractIntel()

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

Definition at line 82 of file dbc_decoder.cpp.

+ +

Referenced by ExtractUnsigned().

+ +
+
+ +

◆ ExtractMotorola()

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

Definition at line 105 of file dbc_decoder.cpp.

+ +

Referenced by ExtractUnsigned().

+ +
+
+ +

◆ ExtractUnsigned()

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

Definition at line 70 of file dbc_decoder.cpp.

+ +

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

+ +

Referenced by Decode().

+ +
+
+ +

◆ FindFrame()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
const DecodeFrame * DbcDecoder::FindFrame (const DecodeDatabasedatabase,
std::uint32_t canId,
bool isExtended 
) const
+
+ +

Find frame definition by CAN ID.

+
Parameters
+ + + + +
databaseRuntime decode database.
canIdNormalized CAN ID.
isExtendedtrue for extended frame.
+
+
+
Returns
Pointer to frame definition or nullptr.
+ +

Definition at line 14 of file dbc_decoder.cpp.

+ +

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

+ +

Referenced by Decode().

+ +
+
+ +

◆ SignExtend()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::int64_t DbcDecoder::SignExtend (std::uint64_t value,
std::uint32_t bitLength 
)
+
+staticprivate
+
+ +

Definition at line 144 of file dbc_decoder.cpp.

+ +

Referenced by Decode().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classDbcParser-members.html b/docs/html/classDbcParser-members.html new file mode 100644 index 0000000..13cf41d --- /dev/null +++ b/docs/html/classDbcParser-members.html @@ -0,0 +1,73 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DbcParser Member List
+
+
+ +

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

+ + + + + + + + + + + + + + +
FindFrameById(DbcDatabase &database, std::uint32_t canId, bool isExtended)DbcParserprivatestatic
FindSignalByName(FrameInfo &frame, const std::string &signalName)DbcParserprivatestatic
IsCommentLine(const std::string &line)DbcParserprivatestatic
IsFrameLine(const std::string &line)DbcParserprivatestatic
IsSignalLine(const std::string &line)DbcParserprivatestatic
NormalizeCanId(std::uint32_t rawCanId, std::uint32_t &normalizedCanId, bool &isExtended)DbcParserprivatestatic
ParseCommentLine(const std::string &line, DbcDatabase &database)DbcParserprivatestatic
ParseFile(const std::string &filePath) constDbcParser
ParseFrameLine(const std::string &line)DbcParserprivatestatic
ParseSignalLine(const std::string &line)DbcParserprivatestatic
SplitReceivers(const std::string &text)DbcParserprivatestatic
Trim(const std::string &text)DbcParserprivatestatic
TryExtractPgn(std::uint32_t canId, bool isExtended, bool &hasPgn)DbcParserprivatestatic
+ + + + diff --git a/docs/html/classDbcParser.html b/docs/html/classDbcParser.html new file mode 100644 index 0000000..95bb025 --- /dev/null +++ b/docs/html/classDbcParser.html @@ -0,0 +1,601 @@ + + + + + + + +DBC framework: DbcParser Class Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Public Member Functions | +Static Private Member Functions | +List of all members
+
DbcParser Class Reference
+
+
+ +

Minimal DBC parser. + More...

+ +

#include <dbc_parser.h>

+ + + + + +

+Public Member Functions

DbcDatabase ParseFile (const std::string &filePath) const
 Parse DBC file. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Private Member Functions

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

Detailed Description

+

Minimal DBC parser.

+

Supports:

+

Ignores:

+ +

Definition at line 35 of file dbc_parser.h.

+

Member Function Documentation

+ +

◆ FindFrameById()

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

Definition at line 337 of file dbc_parser.cpp.

+ +

References DbcDatabase::frames.

+ +

Referenced by ParseCommentLine().

+ +
+
+ +

◆ FindSignalByName()

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

Definition at line 349 of file dbc_parser.cpp.

+ +

References FrameInfo::signals.

+ +

Referenced by ParseCommentLine().

+ +
+
+ +

◆ IsCommentLine()

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

Definition at line 79 of file dbc_parser.cpp.

+ +

Referenced by ParseFile().

+ +
+
+ +

◆ IsFrameLine()

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

Definition at line 71 of file dbc_parser.cpp.

+ +

Referenced by ParseFile().

+ +
+
+ +

◆ IsSignalLine()

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

Definition at line 75 of file dbc_parser.cpp.

+ +

Referenced by ParseFile().

+ +
+
+ +

◆ NormalizeCanId()

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

Definition at line 101 of file dbc_parser.cpp.

+ +

Referenced by ParseCommentLine(), and ParseFrameLine().

+ +
+
+ +

◆ ParseCommentLine()

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

Definition at line 274 of file dbc_parser.cpp.

+ +

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

+ +

Referenced by ParseFile().

+ +
+
+ +

◆ ParseFile()

+ +
+
+ + + + + + + + +
DbcDatabase DbcParser::ParseFile (const std::string & filePath) const
+
+ +

Parse DBC file.

+
Parameters
+ + +
filePathPath to input file.
+
+
+
Returns
Parsed database.
+
Exceptions
+ + +
std::runtime_erroron file or parse errors.
+
+
+ +

Definition at line 40 of file dbc_parser.cpp.

+ +

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

+ +

Referenced by main().

+ +
+
+ +

◆ ParseFrameLine()

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

◆ ParseSignalLine()

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

◆ SplitReceivers()

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

Definition at line 87 of file dbc_parser.cpp.

+ +

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

+ +

Referenced by ParseSignalLine().

+ +
+
+ +

◆ Trim()

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

Definition at line 83 of file dbc_parser.cpp.

+ +

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

+ +

Referenced by ParseFile().

+ +
+
+ +

◆ TryExtractPgn()

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

Definition at line 118 of file dbc_parser.cpp.

+ +

Referenced by ParseFrameLine().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classDbcTreeBuilder-members.html b/docs/html/classDbcTreeBuilder-members.html new file mode 100644 index 0000000..1c0bc40 --- /dev/null +++ b/docs/html/classDbcTreeBuilder-members.html @@ -0,0 +1,61 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DbcTreeBuilder Member List
+
+
+ +

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

+ + +
Build(const DbcDatabase &database) constDbcTreeBuilder
+ + + + diff --git a/docs/html/classDbcTreeBuilder.html b/docs/html/classDbcTreeBuilder.html new file mode 100644 index 0000000..fa81693 --- /dev/null +++ b/docs/html/classDbcTreeBuilder.html @@ -0,0 +1,114 @@ + + + + + + + +DBC framework: DbcTreeBuilder Class Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Public Member Functions | +List of all members
+
DbcTreeBuilder Class Reference
+
+
+ +

Builds a simple tree from parsed DBC database. + More...

+ +

#include <dbc_tree_builder.h>

+ + + + + +

+Public Member Functions

std::unique_ptr< TreeNodeBuild (const DbcDatabase &database) const
 Build tree representation of parsed DBC data. More...
 
+

Detailed Description

+

Builds a simple tree from parsed DBC database.

+ +

Definition at line 23 of file dbc_tree_builder.h.

+

Member Function Documentation

+ +

◆ Build()

+ +
+
+ + + + + + + + +
std::unique_ptr< TreeNode > DbcTreeBuilder::Build (const DbcDatabasedatabase) const
+
+ +

Build tree representation of parsed DBC data.

+
Parameters
+ + +
databaseParsed database.
+
+
+
Returns
Root node of the tree.
+ +

Definition at line 14 of file dbc_tree_builder.cpp.

+ +

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

+ +

Referenced by main().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classTreeNode-members.html b/docs/html/classTreeNode-members.html new file mode 100644 index 0000000..4095d06 --- /dev/null +++ b/docs/html/classTreeNode-members.html @@ -0,0 +1,81 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
TreeNode Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + +
AddChild(std::unique_ptr< TreeNode > child)TreeNode
GetChild(std::size_t index) constTreeNode
GetChild(std::size_t index)TreeNode
GetChildCount() constTreeNode
GetFrame() constTreeNode
GetName() constTreeNode
GetSignal() constTreeNode
GetType() constTreeNode
m_childrenTreeNodeprivate
m_frameTreeNodeprivate
m_nameTreeNodeprivate
m_signalTreeNodeprivate
m_typeTreeNodeprivate
operator=(const TreeNode &)=deleteTreeNode
operator=(TreeNode &&)=defaultTreeNode
TreeNode()TreeNode
TreeNode(const FrameInfo &frame)TreeNodeexplicit
TreeNode(const SignalInfo &signal)TreeNodeexplicit
TreeNode(const TreeNode &)=deleteTreeNode
TreeNode(TreeNode &&)=defaultTreeNode
~TreeNode()=defaultTreeNode
+ + + + diff --git a/docs/html/classTreeNode.html b/docs/html/classTreeNode.html new file mode 100644 index 0000000..e414e89 --- /dev/null +++ b/docs/html/classTreeNode.html @@ -0,0 +1,719 @@ + + + + + + + +DBC framework: TreeNode Class Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Public Member Functions | +Private Attributes | +List of all members
+
TreeNode Class Reference
+
+
+ +

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

+ +

#include <tree_node.h>

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

+Public Member Functions

 TreeNode ()
 Create root node. More...
 
 TreeNode (const FrameInfo &frame)
 Create frame node. More...
 
 TreeNode (const SignalInfo &signal)
 Create signal node. More...
 
 ~TreeNode ()=default
 
 TreeNode (const TreeNode &)=delete
 
TreeNodeoperator= (const TreeNode &)=delete
 
 TreeNode (TreeNode &&)=default
 
TreeNodeoperator= (TreeNode &&)=default
 
void AddChild (std::unique_ptr< TreeNode > child)
 Add child node. More...
 
std::size_t GetChildCount () const
 Get child count. More...
 
const TreeNodeGetChild (std::size_t index) const
 Get child by index. More...
 
TreeNodeGetChild (std::size_t index)
 Get mutable child by index. More...
 
NodeType GetType () const
 Get node type. More...
 
const std::string & GetName () const
 Get display name. More...
 
const FrameInfoGetFrame () const
 Get frame payload if node is frame. More...
 
const SignalInfoGetSignal () const
 Get signal payload if node is signal. More...
 
+ + + + + + + + + + + +

+Private Attributes

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

Detailed Description

+

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

+ +

Definition at line 35 of file tree_node.h.

+

Constructor & Destructor Documentation

+ +

◆ TreeNode() [1/5]

+ +
+
+ + + + + + + +
TreeNode::TreeNode ()
+
+ +

Create root node.

+ +

Definition at line 14 of file tree_node.cpp.

+ +

References Root.

+ +
+
+ +

◆ TreeNode() [2/5]

+ +
+
+ + + + + +
+ + + + + + + + +
TreeNode::TreeNode (const FrameInfoframe)
+
+explicit
+
+ +

Create frame node.

+
Parameters
+ + +
frameFrame payload.
+
+
+ +

Definition at line 22 of file tree_node.cpp.

+ +

References Frame.

+ +
+
+ +

◆ TreeNode() [3/5]

+ +
+
+ + + + + +
+ + + + + + + + +
TreeNode::TreeNode (const SignalInfosignal)
+
+explicit
+
+ +

Create signal node.

+
Parameters
+ + +
signalSignal payload.
+
+
+ +

Definition at line 30 of file tree_node.cpp.

+ +

References Signal.

+ +
+
+ +

◆ ~TreeNode()

+ +
+
+ + + + + +
+ + + + + + + +
TreeNode::~TreeNode ()
+
+default
+
+ +
+
+ +

◆ TreeNode() [4/5]

+ +
+
+ + + + + +
+ + + + + + + + +
TreeNode::TreeNode (const TreeNode)
+
+delete
+
+ +
+
+ +

◆ TreeNode() [5/5]

+ +
+
+ + + + + +
+ + + + + + + + +
TreeNode::TreeNode (TreeNode && )
+
+default
+
+ +
+
+

Member Function Documentation

+ +

◆ AddChild()

+ +
+
+ + + + + + + + +
void TreeNode::AddChild (std::unique_ptr< TreeNodechild)
+
+ +

Add child node.

+
Parameters
+ + +
childChild node to add.
+
+
+ +

Definition at line 38 of file tree_node.cpp.

+ +

References m_children.

+ +
+
+ +

◆ GetChild() [1/2]

+ +
+
+ + + + + + + + +
TreeNode * TreeNode::GetChild (std::size_t index)
+
+ +

Get mutable child by index.

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

Definition at line 54 of file tree_node.cpp.

+ +

References m_children.

+ +
+
+ +

◆ GetChild() [2/2]

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

Get child by index.

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

Definition at line 47 of file tree_node.cpp.

+ +

References m_children.

+ +

Referenced by PrintTree().

+ +
+
+ +

◆ GetChildCount()

+ +
+
+ + + + + + + +
std::size_t TreeNode::GetChildCount () const
+
+ +

Get child count.

+
Returns
Number of children.
+ +

Definition at line 43 of file tree_node.cpp.

+ +

References m_children.

+ +

Referenced by PrintTree().

+ +
+
+ +

◆ GetFrame()

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

Get frame payload if node is frame.

+
Returns
Pointer to frame info or nullptr.
+ +

Definition at line 69 of file tree_node.cpp.

+ +

References m_frame.

+ +

Referenced by PrintTree().

+ +
+
+ +

◆ GetName()

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

Get display name.

+
Returns
Node name.
+ +

Definition at line 65 of file tree_node.cpp.

+ +

References m_name.

+ +

Referenced by PrintTree().

+ +
+
+ +

◆ GetSignal()

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

Get signal payload if node is signal.

+
Returns
Pointer to signal info or nullptr.
+ +

Definition at line 73 of file tree_node.cpp.

+ +

References m_signal.

+ +

Referenced by PrintTree().

+ +
+
+ +

◆ GetType()

+ +
+
+ + + + + + + +
NodeType TreeNode::GetType () const
+
+ +

Get node type.

+
Returns
Node type.
+ +

Definition at line 61 of file tree_node.cpp.

+ +

References m_type.

+ +

Referenced by PrintTree().

+ +
+
+ +

◆ operator=() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + +
TreeNode & TreeNode::operator= (const TreeNode)
+
+delete
+
+ +
+
+ +

◆ operator=() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + +
TreeNode & TreeNode::operator= (TreeNode && )
+
+default
+
+ +
+
+

Member Data Documentation

+ +

◆ m_children

+ +
+
+ + + + + +
+ + + + +
std::vector<std::unique_ptr<TreeNode> > TreeNode::m_children
+
+private
+
+ +

Definition at line 115 of file tree_node.h.

+ +

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

+ +
+
+ +

◆ m_frame

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

Definition at line 116 of file tree_node.h.

+ +

Referenced by GetFrame().

+ +
+
+ +

◆ m_name

+ +
+
+ + + + + +
+ + + + +
std::string TreeNode::m_name
+
+private
+
+ +

Definition at line 114 of file tree_node.h.

+ +

Referenced by GetName().

+ +
+
+ +

◆ m_signal

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

Definition at line 117 of file tree_node.h.

+ +

Referenced by GetSignal().

+ +
+
+ +

◆ m_type

+ +
+
+ + + + + +
+ + + + +
NodeType TreeNode::m_type
+
+private
+
+ +

Definition at line 113 of file tree_node.h.

+ +

Referenced by GetType().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classes.html b/docs/html/classes.html new file mode 100644 index 0000000..13d90c1 --- /dev/null +++ b/docs/html/classes.html @@ -0,0 +1,75 @@ + + + + + + + +DBC framework: Class Index + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
Class Index
+
+
+
D | F | R | S | T
+
+
+
D
+
DbcDatabase
DbcDecodeBuilder
DbcDecoder
DbcParser
DbcTreeBuilder
DecodeDatabase
DecodedFrameValue
DecodedSignalValue
DecodeFrame
DecodeSignal
+
+
F
+
FrameInfo
FrameKey
FrameKeyHasher
+
+
R
+
RawCanFrame
+
+
S
+
SignalInfo
+
+
T
+
TreeNode
+
+
+ + + + diff --git a/docs/html/closed.png b/docs/html/closed.png new file mode 100644 index 0000000..98cc2c9 Binary files /dev/null and b/docs/html/closed.png differ diff --git a/docs/html/dbc.qch b/docs/html/dbc.qch new file mode 100644 index 0000000..1a4d077 Binary files /dev/null and b/docs/html/dbc.qch differ diff --git a/docs/html/dbc__database_8h.html b/docs/html/dbc__database_8h.html new file mode 100644 index 0000000..8165570 --- /dev/null +++ b/docs/html/dbc__database_8h.html @@ -0,0 +1,77 @@ + + + + + + + +DBC framework: dbc_database.h File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Classes
+
dbc_database.h File Reference
+
+
+ +

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

+
#include <vector>
+#include "frame_info.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

struct  DbcDatabase
 Parsed DBC content stored in a simple internal form. More...
 
+

Detailed Description

+

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

+

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

+ +

Definition in file dbc_database.h.

+
+ + + + diff --git a/docs/html/dbc__database_8h_source.html b/docs/html/dbc__database_8h_source.html new file mode 100644 index 0000000..614d235 --- /dev/null +++ b/docs/html/dbc__database_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +DBC framework: dbc_database.h Source File + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
dbc_database.h
+
+
+Go to the documentation of this file.
1/**
+
2 * @file dbc_database.h
+
3 * @brief
+
4 *
+
5 * Created: 2026-03-13
+
6 * Author: Deeaitch (Dim. Himro)
+
7 *
+
8 * Licensed under the MIT License.
+
9 * See LICENSE file in the project root for full license text.
+
10 */
+
11
+
12#ifndef DBC_DATABASE_H
+
13#define DBC_DATABASE_H
+
14
+
15#include <vector>
+
16
+
17#include "frame_info.h"
+
18
+
19/**
+
20 * @brief Parsed DBC content stored in a simple internal form.
+
21 */
+ +
23 std::vector<FrameInfo> frames; /**< All frames found in the DBC file. */
+
24};
+
25
+
26#endif /* DBC_DATABASE_H */
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Parsed DBC content stored in a simple internal form.
Definition: dbc_database.h:22
+
std::vector< FrameInfo > frames
Definition: dbc_database.h:23
+
+ + + + diff --git a/docs/html/dbc__decode__builder_8cpp.html b/docs/html/dbc__decode__builder_8cpp.html new file mode 100644 index 0000000..790675e --- /dev/null +++ b/docs/html/dbc__decode__builder_8cpp.html @@ -0,0 +1,67 @@ + + + + + + + +DBC framework: dbc_decode_builder.cpp File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
dbc_decode_builder.cpp File Reference
+
+
+ +

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

+
#include "dbc_decode_builder.h"
+
+

Go to the source code of this file.

+

Detailed Description

+

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

+

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

+ +

Definition in file dbc_decode_builder.cpp.

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

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

+
#include "dbc_database.h"
+#include "decode_database.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  DbcDecodeBuilder
 Converts parsed DBC data into runtime decode database. More...
 
+

Detailed Description

+

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

+

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

+ +

Definition in file dbc_decode_builder.h.

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

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

+
#include "dbc_decoder.h"
+
+

Go to the source code of this file.

+

Detailed Description

+

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

+

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

+ +

Definition in file dbc_decoder.cpp.

+
+ + + + diff --git a/docs/html/dbc__decoder_8cpp_source.html b/docs/html/dbc__decoder_8cpp_source.html new file mode 100644 index 0000000..e212796 --- /dev/null +++ b/docs/html/dbc__decoder_8cpp_source.html @@ -0,0 +1,248 @@ + + + + + + + +DBC framework: dbc_decoder.cpp Source File + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
dbc_decoder.cpp
+
+
+Go to the documentation of this file.
1/**
+
2 * @file dbc_decoder.cpp
+
3 * @brief
+
4 *
+
5 * Created: 2026-03-13
+
6 * Author: Deeaitch (Dim. Himro)
+
7 *
+
8 * Licensed under the MIT License.
+
9 * See LICENSE file in the project root for full license text.
+
10 */
+
11
+
12#include "dbc_decoder.h"
+
13
+ +
15 std::uint32_t canId,
+
16 bool isExtended) const {
+
17 const FrameKey key (canId, isExtended);
+
18 const std::unordered_map<FrameKey, std::size_t, FrameKeyHasher>::const_iterator it =
+
19 database.frameIndexByKey.find (key);
+
20
+
21 if (it == database.frameIndexByKey.end())
+
22 return nullptr;
+
23
+
24 const std::size_t index = it->second;
+
25 if (index >= database.frames.size())
+
26 return nullptr;
+
27
+
28 return &database.frames[index];
+
29}
+
30
+ +
32 const RawCanFrame &frame) const {
+
33 DecodedFrameValue result;
+
34 const DecodeFrame *definition = FindFrame (database, frame.canId, frame.isExtended);
+
35
+
36 if (definition == nullptr)
+
37 return result;
+
38
+
39 result.definition = definition;
+
40 result.valid = true;
+
41
+
42 for (std::size_t signalIndex = 0U; signalIndex < definition->signals.size(); ++signalIndex) {
+
43 const DecodeSignal &signal = definition->signals[signalIndex];
+
44 DecodedSignalValue decoded;
+
45 std::uint64_t unsignedValue = 0U;
+
46
+
47 decoded.definition = &signal;
+
48
+
49 if (!ExtractUnsigned (frame.data, signal, unsignedValue)) {
+
50 decoded.valid = false;
+
51 result.signals.push_back (decoded);
+
52 continue;
+
53 }
+
54
+
55 if (signal.valueType == ValueType::Signed)
+
56 decoded.rawValue = SignExtend (unsignedValue, signal.length);
+
57 else
+
58 decoded.rawValue = static_cast<std::int64_t> (unsignedValue);
+
59
+
60 decoded.physicalValue =
+
61 (static_cast<double> (decoded.rawValue) * signal.factor) + signal.offset;
+
62 decoded.valid = true;
+
63
+
64 result.signals.push_back (decoded);
+
65 }
+
66
+
67 return result;
+
68}
+
69
+
70bool DbcDecoder::ExtractUnsigned (const std::vector<std::uint8_t> &data,
+
71 const DecodeSignal &signal,
+
72 std::uint64_t &value) {
+
73 if ((signal.length == 0U) || (signal.length > 64U))
+
74 return false;
+
75
+
76 if (signal.byteOrder == ByteOrder::Intel)
+
77 return ExtractIntel (data, signal.startBit, signal.length, value);
+
78
+
79 return ExtractMotorola (data, signal.startBit, signal.length, value);
+
80}
+
81
+
82bool DbcDecoder::ExtractIntel (const std::vector<std::uint8_t> &data,
+
83 std::uint32_t startBit,
+
84 std::uint32_t length,
+
85 std::uint64_t &value) {
+
86 value = 0U;
+
87
+
88 for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
+
89 const std::uint32_t absoluteBit = startBit + bitIndex;
+
90 const std::uint32_t byteIndex = absoluteBit / 8U;
+
91 const std::uint32_t bitInByte = absoluteBit % 8U;
+
92
+
93 if (byteIndex >= data.size())
+
94 return false;
+
95
+
96 const std::uint64_t bitValue =
+
97 (static_cast<std::uint64_t> ((data[byteIndex] >> bitInByte) & 0x01U) << bitIndex);
+
98
+
99 value |= bitValue;
+
100 }
+
101
+
102 return true;
+
103}
+
104
+
105bool DbcDecoder::ExtractMotorola (const std::vector<std::uint8_t> &data,
+
106 std::uint32_t startBit,
+
107 std::uint32_t length,
+
108 std::uint64_t &value) {
+
109 /*
+
110 * DBC Motorola bit numbering:
+
111 * - startBit points to the most significant bit of the signal
+
112 * - inside a byte, bit numbering goes 7..0
+
113 * - crossing byte boundary moves to the next byte, bit 7
+
114 */
+
115
+
116 value = 0U;
+
117
+
118 std::int32_t currentBit = static_cast<std::int32_t> (startBit);
+
119
+
120 for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
+
121 if (currentBit < 0)
+
122 return false;
+
123
+
124 const std::uint32_t absoluteBit = static_cast<std::uint32_t> (currentBit);
+
125 const std::uint32_t byteIndex = absoluteBit / 8U;
+
126 const std::uint32_t bitFromMsb = absoluteBit % 8U;
+
127 const std::uint32_t bitInByte = 7U - bitFromMsb;
+
128
+
129 if (byteIndex >= data.size())
+
130 return false;
+
131
+
132 value <<= 1U;
+
133 value |= static_cast<std::uint64_t> ((data[byteIndex] >> bitInByte) & 0x01U);
+
134
+
135 if ((absoluteBit % 8U) == 7U)
+
136 currentBit = static_cast<std::int32_t> ((byteIndex + 1U) * 8U);
+
137 else
+
138 --currentBit;
+
139 }
+
140
+
141 return true;
+
142}
+
143
+
144std::int64_t DbcDecoder::SignExtend (std::uint64_t value, std::uint32_t bitLength) {
+
145 if ((bitLength == 0U) || (bitLength >= 64U))
+
146 return static_cast<std::int64_t> (value);
+
147
+
148 const std::uint64_t signMask = (static_cast<std::uint64_t> (1U) << (bitLength - 1U));
+
149 const std::uint64_t valueMask = (static_cast<std::uint64_t> (1U) << bitLength) - 1U;
+
150
+
151 value &= valueMask;
+
152
+
153 if ((value & signMask) == 0U)
+
154 return static_cast<std::int64_t> (value);
+
155
+
156 return static_cast<std::int64_t> (value | (~valueMask));
+
157}
+
static bool ExtractUnsigned(const std::vector< std::uint8_t > &data, const DecodeSignal &signal, std::uint64_t &value)
Definition: dbc_decoder.cpp:70
+
DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
Decode one raw CAN frame.
Definition: dbc_decoder.cpp:31
+
static std::int64_t SignExtend(std::uint64_t value, std::uint32_t bitLength)
+
const DecodeFrame * FindFrame(const DecodeDatabase &database, std::uint32_t canId, bool isExtended) const
Find frame definition by CAN ID.
Definition: dbc_decoder.cpp:14
+
static bool ExtractIntel(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)
Definition: dbc_decoder.cpp:82
+
static bool ExtractMotorola(const std::vector< std::uint8_t > &data, std::uint32_t startBit, std::uint32_t length, std::uint64_t &value)
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+ + +
Runtime decode database with fast lookup by CAN ID.
+
std::vector< DecodeFrame > frames
+
std::unordered_map< FrameKey, std::size_t, FrameKeyHasher > frameIndexByKey
+
Runtime-ready frame definition.
+
std::vector< DecodeSignal > signals
+
Runtime-ready signal definition.
+ + +
ValueType valueType
+
std::uint32_t startBit
+
ByteOrder byteOrder
+
std::uint32_t length
+
Fully decoded frame.
Definition: dbc_decoder.h:55
+ +
const DecodeFrame * definition
Definition: dbc_decoder.h:56
+
std::vector< DecodedSignalValue > signals
Definition: dbc_decoder.h:57
+
One decoded signal value.
Definition: dbc_decoder.h:38
+
std::int64_t rawValue
Definition: dbc_decoder.h:40
+ + +
const DecodeSignal * definition
Definition: dbc_decoder.h:39
+
Key for fast frame lookup.
+
Raw CAN frame used for runtime or trace decoding.
Definition: dbc_decoder.h:23
+
std::vector< std::uint8_t > data
Definition: dbc_decoder.h:26
+
std::uint32_t canId
Definition: dbc_decoder.h:24
+
bool isExtended
Definition: dbc_decoder.h:25
+
+ + + + diff --git a/docs/html/dbc__decoder_8h.html b/docs/html/dbc__decoder_8h.html new file mode 100644 index 0000000..6cc42ab --- /dev/null +++ b/docs/html/dbc__decoder_8h.html @@ -0,0 +1,87 @@ + + + + + + + +DBC framework: dbc_decoder.h File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Classes
+
dbc_decoder.h File Reference
+
+
+ +

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

+
#include <vector>
+#include <cstdint>
+#include "decode_database.h"
+
+

Go to the source code of this file.

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

+Classes

struct  RawCanFrame
 Raw CAN frame used for runtime or trace decoding. More...
 
struct  DecodedSignalValue
 One decoded signal value. More...
 
struct  DecodedFrameValue
 Fully decoded frame. More...
 
class  DbcDecoder
 Runtime CAN decoder using prebuilt decode database. More...
 
+

Detailed Description

+

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

+

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

+ +

Definition in file dbc_decoder.h.

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

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

+
#include "dbc_parser.h"
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+#include <cctype>
+
+

Go to the source code of this file.

+ + + + +

+Namespaces

namespace  anonymous_namespace{dbc_parser.cpp}
 
+ + + + +

+Functions

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

Detailed Description

+

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

+

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

+ +

Definition in file dbc_parser.cpp.

+
+ + + + diff --git a/docs/html/dbc__parser_8cpp_source.html b/docs/html/dbc__parser_8cpp_source.html new file mode 100644 index 0000000..2f502d5 --- /dev/null +++ b/docs/html/dbc__parser_8cpp_source.html @@ -0,0 +1,452 @@ + + + + + + + +DBC framework: dbc_parser.cpp Source File + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
dbc_parser.cpp
+
+
+Go to the documentation of this file.
1/**
+
2 * @file dbc_parser.cpp
+
3 * @brief
+
4 *
+
5 * Created: 2026-03-13
+
6 * Author: Deeaitch (Dim. Himro)
+
7 *
+
8 * Licensed under the MIT License.
+
9 * See LICENSE file in the project root for full license text.
+
10 */
+
11
+
12#include "dbc_parser.h"
+
13
+
14#include <fstream>
+
15#include <sstream>
+
16#include <stdexcept>
+
17#include <cctype>
+
18
+
19namespace {
+
20 /**
+
21 * @brief Remove leading and trailing spaces.
+
22 * @param text Input text.
+
23 * @return Trimmed text.
+
24 */
+
25 std::string TrimText (const std::string &text) {
+
26 std::string::size_type begin = 0U;
+
27 while ((begin < text.size()) &&
+
28 std::isspace (static_cast<unsigned char> (text[begin])))
+
29 ++begin;
+
30
+
31 std::string::size_type end = text.size();
+
32 while ((end > begin) &&
+
33 std::isspace (static_cast<unsigned char> (text[end - 1U])))
+
34 --end;
+
35
+
36 return text.substr (begin, end - begin);
+
37 }
+
38}
+
39
+
40DbcDatabase DbcParser::ParseFile (const std::string &filePath) const {
+
41 std::ifstream input (filePath.c_str());
+
42 if (!input.is_open())
+
43 throw std::runtime_error ("Failed to open DBC file: " + filePath);
+
44
+
45 DbcDatabase database;
+
46 FrameInfo *currentFrame = nullptr;
+
47
+
48 std::string line;
+
49 while (std::getline (input, line)) {
+
50 line = Trim (line);
+
51 if (line.empty())
+
52 continue;
+
53
+
54 if (IsFrameLine (line)) {
+
55 FrameInfo frame = ParseFrameLine (line);
+
56 database.frames.push_back (frame);
+
57 currentFrame = &database.frames.back();
+
58 } else if (IsSignalLine (line)) {
+
59 if (currentFrame == nullptr)
+
60 throw std::runtime_error ("Signal found before any frame definition.");
+
61
+
62 SignalInfo signal = ParseSignalLine (line);
+
63 currentFrame->signals.push_back (signal);
+
64 } else if (IsCommentLine (line))
+
65 ParseCommentLine (line, database);
+
66 }
+
67
+
68 return database;
+
69}
+
70
+
71bool DbcParser::IsFrameLine (const std::string &line) {
+
72 return (line.size() >= 4U) && (line.compare (0U, 4U, "BO_ ") == 0);
+
73}
+
74
+
75bool DbcParser::IsSignalLine (const std::string &line) {
+
76 return (line.size() >= 4U) && (line.compare (0U, 4U, "SG_ ") == 0);
+
77}
+
78
+
79bool DbcParser::IsCommentLine (const std::string &line) {
+
80 return (line.size() >= 4U) && (line.compare (0U, 4U, "CM_ ") == 0);
+
81}
+
82
+
83std::string DbcParser::Trim (const std::string &text) {
+
84 return TrimText (text);
+
85}
+
86
+
87std::vector<std::string> DbcParser::SplitReceivers (const std::string &text) {
+
88 std::vector<std::string> receivers;
+
89 std::string token;
+
90 std::istringstream stream (text);
+
91
+
92 while (std::getline (stream, token, ',')) {
+
93 token = TrimText (token);
+
94 if (!token.empty())
+
95 receivers.push_back (token);
+
96 }
+
97
+
98 return receivers;
+
99}
+
100
+
101void DbcParser::NormalizeCanId (std::uint32_t rawCanId,
+
102 std::uint32_t &normalizedCanId,
+
103 bool &isExtended) {
+
104 /*
+
105 * DBC commonly stores extended identifiers with bit 31 set.
+
106 * Example:
+
107 * raw id = 0x80000000 | actual_29_bit_id
+
108 */
+
109 if ((rawCanId & 0x80000000U) != 0U) {
+
110 isExtended = true;
+
111 normalizedCanId = (rawCanId & 0x1FFFFFFFU);
+
112 } else {
+
113 isExtended = (rawCanId > 0x7FFU);
+
114 normalizedCanId = rawCanId;
+
115 }
+
116}
+
117
+
118std::uint32_t DbcParser::TryExtractPgn (std::uint32_t canId, bool isExtended, bool &hasPgn) {
+
119 hasPgn = false;
+
120
+
121 if (!isExtended)
+
122 return 0U;
+
123
+
124 if ((canId & 0x1FFFFFFFU) != canId)
+
125 return 0U;
+
126
+
127 const std::uint32_t pf = (canId >> 16U) & 0xFFU;
+
128 const std::uint32_t ps = (canId >> 8U) & 0xFFU;
+
129 const std::uint32_t dp = (canId >> 24U) & 0x01U;
+
130
+
131 std::uint32_t pgn = 0U;
+
132
+
133 if (pf < 240U)
+
134 pgn = (dp << 16U) | (pf << 8U);
+
135 else
+
136 pgn = (dp << 16U) | (pf << 8U) | ps;
+
137
+
138 hasPgn = true;
+
139 return pgn;
+
140}
+
141
+
142FrameInfo DbcParser::ParseFrameLine (const std::string &line) {
+
143 /*
+
144 * Example:
+
145 * BO_ 256 EngineData: 8 EEC1
+
146 */
+
147
+
148 std::istringstream stream (line);
+
149 std::string token;
+
150 FrameInfo frame;
+
151 std::uint32_t rawCanId = 0U;
+
152
+
153 stream >> token;
+
154 if (token != "BO_")
+
155 throw std::runtime_error ("Invalid frame line: " + line);
+
156
+
157 stream >> rawCanId;
+
158 NormalizeCanId (rawCanId, frame.canId, frame.isExtended);
+
159
+
160 stream >> token;
+
161 if (token.empty())
+
162 throw std::runtime_error ("Missing frame name: " + line);
+
163
+
164 if (token[token.size() - 1U] == ':')
+
165 token.erase (token.size() - 1U, 1U);
+
166
+
167 frame.name = token;
+
168
+
169 {
+
170 unsigned int dlcValue = 0U;
+
171 stream >> dlcValue;
+
172 frame.dlc = static_cast<std::uint8_t> (dlcValue);
+
173 }
+
174
+
175 stream >> frame.transmitter;
+
176 frame.pgn = TryExtractPgn (frame.canId, frame.isExtended, frame.hasPgn);
+
177
+
178 return frame;
+
179}
+
180
+
181SignalInfo DbcParser::ParseSignalLine (const std::string &line) {
+
182 /*
+
183 * Example:
+
184 * SG_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] "rpm" ECU1,ECU2
+
185 */
+
186
+
187 SignalInfo signal;
+
188
+
189 std::string work = TrimText (line);
+
190 if (work.compare (0U, 4U, "SG_ ") != 0)
+
191 throw std::runtime_error ("Invalid signal line: " + line);
+
192
+
193 work.erase (0U, 4U);
+
194
+
195 const std::string::size_type colonPos = work.find (':');
+
196 if (colonPos == std::string::npos)
+
197 throw std::runtime_error ("Signal line missing ':' : " + line);
+
198
+
199 signal.name = TrimText (work.substr (0U, colonPos));
+
200 std::string rest = TrimText (work.substr (colonPos + 1U));
+
201
+
202 const std::string::size_type pipePos = rest.find ('|');
+
203 const std::string::size_type atPos = rest.find ('@');
+
204 const std::string::size_type signPos = rest.find_first_of ("+-", atPos);
+
205 const std::string::size_type factorBegin = rest.find ('(');
+
206 const std::string::size_type factorComma = rest.find (',', factorBegin);
+
207 const std::string::size_type factorEnd = rest.find (')', factorComma);
+
208 const std::string::size_type rangeBegin = rest.find ('[');
+
209 const std::string::size_type rangeSep = rest.find ('|', rangeBegin);
+
210 const std::string::size_type rangeEnd = rest.find (']', rangeSep);
+
211 const std::string::size_type unitBegin = rest.find ('"', rangeEnd);
+
212 const std::string::size_type unitEnd = rest.find ('"', unitBegin + 1U);
+
213
+
214 if ((pipePos == std::string::npos) ||
+
215 (atPos == std::string::npos) ||
+
216 (signPos == std::string::npos) ||
+
217 (factorBegin == std::string::npos) ||
+
218 (factorComma == std::string::npos) ||
+
219 (factorEnd == std::string::npos) ||
+
220 (rangeBegin == std::string::npos) ||
+
221 (rangeSep == std::string::npos) ||
+
222 (rangeEnd == std::string::npos) ||
+
223 (unitBegin == std::string::npos) ||
+
224 (unitEnd == std::string::npos))
+
225 throw std::runtime_error ("Unsupported signal syntax: " + line);
+
226
+
227 signal.startBit = static_cast<std::uint32_t> (
+
228 std::stoul (TrimText (rest.substr (0U, pipePos)))
+
229 );
+
230
+
231 signal.length = static_cast<std::uint32_t> (
+
232 std::stoul (TrimText (rest.substr (pipePos + 1U, atPos - pipePos - 1U)))
+
233 );
+
234
+
235 {
+
236 if ((atPos + 1U) >= rest.size())
+
237 throw std::runtime_error ("Invalid endianness in signal: " + line);
+
238
+
239 const char endianChar = rest[atPos + 1U];
+
240 signal.isLittleEndian = (endianChar == '1');
+
241 }
+
242
+
243 {
+
244 const char signChar = rest[signPos];
+
245 signal.isSigned = (signChar == '-');
+
246 }
+
247
+
248 signal.factor = std::stod (
+
249 TrimText (rest.substr (factorBegin + 1U, factorComma - factorBegin - 1U))
+
250 );
+
251
+
252 signal.offset = std::stod (
+
253 TrimText (rest.substr (factorComma + 1U, factorEnd - factorComma - 1U))
+
254 );
+
255
+
256 signal.minimum = std::stod (
+
257 TrimText (rest.substr (rangeBegin + 1U, rangeSep - rangeBegin - 1U))
+
258 );
+
259
+
260 signal.maximum = std::stod (
+
261 TrimText (rest.substr (rangeSep + 1U, rangeEnd - rangeSep - 1U))
+
262 );
+
263
+
264 signal.unit = rest.substr (unitBegin + 1U, unitEnd - unitBegin - 1U);
+
265
+
266 {
+
267 const std::string receiversText = TrimText (rest.substr (unitEnd + 1U));
+
268 signal.receivers = SplitReceivers (receiversText);
+
269 }
+
270
+
271 return signal;
+
272}
+
273
+
274void DbcParser::ParseCommentLine (const std::string &line, DbcDatabase &database) {
+
275 /*
+
276 * Examples:
+
277 * CM_ BO_ 256 "Frame comment";
+
278 * CM_ SG_ 256 EngineSpeed "Signal comment";
+
279 */
+
280
+
281 std::istringstream stream (line);
+
282 std::string token;
+
283 stream >> token;
+
284
+
285 if (token != "CM_")
+
286 return;
+
287
+
288 stream >> token;
+
289
+
290 if (token == "BO_") {
+
291 std::uint32_t rawCanId = 0U;
+
292 std::uint32_t canId = 0U;
+
293 bool isExtended = false;
+
294
+
295 stream >> rawCanId;
+
296 NormalizeCanId (rawCanId, canId, isExtended);
+
297
+
298 const std::string::size_type quoteBegin = line.find ('"');
+
299 const std::string::size_type quoteEnd = line.rfind ('"');
+
300
+
301 if ((quoteBegin == std::string::npos) ||
+
302 (quoteEnd == std::string::npos) ||
+
303 (quoteEnd <= quoteBegin))
+
304 return;
+
305
+
306 FrameInfo *frame = FindFrameById (database, canId, isExtended);
+
307 if (frame != nullptr)
+
308 frame->comment = line.substr (quoteBegin + 1U, quoteEnd - quoteBegin - 1U);
+
309 } else if (token == "SG_") {
+
310 std::uint32_t rawCanId = 0U;
+
311 std::uint32_t canId = 0U;
+
312 bool isExtended = false;
+
313 std::string signalName;
+
314
+
315 stream >> rawCanId;
+
316 stream >> signalName;
+
317
+
318 NormalizeCanId (rawCanId, canId, isExtended);
+
319
+
320 const std::string::size_type quoteBegin = line.find ('"');
+
321 const std::string::size_type quoteEnd = line.rfind ('"');
+
322
+
323 if ((quoteBegin == std::string::npos) ||
+
324 (quoteEnd == std::string::npos) ||
+
325 (quoteEnd <= quoteBegin))
+
326 return;
+
327
+
328 FrameInfo *frame = FindFrameById (database, canId, isExtended);
+
329 if (frame != nullptr) {
+
330 SignalInfo *signal = FindSignalByName (*frame, signalName);
+
331 if (signal != nullptr)
+
332 signal->comment = line.substr (quoteBegin + 1U, quoteEnd - quoteBegin - 1U);
+
333 }
+
334 }
+
335}
+
336
+ +
338 std::uint32_t canId,
+
339 bool isExtended) {
+
340 for (std::size_t index = 0U; index < database.frames.size(); ++index) {
+
341 if ((database.frames[index].canId == canId) &&
+
342 (database.frames[index].isExtended == isExtended))
+
343 return &database.frames[index];
+
344 }
+
345
+
346 return nullptr;
+
347}
+
348
+
349SignalInfo *DbcParser::FindSignalByName (FrameInfo &frame, const std::string &signalName) {
+
350 for (std::size_t index = 0U; index < frame.signals.size(); ++index) {
+
351 if (frame.signals[index].name == signalName)
+
352 return &frame.signals[index];
+
353 }
+
354
+
355 return nullptr;
+
356}
+
static std::vector< std::string > SplitReceivers(const std::string &text)
Definition: dbc_parser.cpp:87
+
static std::string Trim(const std::string &text)
Definition: dbc_parser.cpp:83
+
static SignalInfo ParseSignalLine(const std::string &line)
Definition: dbc_parser.cpp:181
+
static FrameInfo ParseFrameLine(const std::string &line)
Definition: dbc_parser.cpp:142
+
static std::uint32_t TryExtractPgn(std::uint32_t canId, bool isExtended, bool &hasPgn)
Definition: dbc_parser.cpp:118
+
static void NormalizeCanId(std::uint32_t rawCanId, std::uint32_t &normalizedCanId, bool &isExtended)
Definition: dbc_parser.cpp:101
+
static void ParseCommentLine(const std::string &line, DbcDatabase &database)
Definition: dbc_parser.cpp:274
+
static FrameInfo * FindFrameById(DbcDatabase &database, std::uint32_t canId, bool isExtended)
Definition: dbc_parser.cpp:337
+
static SignalInfo * FindSignalByName(FrameInfo &frame, const std::string &signalName)
Definition: dbc_parser.cpp:349
+
static bool IsSignalLine(const std::string &line)
Definition: dbc_parser.cpp:75
+
static bool IsFrameLine(const std::string &line)
Definition: dbc_parser.cpp:71
+
static bool IsCommentLine(const std::string &line)
Definition: dbc_parser.cpp:79
+
DbcDatabase ParseFile(const std::string &filePath) const
Parse DBC file.
Definition: dbc_parser.cpp:40
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
std::string TrimText(const std::string &text)
Remove leading and trailing spaces.
Definition: dbc_parser.cpp:25
+
Parsed DBC content stored in a simple internal form.
Definition: dbc_database.h:22
+
std::vector< FrameInfo > frames
Definition: dbc_database.h:23
+
Describes one CAN frame from a DBC file.
Definition: frame_info.h:24
+
bool isExtended
Definition: frame_info.h:27
+
bool hasPgn
Definition: frame_info.h:29
+
std::string transmitter
Definition: frame_info.h:31
+
std::vector< SignalInfo > signals
Definition: frame_info.h:33
+
std::uint8_t dlc
Definition: frame_info.h:30
+
std::string name
Definition: frame_info.h:25
+
std::string comment
Definition: frame_info.h:32
+
std::uint32_t pgn
Definition: frame_info.h:28
+
std::uint32_t canId
Definition: frame_info.h:26
+
Describes one signal inside a DBC frame.
Definition: signal_info.h:22
+
std::uint32_t length
Definition: signal_info.h:25
+
std::string unit
Definition: signal_info.h:32
+
std::vector< std::string > receivers
Definition: signal_info.h:33
+
std::string name
Definition: signal_info.h:23
+
bool isSigned
Definition: signal_info.h:27
+
double offset
Definition: signal_info.h:29
+
std::string comment
Definition: signal_info.h:34
+
std::uint32_t startBit
Definition: signal_info.h:24
+
double minimum
Definition: signal_info.h:30
+
double maximum
Definition: signal_info.h:31
+
double factor
Definition: signal_info.h:28
+
bool isLittleEndian
Definition: signal_info.h:26
+
+ + + + diff --git a/docs/html/dbc__parser_8h.html b/docs/html/dbc__parser_8h.html new file mode 100644 index 0000000..369cbe6 --- /dev/null +++ b/docs/html/dbc__parser_8h.html @@ -0,0 +1,79 @@ + + + + + + + +DBC framework: dbc_parser.h File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Classes
+
dbc_parser.h File Reference
+
+
+ +

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

+
#include <string>
+#include <vector>
+#include <cstdint>
+#include "dbc_database.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  DbcParser
 Minimal DBC parser. More...
 
+

Detailed Description

+

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

+

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

+ +

Definition in file dbc_parser.h.

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

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

+
#include "dbc_tree_builder.h"
+
+

Go to the source code of this file.

+

Detailed Description

+

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

+

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

+ +

Definition in file dbc_tree_builder.cpp.

+
+ + + + diff --git a/docs/html/dbc__tree__builder_8cpp_source.html b/docs/html/dbc__tree__builder_8cpp_source.html new file mode 100644 index 0000000..c5f65a8 --- /dev/null +++ b/docs/html/dbc__tree__builder_8cpp_source.html @@ -0,0 +1,95 @@ + + + + + + + +DBC framework: dbc_tree_builder.cpp Source File + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
dbc_tree_builder.cpp
+
+
+Go to the documentation of this file.
1/**
+
2 * @file dbc_tree_builder.cpp
+
3 * @brief
+
4 *
+
5 * Created: 2026-03-13
+
6 * Author: Deeaitch (Dim. Himro)
+
7 *
+
8 * Licensed under the MIT License.
+
9 * See LICENSE file in the project root for full license text.
+
10 */
+
11
+
12#include "dbc_tree_builder.h"
+
13
+
14std::unique_ptr<TreeNode> DbcTreeBuilder::Build (const DbcDatabase &database) const {
+
15 std::unique_ptr<TreeNode> root (new TreeNode());
+
16
+
17 for (std::size_t frameIndex = 0U; frameIndex < database.frames.size(); ++frameIndex) {
+
18 const FrameInfo &frame = database.frames[frameIndex];
+
19 std::unique_ptr<TreeNode> frameNode (new TreeNode (frame));
+
20
+
21 for (std::size_t signalIndex = 0U; signalIndex < frame.signals.size(); ++signalIndex) {
+
22 const SignalInfo &signal = frame.signals[signalIndex];
+
23 std::unique_ptr<TreeNode> signalNode (new TreeNode (signal));
+
24 frameNode->AddChild (std::move (signalNode));
+
25 }
+
26
+
27 root->AddChild (std::move (frameNode));
+
28 }
+
29
+
30 return root;
+
31}
+
std::unique_ptr< TreeNode > Build(const DbcDatabase &database) const
Build tree representation of parsed DBC data.
+
Tree node for later use in model/view or other hierarchy consumers.
Definition: tree_node.h:35
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Parsed DBC content stored in a simple internal form.
Definition: dbc_database.h:22
+
std::vector< FrameInfo > frames
Definition: dbc_database.h:23
+
Describes one CAN frame from a DBC file.
Definition: frame_info.h:24
+
std::vector< SignalInfo > signals
Definition: frame_info.h:33
+
Describes one signal inside a DBC frame.
Definition: signal_info.h:22
+
+ + + + diff --git a/docs/html/dbc__tree__builder_8h.html b/docs/html/dbc__tree__builder_8h.html new file mode 100644 index 0000000..ccbfb85 --- /dev/null +++ b/docs/html/dbc__tree__builder_8h.html @@ -0,0 +1,78 @@ + + + + + + + +DBC framework: dbc_tree_builder.h File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Classes
+
dbc_tree_builder.h File Reference
+
+
+ +

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

+
#include <memory>
+#include "dbc_database.h"
+#include "tree_node.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  DbcTreeBuilder
 Builds a simple tree from parsed DBC database. More...
 
+

Detailed Description

+

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

+

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

+ +

Definition in file dbc_tree_builder.h.

+
+ + + + diff --git a/docs/html/dbc__tree__builder_8h_source.html b/docs/html/dbc__tree__builder_8h_source.html new file mode 100644 index 0000000..47ce76a --- /dev/null +++ b/docs/html/dbc__tree__builder_8h_source.html @@ -0,0 +1,94 @@ + + + + + + + +DBC framework: dbc_tree_builder.h Source File + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
dbc_tree_builder.h
+
+
+Go to the documentation of this file.
1/**
+
2 * @file dbc_tree_builder.h
+
3 * @brief
+
4 *
+
5 * Created: 2026-03-13
+
6 * Author: Deeaitch (Dim. Himro)
+
7 *
+
8 * Licensed under the MIT License.
+
9 * See LICENSE file in the project root for full license text.
+
10 */
+
11
+
12#ifndef DBC_TREE_BUILDER_H
+
13#define DBC_TREE_BUILDER_H
+
14
+
15#include <memory>
+
16
+
17#include "dbc_database.h"
+
18#include "tree_node.h"
+
19
+
20/**
+
21 * @brief Builds a simple tree from parsed DBC database.
+
22 */
+ +
24 public:
+
25 /**
+
26 * @brief Build tree representation of parsed DBC data.
+
27 * @param database Parsed database.
+
28 * @return Root node of the tree.
+
29 */
+
30 std::unique_ptr<TreeNode> Build (const DbcDatabase &database) const;
+
31};
+
32
+
33#endif /* DBC_TREE_BUILDER_H */
+
Builds a simple tree from parsed DBC database.
+
std::unique_ptr< TreeNode > Build(const DbcDatabase &database) const
Build tree representation of parsed DBC data.
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Parsed DBC content stored in a simple internal form.
Definition: dbc_database.h:22
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
+ + + + diff --git a/docs/html/decode__database_8h.html b/docs/html/decode__database_8h.html new file mode 100644 index 0000000..406c715 --- /dev/null +++ b/docs/html/decode__database_8h.html @@ -0,0 +1,166 @@ + + + + + + + +DBC framework: decode_database.h File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
+Classes | +Enumerations
+
decode_database.h File Reference
+
+
+ +

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

+
#include <string>
+#include <vector>
+#include <unordered_map>
+#include <cstdint>
+
+

Go to the source code of this file.

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

+Classes

struct  DecodeSignal
 Runtime-ready signal definition. More...
 
struct  DecodeFrame
 Runtime-ready frame definition. More...
 
struct  FrameKey
 Key for fast frame lookup. More...
 
struct  FrameKeyHasher
 Hasher for frame key. More...
 
struct  DecodeDatabase
 Runtime decode database with fast lookup by CAN ID. More...
 
+ + + + + + + +

+Enumerations

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

Detailed Description

+

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

+

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

+ +

Definition in file decode_database.h.

+

Enumeration Type Documentation

+ +

◆ ByteOrder

+ +
+
+ + + + + +
+ + + + +
enum class ByteOrder
+
+strong
+
+ +

Signal byte order used for runtime decoding.

+ + + +
Enumerator
Intel 
Motorola 
+ +

Definition at line 23 of file decode_database.h.

+ +
+
+ +

◆ ValueType

+ +
+
+ + + + + +
+ + + + +
enum class ValueType
+
+strong
+
+ +

Signal numeric type.

+ + + +
Enumerator
Unsigned 
Signed 
+ +

Definition at line 31 of file decode_database.h.

+ +
+
+
+ + + + diff --git a/docs/html/decode__database_8h_source.html b/docs/html/decode__database_8h_source.html new file mode 100644 index 0000000..b6fdf4a --- /dev/null +++ b/docs/html/decode__database_8h_source.html @@ -0,0 +1,235 @@ + + + + + + + +DBC framework: decode_database.h Source File + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
decode_database.h
+
+
+Go to the documentation of this file.
1/**
+
2 * @file decode_database.h
+
3 * @brief
+
4 *
+
5 * Created: 2026-03-13
+
6 * Author: Deeaitch (Dim. Himro)
+
7 *
+
8 * Licensed under the MIT License.
+
9 * See LICENSE file in the project root for full license text.
+
10 */
+
11
+
12#ifndef DECODE_DATABASE_H
+
13#define DECODE_DATABASE_H
+
14
+
15#include <string>
+
16#include <vector>
+
17#include <unordered_map>
+
18#include <cstdint>
+
19
+
20/**
+
21 * @brief Signal byte order used for runtime decoding.
+
22 */
+
23enum class ByteOrder {
+
24 Intel,
+ +
26};
+
27
+
28/**
+
29 * @brief Signal numeric type.
+
30 */
+
31enum class ValueType {
+ +
33 Signed
+
34};
+
35
+
36/**
+
37 * @brief Runtime-ready signal definition.
+
38 */
+ +
40 std::string name; /**< Signal name. */
+
41 std::uint32_t startBit; /**< DBC start bit. */
+
42 std::uint32_t length; /**< Signal length in bits. */
+
43 ByteOrder byteOrder; /**< Intel or Motorola. */
+
44 ValueType valueType; /**< Signed or unsigned. */
+
45 double factor; /**< Scaling factor. */
+
46 double offset; /**< Physical offset. */
+
47 double minimum; /**< Minimum physical value. */
+
48 double maximum; /**< Maximum physical value. */
+
49 std::string unit; /**< Physical unit. */
+
50 std::vector<std::string> receivers; /**< Receivers. */
+
51 std::string comment; /**< Comment. */
+
52
+ +
54 : name()
+
55 , startBit (0U)
+
56 , length (0U)
+ + +
59 , factor (1.0)
+
60 , offset (0.0)
+
61 , minimum (0.0)
+
62 , maximum (0.0)
+
63 , unit()
+
64 , receivers()
+
65 , comment() {
+
66 }
+
67};
+
68
+
69/**
+
70 * @brief Runtime-ready frame definition.
+
71 */
+ +
73 std::string name; /**< Frame name. */
+
74 std::uint32_t canId; /**< Normalized CAN ID. */
+
75 bool isExtended; /**< true for extended frame. */
+
76 std::uint8_t dlc; /**< Payload length. */
+
77 std::uint32_t pgn; /**< PGN if available. */
+
78 bool hasPgn; /**< true if PGN is valid. */
+
79 std::string transmitter; /**< Transmitter ECU. */
+
80 std::string comment; /**< Frame comment. */
+
81 std::vector<DecodeSignal> signals; /**< Signal definitions. */
+
82
+ +
84 : name()
+
85 , canId (0U)
+
86 , isExtended (false)
+
87 , dlc (0U)
+
88 , pgn (0U)
+
89 , hasPgn (false)
+
90 , transmitter()
+
91 , comment()
+
92 , signals() {
+
93 }
+
94};
+
95
+
96/**
+
97 * @brief Key for fast frame lookup.
+
98 */
+
99struct FrameKey {
+
100 std::uint32_t canId;
+ +
102
+ +
104 : canId (0U)
+
105 , isExtended (false) {
+
106 }
+
107
+
108 FrameKey (std::uint32_t id, bool extended)
+
109 : canId (id)
+
110 , isExtended (extended) {
+
111 }
+
112
+
113 bool operator== (const FrameKey &other) const {
+
114 return (canId == other.canId) && (isExtended == other.isExtended);
+
115 }
+
116};
+
117
+
118/**
+
119 * @brief Hasher for frame key.
+
120 */
+ +
122 std::size_t operator() (const FrameKey &key) const {
+
123 const std::size_t a = static_cast<std::size_t> (key.canId);
+
124 const std::size_t b = key.isExtended ? 1U : 0U;
+
125 return (a * 1315423911U) ^ b;
+
126 }
+
127};
+
128
+
129/**
+
130 * @brief Runtime decode database with fast lookup by CAN ID.
+
131 */
+ +
133 std::vector<DecodeFrame> frames;
+
134 std::unordered_map<FrameKey, std::size_t, FrameKeyHasher> frameIndexByKey;
+
135};
+
136
+
137#endif /* DECODE_DATABASE_H */
+
ByteOrder
Signal byte order used for runtime decoding.
+ + +
ValueType
Signal numeric type.
+ + +
Runtime decode database with fast lookup by CAN ID.
+
std::vector< DecodeFrame > frames
+
std::unordered_map< FrameKey, std::size_t, FrameKeyHasher > frameIndexByKey
+
Runtime-ready frame definition.
+
std::uint32_t pgn
+ +
std::string comment
+
std::vector< DecodeSignal > signals
+ +
std::uint8_t dlc
+
std::uint32_t canId
+
std::string name
+
std::string transmitter
+ +
Runtime-ready signal definition.
+ +
std::string unit
+ + +
std::string name
+ + +
ValueType valueType
+
std::uint32_t startBit
+
std::vector< std::string > receivers
+
ByteOrder byteOrder
+
std::uint32_t length
+
std::string comment
+
Hasher for frame key.
+
std::size_t operator()(const FrameKey &key) const
+
Key for fast frame lookup.
+
std::uint32_t canId
+ +
FrameKey(std::uint32_t id, bool extended)
+ +
bool operator==(const FrameKey &other) const
+
+ + + + diff --git a/docs/html/doc.png b/docs/html/doc.png new file mode 100644 index 0000000..17edabf Binary files /dev/null and b/docs/html/doc.png differ diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css new file mode 100644 index 0000000..2010785 --- /dev/null +++ b/docs/html/doxygen.css @@ -0,0 +1,1841 @@ +/* The standard CSS for doxygen 1.9.4 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +.compoundTemplParams { + color: #4665A2; + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font: 200% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 90% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +code.JavaDocCode { + direction:ltr; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/docs/html/doxygen.svg b/docs/html/doxygen.svg new file mode 100644 index 0000000..d42dad5 --- /dev/null +++ b/docs/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js new file mode 100644 index 0000000..7906639 --- /dev/null +++ b/docs/html/dynsections.js @@ -0,0 +1,128 @@ +/* + @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'); +} + +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 + + + + + + +DBC framework: File List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
File List
+
+
+
Here is a list of all files with brief descriptions:
+ + + + + + + + + + + + + + + + +
 dbc_database.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 dbc_decode_builder.cppCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 dbc_decode_builder.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 dbc_decoder.cppCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 dbc_decoder.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 dbc_parser.cppCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 dbc_parser.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 dbc_tree_builder.cppCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 dbc_tree_builder.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 decode_database.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 frame_info.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 main.cppCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 signal_info.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 tree_node.cppCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
 tree_node.hCreated: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
+
+ + + + diff --git a/docs/html/folderclosed.png b/docs/html/folderclosed.png new file mode 100644 index 0000000..bb8ab35 Binary files /dev/null and b/docs/html/folderclosed.png differ diff --git a/docs/html/folderopen.png b/docs/html/folderopen.png new file mode 100644 index 0000000..d6c7f67 Binary files /dev/null and b/docs/html/folderopen.png differ diff --git a/docs/html/frame__info_8h.html b/docs/html/frame__info_8h.html new file mode 100644 index 0000000..23f2efc --- /dev/null +++ b/docs/html/frame__info_8h.html @@ -0,0 +1,79 @@ + + + + + + + +DBC framework: frame_info.h File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
frame_info.h File Reference
+
+
+ +

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

+
#include <string>
+#include <vector>
+#include <cstdint>
+#include "signal_info.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

struct  FrameInfo
 Describes one CAN frame from a DBC file. More...
 
+

Detailed Description

+

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

+

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

+ +

Definition in file frame_info.h.

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

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+ + +

- ~ -

+
+ + + + diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html new file mode 100644 index 0000000..b72d7db --- /dev/null +++ b/docs/html/functions_func.html @@ -0,0 +1,175 @@ + + + + + + + +DBC framework: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + + + +
+
+  + +

- a -

+ + +

- b -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- ~ -

+
+ + + + diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html new file mode 100644 index 0000000..5267e4b --- /dev/null +++ b/docs/html/functions_vars.html @@ -0,0 +1,178 @@ + + + + + + + +DBC framework: Class Members - Variables + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + + + +
+
+  + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- f -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+
+ + + + diff --git a/docs/html/globals.html b/docs/html/globals.html new file mode 100644 index 0000000..18651ec --- /dev/null +++ b/docs/html/globals.html @@ -0,0 +1,68 @@ + + + + + + + +DBC framework: File Members + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + + +
+
+
Here is a list of all file members with links to the files they belong to:
+
+ + + + diff --git a/docs/html/globals_enum.html b/docs/html/globals_enum.html new file mode 100644 index 0000000..427a8a7 --- /dev/null +++ b/docs/html/globals_enum.html @@ -0,0 +1,65 @@ + + + + + + + +DBC framework: File Members + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + + +
+
+
+ + + + diff --git a/docs/html/globals_func.html b/docs/html/globals_func.html new file mode 100644 index 0000000..9f96630 --- /dev/null +++ b/docs/html/globals_func.html @@ -0,0 +1,65 @@ + + + + + + + +DBC framework: File Members + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + + +
+
+
+ + + + diff --git a/docs/html/index.hhc b/docs/html/index.hhc new file mode 100644 index 0000000..83dda72 --- /dev/null +++ b/docs/html/index.hhc @@ -0,0 +1,496 @@ + + + + + + + + diff --git a/docs/html/index.hhk b/docs/html/index.hhk new file mode 100644 index 0000000..2364421 --- /dev/null +++ b/docs/html/index.hhk @@ -0,0 +1,794 @@ + + + + + + + + diff --git a/docs/html/index.hhp b/docs/html/index.hhp new file mode 100644 index 0000000..1b66c98 --- /dev/null +++ b/docs/html/index.hhp @@ -0,0 +1,116 @@ +[OPTIONS] +Compiled file=dbc.chm +Compatibility=1.1 +Full-text search=Yes +Contents file=index.hhc +Default Window=main +Default topic=index.html +Index file=index.hhk +Language=0x409 English (United States) +Title=DBC framework + +[WINDOWS] +main="DBC framework","index.hhc","index.hhk","index.html","index.html",,,,,0x23520,,0x10387e,,,,,,,,0 + +[FILES] +README_8md.html +annotated.html +classDbcDecodeBuilder-members.html +classDbcDecodeBuilder.html +classDbcDecoder-members.html +classDbcDecoder.html +classDbcParser-members.html +classDbcParser.html +classDbcTreeBuilder-members.html +classDbcTreeBuilder.html +classTreeNode-members.html +classTreeNode.html +classes.html +dbc__database_8h.html +dbc__database_8h_source.html +dbc__decode__builder_8cpp.html +dbc__decode__builder_8cpp_source.html +dbc__decode__builder_8h.html +dbc__decode__builder_8h_source.html +dbc__decoder_8cpp.html +dbc__decoder_8cpp_source.html +dbc__decoder_8h.html +dbc__decoder_8h_source.html +dbc__parser_8cpp.html +dbc__parser_8cpp_source.html +dbc__parser_8h.html +dbc__parser_8h_source.html +dbc__tree__builder_8cpp.html +dbc__tree__builder_8cpp_source.html +dbc__tree__builder_8h.html +dbc__tree__builder_8h_source.html +decode__database_8h.html +decode__database_8h_source.html +files.html +frame__info_8h.html +frame__info_8h_source.html +functions.html +functions_func.html +functions_vars.html +globals.html +globals_enum.html +globals_func.html +index.html +main_8cpp.html +main_8cpp_source.html +md_README.html +namespaceanonymous__namespace_02dbc__parser_8cpp_03.html +namespacemembers.html +namespacemembers_func.html +namespaces.html +pages.html +signal__info_8h.html +signal__info_8h_source.html +structDbcDatabase-members.html +structDbcDatabase.html +structDecodeDatabase-members.html +structDecodeDatabase.html +structDecodeFrame-members.html +structDecodeFrame.html +structDecodeSignal-members.html +structDecodeSignal.html +structDecodedFrameValue-members.html +structDecodedFrameValue.html +structDecodedSignalValue-members.html +structDecodedSignalValue.html +structFrameInfo-members.html +structFrameInfo.html +structFrameKey-members.html +structFrameKey.html +structFrameKeyHasher-members.html +structFrameKeyHasher.html +structRawCanFrame-members.html +structRawCanFrame.html +structSignalInfo-members.html +structSignalInfo.html +tree__node_8cpp.html +tree__node_8cpp_source.html +tree__node_8h.html +tree__node_8h_source.html +bc_s.png +bdwn.png +closed.png +doc.png +doxygen.svg +folderclosed.png +folderopen.png +nav_f.png +nav_g.png +nav_h.png +open.png +splitbar.png +sync_off.png +sync_on.png +tab_a.png +tab_b.png +tab_h.png +tab_s.png +doxygen.css +dynsections.js +jquery.js +tabs.css diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 0000000..e4a3f66 --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,50 @@ + + + + + + + +DBC framework: Main Page + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + +
+
+
DBC framework Documentation
+
+
+
+ + + + diff --git a/docs/html/index.qhp b/docs/html/index.qhp new file mode 100644 index 0000000..0c034d8 --- /dev/null +++ b/docs/html/index.qhp @@ -0,0 +1,691 @@ + + +org.doxygen.Project +doc + +doxygen + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +README_8md.html +annotated.html +bc_s.png +bdwn.png +classDbcDecodeBuilder-members.html +classDbcDecodeBuilder.html +classDbcDecoder-members.html +classDbcDecoder.html +classDbcParser-members.html +classDbcParser.html +classDbcTreeBuilder-members.html +classDbcTreeBuilder.html +classTreeNode-members.html +classTreeNode.html +classes.html +closed.png +dbc__database_8h.html +dbc__database_8h_source.html +dbc__decode__builder_8cpp.html +dbc__decode__builder_8cpp_source.html +dbc__decode__builder_8h.html +dbc__decode__builder_8h_source.html +dbc__decoder_8cpp.html +dbc__decoder_8cpp_source.html +dbc__decoder_8h.html +dbc__decoder_8h_source.html +dbc__parser_8cpp.html +dbc__parser_8cpp_source.html +dbc__parser_8h.html +dbc__parser_8h_source.html +dbc__tree__builder_8cpp.html +dbc__tree__builder_8cpp_source.html +dbc__tree__builder_8h.html +dbc__tree__builder_8h_source.html +decode__database_8h.html +decode__database_8h_source.html +doc.png +doxygen.css +doxygen.svg +dynsections.js +files.html +folderclosed.png +folderopen.png +frame__info_8h.html +frame__info_8h_source.html +functions.html +functions_func.html +functions_vars.html +globals.html +globals_enum.html +globals_func.html +index.html +jquery.js +main_8cpp.html +main_8cpp_source.html +md_README.html +namespaceanonymous__namespace_02dbc__parser_8cpp_03.html +namespacemembers.html +namespacemembers_func.html +namespaces.html +nav_f.png +nav_g.png +nav_h.png +open.png +pages.html +signal__info_8h.html +signal__info_8h_source.html +splitbar.png +structDbcDatabase-members.html +structDbcDatabase.html +structDecodeDatabase-members.html +structDecodeDatabase.html +structDecodeFrame-members.html +structDecodeFrame.html +structDecodeSignal-members.html +structDecodeSignal.html +structDecodedFrameValue-members.html +structDecodedFrameValue.html +structDecodedSignalValue-members.html +structDecodedSignalValue.html +structFrameInfo-members.html +structFrameInfo.html +structFrameKey-members.html +structFrameKey.html +structFrameKeyHasher-members.html +structFrameKeyHasher.html +structRawCanFrame-members.html +structRawCanFrame.html +structSignalInfo-members.html +structSignalInfo.html +sync_off.png +sync_on.png +tab_a.png +tab_b.png +tab_h.png +tab_s.png +tabs.css +tree__node_8cpp.html +tree__node_8cpp_source.html +tree__node_8h.html +tree__node_8h_source.html + + + diff --git a/docs/html/jquery.js b/docs/html/jquery.js new file mode 100644 index 0000000..c9ed3d9 --- /dev/null +++ b/docs/html/jquery.js @@ -0,0 +1,35 @@ +/*! 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 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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/html/main_8cpp.html b/docs/html/main_8cpp.html new file mode 100644 index 0000000..b2b0c08 --- /dev/null +++ b/docs/html/main_8cpp.html @@ -0,0 +1,194 @@ + + + + + + + +DBC framework: main.cpp File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
main.cpp File Reference
+
+
+ +

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

+
#include <iostream>
+#include <iomanip>
+#include <memory>
+#include <vector>
+#include <cstddef>
+#include "dbc_parser.h"
+#include "dbc_tree_builder.h"
+#include "dbc_decode_builder.h"
+#include "dbc_decoder.h"
+
+

Go to the source code of this file.

+ + + + + + + + +

+Functions

static void PrintTree (const TreeNode *node, int indent)
 
static void PrintDecodedFrame (const DecodedFrameValue &decoded)
 
int main (int argc, char *argv[])
 
+

Detailed Description

+

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

+

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

+ +

Definition in file main.cpp.

+

Function Documentation

+ +

◆ main()

+ +
+
+ + + + + + + + + + + + + + + + + + +
int main (int argc,
char * argv[] 
)
+
+
+ +

◆ PrintDecodedFrame()

+ +
+
+ + + + + +
+ + + + + + + + +
static void PrintDecodedFrame (const DecodedFrameValuedecoded)
+
+static
+
+
+ +

◆ PrintTree()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void PrintTree (const TreeNodenode,
int indent 
)
+
+static
+
+
+
+ + + + diff --git a/docs/html/main_8cpp_source.html b/docs/html/main_8cpp_source.html new file mode 100644 index 0000000..dd07911 --- /dev/null +++ b/docs/html/main_8cpp_source.html @@ -0,0 +1,246 @@ + + + + + + + +DBC framework: main.cpp Source File + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
main.cpp
+
+
+Go to the documentation of this file.
1/**
+
2 * @file main.cpp
+
3 * @brief
+
4 *
+
5 * Created: 2026-03-13
+
6 * Author: Deeaitch (Dim. Himro)
+
7 *
+
8 * Licensed under the MIT License.
+
9 * See LICENSE file in the project root for full license text.
+
10 */
+
11
+
12#include <iostream>
+
13#include <iomanip>
+
14#include <memory>
+
15#include <vector>
+
16#include <cstddef>
+
17
+
18#include "dbc_parser.h"
+
19#include "dbc_tree_builder.h"
+
20#include "dbc_decode_builder.h"
+
21#include "dbc_decoder.h"
+
22
+
23static void PrintTree (const TreeNode *node, int indent) {
+
24 if (node == nullptr)
+
25 return;
+
26
+
27 for (int i = 0; i < indent; ++i)
+
28 std::cout << " ";
+
29
+
30 switch (node->GetType()) {
+
31 case NodeType::Root:
+
32 std::cout << "[root] " << node->GetName() << "\n";
+
33 break;
+
34
+
35 case NodeType::Frame: {
+
36 const FrameInfo *frame = node->GetFrame();
+
37 std::cout << "[frame] " << node->GetName();
+
38
+
39 if (frame != nullptr) {
+
40 std::cout << " id=0x" << std::hex << frame->canId << std::dec
+
41 << " ext=" << (frame->isExtended ? "yes" : "no")
+
42 << " dlc=" << static_cast<unsigned int> (frame->dlc);
+
43
+
44 if (frame->hasPgn)
+
45 std::cout << " pgn=" << frame->pgn;
+
46 }
+
47
+
48 std::cout << "\n";
+
49 break;
+
50 }
+
51
+
52 case NodeType::Signal: {
+
53 const SignalInfo *signal = node->GetSignal();
+
54 std::cout << "[signal] " << node->GetName();
+
55
+
56 if (signal != nullptr) {
+
57 std::cout << " start=" << signal->startBit
+
58 << " len=" << signal->length
+
59 << " unit=" << signal->unit;
+
60 }
+
61
+
62 std::cout << "\n";
+
63 break;
+
64 }
+
65
+
66 default:
+
67 std::cout << "[unknown]\n";
+
68 break;
+
69 }
+
70
+
71 for (std::size_t i = 0U; i < node->GetChildCount(); ++i)
+
72 PrintTree (node->GetChild (i), indent + 1);
+
73}
+
74
+
75static void PrintDecodedFrame (const DecodedFrameValue &decoded) {
+
76 if (!decoded.valid || (decoded.definition == nullptr)) {
+
77 std::cout << "No frame definition found.\n";
+
78 return;
+
79 }
+
80
+
81 std::cout << "Decoded frame: " << decoded.definition->name << "\n";
+
82
+
83 for (std::size_t index = 0U; index < decoded.signals.size(); ++index) {
+
84 const DecodedSignalValue &signal = decoded.signals[index];
+
85
+
86 if ((signal.definition == nullptr) || !signal.valid)
+
87 continue;
+
88
+
89 std::cout << " " << signal.definition->name
+
90 << " raw=" << signal.rawValue
+
91 << " physical=" << signal.physicalValue
+
92 << " " << signal.definition->unit
+
93 << "\n";
+
94 }
+
95}
+
96
+
97int main (int argc, char *argv[]) {
+
98 if (argc < 2) {
+
99 std::cerr << "Usage: dbc_demo <file.dbc>\n";
+
100 return 1;
+
101 }
+
102
+
103 try {
+
104 DbcParser parser;
+
105 DbcDatabase database = parser.ParseFile (argv[1]);
+
106
+
107 DbcTreeBuilder treeBuilder;
+
108 std::unique_ptr<TreeNode> root = treeBuilder.Build (database);
+
109
+
110 std::cout << "=== Parsed tree ===\n";
+
111 PrintTree (root.get(), 0);
+
112
+
113 DbcDecodeBuilder decodeBuilder;
+
114 DecodeDatabase decodeDatabase = decodeBuilder.Build (database);
+
115
+
116 /*
+
117 * Example raw frame.
+
118 * Replace with live CAN frame or trace record later.
+
119 */
+
120 RawCanFrame rawFrame;
+
121 rawFrame.canId = decodeDatabase.frames.empty() ? 0U : decodeDatabase.frames[0].canId;
+
122 rawFrame.isExtended = decodeDatabase.frames.empty() ? false : decodeDatabase.frames[0].isExtended;
+
123 rawFrame.data.resize (8U, 0U);
+
124
+
125 DbcDecoder decoder;
+
126 DecodedFrameValue decoded = decoder.Decode (decodeDatabase, rawFrame);
+
127
+
128 std::cout << "\n=== Decoded frame ===\n";
+
129 PrintDecodedFrame (decoded);
+
130 } catch (const std::exception &ex) {
+
131 std::cerr << "Error: " << ex.what() << "\n";
+
132 return 2;
+
133 }
+
134
+
135 return 0;
+
136}
+
Converts parsed DBC data into runtime decode database.
+
DecodeDatabase Build(const DbcDatabase &source) const
Build runtime decode database.
+
Runtime CAN decoder using prebuilt decode database.
Definition: dbc_decoder.h:70
+
DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
Decode one raw CAN frame.
Definition: dbc_decoder.cpp:31
+
Minimal DBC parser.
Definition: dbc_parser.h:35
+
DbcDatabase ParseFile(const std::string &filePath) const
Parse DBC file.
Definition: dbc_parser.cpp:40
+
Builds a simple tree from parsed DBC database.
+
std::unique_ptr< TreeNode > Build(const DbcDatabase &database) const
Build tree representation of parsed DBC data.
+
Tree node for later use in model/view or other hierarchy consumers.
Definition: tree_node.h:35
+
const SignalInfo * GetSignal() const
Get signal payload if node is signal.
Definition: tree_node.cpp:73
+
const TreeNode * GetChild(std::size_t index) const
Get child by index.
Definition: tree_node.cpp:47
+
const std::string & GetName() const
Get display name.
Definition: tree_node.cpp:65
+
std::size_t GetChildCount() const
Get child count.
Definition: tree_node.cpp:43
+
NodeType GetType() const
Get node type.
Definition: tree_node.cpp:61
+
const FrameInfo * GetFrame() const
Get frame payload if node is frame.
Definition: tree_node.cpp:69
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
int main(int argc, char *argv[])
Definition: main.cpp:97
+
static void PrintDecodedFrame(const DecodedFrameValue &decoded)
Definition: main.cpp:75
+
static void PrintTree(const TreeNode *node, int indent)
Definition: main.cpp:23
+
Parsed DBC content stored in a simple internal form.
Definition: dbc_database.h:22
+
Runtime decode database with fast lookup by CAN ID.
+
std::vector< DecodeFrame > frames
+
std::string name
+
std::string unit
+
std::string name
+
Fully decoded frame.
Definition: dbc_decoder.h:55
+ +
const DecodeFrame * definition
Definition: dbc_decoder.h:56
+
std::vector< DecodedSignalValue > signals
Definition: dbc_decoder.h:57
+
One decoded signal value.
Definition: dbc_decoder.h:38
+
std::int64_t rawValue
Definition: dbc_decoder.h:40
+ + +
const DecodeSignal * definition
Definition: dbc_decoder.h:39
+
Describes one CAN frame from a DBC file.
Definition: frame_info.h:24
+
bool isExtended
Definition: frame_info.h:27
+
bool hasPgn
Definition: frame_info.h:29
+
std::uint8_t dlc
Definition: frame_info.h:30
+
std::uint32_t pgn
Definition: frame_info.h:28
+
std::uint32_t canId
Definition: frame_info.h:26
+
Raw CAN frame used for runtime or trace decoding.
Definition: dbc_decoder.h:23
+
std::vector< std::uint8_t > data
Definition: dbc_decoder.h:26
+
std::uint32_t canId
Definition: dbc_decoder.h:24
+
bool isExtended
Definition: dbc_decoder.h:25
+
Describes one signal inside a DBC frame.
Definition: signal_info.h:22
+
std::uint32_t length
Definition: signal_info.h:25
+
std::string unit
Definition: signal_info.h:32
+
std::uint32_t startBit
Definition: signal_info.h:24
+ + + +
+ + + + diff --git a/docs/html/md_README.html b/docs/html/md_README.html new file mode 100644 index 0000000..f6dd088 --- /dev/null +++ b/docs/html/md_README.html @@ -0,0 +1,740 @@ + + + + + + + +DBC framework: DBC Parser and Runtime Decode Module Documentation + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + +
+
+
DBC Parser and Runtime Decode Module Documentation
+
+
+

+Overview

+

This module provides a minimal but extensible DBC parser and runtime decode foundation for the FrameTap project.

+

Its purpose is to:

+
    +
  • parse DBC files
  • +
  • store parsed frame and signal metadata
  • +
  • build a tree for future UI integration
  • +
  • build a runtime-ready decode database
  • +
  • decode live CAN frames
  • +
  • decode CAN trace records using the same decoder
  • +
+

The implementation follows a simple and practical design:

+
    +
  • parser logic is separated from UI logic
  • +
  • runtime decode structures are separated from tree structures
  • +
  • Qt is not required at the parser or decoder level
  • +
  • the same decode engine can be reused for live traffic and trace replay
  • +
+

This is not a full production-grade DBC implementation yet, but it is a strong architectural base.

+
+

+High-Level Architecture

+

The module is divided into two main paths.

+

+1. Parse and UI path

+

Used for:

+
    +
  • browsing frames and signals
  • +
  • later integration with Qt Model/View
  • +
  • displaying metadata
  • +
+

Pipeline:

+
DBC file
+
+
DbcParser
+
+
DbcDatabase
+
+
DbcTreeBuilder
+
+
TreeNode hierarchy
+
+
future Qt UI
+

+2. Runtime decode path

+

Used for:

+
    +
  • live CAN decoding
  • +
  • CAN trace decoding
  • +
  • fast lookup by CAN ID
  • +
+

Pipeline:

+
DBC file
+
+
DbcParser
+
+
DbcDatabase
+
+
DbcDecodeBuilder
+
+
DecodeDatabase
+
+
DbcDecoder
+
+
Decoded values
+

This separation is intentional.

+

The tree is useful for UI, but it is not the main data structure for runtime decoding.

+
+

+Why the Runtime Decode Layer Exists

+

A tree structure is convenient for browsing, but a runtime decoder needs something different:

+
    +
  • fast lookup by CAN ID
  • +
  • direct access to signal decode definitions
  • +
  • minimal overhead during repeated decoding
  • +
  • the same logic for live frames and trace frames
  • +
+

Because of that, the design uses a dedicated runtime-ready structure:

+ +

This avoids forcing UI-oriented structures into a decode role they were not meant for.

+
+

+Module Layout

+

+Parsed DBC structures

+

Files:

+ +

These store a readable representation of the parsed DBC file.

+

+UI tree structures

+

Files:

+ +

These convert parsed DBC content into a tree hierarchy suitable for UI and model/view usage later.

+

+Runtime decode structures

+

Files:

+ +

These convert parsed DBC content into a structure optimized for decoding.

+

+Runtime decoder

+

Files:

+ +

These perform actual decoding of raw CAN frames using DecodeDatabase.

+

+Parser

+

Files:

+ +

These parse the DBC file itself.

+

+Demo

+

File:

+ +

Used as a small integration example.

+
+

+Parsed Data Structures

+

+<tt>SignalInfo</tt>

+

Represents one signal as parsed from the DBC file.

+

Fields:

+
    +
  • name
  • +
  • startBit
  • +
  • length
  • +
  • isLittleEndian
  • +
  • isSigned
  • +
  • factor
  • +
  • offset
  • +
  • minimum
  • +
  • maximum
  • +
  • unit
  • +
  • receivers
  • +
  • comment
  • +
+

Notes:

+
    +
  • receivers is a list because a signal may have more than one receiver ECU
  • +
  • factor and offset define physical conversion
  • +
  • this structure is close to DBC content and easy to inspect
  • +
+

Physical value rule:

+
physical = raw * factor + offset
+

+

+<tt>FrameInfo</tt>

+

Represents one frame as parsed from the DBC file.

+

Fields:

+
    +
  • name
  • +
  • canId
  • +
  • isExtended
  • +
  • pgn
  • +
  • hasPgn
  • +
  • dlc
  • +
  • transmitter
  • +
  • comment
  • +
  • signals
  • +
+

Notes:

+
    +
  • signals is a list of SignalInfo
  • +
  • isExtended is determined during CAN ID normalization
  • +
  • pgn is derived using simplified J1939 logic when applicable
  • +
+
+

+<tt>DbcDatabase</tt>

+

Top-level parsed DBC container.

+

Conceptually:

+
DbcDatabase
+
└── vector<FrameInfo>
+

This is the central structure produced by DbcParser.

+
+

+UI Tree Layer

+

+<tt>TreeNode</tt>

+

The UI tree contains three node types:

+
    +
  • Root
  • +
  • Frame
  • +
  • Signal
  • +
+

Example hierarchy:

+
dbc
+
├── EngineData
+
│ ├── EngineSpeed
+
│ ├── OilTemp
+
│ └── CoolantTemp
+
└── VehicleData
+
├── VehicleSpeed
+
└── Odometer
+

Each node stores either:

+ +

The tree is intended for browsing and later Qt model integration.

+

It is not the primary runtime decode structure.

+
+

+Runtime Decode Layer

+

+Purpose

+

The decode layer exists so that decoding can be fast and independent from UI concerns.

+

Instead of searching a tree, the decoder uses a prepared database with direct lookup.

+
+

+<tt>ByteOrder</tt>

+

Runtime byte order enum:

+
    +
  • Intel
  • +
  • Motorola
  • +
+

This is better for decode code than passing around raw DBC characters.

+
+

+<tt>ValueType</tt>

+

Numeric type enum:

+
    +
  • Unsigned
  • +
  • Signed
  • +
+

This is clearer than combining multiple boolean flags during runtime logic.

+
+

+<tt>DecodeSignal</tt>

+

Represents one runtime-ready signal definition.

+

Fields:

+
    +
  • name
  • +
  • startBit
  • +
  • length
  • +
  • byteOrder
  • +
  • valueType
  • +
  • factor
  • +
  • offset
  • +
  • minimum
  • +
  • maximum
  • +
  • unit
  • +
  • receivers
  • +
  • comment
  • +
+

This structure contains all information required for extracting and converting a signal value from raw frame data.

+
+

+<tt>DecodeFrame</tt>

+

Represents one runtime-ready frame definition.

+

Fields:

+
    +
  • name
  • +
  • canId
  • +
  • isExtended
  • +
  • dlc
  • +
  • pgn
  • +
  • hasPgn
  • +
  • transmitter
  • +
  • comment
  • +
  • signals
  • +
+

This structure is used directly by the decoder.

+
+

+<tt>FrameKey</tt>

+

Fast lookup key for runtime frame matching.

+

Fields:

+
    +
  • canId
  • +
  • isExtended
  • +
+

This matters because the same numeric identifier must not be confused between standard and extended frames.

+
+

+<tt>DecodeDatabase</tt>

+

Top-level runtime decode container.

+

Fields:

+
    +
  • frames
  • +
  • frameIndexByKey
  • +
+

Conceptually:

+
DecodeDatabase
+
├── vector<DecodeFrame>
+
└── unordered_map<FrameKey, index>
+

This gives the decoder fast access to a frame definition using CAN ID and frame type.

+
+

+Decoder Layer

+

+<tt>RawCanFrame</tt>

+

Represents a raw CAN frame to decode.

+

Fields:

+
    +
  • canId
  • +
  • isExtended
  • +
  • data
  • +
+

This same structure can be used for:

+
    +
  • live CAN bus input
  • +
  • replayed trace records
  • +
  • unit tests
  • +
+
+

+<tt>DecodedSignalValue</tt>

+

Represents one decoded signal result.

+

Fields:

+
    +
  • definition
  • +
  • rawValue
  • +
  • physicalValue
  • +
  • valid
  • +
+
+

+<tt>DecodedFrameValue</tt>

+

Represents one decoded frame result.

+

Fields:

+
    +
  • definition
  • +
  • signals
  • +
  • valid
  • +
+

This is the decoder output for one raw frame.

+
+

+<tt>DbcDecoder</tt>

+

Main runtime decoder class.

+

Responsibilities:

+
    +
  • find a frame definition by CAN ID
  • +
  • decode all signals in a frame
  • +
  • extract raw values
  • +
  • sign-extend signed values
  • +
  • convert raw values into physical values
  • +
+

Main methods:

+
    +
  • FindFrame(...)
  • +
  • Decode(...)
  • +
+
+

+Parser Support

+

The current parser supports the following DBC elements:

+
    +
  • BO_
  • +
  • SG_
  • +
  • CM_ BO_
  • +
  • CM_ SG_
  • +
+
+

+Supported DBC Syntax

+

+Frame definition

+

Example:

+
BO_ 256 EngineData: 8 EEC1
+

Parsed fields:

+
    +
  • frame CAN ID
  • +
  • frame name
  • +
  • DLC
  • +
  • transmitter ECU
  • +
+
+

+Signal definition

+

Example:

+
SG_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] "rpm" ECU1,ECU2
+

Parsed fields:

+
    +
  • signal name
  • +
  • start bit
  • +
  • signal length
  • +
  • byte order
  • +
  • signedness
  • +
  • factor
  • +
  • offset
  • +
  • minimum
  • +
  • maximum
  • +
  • unit
  • +
  • receivers
  • +
+
+

+Comments

+

Frame comment example:

+
CM_ BO_ 256 "Engine data frame";
+

Signal comment example:

+
CM_ SG_ 256 EngineSpeed "Actual engine speed";
+

Stored in:

+ +
+

+CAN ID Normalization

+

The parser normalizes frame identifiers.

+

Common DBC behavior:

+
    +
  • extended identifiers may be stored with bit 31 set
  • +
  • the actual 29-bit identifier must be extracted from that value
  • +
+

The parser therefore stores:

+
    +
  • normalized canId
  • +
  • separate isExtended flag
  • +
+

This is important both for correct lookup and for future interoperability with live CAN APIs.

+
+

+PGN Extraction

+

PGN is derived only when the frame is treated as extended.

+

The current logic is simplified J1939 extraction:

+
    +
  • pf
  • +
  • ps
  • +
  • dp
  • +
+

This is enough for a practical start but should not be treated as full J1939 validation.

+
+

+Decode Flow

+

Typical runtime decode flow:

+
RawCanFrame
+
+
Find frame in DecodeDatabase
+
+
For each signal:
+
extract raw bits
+
apply sign extension if needed
+
convert to physical value
+
+
DecodedFrameValue
+

+

+Intel and Motorola Extraction

+

The decoder currently has separate extraction paths:

+
    +
  • ExtractIntel(...)
  • +
  • ExtractMotorola(...)
  • +
+

This is important because byte order is not just metadata once decoding starts.

+

Intel and Motorola require different bit extraction logic.

+

This is one of the main reasons why the runtime decode layer should be explicit and prepared in advance.

+
+

+Example Usage

+

+Parse DBC

+
DbcParser parser;
+
DbcDatabase database = parser.ParseFile("example.dbc");
+
Minimal DBC parser.
Definition: dbc_parser.h:35
+
DbcDatabase ParseFile(const std::string &filePath) const
Parse DBC file.
Definition: dbc_parser.cpp:40
+
Parsed DBC content stored in a simple internal form.
Definition: dbc_database.h:22
+

+Build UI tree

+
DbcTreeBuilder treeBuilder;
+
std::unique_ptr<TreeNode> root = treeBuilder.Build(database);
+
Builds a simple tree from parsed DBC database.
+
std::unique_ptr< TreeNode > Build(const DbcDatabase &database) const
Build tree representation of parsed DBC data.
+

+Build runtime decode database

+
DbcDecodeBuilder decodeBuilder;
+
DecodeDatabase decodeDatabase = decodeBuilder.Build(database);
+
Converts parsed DBC data into runtime decode database.
+
DecodeDatabase Build(const DbcDatabase &source) const
Build runtime decode database.
+
Runtime decode database with fast lookup by CAN ID.
+

+Decode a raw frame

+
RawCanFrame rawFrame;
+
rawFrame.canId = 0x123;
+
rawFrame.isExtended = false;
+
rawFrame.data = {0x01, 0x02, 0x03, 0x04};
+
+
DbcDecoder decoder;
+
DecodedFrameValue decoded = decoder.Decode(decodeDatabase, rawFrame);
+
Runtime CAN decoder using prebuilt decode database.
Definition: dbc_decoder.h:70
+
DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
Decode one raw CAN frame.
Definition: dbc_decoder.cpp:31
+
Fully decoded frame.
Definition: dbc_decoder.h:55
+
Raw CAN frame used for runtime or trace decoding.
Definition: dbc_decoder.h:23
+
std::vector< std::uint8_t > data
Definition: dbc_decoder.h:26
+
std::uint32_t canId
Definition: dbc_decoder.h:24
+
bool isExtended
Definition: dbc_decoder.h:25
+

+

+Unified Decode Strategy

+

A key design goal is that the same decoder should work for both:

+
    +
  • live CAN frames
  • +
  • trace replay frames
  • +
+

That means this architecture supports:

+

+live path

+
live CAN input
+
+
RawCanFrame
+
+
DbcDecoder
+
+
decoded signal values
+

+trace path

+
trace reader
+
+
RawCanFrame
+
+
DbcDecoder
+
+
decoded signal values
+

This avoids duplicating decode logic in two separate parts of the application.

+
+

+Intended Use in FrameTap

+

This module is meant to support at least the following FrameTap workflows:

+
    +
  • load a DBC file
  • +
  • browse frames and signals
  • +
  • search signals
  • +
  • drag a signal into a plot later
  • +
  • decode live CAN traffic
  • +
  • decode recorded traces
  • +
  • convert raw values into physical values
  • +
  • show metadata like units, comments, transmitter, receivers, and PGN
  • +
+

Example combined workflow:

+
Load DBC
+
+
Parse into DbcDatabase
+
+
Build UI tree
+
+
Build DecodeDatabase
+
+
Use same decode engine for:
+
- live frames
+
- trace replay
+

+

+Why the Tree Is Not Enough

+

The tree exists for browsing.

+

However, runtime decode should not rely on tree traversal because that would introduce unnecessary coupling and inefficiency.

+

A runtime decoder needs:

+
    +
  • fast key-based access
  • +
  • minimal interpretation at decode time
  • +
  • direct signal definitions already prepared
  • +
+

That is why DecodeDatabase is a separate layer.

+
+

+Why No Abstract Factory Is Used

+

At the current stage, abstract factory is intentionally avoided.

+

The current design is already clean:

+
parser → parsed database → decode database
+
↘ tree builder → UI tree
+

Introducing factory layers now would increase complexity without solving an immediate problem.

+

If later the project requires multiple output representations or multiple build strategies, that can be added then.

+
+

+Current Limitations

+

This is still a minimal implementation.

+

Not supported yet:

+
    +
  • multiplexed signals
  • +
  • VAL_ tables
  • +
  • BA_ attributes
  • +
  • BA_DEF_ definitions
  • +
  • advanced comment handling
  • +
  • full DBC grammar coverage
  • +
  • full J1939 validation
  • +
  • extensive edge-case handling for unusual DBC formatting
  • +
+

Motorola extraction is implemented, but it should still be verified carefully against real-world DBC files and expected values.

+
+

+Recommended Next Steps

+

A practical development order would be:

+

+Stage 1 - already implemented

+
    +
  • BO_
  • +
  • SG_
  • +
  • CM_
  • +
  • normalized CAN ID
  • +
  • isExtended
  • +
  • transmitter
  • +
  • receivers
  • +
  • comments
  • +
  • tree representation
  • +
  • runtime decode database
  • +
  • runtime decoder
  • +
+

+Stage 2

+

Recommended additions:

+
    +
  • parent pointer in TreeNode
  • +
  • Qt model adapter
  • +
  • VAL_ support for enum-style signals
  • +
  • better display strings for UI
  • +
  • selective decoding of only chosen signals
  • +
+

+Stage 3

+

Recommended additions:

+
    +
  • multiplexing support
  • +
  • attribute parsing
  • +
  • richer J1939 support
  • +
  • CSV export of decoded traces
  • +
  • optimized filtering and signal selection
  • +
+

+Stage 4

+

Advanced functionality:

+
    +
  • live plot integration
  • +
  • signal subscriptions
  • +
  • per-signal trace decode pipelines
  • +
  • decoder-assisted export formats
  • +
+
+

+Build Integration

+

The module does not depend on any specific build system.

+

It can be integrated with:

+
    +
  • CMake
  • +
  • qmake
  • +
  • Makefile
  • +
+

Just add the source files to the project.

+
+

+Summary

+

This module is now split into two intentionally separate layers:

+

+Parsed representation

+

Used for:

+
    +
  • storing parsed DBC content
  • +
  • browsing
  • +
  • UI tree generation
  • +
+

+Runtime decode representation

+

Used for:

+
    +
  • fast frame lookup
  • +
  • live CAN decode
  • +
  • trace decode
  • +
  • physical value conversion
  • +
+

That separation is the main architectural improvement.

+

In short, the system now looks like this:

+
DBC parser → DbcDatabase → DecodeDatabase → DbcDecoder
+
↘ TreeNode → future UI
+

This gives FrameTap a much better foundation for real use, because both browsing and decoding are supported without forcing one representation to do the other's job.

+
+
+ + + + diff --git a/docs/html/menudata.js b/docs/html/menudata.js new file mode 100644 index 0000000..34f2450 --- /dev/null +++ b/docs/html/menudata.js @@ -0,0 +1,95 @@ +/* + @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:"Related Pages",url:"pages.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html"}, +{text:"Functions",url:"namespacemembers_func.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"v",url:"functions.html#index_v"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"b",url:"functions_func.html#index_b"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"~",url:"functions_func.html#index__7E"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"b",url:"functions_vars.html#index_b"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"f",url:"functions_vars.html#index_f"}, +{text:"h",url:"functions_vars.html#index_h"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"l",url:"functions_vars.html#index_l"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"u",url:"functions_vars.html#index_u"}, +{text:"v",url:"functions_vars.html#index_v"}]}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html"}, +{text:"Functions",url:"globals_func.html"}, +{text:"Enumerations",url:"globals_enum.html"}]}]}]} diff --git a/docs/html/namespaceanonymous__namespace_02dbc__parser_8cpp_03.html b/docs/html/namespaceanonymous__namespace_02dbc__parser_8cpp_03.html new file mode 100644 index 0000000..f8e36f5 --- /dev/null +++ b/docs/html/namespaceanonymous__namespace_02dbc__parser_8cpp_03.html @@ -0,0 +1,97 @@ + + + + + + + +DBC framework: anonymous_namespace{dbc_parser.cpp} Namespace Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
anonymous_namespace{dbc_parser.cpp} Namespace Reference
+
+
+ + + + + +

+Functions

std::string TrimText (const std::string &text)
 Remove leading and trailing spaces. More...
 
+

Function Documentation

+ +

◆ TrimText()

+ +
+
+ + + + + + + + +
std::string anonymous_namespace{dbc_parser.cpp}::TrimText (const std::string & text)
+
+ +

Remove leading and trailing spaces.

+
Parameters
+ + +
textInput text.
+
+
+
Returns
Trimmed text.
+ +

Definition at line 25 of file dbc_parser.cpp.

+ +

Referenced by DbcParser::ParseSignalLine(), DbcParser::SplitReceivers(), and DbcParser::Trim().

+ +
+
+
+ + + + diff --git a/docs/html/namespacemembers.html b/docs/html/namespacemembers.html new file mode 100644 index 0000000..f61943e --- /dev/null +++ b/docs/html/namespacemembers.html @@ -0,0 +1,62 @@ + + + + + + + +DBC framework: Namespace Members + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + + +
+
+
Here is a list of all namespace members with links to the namespace documentation for each member:
+
+ + + + diff --git a/docs/html/namespacemembers_func.html b/docs/html/namespacemembers_func.html new file mode 100644 index 0000000..3d75f1b --- /dev/null +++ b/docs/html/namespacemembers_func.html @@ -0,0 +1,62 @@ + + + + + + + +DBC framework: Namespace Members + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + + +
+
+
+ + + + diff --git a/docs/html/namespaces.html b/docs/html/namespaces.html new file mode 100644 index 0000000..3a0561d --- /dev/null +++ b/docs/html/namespaces.html @@ -0,0 +1,61 @@ + + + + + + + +DBC framework: Namespace List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
Namespace List
+
+
+
Here is a list of all namespaces with brief descriptions:
+
+ + + + diff --git a/docs/html/nav_f.png b/docs/html/nav_f.png new file mode 100644 index 0000000..72a58a5 Binary files /dev/null and b/docs/html/nav_f.png differ diff --git a/docs/html/nav_g.png b/docs/html/nav_g.png new file mode 100644 index 0000000..2093a23 Binary files /dev/null and b/docs/html/nav_g.png differ diff --git a/docs/html/nav_h.png b/docs/html/nav_h.png new file mode 100644 index 0000000..33389b1 Binary files /dev/null and b/docs/html/nav_h.png differ diff --git a/docs/html/open.png b/docs/html/open.png new file mode 100644 index 0000000..30f75c7 Binary files /dev/null and b/docs/html/open.png differ diff --git a/docs/html/pages.html b/docs/html/pages.html new file mode 100644 index 0000000..8f9cce5 --- /dev/null +++ b/docs/html/pages.html @@ -0,0 +1,55 @@ + + + + + + + +DBC framework: Related Pages + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + +
+
+
Related Pages
+
+
+
Here is a list of all related documentation pages:
+
+ + + + diff --git a/docs/html/signal__info_8h.html b/docs/html/signal__info_8h.html new file mode 100644 index 0000000..f41b4db --- /dev/null +++ b/docs/html/signal__info_8h.html @@ -0,0 +1,78 @@ + + + + + + + +DBC framework: signal_info.h File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
signal_info.h File Reference
+
+
+ +

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

+
#include <string>
+#include <vector>
+#include <cstdint>
+
+

Go to the source code of this file.

+ + + + + +

+Classes

struct  SignalInfo
 Describes one signal inside a DBC frame. More...
 
+

Detailed Description

+

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

+

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

+ +

Definition in file signal_info.h.

+
+ + + + diff --git a/docs/html/signal__info_8h_source.html b/docs/html/signal__info_8h_source.html new file mode 100644 index 0000000..abdeb3e --- /dev/null +++ b/docs/html/signal__info_8h_source.html @@ -0,0 +1,122 @@ + + + + + + + +DBC framework: signal_info.h Source File + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
signal_info.h
+
+
+Go to the documentation of this file.
1/**
+
2 * @file signal_info.h
+
3 * @brief
+
4 *
+
5 * Created: 2026-03-13
+
6 * Author: Deeaitch (Dim. Himro)
+
7 *
+
8 * Licensed under the MIT License.
+
9 * See LICENSE file in the project root for full license text.
+
10 */
+
11
+
12#ifndef SIGNAL_INFO_H
+
13#define SIGNAL_INFO_H
+
14
+
15#include <string>
+
16#include <vector>
+
17#include <cstdint>
+
18
+
19/**
+
20 * @brief Describes one signal inside a DBC frame.
+
21 */
+
22struct SignalInfo {
+
23 std::string name; /**< Signal name. */
+
24 std::uint32_t startBit; /**< Start bit in DBC notation. */
+
25 std::uint32_t length; /**< Signal length in bits. */
+
26 bool isLittleEndian; /**< true for Intel, false for Motorola. */
+
27 bool isSigned; /**< true if signal is signed. */
+
28 double factor; /**< Scaling factor. */
+
29 double offset; /**< Physical offset. */
+
30 double minimum; /**< Minimum physical value. */
+
31 double maximum; /**< Maximum physical value. */
+
32 std::string unit; /**< Physical unit. */
+
33 std::vector<std::string> receivers; /**< Signal receivers. */
+
34 std::string comment; /**< Optional signal comment. */
+
35
+ +
37 : name()
+
38 , startBit (0U)
+
39 , length (0U)
+
40 , isLittleEndian (true)
+
41 , isSigned (false)
+
42 , factor (1.0)
+
43 , offset (0.0)
+
44 , minimum (0.0)
+
45 , maximum (0.0)
+
46 , unit()
+
47 , receivers()
+
48 , comment() {
+
49 }
+
50};
+
51
+
52#endif /* SIGNAL_INFO_H */
+
Describes one signal inside a DBC frame.
Definition: signal_info.h:22
+
std::uint32_t length
Definition: signal_info.h:25
+
std::string unit
Definition: signal_info.h:32
+
std::vector< std::string > receivers
Definition: signal_info.h:33
+
std::string name
Definition: signal_info.h:23
+
bool isSigned
Definition: signal_info.h:27
+ +
double offset
Definition: signal_info.h:29
+
std::string comment
Definition: signal_info.h:34
+
std::uint32_t startBit
Definition: signal_info.h:24
+
double minimum
Definition: signal_info.h:30
+
double maximum
Definition: signal_info.h:31
+
double factor
Definition: signal_info.h:28
+
bool isLittleEndian
Definition: signal_info.h:26
+
+ + + + diff --git a/docs/html/splitbar.png b/docs/html/splitbar.png new file mode 100644 index 0000000..fe895f2 Binary files /dev/null and b/docs/html/splitbar.png differ diff --git a/docs/html/structDbcDatabase-members.html b/docs/html/structDbcDatabase-members.html new file mode 100644 index 0000000..ad6b28c --- /dev/null +++ b/docs/html/structDbcDatabase-members.html @@ -0,0 +1,61 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DbcDatabase Member List
+
+
+ +

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

+ + +
framesDbcDatabase
+ + + + diff --git a/docs/html/structDbcDatabase.html b/docs/html/structDbcDatabase.html new file mode 100644 index 0000000..2068a72 --- /dev/null +++ b/docs/html/structDbcDatabase.html @@ -0,0 +1,98 @@ + + + + + + + +DBC framework: DbcDatabase Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
DbcDatabase Struct Reference
+
+
+ +

Parsed DBC content stored in a simple internal form. + More...

+ +

#include <dbc_database.h>

+ + + + +

+Public Attributes

std::vector< FrameInfoframes
 
+

Detailed Description

+

Parsed DBC content stored in a simple internal form.

+ +

Definition at line 22 of file dbc_database.h.

+

Member Data Documentation

+ +

◆ frames

+ +
+
+ + + + +
std::vector<FrameInfo> DbcDatabase::frames
+
+

All frames found in the DBC file.

+ +

Definition at line 23 of file dbc_database.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structDecodeDatabase-members.html b/docs/html/structDecodeDatabase-members.html new file mode 100644 index 0000000..cde9ba8 --- /dev/null +++ b/docs/html/structDecodeDatabase-members.html @@ -0,0 +1,62 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DecodeDatabase Member List
+
+
+ +

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

+ + + +
frameIndexByKeyDecodeDatabase
framesDecodeDatabase
+ + + + diff --git a/docs/html/structDecodeDatabase.html b/docs/html/structDecodeDatabase.html new file mode 100644 index 0000000..0ac4fbd --- /dev/null +++ b/docs/html/structDecodeDatabase.html @@ -0,0 +1,117 @@ + + + + + + + +DBC framework: DecodeDatabase Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
DecodeDatabase Struct Reference
+
+
+ +

Runtime decode database with fast lookup by CAN ID. + More...

+ +

#include <decode_database.h>

+ + + + + + +

+Public Attributes

std::vector< DecodeFrameframes
 
std::unordered_map< FrameKey, std::size_t, FrameKeyHasherframeIndexByKey
 
+

Detailed Description

+

Runtime decode database with fast lookup by CAN ID.

+ +

Definition at line 132 of file decode_database.h.

+

Member Data Documentation

+ +

◆ frameIndexByKey

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

Definition at line 134 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ frames

+ +
+
+ + + + +
std::vector<DecodeFrame> DecodeDatabase::frames
+
+ +

Definition at line 133 of file decode_database.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structDecodeFrame-members.html b/docs/html/structDecodeFrame-members.html new file mode 100644 index 0000000..4464859 --- /dev/null +++ b/docs/html/structDecodeFrame-members.html @@ -0,0 +1,70 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DecodeFrame Member List
+
+ + + + + diff --git a/docs/html/structDecodeFrame.html b/docs/html/structDecodeFrame.html new file mode 100644 index 0000000..dec3d42 --- /dev/null +++ b/docs/html/structDecodeFrame.html @@ -0,0 +1,300 @@ + + + + + + + +DBC framework: DecodeFrame Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
DecodeFrame Struct Reference
+
+
+ +

Runtime-ready frame definition. + More...

+ +

#include <decode_database.h>

+ + + + +

+Public Member Functions

 DecodeFrame ()
 
+ + + + + + + + + + + + + + + + + + + +

+Public Attributes

std::string name
 
std::uint32_t canId
 
bool isExtended
 
std::uint8_t dlc
 
std::uint32_t pgn
 
bool hasPgn
 
std::string transmitter
 
std::string comment
 
std::vector< DecodeSignalsignals
 
+

Detailed Description

+

Runtime-ready frame definition.

+ +

Definition at line 72 of file decode_database.h.

+

Constructor & Destructor Documentation

+ +

◆ DecodeFrame()

+ +
+
+ + + + + +
+ + + + + + + +
DecodeFrame::DecodeFrame ()
+
+inline
+
+ +

Definition at line 83 of file decode_database.h.

+ +
+
+

Member Data Documentation

+ +

◆ canId

+ +
+
+ + + + +
std::uint32_t DecodeFrame::canId
+
+

Normalized CAN ID.

+ +

Definition at line 74 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ comment

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

Frame comment.

+ +

Definition at line 80 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ dlc

+ +
+
+ + + + +
std::uint8_t DecodeFrame::dlc
+
+

Payload length.

+ +

Definition at line 76 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ hasPgn

+ +
+
+ + + + +
bool DecodeFrame::hasPgn
+
+

true if PGN is valid.

+ +

Definition at line 78 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ isExtended

+ +
+
+ + + + +
bool DecodeFrame::isExtended
+
+

true for extended frame.

+ +

Definition at line 75 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ name

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

Frame name.

+ +

Definition at line 73 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ pgn

+ +
+
+ + + + +
std::uint32_t DecodeFrame::pgn
+
+

PGN if available.

+ +

Definition at line 77 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ signals

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

Signal definitions.

+ +

Definition at line 81 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ transmitter

+ +
+
+ + + + +
std::string DecodeFrame::transmitter
+
+

Transmitter ECU.

+ +

Definition at line 79 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structDecodeSignal-members.html b/docs/html/structDecodeSignal-members.html new file mode 100644 index 0000000..10a0df2 --- /dev/null +++ b/docs/html/structDecodeSignal-members.html @@ -0,0 +1,73 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DecodeSignal Member List
+
+ + + + + diff --git a/docs/html/structDecodeSignal.html b/docs/html/structDecodeSignal.html new file mode 100644 index 0000000..6163042 --- /dev/null +++ b/docs/html/structDecodeSignal.html @@ -0,0 +1,363 @@ + + + + + + + +DBC framework: DecodeSignal Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
DecodeSignal Struct Reference
+
+
+ +

Runtime-ready signal definition. + More...

+ +

#include <decode_database.h>

+ + + + +

+Public Member Functions

 DecodeSignal ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

std::string name
 
std::uint32_t startBit
 
std::uint32_t length
 
ByteOrder byteOrder
 
ValueType valueType
 
double factor
 
double offset
 
double minimum
 
double maximum
 
std::string unit
 
std::vector< std::string > receivers
 
std::string comment
 
+

Detailed Description

+

Runtime-ready signal definition.

+ +

Definition at line 39 of file decode_database.h.

+

Constructor & Destructor Documentation

+ +

◆ DecodeSignal()

+ +
+
+ + + + + +
+ + + + + + + +
DecodeSignal::DecodeSignal ()
+
+inline
+
+ +

Definition at line 53 of file decode_database.h.

+ +
+
+

Member Data Documentation

+ +

◆ byteOrder

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

Intel or Motorola.

+ +

Definition at line 43 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ comment

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

Comment.

+ +

Definition at line 51 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ factor

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

Scaling factor.

+ +

Definition at line 45 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ length

+ +
+
+ + + + +
std::uint32_t DecodeSignal::length
+
+

Signal length in bits.

+ +

Definition at line 42 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ maximum

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

Maximum physical value.

+ +

Definition at line 48 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ minimum

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

Minimum physical value.

+ +

Definition at line 47 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ name

+ +
+
+ + + + +
std::string DecodeSignal::name
+
+

Signal name.

+ +

Definition at line 40 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ offset

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

Physical offset.

+ +

Definition at line 46 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ receivers

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

Receivers.

+ +

Definition at line 50 of file decode_database.h.

+ +

Referenced by DbcDecodeBuilder::Build().

+ +
+
+ +

◆ startBit

+ +
+
+ + + + +
std::uint32_t DecodeSignal::startBit
+
+

DBC start bit.

+ +

Definition at line 41 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ unit

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

Physical unit.

+ +

Definition at line 49 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ valueType

+ +
+
+ + + + +
ValueType DecodeSignal::valueType
+
+

Signed or unsigned.

+ +

Definition at line 44 of file decode_database.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structDecodedFrameValue-members.html b/docs/html/structDecodedFrameValue-members.html new file mode 100644 index 0000000..2573264 --- /dev/null +++ b/docs/html/structDecodedFrameValue-members.html @@ -0,0 +1,64 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DecodedFrameValue Member List
+
+
+ +

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

+ + + + + +
DecodedFrameValue()DecodedFrameValueinline
definitionDecodedFrameValue
signalsDecodedFrameValue
validDecodedFrameValue
+ + + + diff --git a/docs/html/structDecodedFrameValue.html b/docs/html/structDecodedFrameValue.html new file mode 100644 index 0000000..2ce38f5 --- /dev/null +++ b/docs/html/structDecodedFrameValue.html @@ -0,0 +1,174 @@ + + + + + + + +DBC framework: DecodedFrameValue Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
DecodedFrameValue Struct Reference
+
+
+ +

Fully decoded frame. + More...

+ +

#include <dbc_decoder.h>

+ + + + +

+Public Member Functions

 DecodedFrameValue ()
 
+ + + + + + + +

+Public Attributes

const DecodeFramedefinition
 
std::vector< DecodedSignalValuesignals
 
bool valid
 
+

Detailed Description

+

Fully decoded frame.

+ +

Definition at line 55 of file dbc_decoder.h.

+

Constructor & Destructor Documentation

+ +

◆ DecodedFrameValue()

+ +
+
+ + + + + +
+ + + + + + + +
DecodedFrameValue::DecodedFrameValue ()
+
+inline
+
+ +

Definition at line 60 of file dbc_decoder.h.

+ +
+
+

Member Data Documentation

+ +

◆ definition

+ +
+
+ + + + +
const DecodeFrame* DecodedFrameValue::definition
+
+

Frame definition.

+ +

Definition at line 56 of file dbc_decoder.h.

+ +

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

+ +
+
+ +

◆ signals

+ +
+
+ + + + +
std::vector<DecodedSignalValue> DecodedFrameValue::signals
+
+

Decoded signal values.

+ +

Definition at line 57 of file dbc_decoder.h.

+ +

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

+ +
+
+ +

◆ valid

+ +
+
+ + + + +
bool DecodedFrameValue::valid
+
+

true if frame was matched.

+ +

Definition at line 58 of file dbc_decoder.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structDecodedSignalValue-members.html b/docs/html/structDecodedSignalValue-members.html new file mode 100644 index 0000000..d0eaab6 --- /dev/null +++ b/docs/html/structDecodedSignalValue-members.html @@ -0,0 +1,65 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
DecodedSignalValue Member List
+
+ + + + + diff --git a/docs/html/structDecodedSignalValue.html b/docs/html/structDecodedSignalValue.html new file mode 100644 index 0000000..0dcf1f8 --- /dev/null +++ b/docs/html/structDecodedSignalValue.html @@ -0,0 +1,195 @@ + + + + + + + +DBC framework: DecodedSignalValue Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
DecodedSignalValue Struct Reference
+
+
+ +

One decoded signal value. + More...

+ +

#include <dbc_decoder.h>

+ + + + +

+Public Member Functions

 DecodedSignalValue ()
 
+ + + + + + + + + +

+Public Attributes

const DecodeSignaldefinition
 
std::int64_t rawValue
 
double physicalValue
 
bool valid
 
+

Detailed Description

+

One decoded signal value.

+ +

Definition at line 38 of file dbc_decoder.h.

+

Constructor & Destructor Documentation

+ +

◆ DecodedSignalValue()

+ +
+
+ + + + + +
+ + + + + + + +
DecodedSignalValue::DecodedSignalValue ()
+
+inline
+
+ +

Definition at line 44 of file dbc_decoder.h.

+ +
+
+

Member Data Documentation

+ +

◆ definition

+ +
+
+ + + + +
const DecodeSignal* DecodedSignalValue::definition
+
+

Signal definition.

+ +

Definition at line 39 of file dbc_decoder.h.

+ +

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

+ +
+
+ +

◆ physicalValue

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

Converted physical value.

+ +

Definition at line 41 of file dbc_decoder.h.

+ +

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

+ +
+
+ +

◆ rawValue

+ +
+
+ + + + +
std::int64_t DecodedSignalValue::rawValue
+
+

Extracted raw integer value.

+ +

Definition at line 40 of file dbc_decoder.h.

+ +

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

+ +
+
+ +

◆ valid

+ +
+
+ + + + +
bool DecodedSignalValue::valid
+
+

true if decoding succeeded.

+ +

Definition at line 42 of file dbc_decoder.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structFrameInfo-members.html b/docs/html/structFrameInfo-members.html new file mode 100644 index 0000000..03dbb8d --- /dev/null +++ b/docs/html/structFrameInfo-members.html @@ -0,0 +1,70 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
FrameInfo Member List
+
+
+ +

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

+ + + + + + + + + + + +
canIdFrameInfo
commentFrameInfo
dlcFrameInfo
FrameInfo()FrameInfoinline
hasPgnFrameInfo
isExtendedFrameInfo
nameFrameInfo
pgnFrameInfo
signalsFrameInfo
transmitterFrameInfo
+ + + + diff --git a/docs/html/structFrameInfo.html b/docs/html/structFrameInfo.html new file mode 100644 index 0000000..770acb0 --- /dev/null +++ b/docs/html/structFrameInfo.html @@ -0,0 +1,300 @@ + + + + + + + +DBC framework: FrameInfo Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
FrameInfo Struct Reference
+
+
+ +

Describes one CAN frame from a DBC file. + More...

+ +

#include <frame_info.h>

+ + + + +

+Public Member Functions

 FrameInfo ()
 
+ + + + + + + + + + + + + + + + + + + +

+Public Attributes

std::string name
 
std::uint32_t canId
 
bool isExtended
 
std::uint32_t pgn
 
bool hasPgn
 
std::uint8_t dlc
 
std::string transmitter
 
std::string comment
 
std::vector< SignalInfosignals
 
+

Detailed Description

+

Describes one CAN frame from a DBC file.

+ +

Definition at line 24 of file frame_info.h.

+

Constructor & Destructor Documentation

+ +

◆ FrameInfo()

+ +
+
+ + + + + +
+ + + + + + + +
FrameInfo::FrameInfo ()
+
+inline
+
+ +

Definition at line 35 of file frame_info.h.

+ +
+
+

Member Data Documentation

+ +

◆ canId

+ +
+
+ + + + +
std::uint32_t FrameInfo::canId
+
+

Normalized CAN identifier.

+ +

Definition at line 26 of file frame_info.h.

+ +

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

+ +
+
+ +

◆ comment

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

Optional frame comment.

+ +

Definition at line 32 of file frame_info.h.

+ +

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

+ +
+
+ +

◆ dlc

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

Frame payload length.

+ +

Definition at line 30 of file frame_info.h.

+ +

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

+ +
+
+ +

◆ hasPgn

+ +
+
+ + + + +
bool FrameInfo::hasPgn
+
+

true if PGN was derived.

+ +

Definition at line 29 of file frame_info.h.

+ +

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

+ +
+
+ +

◆ isExtended

+ +
+
+ + + + +
bool FrameInfo::isExtended
+
+

true for extended frame.

+ +

Definition at line 27 of file frame_info.h.

+ +

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

+ +
+
+ +

◆ name

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

Frame name.

+ +

Definition at line 25 of file frame_info.h.

+ +

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

+ +
+
+ +

◆ pgn

+ +
+
+ + + + +
std::uint32_t FrameInfo::pgn
+
+

J1939 PGN if applicable.

+ +

Definition at line 28 of file frame_info.h.

+ +

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

+ +
+
+ +

◆ signals

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

Signals contained in the frame.

+ +

Definition at line 33 of file frame_info.h.

+ +

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

+ +
+
+ +

◆ transmitter

+ +
+
+ + + + +
std::string FrameInfo::transmitter
+
+

Transmitter ECU name.

+ +

Definition at line 31 of file frame_info.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structFrameKey-members.html b/docs/html/structFrameKey-members.html new file mode 100644 index 0000000..7310bfc --- /dev/null +++ b/docs/html/structFrameKey-members.html @@ -0,0 +1,65 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
FrameKey Member List
+
+
+ +

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

+ + + + + + +
canIdFrameKey
FrameKey()FrameKeyinline
FrameKey(std::uint32_t id, bool extended)FrameKeyinline
isExtendedFrameKey
operator==(const FrameKey &other) constFrameKeyinline
+ + + + diff --git a/docs/html/structFrameKey.html b/docs/html/structFrameKey.html new file mode 100644 index 0000000..a9e39a4 --- /dev/null +++ b/docs/html/structFrameKey.html @@ -0,0 +1,224 @@ + + + + + + + +DBC framework: FrameKey Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
FrameKey Struct Reference
+
+
+ +

Key for fast frame lookup. + More...

+ +

#include <decode_database.h>

+ + + + + + + + +

+Public Member Functions

 FrameKey ()
 
 FrameKey (std::uint32_t id, bool extended)
 
bool operator== (const FrameKey &other) const
 
+ + + + + +

+Public Attributes

std::uint32_t canId
 
bool isExtended
 
+

Detailed Description

+

Key for fast frame lookup.

+ +

Definition at line 99 of file decode_database.h.

+

Constructor & Destructor Documentation

+ +

◆ FrameKey() [1/2]

+ +
+
+ + + + + +
+ + + + + + + +
FrameKey::FrameKey ()
+
+inline
+
+ +

Definition at line 103 of file decode_database.h.

+ +
+
+ +

◆ FrameKey() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
FrameKey::FrameKey (std::uint32_t id,
bool extended 
)
+
+inline
+
+ +

Definition at line 108 of file decode_database.h.

+ +
+
+

Member Function Documentation

+ +

◆ operator==()

+ +
+
+ + + + + +
+ + + + + + + + +
bool FrameKey::operator== (const FrameKeyother) const
+
+inline
+
+ +

Definition at line 113 of file decode_database.h.

+ +

References canId, and isExtended.

+ +
+
+

Member Data Documentation

+ +

◆ canId

+ +
+
+ + + + +
std::uint32_t FrameKey::canId
+
+ +

Definition at line 100 of file decode_database.h.

+ +

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

+ +
+
+ +

◆ isExtended

+ +
+
+ + + + +
bool FrameKey::isExtended
+
+ +

Definition at line 101 of file decode_database.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structFrameKeyHasher-members.html b/docs/html/structFrameKeyHasher-members.html new file mode 100644 index 0000000..4ad2989 --- /dev/null +++ b/docs/html/structFrameKeyHasher-members.html @@ -0,0 +1,61 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
FrameKeyHasher Member List
+
+
+ +

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

+ + +
operator()(const FrameKey &key) constFrameKeyHasherinline
+ + + + diff --git a/docs/html/structFrameKeyHasher.html b/docs/html/structFrameKeyHasher.html new file mode 100644 index 0000000..9919ed5 --- /dev/null +++ b/docs/html/structFrameKeyHasher.html @@ -0,0 +1,109 @@ + + + + + + + +DBC framework: FrameKeyHasher Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
FrameKeyHasher Struct Reference
+
+
+ +

Hasher for frame key. + More...

+ +

#include <decode_database.h>

+ + + + +

+Public Member Functions

std::size_t operator() (const FrameKey &key) const
 
+

Detailed Description

+

Hasher for frame key.

+ +

Definition at line 121 of file decode_database.h.

+

Member Function Documentation

+ +

◆ operator()()

+ +
+
+ + + + + +
+ + + + + + + + +
std::size_t FrameKeyHasher::operator() (const FrameKeykey) const
+
+inline
+
+ +

Definition at line 122 of file decode_database.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structRawCanFrame-members.html b/docs/html/structRawCanFrame-members.html new file mode 100644 index 0000000..1d9410a --- /dev/null +++ b/docs/html/structRawCanFrame-members.html @@ -0,0 +1,64 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
RawCanFrame Member List
+
+
+ +

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

+ + + + + +
canIdRawCanFrame
dataRawCanFrame
isExtendedRawCanFrame
RawCanFrame()RawCanFrameinline
+ + + + diff --git a/docs/html/structRawCanFrame.html b/docs/html/structRawCanFrame.html new file mode 100644 index 0000000..863c3ef --- /dev/null +++ b/docs/html/structRawCanFrame.html @@ -0,0 +1,174 @@ + + + + + + + +DBC framework: RawCanFrame Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
RawCanFrame Struct Reference
+
+
+ +

Raw CAN frame used for runtime or trace decoding. + More...

+ +

#include <dbc_decoder.h>

+ + + + +

+Public Member Functions

 RawCanFrame ()
 
+ + + + + + + +

+Public Attributes

std::uint32_t canId
 
bool isExtended
 
std::vector< std::uint8_t > data
 
+

Detailed Description

+

Raw CAN frame used for runtime or trace decoding.

+ +

Definition at line 23 of file dbc_decoder.h.

+

Constructor & Destructor Documentation

+ +

◆ RawCanFrame()

+ +
+
+ + + + + +
+ + + + + + + +
RawCanFrame::RawCanFrame ()
+
+inline
+
+ +

Definition at line 28 of file dbc_decoder.h.

+ +
+
+

Member Data Documentation

+ +

◆ canId

+ +
+
+ + + + +
std::uint32_t RawCanFrame::canId
+
+

Normalized CAN ID.

+ +

Definition at line 24 of file dbc_decoder.h.

+ +

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

+ +
+
+ +

◆ data

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

Payload bytes.

+ +

Definition at line 26 of file dbc_decoder.h.

+ +

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

+ +
+
+ +

◆ isExtended

+ +
+
+ + + + +
bool RawCanFrame::isExtended
+
+

true for extended frame.

+ +

Definition at line 25 of file dbc_decoder.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structSignalInfo-members.html b/docs/html/structSignalInfo-members.html new file mode 100644 index 0000000..f1f700a --- /dev/null +++ b/docs/html/structSignalInfo-members.html @@ -0,0 +1,73 @@ + + + + + + + +DBC framework: Member List + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
SignalInfo Member List
+
+ + + + + diff --git a/docs/html/structSignalInfo.html b/docs/html/structSignalInfo.html new file mode 100644 index 0000000..d8517f6 --- /dev/null +++ b/docs/html/structSignalInfo.html @@ -0,0 +1,363 @@ + + + + + + + +DBC framework: SignalInfo Struct Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+ +
SignalInfo Struct Reference
+
+
+ +

Describes one signal inside a DBC frame. + More...

+ +

#include <signal_info.h>

+ + + + +

+Public Member Functions

 SignalInfo ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

std::string name
 
std::uint32_t startBit
 
std::uint32_t length
 
bool isLittleEndian
 
bool isSigned
 
double factor
 
double offset
 
double minimum
 
double maximum
 
std::string unit
 
std::vector< std::string > receivers
 
std::string comment
 
+

Detailed Description

+

Describes one signal inside a DBC frame.

+ +

Definition at line 22 of file signal_info.h.

+

Constructor & Destructor Documentation

+ +

◆ SignalInfo()

+ +
+
+ + + + + +
+ + + + + + + +
SignalInfo::SignalInfo ()
+
+inline
+
+ +

Definition at line 36 of file signal_info.h.

+ +
+
+

Member Data Documentation

+ +

◆ comment

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

Optional signal comment.

+ +

Definition at line 34 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ factor

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

Scaling factor.

+ +

Definition at line 28 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ isLittleEndian

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

true for Intel, false for Motorola.

+ +

Definition at line 26 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ isSigned

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

true if signal is signed.

+ +

Definition at line 27 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ length

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

Signal length in bits.

+ +

Definition at line 25 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ maximum

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

Maximum physical value.

+ +

Definition at line 31 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ minimum

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

Minimum physical value.

+ +

Definition at line 30 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ name

+ +
+
+ + + + +
std::string SignalInfo::name
+
+

Signal name.

+ +

Definition at line 23 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ offset

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

Physical offset.

+ +

Definition at line 29 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ receivers

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

Signal receivers.

+ +

Definition at line 33 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ startBit

+ +
+
+ + + + +
std::uint32_t SignalInfo::startBit
+
+

Start bit in DBC notation.

+ +

Definition at line 24 of file signal_info.h.

+ +

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

+ +
+
+ +

◆ unit

+ +
+
+ + + + +
std::string SignalInfo::unit
+
+

Physical unit.

+ +

Definition at line 32 of file signal_info.h.

+ +

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

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png new file mode 100644 index 0000000..3b443fc Binary files /dev/null and b/docs/html/sync_off.png differ diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png new file mode 100644 index 0000000..e08320f Binary files /dev/null and b/docs/html/sync_on.png differ diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png new file mode 100644 index 0000000..3b725c4 Binary files /dev/null and b/docs/html/tab_a.png differ diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png new file mode 100644 index 0000000..e2b4a86 Binary files /dev/null and b/docs/html/tab_b.png differ diff --git a/docs/html/tab_h.png b/docs/html/tab_h.png new file mode 100644 index 0000000..fd5cb70 Binary files /dev/null and b/docs/html/tab_h.png differ diff --git a/docs/html/tab_s.png b/docs/html/tab_s.png new file mode 100644 index 0000000..ab478c9 Binary files /dev/null and b/docs/html/tab_s.png differ diff --git a/docs/html/tabs.css b/docs/html/tabs.css new file mode 100644 index 0000000..720b1c6 --- /dev/null +++ b/docs/html/tabs.css @@ -0,0 +1,61 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #283A5D; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + diff --git a/docs/html/tree__node_8cpp.html b/docs/html/tree__node_8cpp.html new file mode 100644 index 0000000..4bb189b --- /dev/null +++ b/docs/html/tree__node_8cpp.html @@ -0,0 +1,67 @@ + + + + + + + +DBC framework: tree_node.cpp File Reference + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
tree_node.cpp File Reference
+
+
+ +

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

+
#include "tree_node.h"
+
+

Go to the source code of this file.

+

Detailed Description

+

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

+

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

+ +

Definition in file tree_node.cpp.

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

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

+
#include <string>
+#include <vector>
+#include <memory>
+#include <cstddef>
+#include "frame_info.h"
+#include "signal_info.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  TreeNode
 Tree node for later use in model/view or other hierarchy consumers. More...
 
+ + + + +

+Enumerations

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

Detailed Description

+

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

+

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

+ +

Definition in file tree_node.h.

+

Enumeration Type Documentation

+ +

◆ NodeType

+ +
+
+ + + + + +
+ + + + +
enum class NodeType
+
+strong
+
+ +

Type of a tree node.

+ + + + +
Enumerator
Root 
Frame 
Signal 
+ +

Definition at line 26 of file tree_node.h.

+ +
+
+
+ + + + diff --git a/docs/html/tree__node_8h_source.html b/docs/html/tree__node_8h_source.html new file mode 100644 index 0000000..cf19e10 --- /dev/null +++ b/docs/html/tree__node_8h_source.html @@ -0,0 +1,202 @@ + + + + + + + +DBC framework: tree_node.h Source File + + + + + + +
+
+ + + + + + +
+
DBC framework +
+
+
+ + + + +
+
+
tree_node.h
+
+
+Go to the documentation of this file.
1/**
+
2 * @file tree_node.h
+
3 * @brief
+
4 *
+
5 * Created: 2026-03-13
+
6 * Author: Deeaitch (Dim. Himro)
+
7 *
+
8 * Licensed under the MIT License.
+
9 * See LICENSE file in the project root for full license text.
+
10 */
+
11
+
12#ifndef TREE_NODE_H
+
13#define TREE_NODE_H
+
14
+
15#include <string>
+
16#include <vector>
+
17#include <memory>
+
18#include <cstddef>
+
19
+
20#include "frame_info.h"
+
21#include "signal_info.h"
+
22
+
23/**
+
24 * @brief Type of a tree node.
+
25 */
+
26enum class NodeType {
+
27 Root,
+
28 Frame,
+
29 Signal
+
30};
+
31
+
32/**
+
33 * @brief Tree node for later use in model/view or other hierarchy consumers.
+
34 */
+
35class TreeNode {
+
36 public:
+
37 /**
+
38 * @brief Create root node.
+
39 */
+
40 TreeNode();
+
41
+
42 /**
+
43 * @brief Create frame node.
+
44 * @param frame Frame payload.
+
45 */
+
46 explicit TreeNode (const FrameInfo &frame);
+
47
+
48 /**
+
49 * @brief Create signal node.
+
50 * @param signal Signal payload.
+
51 */
+
52 explicit TreeNode (const SignalInfo &signal);
+
53
+
54 ~TreeNode() = default;
+
55
+
56 TreeNode (const TreeNode &) = delete;
+
57 TreeNode &operator= (const TreeNode &) = delete;
+
58
+
59 TreeNode (TreeNode &&) = default;
+ +
61
+
62 /**
+
63 * @brief Add child node.
+
64 * @param child Child node to add.
+
65 */
+
66 void AddChild (std::unique_ptr<TreeNode> child);
+
67
+
68 /**
+
69 * @brief Get child count.
+
70 * @return Number of children.
+
71 */
+
72 std::size_t GetChildCount() const;
+
73
+
74 /**
+
75 * @brief Get child by index.
+
76 * @param index Child index.
+
77 * @return Child pointer or nullptr if index is invalid.
+
78 */
+
79 const TreeNode *GetChild (std::size_t index) const;
+
80
+
81 /**
+
82 * @brief Get mutable child by index.
+
83 * @param index Child index.
+
84 * @return Child pointer or nullptr if index is invalid.
+
85 */
+
86 TreeNode *GetChild (std::size_t index);
+
87
+
88 /**
+
89 * @brief Get node type.
+
90 * @return Node type.
+
91 */
+
92 NodeType GetType() const;
+
93
+
94 /**
+
95 * @brief Get display name.
+
96 * @return Node name.
+
97 */
+
98 const std::string &GetName() const;
+
99
+
100 /**
+
101 * @brief Get frame payload if node is frame.
+
102 * @return Pointer to frame info or nullptr.
+
103 */
+
104 const FrameInfo *GetFrame() const;
+
105
+
106 /**
+
107 * @brief Get signal payload if node is signal.
+
108 * @return Pointer to signal info or nullptr.
+
109 */
+
110 const SignalInfo *GetSignal() const;
+
111
+
112 private:
+ +
114 std::string m_name;
+
115 std::vector<std::unique_ptr<TreeNode> > m_children;
+
116 std::unique_ptr<FrameInfo> m_frame;
+
117 std::unique_ptr<SignalInfo> m_signal;
+
118};
+
119
+
120#endif /* TREE_NODE_H */
+
Tree node for later use in model/view or other hierarchy consumers.
Definition: tree_node.h:35
+
NodeType m_type
Definition: tree_node.h:113
+
std::vector< std::unique_ptr< TreeNode > > m_children
Definition: tree_node.h:115
+
const SignalInfo * GetSignal() const
Get signal payload if node is signal.
Definition: tree_node.cpp:73
+
TreeNode(TreeNode &&)=default
+
const TreeNode * GetChild(std::size_t index) const
Get child by index.
Definition: tree_node.cpp:47
+
TreeNode(const TreeNode &)=delete
+
void AddChild(std::unique_ptr< TreeNode > child)
Add child node.
Definition: tree_node.cpp:38
+
std::unique_ptr< FrameInfo > m_frame
Definition: tree_node.h:116
+
~TreeNode()=default
+
TreeNode()
Create root node.
Definition: tree_node.cpp:14
+
const std::string & GetName() const
Get display name.
Definition: tree_node.cpp:65
+
std::size_t GetChildCount() const
Get child count.
Definition: tree_node.cpp:43
+
std::string m_name
Definition: tree_node.h:114
+
TreeNode & operator=(const TreeNode &)=delete
+
std::unique_ptr< SignalInfo > m_signal
Definition: tree_node.h:117
+
NodeType GetType() const
Get node type.
Definition: tree_node.cpp:61
+
const FrameInfo * GetFrame() const
Get frame payload if node is frame.
Definition: tree_node.cpp:69
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Describes one CAN frame from a DBC file.
Definition: frame_info.h:24
+
Describes one signal inside a DBC frame.
Definition: signal_info.h:22
+
NodeType
Type of a tree node.
Definition: tree_node.h:26
+ + + +
+ + + + diff --git a/docs/latex/Makefile b/docs/latex/Makefile new file mode 100644 index 0000000..07f226d --- /dev/null +++ b/docs/latex/Makefile @@ -0,0 +1,27 @@ +LATEX_CMD?=pdflatex +MKIDX_CMD?=makeindex +BIBTEX_CMD?=bibtex +LATEX_COUNT?=8 +MANUAL_FILE?=refman + +all: $(MANUAL_FILE).pdf + +pdf: $(MANUAL_FILE).pdf + +$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex + $(LATEX_CMD) $(MANUAL_FILE) + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + latex_count=$(LATEX_COUNT) ; \ + while egrep -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\ + do \ + echo "Rerunning latex...." ;\ + $(LATEX_CMD) $(MANUAL_FILE) ;\ + latex_count=`expr $$latex_count - 1` ;\ + done + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + + +clean: + rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf diff --git a/docs/latex/README_8md.tex b/docs/latex/README_8md.tex new file mode 100644 index 0000000..3be9d7a --- /dev/null +++ b/docs/latex/README_8md.tex @@ -0,0 +1,2 @@ +\hypertarget{README_8md}{}\doxysection{README.\+md File Reference} +\label{README_8md}\index{README.md@{README.md}} diff --git a/docs/latex/annotated.tex b/docs/latex/annotated.tex new file mode 100644 index 0000000..413ce32 --- /dev/null +++ b/docs/latex/annotated.tex @@ -0,0 +1,19 @@ +\doxysection{Class List} +Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \\*Parsed DBC content stored in a simple internal form }{\pageref{structDbcDatabase}}{} +\item\contentsline{section}{\mbox{\hyperlink{classDbcDecodeBuilder}{Dbc\+Decode\+Builder}} \\*Converts parsed DBC data into runtime decode database }{\pageref{classDbcDecodeBuilder}}{} +\item\contentsline{section}{\mbox{\hyperlink{classDbcDecoder}{Dbc\+Decoder}} \\*Runtime CAN decoder using prebuilt decode database }{\pageref{classDbcDecoder}}{} +\item\contentsline{section}{\mbox{\hyperlink{classDbcParser}{Dbc\+Parser}} \\*Minimal DBC parser }{\pageref{classDbcParser}}{} +\item\contentsline{section}{\mbox{\hyperlink{classDbcTreeBuilder}{Dbc\+Tree\+Builder}} \\*Builds a simple tree from parsed DBC database }{\pageref{classDbcTreeBuilder}}{} +\item\contentsline{section}{\mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \\*Runtime decode database with fast lookup by CAN ID }{\pageref{structDecodeDatabase}}{} +\item\contentsline{section}{\mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} \\*Fully decoded frame }{\pageref{structDecodedFrameValue}}{} +\item\contentsline{section}{\mbox{\hyperlink{structDecodedSignalValue}{Decoded\+Signal\+Value}} \\*One decoded signal value }{\pageref{structDecodedSignalValue}}{} +\item\contentsline{section}{\mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} \\*Runtime-\/ready frame definition }{\pageref{structDecodeFrame}}{} +\item\contentsline{section}{\mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} \\*Runtime-\/ready signal definition }{\pageref{structDecodeSignal}}{} +\item\contentsline{section}{\mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \\*Describes one CAN frame from a DBC file }{\pageref{structFrameInfo}}{} +\item\contentsline{section}{\mbox{\hyperlink{structFrameKey}{Frame\+Key}} \\*Key for fast frame lookup }{\pageref{structFrameKey}}{} +\item\contentsline{section}{\mbox{\hyperlink{structFrameKeyHasher}{Frame\+Key\+Hasher}} \\*Hasher for frame key }{\pageref{structFrameKeyHasher}}{} +\item\contentsline{section}{\mbox{\hyperlink{structRawCanFrame}{Raw\+Can\+Frame}} \\*Raw CAN frame used for runtime or trace decoding }{\pageref{structRawCanFrame}}{} +\item\contentsline{section}{\mbox{\hyperlink{structSignalInfo}{Signal\+Info}} \\*Describes one signal inside a DBC frame }{\pageref{structSignalInfo}}{} +\item\contentsline{section}{\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \\*Tree node for later use in model/view or other hierarchy consumers }{\pageref{classTreeNode}}{} +\end{DoxyCompactList} diff --git a/docs/latex/classDbcDecodeBuilder.tex b/docs/latex/classDbcDecodeBuilder.tex new file mode 100644 index 0000000..f32bcb4 --- /dev/null +++ b/docs/latex/classDbcDecodeBuilder.tex @@ -0,0 +1,62 @@ +\hypertarget{classDbcDecodeBuilder}{}\doxysection{Dbc\+Decode\+Builder Class Reference} +\label{classDbcDecodeBuilder}\index{DbcDecodeBuilder@{DbcDecodeBuilder}} + + +Converts parsed DBC data into runtime decode database. + + + + +{\ttfamily \#include $<$dbc\+\_\+decode\+\_\+builder.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{Build}} (const \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&source) const +\begin{DoxyCompactList}\small\item\em Build runtime decode database. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Converts parsed DBC data into runtime decode database. + +Definition at line \mbox{\hyperlink{dbc__decode__builder_8h_source_l00021}{21}} of file \mbox{\hyperlink{dbc__decode__builder_8h_source}{dbc\+\_\+decode\+\_\+builder.\+h}}. + + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}\label{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}} +\index{DbcDecodeBuilder@{DbcDecodeBuilder}!Build@{Build}} +\index{Build@{Build}!DbcDecodeBuilder@{DbcDecodeBuilder}} +\doxysubsubsection{\texorpdfstring{Build()}{Build()}} +{\footnotesize\ttfamily \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} Dbc\+Decode\+Builder\+::\+Build (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&}]{source }\end{DoxyParamCaption}) const} + + + +Build runtime decode database. + + +\begin{DoxyParams}{Parameters} +{\em source} & Parsed DBC database. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Runtime-\/ready decode database. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{14}} of file \mbox{\hyperlink{dbc__decode__builder_8cpp_source}{dbc\+\_\+decode\+\_\+builder.\+cpp}}. + + + +References \mbox{\hyperlink{decode__database_8h_source_l00043}{Decode\+Signal\+::byte\+Order}}, \mbox{\hyperlink{decode__database_8h_source_l00074}{Decode\+Frame\+::can\+Id}}, \mbox{\hyperlink{frame__info_8h_source_l00026}{Frame\+Info\+::can\+Id}}, \mbox{\hyperlink{decode__database_8h_source_l00051}{Decode\+Signal\+::comment}}, \mbox{\hyperlink{decode__database_8h_source_l00080}{Decode\+Frame\+::comment}}, \mbox{\hyperlink{frame__info_8h_source_l00032}{Frame\+Info\+::comment}}, \mbox{\hyperlink{signal__info_8h_source_l00034}{Signal\+Info\+::comment}}, \mbox{\hyperlink{decode__database_8h_source_l00076}{Decode\+Frame\+::dlc}}, \mbox{\hyperlink{frame__info_8h_source_l00030}{Frame\+Info\+::dlc}}, \mbox{\hyperlink{decode__database_8h_source_l00045}{Decode\+Signal\+::factor}}, \mbox{\hyperlink{signal__info_8h_source_l00028}{Signal\+Info\+::factor}}, \mbox{\hyperlink{decode__database_8h_source_l00134}{Decode\+Database\+::frame\+Index\+By\+Key}}, \mbox{\hyperlink{dbc__database_8h_source_l00023}{Dbc\+Database\+::frames}}, \mbox{\hyperlink{decode__database_8h_source_l00133}{Decode\+Database\+::frames}}, \mbox{\hyperlink{decode__database_8h_source_l00078}{Decode\+Frame\+::has\+Pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00029}{Frame\+Info\+::has\+Pgn}}, \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}}, \mbox{\hyperlink{decode__database_8h_source_l00075}{Decode\+Frame\+::is\+Extended}}, \mbox{\hyperlink{frame__info_8h_source_l00027}{Frame\+Info\+::is\+Extended}}, \mbox{\hyperlink{signal__info_8h_source_l00026}{Signal\+Info\+::is\+Little\+Endian}}, \mbox{\hyperlink{signal__info_8h_source_l00027}{Signal\+Info\+::is\+Signed}}, \mbox{\hyperlink{decode__database_8h_source_l00042}{Decode\+Signal\+::length}}, \mbox{\hyperlink{signal__info_8h_source_l00025}{Signal\+Info\+::length}}, \mbox{\hyperlink{decode__database_8h_source_l00048}{Decode\+Signal\+::maximum}}, \mbox{\hyperlink{signal__info_8h_source_l00031}{Signal\+Info\+::maximum}}, \mbox{\hyperlink{decode__database_8h_source_l00047}{Decode\+Signal\+::minimum}}, \mbox{\hyperlink{signal__info_8h_source_l00030}{Signal\+Info\+::minimum}}, \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}{Motorola}}, \mbox{\hyperlink{decode__database_8h_source_l00040}{Decode\+Signal\+::name}}, \mbox{\hyperlink{decode__database_8h_source_l00073}{Decode\+Frame\+::name}}, \mbox{\hyperlink{frame__info_8h_source_l00025}{Frame\+Info\+::name}}, \mbox{\hyperlink{signal__info_8h_source_l00023}{Signal\+Info\+::name}}, \mbox{\hyperlink{decode__database_8h_source_l00046}{Decode\+Signal\+::offset}}, \mbox{\hyperlink{signal__info_8h_source_l00029}{Signal\+Info\+::offset}}, \mbox{\hyperlink{decode__database_8h_source_l00077}{Decode\+Frame\+::pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00028}{Frame\+Info\+::pgn}}, \mbox{\hyperlink{decode__database_8h_source_l00050}{Decode\+Signal\+::receivers}}, \mbox{\hyperlink{signal__info_8h_source_l00033}{Signal\+Info\+::receivers}}, \mbox{\hyperlink{decode__database_8h_source_l00081}{Decode\+Frame\+::signals}}, \mbox{\hyperlink{frame__info_8h_source_l00033}{Frame\+Info\+::signals}}, \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{Signed}}, \mbox{\hyperlink{decode__database_8h_source_l00041}{Decode\+Signal\+::start\+Bit}}, \mbox{\hyperlink{signal__info_8h_source_l00024}{Signal\+Info\+::start\+Bit}}, \mbox{\hyperlink{decode__database_8h_source_l00079}{Decode\+Frame\+::transmitter}}, \mbox{\hyperlink{frame__info_8h_source_l00031}{Frame\+Info\+::transmitter}}, \mbox{\hyperlink{decode__database_8h_source_l00049}{Decode\+Signal\+::unit}}, \mbox{\hyperlink{signal__info_8h_source_l00032}{Signal\+Info\+::unit}}, \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{Unsigned}}, and \mbox{\hyperlink{decode__database_8h_source_l00044}{Decode\+Signal\+::value\+Type}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{dbc__decode__builder_8h}{dbc\+\_\+decode\+\_\+builder.\+h}}\item +\mbox{\hyperlink{dbc__decode__builder_8cpp}{dbc\+\_\+decode\+\_\+builder.\+cpp}}\end{DoxyCompactItemize} diff --git a/docs/latex/classDbcDecoder.tex b/docs/latex/classDbcDecoder.tex new file mode 100644 index 0000000..ebcbd39 --- /dev/null +++ b/docs/latex/classDbcDecoder.tex @@ -0,0 +1,171 @@ +\hypertarget{classDbcDecoder}{}\doxysection{Dbc\+Decoder Class Reference} +\label{classDbcDecoder}\index{DbcDecoder@{DbcDecoder}} + + +Runtime CAN decoder using prebuilt decode database. + + + + +{\ttfamily \#include $<$dbc\+\_\+decoder.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +const \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} $\ast$ \mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{Find\+Frame}} (const \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \&database, std\+::uint32\+\_\+t can\+Id, bool is\+Extended) const +\begin{DoxyCompactList}\small\item\em Find frame definition by CAN ID. \end{DoxyCompactList}\item +\mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} \mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{Decode}} (const \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \&database, const \mbox{\hyperlink{structRawCanFrame}{Raw\+Can\+Frame}} \&frame) const +\begin{DoxyCompactList}\small\item\em Decode one raw CAN frame. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Static Private Member Functions} +\begin{DoxyCompactItemize} +\item +static bool \mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{Extract\+Unsigned}} (const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&data, const \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} \&signal, std\+::uint64\+\_\+t \&value) +\item +static bool \mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{Extract\+Intel}} (const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&data, std\+::uint32\+\_\+t start\+Bit, std\+::uint32\+\_\+t length, std\+::uint64\+\_\+t \&value) +\item +static bool \mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{Extract\+Motorola}} (const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&data, std\+::uint32\+\_\+t start\+Bit, std\+::uint32\+\_\+t length, std\+::uint64\+\_\+t \&value) +\item +static std\+::int64\+\_\+t \mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{Sign\+Extend}} (std\+::uint64\+\_\+t value, std\+::uint32\+\_\+t bit\+Length) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Runtime CAN decoder using prebuilt decode database. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00070}{70}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}\label{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}} +\index{DbcDecoder@{DbcDecoder}!Decode@{Decode}} +\index{Decode@{Decode}!DbcDecoder@{DbcDecoder}} +\doxysubsubsection{\texorpdfstring{Decode()}{Decode()}} +{\footnotesize\ttfamily \mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} Dbc\+Decoder\+::\+Decode (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \&}]{database, }\item[{const \mbox{\hyperlink{structRawCanFrame}{Raw\+Can\+Frame}} \&}]{frame }\end{DoxyParamCaption}) const} + + + +Decode one raw CAN frame. + + +\begin{DoxyParams}{Parameters} +{\em database} & Runtime decode database. \\ +\hline +{\em frame} & Raw CAN frame. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Decoded frame value. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{31}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}. + + + +References \mbox{\hyperlink{dbc__decoder_8h_source_l00024}{Raw\+Can\+Frame\+::can\+Id}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00026}{Raw\+Can\+Frame\+::data}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00039}{Decoded\+Signal\+Value\+::definition}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00056}{Decoded\+Frame\+Value\+::definition}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Extract\+Unsigned()}}, \mbox{\hyperlink{decode__database_8h_source_l00045}{Decode\+Signal\+::factor}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00014}{Find\+Frame()}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00025}{Raw\+Can\+Frame\+::is\+Extended}}, \mbox{\hyperlink{decode__database_8h_source_l00042}{Decode\+Signal\+::length}}, \mbox{\hyperlink{decode__database_8h_source_l00046}{Decode\+Signal\+::offset}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00041}{Decoded\+Signal\+Value\+::physical\+Value}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00040}{Decoded\+Signal\+Value\+::raw\+Value}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00057}{Decoded\+Frame\+Value\+::signals}}, \mbox{\hyperlink{decode__database_8h_source_l00081}{Decode\+Frame\+::signals}}, \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{Signed}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00144}{Sign\+Extend()}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00042}{Decoded\+Signal\+Value\+::valid}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00058}{Decoded\+Frame\+Value\+::valid}}, and \mbox{\hyperlink{decode__database_8h_source_l00044}{Decode\+Signal\+::value\+Type}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}. + +\mbox{\Hypertarget{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}\label{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}} +\index{DbcDecoder@{DbcDecoder}!ExtractIntel@{ExtractIntel}} +\index{ExtractIntel@{ExtractIntel}!DbcDecoder@{DbcDecoder}} +\doxysubsubsection{\texorpdfstring{ExtractIntel()}{ExtractIntel()}} +{\footnotesize\ttfamily bool Dbc\+Decoder\+::\+Extract\+Intel (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&}]{data, }\item[{std\+::uint32\+\_\+t}]{start\+Bit, }\item[{std\+::uint32\+\_\+t}]{length, }\item[{std\+::uint64\+\_\+t \&}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00082}{82}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Extract\+Unsigned()}}. + +\mbox{\Hypertarget{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}\label{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}} +\index{DbcDecoder@{DbcDecoder}!ExtractMotorola@{ExtractMotorola}} +\index{ExtractMotorola@{ExtractMotorola}!DbcDecoder@{DbcDecoder}} +\doxysubsubsection{\texorpdfstring{ExtractMotorola()}{ExtractMotorola()}} +{\footnotesize\ttfamily bool Dbc\+Decoder\+::\+Extract\+Motorola (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&}]{data, }\item[{std\+::uint32\+\_\+t}]{start\+Bit, }\item[{std\+::uint32\+\_\+t}]{length, }\item[{std\+::uint64\+\_\+t \&}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00105}{105}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Extract\+Unsigned()}}. + +\mbox{\Hypertarget{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}\label{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}} +\index{DbcDecoder@{DbcDecoder}!ExtractUnsigned@{ExtractUnsigned}} +\index{ExtractUnsigned@{ExtractUnsigned}!DbcDecoder@{DbcDecoder}} +\doxysubsubsection{\texorpdfstring{ExtractUnsigned()}{ExtractUnsigned()}} +{\footnotesize\ttfamily bool Dbc\+Decoder\+::\+Extract\+Unsigned (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&}]{data, }\item[{const \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} \&}]{signal, }\item[{std\+::uint64\+\_\+t \&}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{70}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}. + + + +References \mbox{\hyperlink{decode__database_8h_source_l00043}{Decode\+Signal\+::byte\+Order}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00082}{Extract\+Intel()}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00105}{Extract\+Motorola()}}, \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}}, \mbox{\hyperlink{decode__database_8h_source_l00042}{Decode\+Signal\+::length}}, and \mbox{\hyperlink{decode__database_8h_source_l00041}{Decode\+Signal\+::start\+Bit}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Decode()}}. + +\mbox{\Hypertarget{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}\label{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}} +\index{DbcDecoder@{DbcDecoder}!FindFrame@{FindFrame}} +\index{FindFrame@{FindFrame}!DbcDecoder@{DbcDecoder}} +\doxysubsubsection{\texorpdfstring{FindFrame()}{FindFrame()}} +{\footnotesize\ttfamily const \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} $\ast$ Dbc\+Decoder\+::\+Find\+Frame (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \&}]{database, }\item[{std\+::uint32\+\_\+t}]{can\+Id, }\item[{bool}]{is\+Extended }\end{DoxyParamCaption}) const} + + + +Find frame definition by CAN ID. + + +\begin{DoxyParams}{Parameters} +{\em database} & Runtime decode database. \\ +\hline +{\em can\+Id} & Normalized CAN ID. \\ +\hline +{\em is\+Extended} & true for extended frame. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Pointer to frame definition or nullptr. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00014}{14}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}. + + + +References \mbox{\hyperlink{decode__database_8h_source_l00134}{Decode\+Database\+::frame\+Index\+By\+Key}}, and \mbox{\hyperlink{decode__database_8h_source_l00133}{Decode\+Database\+::frames}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Decode()}}. + +\mbox{\Hypertarget{classDbcDecoder_a41e89e343338088d27e46773fa52df42}\label{classDbcDecoder_a41e89e343338088d27e46773fa52df42}} +\index{DbcDecoder@{DbcDecoder}!SignExtend@{SignExtend}} +\index{SignExtend@{SignExtend}!DbcDecoder@{DbcDecoder}} +\doxysubsubsection{\texorpdfstring{SignExtend()}{SignExtend()}} +{\footnotesize\ttfamily std\+::int64\+\_\+t Dbc\+Decoder\+::\+Sign\+Extend (\begin{DoxyParamCaption}\item[{std\+::uint64\+\_\+t}]{value, }\item[{std\+::uint32\+\_\+t}]{bit\+Length }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00144}{144}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Decode()}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}\item +\mbox{\hyperlink{dbc__decoder_8cpp}{dbc\+\_\+decoder.\+cpp}}\end{DoxyCompactItemize} diff --git a/docs/latex/classDbcParser.tex b/docs/latex/classDbcParser.tex new file mode 100644 index 0000000..30e4c68 --- /dev/null +++ b/docs/latex/classDbcParser.tex @@ -0,0 +1,305 @@ +\hypertarget{classDbcParser}{}\doxysection{Dbc\+Parser Class Reference} +\label{classDbcParser}\index{DbcParser@{DbcParser}} + + +Minimal DBC parser. + + + + +{\ttfamily \#include $<$dbc\+\_\+parser.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{Parse\+File}} (const std\+::string \&file\+Path) const +\begin{DoxyCompactList}\small\item\em Parse DBC file. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Static Private Member Functions} +\begin{DoxyCompactItemize} +\item +static bool \mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{Is\+Frame\+Line}} (const std\+::string \&line) +\item +static bool \mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{Is\+Signal\+Line}} (const std\+::string \&line) +\item +static bool \mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{Is\+Comment\+Line}} (const std\+::string \&line) +\item +static std\+::string \mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{Trim}} (const std\+::string \&text) +\item +static std\+::vector$<$ std\+::string $>$ \mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{Split\+Receivers}} (const std\+::string \&text) +\item +static std\+::uint32\+\_\+t \mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{Try\+Extract\+Pgn}} (std\+::uint32\+\_\+t can\+Id, bool is\+Extended, bool \&has\+Pgn) +\item +static void \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{Normalize\+Can\+Id}} (std\+::uint32\+\_\+t raw\+Can\+Id, std\+::uint32\+\_\+t \&normalized\+Can\+Id, bool \&is\+Extended) +\item +static \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{Parse\+Frame\+Line}} (const std\+::string \&line) +\item +static \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} \mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{Parse\+Signal\+Line}} (const std\+::string \&line) +\item +static void \mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{Parse\+Comment\+Line}} (const std\+::string \&line, \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&database) +\item +static \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $\ast$ \mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{Find\+Frame\+By\+Id}} (\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&database, std\+::uint32\+\_\+t can\+Id, bool is\+Extended) +\item +static \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $\ast$ \mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{Find\+Signal\+By\+Name}} (\mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \&frame, const std\+::string \&signal\+Name) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Minimal DBC parser. + +Supports\+: +\begin{DoxyItemize} +\item BO\+\_\+ +\item SG\+\_\+ +\item CM\+\_\+ BO\+\_\+ +\item CM\+\_\+ SG\+\_\+ +\end{DoxyItemize} + +Ignores\+: +\begin{DoxyItemize} +\item attributes +\item multiplexing +\item value tables +\end{DoxyItemize} + +Definition at line \mbox{\hyperlink{dbc__parser_8h_source_l00035}{35}} of file \mbox{\hyperlink{dbc__parser_8h_source}{dbc\+\_\+parser.\+h}}. + + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}\label{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}} +\index{DbcParser@{DbcParser}!FindFrameById@{FindFrameById}} +\index{FindFrameById@{FindFrameById}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{FindFrameById()}{FindFrameById()}} +{\footnotesize\ttfamily \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $\ast$ Dbc\+Parser\+::\+Find\+Frame\+By\+Id (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&}]{database, }\item[{std\+::uint32\+\_\+t}]{can\+Id, }\item[{bool}]{is\+Extended }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00337}{337}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +References \mbox{\hyperlink{dbc__database_8h_source_l00023}{Dbc\+Database\+::frames}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Parse\+Comment\+Line()}}. + +\mbox{\Hypertarget{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}\label{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}} +\index{DbcParser@{DbcParser}!FindSignalByName@{FindSignalByName}} +\index{FindSignalByName@{FindSignalByName}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{FindSignalByName()}{FindSignalByName()}} +{\footnotesize\ttfamily \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $\ast$ Dbc\+Parser\+::\+Find\+Signal\+By\+Name (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \&}]{frame, }\item[{const std\+::string \&}]{signal\+Name }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00349}{349}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +References \mbox{\hyperlink{frame__info_8h_source_l00033}{Frame\+Info\+::signals}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Parse\+Comment\+Line()}}. + +\mbox{\Hypertarget{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}\label{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}} +\index{DbcParser@{DbcParser}!IsCommentLine@{IsCommentLine}} +\index{IsCommentLine@{IsCommentLine}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{IsCommentLine()}{IsCommentLine()}} +{\footnotesize\ttfamily bool Dbc\+Parser\+::\+Is\+Comment\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00079}{79}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}. + +\mbox{\Hypertarget{classDbcParser_ada086584d371c08dd93b75fb7965f13b}\label{classDbcParser_ada086584d371c08dd93b75fb7965f13b}} +\index{DbcParser@{DbcParser}!IsFrameLine@{IsFrameLine}} +\index{IsFrameLine@{IsFrameLine}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{IsFrameLine()}{IsFrameLine()}} +{\footnotesize\ttfamily bool Dbc\+Parser\+::\+Is\+Frame\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00071}{71}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}. + +\mbox{\Hypertarget{classDbcParser_ace3d3432a55707bc286a994aa205fed1}\label{classDbcParser_ace3d3432a55707bc286a994aa205fed1}} +\index{DbcParser@{DbcParser}!IsSignalLine@{IsSignalLine}} +\index{IsSignalLine@{IsSignalLine}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{IsSignalLine()}{IsSignalLine()}} +{\footnotesize\ttfamily bool Dbc\+Parser\+::\+Is\+Signal\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00075}{75}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}. + +\mbox{\Hypertarget{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}\label{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}} +\index{DbcParser@{DbcParser}!NormalizeCanId@{NormalizeCanId}} +\index{NormalizeCanId@{NormalizeCanId}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{NormalizeCanId()}{NormalizeCanId()}} +{\footnotesize\ttfamily void Dbc\+Parser\+::\+Normalize\+Can\+Id (\begin{DoxyParamCaption}\item[{std\+::uint32\+\_\+t}]{raw\+Can\+Id, }\item[{std\+::uint32\+\_\+t \&}]{normalized\+Can\+Id, }\item[{bool \&}]{is\+Extended }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00101}{101}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Parse\+Comment\+Line()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Parse\+Frame\+Line()}}. + +\mbox{\Hypertarget{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}\label{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}} +\index{DbcParser@{DbcParser}!ParseCommentLine@{ParseCommentLine}} +\index{ParseCommentLine@{ParseCommentLine}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{ParseCommentLine()}{ParseCommentLine()}} +{\footnotesize\ttfamily void Dbc\+Parser\+::\+Parse\+Comment\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line, }\item[{\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&}]{database }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{274}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +References \mbox{\hyperlink{frame__info_8h_source_l00032}{Frame\+Info\+::comment}}, \mbox{\hyperlink{signal__info_8h_source_l00034}{Signal\+Info\+::comment}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00337}{Find\+Frame\+By\+Id()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00349}{Find\+Signal\+By\+Name()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00101}{Normalize\+Can\+Id()}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}. + +\mbox{\Hypertarget{classDbcParser_aef72826942c9095d653fafa435855e56}\label{classDbcParser_aef72826942c9095d653fafa435855e56}} +\index{DbcParser@{DbcParser}!ParseFile@{ParseFile}} +\index{ParseFile@{ParseFile}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{ParseFile()}{ParseFile()}} +{\footnotesize\ttfamily \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} Dbc\+Parser\+::\+Parse\+File (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{file\+Path }\end{DoxyParamCaption}) const} + + + +Parse DBC file. + + +\begin{DoxyParams}{Parameters} +{\em file\+Path} & Path to input file. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Parsed database. +\end{DoxyReturn} + +\begin{DoxyExceptions}{Exceptions} +{\em std\+::runtime\+\_\+error} & on file or parse errors. \\ +\hline +\end{DoxyExceptions} + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{40}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +References \mbox{\hyperlink{dbc__database_8h_source_l00023}{Dbc\+Database\+::frames}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00079}{Is\+Comment\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00071}{Is\+Frame\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00075}{Is\+Signal\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Parse\+Comment\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Parse\+Frame\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Parse\+Signal\+Line()}}, \mbox{\hyperlink{frame__info_8h_source_l00033}{Frame\+Info\+::signals}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00083}{Trim()}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}. + +\mbox{\Hypertarget{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}\label{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}} +\index{DbcParser@{DbcParser}!ParseFrameLine@{ParseFrameLine}} +\index{ParseFrameLine@{ParseFrameLine}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{ParseFrameLine()}{ParseFrameLine()}} +{\footnotesize\ttfamily \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} Dbc\+Parser\+::\+Parse\+Frame\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{142}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +References \mbox{\hyperlink{frame__info_8h_source_l00026}{Frame\+Info\+::can\+Id}}, \mbox{\hyperlink{frame__info_8h_source_l00030}{Frame\+Info\+::dlc}}, \mbox{\hyperlink{frame__info_8h_source_l00029}{Frame\+Info\+::has\+Pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00027}{Frame\+Info\+::is\+Extended}}, \mbox{\hyperlink{frame__info_8h_source_l00025}{Frame\+Info\+::name}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00101}{Normalize\+Can\+Id()}}, \mbox{\hyperlink{frame__info_8h_source_l00028}{Frame\+Info\+::pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00031}{Frame\+Info\+::transmitter}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00118}{Try\+Extract\+Pgn()}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}. + +\mbox{\Hypertarget{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}\label{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}} +\index{DbcParser@{DbcParser}!ParseSignalLine@{ParseSignalLine}} +\index{ParseSignalLine@{ParseSignalLine}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{ParseSignalLine()}{ParseSignalLine()}} +{\footnotesize\ttfamily \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} Dbc\+Parser\+::\+Parse\+Signal\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{181}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +References \mbox{\hyperlink{signal__info_8h_source_l00028}{Signal\+Info\+::factor}}, \mbox{\hyperlink{signal__info_8h_source_l00026}{Signal\+Info\+::is\+Little\+Endian}}, \mbox{\hyperlink{signal__info_8h_source_l00027}{Signal\+Info\+::is\+Signed}}, \mbox{\hyperlink{signal__info_8h_source_l00025}{Signal\+Info\+::length}}, \mbox{\hyperlink{signal__info_8h_source_l00031}{Signal\+Info\+::maximum}}, \mbox{\hyperlink{signal__info_8h_source_l00030}{Signal\+Info\+::minimum}}, \mbox{\hyperlink{signal__info_8h_source_l00023}{Signal\+Info\+::name}}, \mbox{\hyperlink{signal__info_8h_source_l00029}{Signal\+Info\+::offset}}, \mbox{\hyperlink{signal__info_8h_source_l00033}{Signal\+Info\+::receivers}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00087}{Split\+Receivers()}}, \mbox{\hyperlink{signal__info_8h_source_l00024}{Signal\+Info\+::start\+Bit}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00025}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text()}}, and \mbox{\hyperlink{signal__info_8h_source_l00032}{Signal\+Info\+::unit}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}. + +\mbox{\Hypertarget{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}\label{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}} +\index{DbcParser@{DbcParser}!SplitReceivers@{SplitReceivers}} +\index{SplitReceivers@{SplitReceivers}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{SplitReceivers()}{SplitReceivers()}} +{\footnotesize\ttfamily std\+::vector$<$ std\+::string $>$ Dbc\+Parser\+::\+Split\+Receivers (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{text }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00087}{87}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +References \mbox{\hyperlink{dbc__parser_8cpp_source_l00025}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text()}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Parse\+Signal\+Line()}}. + +\mbox{\Hypertarget{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}\label{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}} +\index{DbcParser@{DbcParser}!Trim@{Trim}} +\index{Trim@{Trim}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{Trim()}{Trim()}} +{\footnotesize\ttfamily std\+::string Dbc\+Parser\+::\+Trim (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{text }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00083}{83}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +References \mbox{\hyperlink{dbc__parser_8cpp_source_l00025}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text()}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}. + +\mbox{\Hypertarget{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}\label{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}} +\index{DbcParser@{DbcParser}!TryExtractPgn@{TryExtractPgn}} +\index{TryExtractPgn@{TryExtractPgn}!DbcParser@{DbcParser}} +\doxysubsubsection{\texorpdfstring{TryExtractPgn()}{TryExtractPgn()}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Dbc\+Parser\+::\+Try\+Extract\+Pgn (\begin{DoxyParamCaption}\item[{std\+::uint32\+\_\+t}]{can\+Id, }\item[{bool}]{is\+Extended, }\item[{bool \&}]{has\+Pgn }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00118}{118}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Parse\+Frame\+Line()}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{dbc__parser_8h}{dbc\+\_\+parser.\+h}}\item +\mbox{\hyperlink{dbc__parser_8cpp}{dbc\+\_\+parser.\+cpp}}\end{DoxyCompactItemize} diff --git a/docs/latex/classDbcTreeBuilder.tex b/docs/latex/classDbcTreeBuilder.tex new file mode 100644 index 0000000..3eaff73 --- /dev/null +++ b/docs/latex/classDbcTreeBuilder.tex @@ -0,0 +1,62 @@ +\hypertarget{classDbcTreeBuilder}{}\doxysection{Dbc\+Tree\+Builder Class Reference} +\label{classDbcTreeBuilder}\index{DbcTreeBuilder@{DbcTreeBuilder}} + + +Builds a simple tree from parsed DBC database. + + + + +{\ttfamily \#include $<$dbc\+\_\+tree\+\_\+builder.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$ \mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{Build}} (const \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&database) const +\begin{DoxyCompactList}\small\item\em Build tree representation of parsed DBC data. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Builds a simple tree from parsed DBC database. + +Definition at line \mbox{\hyperlink{dbc__tree__builder_8h_source_l00023}{23}} of file \mbox{\hyperlink{dbc__tree__builder_8h_source}{dbc\+\_\+tree\+\_\+builder.\+h}}. + + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}\label{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}} +\index{DbcTreeBuilder@{DbcTreeBuilder}!Build@{Build}} +\index{Build@{Build}!DbcTreeBuilder@{DbcTreeBuilder}} +\doxysubsubsection{\texorpdfstring{Build()}{Build()}} +{\footnotesize\ttfamily std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$ Dbc\+Tree\+Builder\+::\+Build (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&}]{database }\end{DoxyParamCaption}) const} + + + +Build tree representation of parsed DBC data. + + +\begin{DoxyParams}{Parameters} +{\em database} & Parsed database. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Root node of the tree. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{dbc__tree__builder_8cpp_source_l00014}{14}} of file \mbox{\hyperlink{dbc__tree__builder_8cpp_source}{dbc\+\_\+tree\+\_\+builder.\+cpp}}. + + + +References \mbox{\hyperlink{dbc__database_8h_source_l00023}{Dbc\+Database\+::frames}}, and \mbox{\hyperlink{frame__info_8h_source_l00033}{Frame\+Info\+::signals}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{dbc__tree__builder_8h}{dbc\+\_\+tree\+\_\+builder.\+h}}\item +\mbox{\hyperlink{dbc__tree__builder_8cpp}{dbc\+\_\+tree\+\_\+builder.\+cpp}}\end{DoxyCompactItemize} diff --git a/docs/latex/classTreeNode.tex b/docs/latex/classTreeNode.tex new file mode 100644 index 0000000..f5172f1 --- /dev/null +++ b/docs/latex/classTreeNode.tex @@ -0,0 +1,449 @@ +\hypertarget{classTreeNode}{}\doxysection{Tree\+Node Class Reference} +\label{classTreeNode}\index{TreeNode@{TreeNode}} + + +Tree node for later use in model/view or other hierarchy consumers. + + + + +{\ttfamily \#include $<$tree\+\_\+node.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{Tree\+Node}} () +\begin{DoxyCompactList}\small\item\em Create root node. \end{DoxyCompactList}\item +\mbox{\hyperlink{classTreeNode_a8e38dd591d8801d7ee3a7dbad90c67fc}{Tree\+Node}} (const \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \&frame) +\begin{DoxyCompactList}\small\item\em Create frame node. \end{DoxyCompactList}\item +\mbox{\hyperlink{classTreeNode_ab9f00f5253d56461bb2d420fd639c5ae}{Tree\+Node}} (const \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} \&signal) +\begin{DoxyCompactList}\small\item\em Create signal node. \end{DoxyCompactList}\item +\mbox{\hyperlink{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}{$\sim$\+Tree\+Node}} ()=default +\item +\mbox{\hyperlink{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}{Tree\+Node}} (const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&)=delete +\item +\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \& \mbox{\hyperlink{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}{operator=}} (const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&)=delete +\item +\mbox{\hyperlink{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}{Tree\+Node}} (\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&\&)=default +\item +\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \& \mbox{\hyperlink{classTreeNode_a88fbcbec9c64d888b19c5edb95059a95}{operator=}} (\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&\&)=default +\item +void \mbox{\hyperlink{classTreeNode_a6161f2ebb92184eab4215d121870e788}{Add\+Child}} (std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$ child) +\begin{DoxyCompactList}\small\item\em Add child node. \end{DoxyCompactList}\item +std\+::size\+\_\+t \mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{Get\+Child\+Count}} () const +\begin{DoxyCompactList}\small\item\em Get child count. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$ \mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{Get\+Child}} (std\+::size\+\_\+t index) const +\begin{DoxyCompactList}\small\item\em Get child by index. \end{DoxyCompactList}\item +\mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$ \mbox{\hyperlink{classTreeNode_a81047bd7d2a4cc96b9ef5e20d0d63b5f}{Get\+Child}} (std\+::size\+\_\+t index) +\begin{DoxyCompactList}\small\item\em Get mutable child by index. \end{DoxyCompactList}\item +\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} \mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{Get\+Type}} () const +\begin{DoxyCompactList}\small\item\em Get node type. \end{DoxyCompactList}\item +const std\+::string \& \mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{Get\+Name}} () const +\begin{DoxyCompactList}\small\item\em Get display name. \end{DoxyCompactList}\item +const \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $\ast$ \mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{Get\+Frame}} () const +\begin{DoxyCompactList}\small\item\em Get frame payload if node is frame. \end{DoxyCompactList}\item +const \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $\ast$ \mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{Get\+Signal}} () const +\begin{DoxyCompactList}\small\item\em Get signal payload if node is signal. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Private Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} \mbox{\hyperlink{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}{m\+\_\+type}} +\item +std\+::string \mbox{\hyperlink{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}{m\+\_\+name}} +\item +std\+::vector$<$ std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$ $>$ \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\+\_\+children}} +\item +std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $>$ \mbox{\hyperlink{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}{m\+\_\+frame}} +\item +std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $>$ \mbox{\hyperlink{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}{m\+\_\+signal}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Tree node for later use in model/view or other hierarchy consumers. + +Definition at line \mbox{\hyperlink{tree__node_8h_source_l00035}{35}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}. + + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}\label{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [1/5]}} +{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} + + + +Create root node. + + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00014}{14}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}}. + +\mbox{\Hypertarget{classTreeNode_a8e38dd591d8801d7ee3a7dbad90c67fc}\label{classTreeNode_a8e38dd591d8801d7ee3a7dbad90c67fc}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [2/5]}} +{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \&}]{frame }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [explicit]}} + + + +Create frame node. + + +\begin{DoxyParams}{Parameters} +{\em frame} & Frame payload. \\ +\hline +\end{DoxyParams} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00022}{22}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}}. + +\mbox{\Hypertarget{classTreeNode_ab9f00f5253d56461bb2d420fd639c5ae}\label{classTreeNode_ab9f00f5253d56461bb2d420fd639c5ae}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [3/5]}} +{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} \&}]{signal }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [explicit]}} + + + +Create signal node. + + +\begin{DoxyParams}{Parameters} +{\em signal} & Signal payload. \\ +\hline +\end{DoxyParams} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00030}{30}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}}. + +\mbox{\Hypertarget{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}\label{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}} +\index{TreeNode@{TreeNode}!````~TreeNode@{$\sim$TreeNode}} +\index{````~TreeNode@{$\sim$TreeNode}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{$\sim$TreeNode()}{~TreeNode()}} +{\footnotesize\ttfamily Tree\+Node\+::$\sim$\+Tree\+Node (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [default]}} + +\mbox{\Hypertarget{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}\label{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [4/5]}} +{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&}]{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [delete]}} + +\mbox{\Hypertarget{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}\label{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [5/5]}} +{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&\&}]{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [default]}} + + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classTreeNode_a6161f2ebb92184eab4215d121870e788}\label{classTreeNode_a6161f2ebb92184eab4215d121870e788}} +\index{TreeNode@{TreeNode}!AddChild@{AddChild}} +\index{AddChild@{AddChild}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{AddChild()}{AddChild()}} +{\footnotesize\ttfamily void Tree\+Node\+::\+Add\+Child (\begin{DoxyParamCaption}\item[{std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$}]{child }\end{DoxyParamCaption})} + + + +Add child node. + + +\begin{DoxyParams}{Parameters} +{\em child} & Child node to add. \\ +\hline +\end{DoxyParams} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00038}{38}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_source_l00115}{m\+\_\+children}}. + +\mbox{\Hypertarget{classTreeNode_a81047bd7d2a4cc96b9ef5e20d0d63b5f}\label{classTreeNode_a81047bd7d2a4cc96b9ef5e20d0d63b5f}} +\index{TreeNode@{TreeNode}!GetChild@{GetChild}} +\index{GetChild@{GetChild}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{GetChild()}{GetChild()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$ Tree\+Node\+::\+Get\+Child (\begin{DoxyParamCaption}\item[{std\+::size\+\_\+t}]{index }\end{DoxyParamCaption})} + + + +Get mutable child by index. + + +\begin{DoxyParams}{Parameters} +{\em index} & Child index. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Child pointer or nullptr if index is invalid. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00054}{54}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_source_l00115}{m\+\_\+children}}. + +\mbox{\Hypertarget{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}\label{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}} +\index{TreeNode@{TreeNode}!GetChild@{GetChild}} +\index{GetChild@{GetChild}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{GetChild()}{GetChild()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$ Tree\+Node\+::\+Get\+Child (\begin{DoxyParamCaption}\item[{std\+::size\+\_\+t}]{index }\end{DoxyParamCaption}) const} + + + +Get child by index. + + +\begin{DoxyParams}{Parameters} +{\em index} & Child index. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Child pointer or nullptr if index is invalid. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00047}{47}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_source_l00115}{m\+\_\+children}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}\label{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}} +\index{TreeNode@{TreeNode}!GetChildCount@{GetChildCount}} +\index{GetChildCount@{GetChildCount}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{GetChildCount()}{GetChildCount()}} +{\footnotesize\ttfamily std\+::size\+\_\+t Tree\+Node\+::\+Get\+Child\+Count (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +Get child count. + +\begin{DoxyReturn}{Returns} +Number of children. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00043}{43}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_source_l00115}{m\+\_\+children}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{classTreeNode_afc503b40004764163605d6dbdb4ef811}\label{classTreeNode_afc503b40004764163605d6dbdb4ef811}} +\index{TreeNode@{TreeNode}!GetFrame@{GetFrame}} +\index{GetFrame@{GetFrame}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{GetFrame()}{GetFrame()}} +{\footnotesize\ttfamily const \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $\ast$ Tree\+Node\+::\+Get\+Frame (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +Get frame payload if node is frame. + +\begin{DoxyReturn}{Returns} +Pointer to frame info or nullptr. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00069}{69}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_source_l00116}{m\+\_\+frame}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}\label{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}} +\index{TreeNode@{TreeNode}!GetName@{GetName}} +\index{GetName@{GetName}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{GetName()}{GetName()}} +{\footnotesize\ttfamily const std\+::string \& Tree\+Node\+::\+Get\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +Get display name. + +\begin{DoxyReturn}{Returns} +Node name. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00065}{65}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_source_l00114}{m\+\_\+name}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}\label{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}} +\index{TreeNode@{TreeNode}!GetSignal@{GetSignal}} +\index{GetSignal@{GetSignal}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{GetSignal()}{GetSignal()}} +{\footnotesize\ttfamily const \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $\ast$ Tree\+Node\+::\+Get\+Signal (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +Get signal payload if node is signal. + +\begin{DoxyReturn}{Returns} +Pointer to signal info or nullptr. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00073}{73}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_source_l00117}{m\+\_\+signal}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}\label{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}} +\index{TreeNode@{TreeNode}!GetType@{GetType}} +\index{GetType@{GetType}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{GetType()}{GetType()}} +{\footnotesize\ttfamily \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} Tree\+Node\+::\+Get\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +Get node type. + +\begin{DoxyReturn}{Returns} +Node type. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00061}{61}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + + + +References \mbox{\hyperlink{tree__node_8h_source_l00113}{m\+\_\+type}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}\label{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}} +\index{TreeNode@{TreeNode}!operator=@{operator=}} +\index{operator=@{operator=}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{operator=()}{operator=()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \& Tree\+Node\+::operator= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&}]{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [delete]}} + +\mbox{\Hypertarget{classTreeNode_a88fbcbec9c64d888b19c5edb95059a95}\label{classTreeNode_a88fbcbec9c64d888b19c5edb95059a95}} +\index{TreeNode@{TreeNode}!operator=@{operator=}} +\index{operator=@{operator=}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{operator=()}{operator=()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \& Tree\+Node\+::operator= (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&\&}]{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [default]}} + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{classTreeNode_a1bd61f40df6d36e61021063e3816a351}\label{classTreeNode_a1bd61f40df6d36e61021063e3816a351}} +\index{TreeNode@{TreeNode}!m\_children@{m\_children}} +\index{m\_children@{m\_children}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{m\_children}{m\_children}} +{\footnotesize\ttfamily std\+::vector$<$std\+::unique\+\_\+ptr$<$\mbox{\hyperlink{classTreeNode}{Tree\+Node}}$>$ $>$ Tree\+Node\+::m\+\_\+children\hspace{0.3cm}{\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{tree__node_8h_source_l00115}{115}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}. + + + +Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00038}{Add\+Child()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00047}{Get\+Child()}}, and \mbox{\hyperlink{tree__node_8cpp_source_l00043}{Get\+Child\+Count()}}. + +\mbox{\Hypertarget{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}\label{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}} +\index{TreeNode@{TreeNode}!m\_frame@{m\_frame}} +\index{m\_frame@{m\_frame}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{m\_frame}{m\_frame}} +{\footnotesize\ttfamily std\+::unique\+\_\+ptr$<$\mbox{\hyperlink{structFrameInfo}{Frame\+Info}}$>$ Tree\+Node\+::m\+\_\+frame\hspace{0.3cm}{\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{tree__node_8h_source_l00116}{116}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}. + + + +Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00069}{Get\+Frame()}}. + +\mbox{\Hypertarget{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}\label{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}} +\index{TreeNode@{TreeNode}!m\_name@{m\_name}} +\index{m\_name@{m\_name}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{m\_name}{m\_name}} +{\footnotesize\ttfamily std\+::string Tree\+Node\+::m\+\_\+name\hspace{0.3cm}{\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{tree__node_8h_source_l00114}{114}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}. + + + +Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00065}{Get\+Name()}}. + +\mbox{\Hypertarget{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}\label{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}} +\index{TreeNode@{TreeNode}!m\_signal@{m\_signal}} +\index{m\_signal@{m\_signal}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{m\_signal}{m\_signal}} +{\footnotesize\ttfamily std\+::unique\+\_\+ptr$<$\mbox{\hyperlink{structSignalInfo}{Signal\+Info}}$>$ Tree\+Node\+::m\+\_\+signal\hspace{0.3cm}{\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{tree__node_8h_source_l00117}{117}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}. + + + +Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00073}{Get\+Signal()}}. + +\mbox{\Hypertarget{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}\label{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}} +\index{TreeNode@{TreeNode}!m\_type@{m\_type}} +\index{m\_type@{m\_type}!TreeNode@{TreeNode}} +\doxysubsubsection{\texorpdfstring{m\_type}{m\_type}} +{\footnotesize\ttfamily \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} Tree\+Node\+::m\+\_\+type\hspace{0.3cm}{\ttfamily [private]}} + + + +Definition at line \mbox{\hyperlink{tree__node_8h_source_l00113}{113}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}. + + + +Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00061}{Get\+Type()}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{tree__node_8h}{tree\+\_\+node.\+h}}\item +\mbox{\hyperlink{tree__node_8cpp}{tree\+\_\+node.\+cpp}}\end{DoxyCompactItemize} diff --git a/docs/latex/dbc__database_8h.tex b/docs/latex/dbc__database_8h.tex new file mode 100644 index 0000000..3c17b80 --- /dev/null +++ b/docs/latex/dbc__database_8h.tex @@ -0,0 +1,23 @@ +\hypertarget{dbc__database_8h}{}\doxysection{dbc\+\_\+database.\+h File Reference} +\label{dbc__database_8h}\index{dbc\_database.h@{dbc\_database.h}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include \char`\"{}frame\+\_\+info.\+h\char`\"{}}\newline +\doxysubsection*{Classes} +\begin{DoxyCompactItemize} +\item +struct \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} +\begin{DoxyCompactList}\small\item\em Parsed DBC content stored in a simple internal form. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{dbc__database_8h_source}{dbc\+\_\+database.\+h}}. + diff --git a/docs/latex/dbc__database_8h_source.tex b/docs/latex/dbc__database_8h_source.tex new file mode 100644 index 0000000..69ac7ac --- /dev/null +++ b/docs/latex/dbc__database_8h_source.tex @@ -0,0 +1,31 @@ +\hypertarget{dbc__database_8h_source}{}\doxysection{dbc\+\_\+database.\+h} +\mbox{\hyperlink{dbc__database_8h}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_database.h}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_DATABASE\_H}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_DATABASE\_H}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00014}00014 } +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00016}00016 } +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00017}00017 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{frame__info_8h}{frame\_info.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00018}00018 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00019}00019 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00020}00020 \textcolor{comment}{ * @brief Parsed DBC content stored in a simple internal form.}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00021}00021 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00022}\mbox{\hyperlink{structDbcDatabase}{00022}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \{} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00023}\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{00023}} std::vector \mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}; \textcolor{comment}{/**< All frames found in the DBC file. */}} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00024}00024 \};} +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00025}00025 } +\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00026}00026 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_DATABASE\_H */}\textcolor{preprocessor}{}} + +\end{DoxyCode} diff --git a/docs/latex/dbc__decode__builder_8cpp.tex b/docs/latex/dbc__decode__builder_8cpp.tex new file mode 100644 index 0000000..126cd28 --- /dev/null +++ b/docs/latex/dbc__decode__builder_8cpp.tex @@ -0,0 +1,17 @@ +\hypertarget{dbc__decode__builder_8cpp}{}\doxysection{dbc\+\_\+decode\+\_\+builder.\+cpp File Reference} +\label{dbc__decode__builder_8cpp}\index{dbc\_decode\_builder.cpp@{dbc\_decode\_builder.cpp}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include \char`\"{}dbc\+\_\+decode\+\_\+builder.\+h\char`\"{}}\newline + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{dbc__decode__builder_8cpp_source}{dbc\+\_\+decode\+\_\+builder.\+cpp}}. + diff --git a/docs/latex/dbc__decode__builder_8cpp_source.tex b/docs/latex/dbc__decode__builder_8cpp_source.tex new file mode 100644 index 0000000..45aa455 --- /dev/null +++ b/docs/latex/dbc__decode__builder_8cpp_source.tex @@ -0,0 +1,61 @@ +\hypertarget{dbc__decode__builder_8cpp_source}{}\doxysection{dbc\+\_\+decode\+\_\+builder.\+cpp} +\mbox{\hyperlink{dbc__decode__builder_8cpp}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00002}00002 \textcolor{comment}{ * @file dbc\_decode\_builder.cpp}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__decode__builder_8h}{dbc\_decode\_builder.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00013}00013 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00014}\mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{00014}} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{DbcDecodeBuilder::Build}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&source)\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00015}00015 \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} result;} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00016}00016 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00017}00017 \textcolor{keywordflow}{for} (std::size\_t frameIndex = 0U; frameIndex < source.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.size(); ++frameIndex) \{} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00018}00018 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&sourceFrame = source.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[frameIndex];} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00019}00019 \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} targetFrame;} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00020}00020 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00021}00021 targetFrame.\mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00022}00022 targetFrame.\mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{canId}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00023}00023 targetFrame.\mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{isExtended}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00024}00024 targetFrame.\mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{dlc}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00025}00025 targetFrame.\mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{pgn}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00026}00026 targetFrame.\mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{hasPgn}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00027}00027 targetFrame.\mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{transmitter}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00028}00028 targetFrame.\mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{comment}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00029}00029 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00030}00030 \textcolor{keywordflow}{for} (std::size\_t signalIndex = 0U; signalIndex < sourceFrame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}.size(); ++signalIndex) \{} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00031}00031 \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \&sourceSignal = sourceFrame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}[signalIndex];} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00032}00032 \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} targetSignal;} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00033}00033 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00034}00034 targetSignal.\mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00035}00035 targetSignal.\mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00036}00036 targetSignal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00037}00037 targetSignal.\mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byteOrder}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{isLittleEndian}} ? \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{ByteOrder::Intel}} : \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}{ByteOrder::Motorola}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00038}00038 targetSignal.\mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{valueType}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{isSigned}} ? \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{ValueType::Signed}} : \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{ValueType::Unsigned}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00039}00039 targetSignal.\mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00040}00040 targetSignal.\mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00041}00041 targetSignal.\mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{minimum}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00042}00042 targetSignal.\mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{maximum}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00043}00043 targetSignal.\mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00044}00044 targetSignal.\mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{receivers}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00045}00045 targetSignal.\mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{comment}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00046}00046 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00047}00047 targetFrame.\mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}.push\_back (targetSignal);} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00048}00048 \}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00049}00049 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00050}00050 result.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.push\_back (targetFrame);} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00051}00051 result.\mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frameIndexByKey}}[\mbox{\hyperlink{structFrameKey}{FrameKey}} (targetFrame.\mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{canId}}, targetFrame.\mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{isExtended}})] =} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00052}00052 result.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.size() -\/ 1U;} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00053}00053 \}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00054}00054 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00055}00055 \textcolor{keywordflow}{return} result;} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00056}00056 \}} + +\end{DoxyCode} diff --git a/docs/latex/dbc__decode__builder_8h.tex b/docs/latex/dbc__decode__builder_8h.tex new file mode 100644 index 0000000..6eb60bd --- /dev/null +++ b/docs/latex/dbc__decode__builder_8h.tex @@ -0,0 +1,23 @@ +\hypertarget{dbc__decode__builder_8h}{}\doxysection{dbc\+\_\+decode\+\_\+builder.\+h File Reference} +\label{dbc__decode__builder_8h}\index{dbc\_decode\_builder.h@{dbc\_decode\_builder.h}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include \char`\"{}dbc\+\_\+database.\+h\char`\"{}}\newline +{\ttfamily \#include \char`\"{}decode\+\_\+database.\+h\char`\"{}}\newline +\doxysubsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \mbox{\hyperlink{classDbcDecodeBuilder}{Dbc\+Decode\+Builder}} +\begin{DoxyCompactList}\small\item\em Converts parsed DBC data into runtime decode database. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{dbc__decode__builder_8h_source}{dbc\+\_\+decode\+\_\+builder.\+h}}. + diff --git a/docs/latex/dbc__decode__builder_8h_source.tex b/docs/latex/dbc__decode__builder_8h_source.tex new file mode 100644 index 0000000..7675003 --- /dev/null +++ b/docs/latex/dbc__decode__builder_8h_source.tex @@ -0,0 +1,36 @@ +\hypertarget{dbc__decode__builder_8h_source}{}\doxysection{dbc\+\_\+decode\+\_\+builder.\+h} +\mbox{\hyperlink{dbc__decode__builder_8h}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_decode\_builder.h}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_DECODE\_BUILDER\_H}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_DECODE\_BUILDER\_H}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00014}00014 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00015}00015 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__database_8h}{dbc\_database.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00016}00016 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{decode__database_8h}{decode\_database.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00017}00017 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00018}00018 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00019}00019 \textcolor{comment}{ * @brief Converts parsed DBC data into runtime decode database.}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00020}00020 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00021}\mbox{\hyperlink{classDbcDecodeBuilder}{00021}} \textcolor{keyword}{class }\mbox{\hyperlink{classDbcDecodeBuilder}{DbcDecodeBuilder}} \{} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00022}00022 \textcolor{keyword}{public}:\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00023}00023 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00024}00024 \textcolor{comment}{ * @brief Build runtime decode database.}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00025}00025 \textcolor{comment}{ * @param source Parsed DBC database.}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00026}00026 \textcolor{comment}{ * @return Runtime-\/ready decode database.}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00027}00027 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00028}00028 \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{Build}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&source) \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00029}00029 \};} +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00030}00030 } +\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00031}00031 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_DECODE\_BUILDER\_H */}\textcolor{preprocessor}{}} + +\end{DoxyCode} diff --git a/docs/latex/dbc__decoder_8cpp.tex b/docs/latex/dbc__decoder_8cpp.tex new file mode 100644 index 0000000..fb7d09a --- /dev/null +++ b/docs/latex/dbc__decoder_8cpp.tex @@ -0,0 +1,17 @@ +\hypertarget{dbc__decoder_8cpp}{}\doxysection{dbc\+\_\+decoder.\+cpp File Reference} +\label{dbc__decoder_8cpp}\index{dbc\_decoder.cpp@{dbc\_decoder.cpp}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include \char`\"{}dbc\+\_\+decoder.\+h\char`\"{}}\newline + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}. + diff --git a/docs/latex/dbc__decoder_8cpp_source.tex b/docs/latex/dbc__decoder_8cpp_source.tex new file mode 100644 index 0000000..1d1cd95 --- /dev/null +++ b/docs/latex/dbc__decoder_8cpp_source.tex @@ -0,0 +1,162 @@ +\hypertarget{dbc__decoder_8cpp_source}{}\doxysection{dbc\+\_\+decoder.\+cpp} +\mbox{\hyperlink{dbc__decoder_8cpp}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00002}00002 \textcolor{comment}{ * @file dbc\_decoder.cpp}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__decoder_8h}{dbc\_decoder.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00013}00013 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00014}\mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{00014}} \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} *\mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{DbcDecoder::FindFrame}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \&database,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00015}00015 std::uint32\_t canId,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00016}00016 \textcolor{keywordtype}{bool} isExtended)\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00017}00017 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameKey}{FrameKey}} key (canId, isExtended);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00018}00018 \textcolor{keyword}{const} std::unordered\_map::const\_iterator it =} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00019}00019 database.\mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frameIndexByKey}}.find (key);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00020}00020 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00021}00021 \textcolor{keywordflow}{if} (it == database.\mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frameIndexByKey}}.end())} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00022}00022 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00023}00023 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00024}00024 \textcolor{keyword}{const} std::size\_t index = it-\/>second;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00025}00025 \textcolor{keywordflow}{if} (index >= database.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.size())} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00026}00026 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00027}00027 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00028}00028 \textcolor{keywordflow}{return} \&database.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}[index];} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00029}00029 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00030}00030 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00031}\mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{00031}} \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} \mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{DbcDecoder::Decode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \&database,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00032}00032 \textcolor{keyword}{const} \mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} \&frame)\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00033}00033 \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} result;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00034}00034 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} *definition = \mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{FindFrame}} (database, frame.\mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}}, frame.\mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}});} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00035}00035 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00036}00036 \textcolor{keywordflow}{if} (definition == \textcolor{keyword}{nullptr})} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00037}00037 \textcolor{keywordflow}{return} result;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00038}00038 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00039}00039 result.\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}} = definition;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00040}00040 result.\mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}} = \textcolor{keyword}{true};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00041}00041 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00042}00042 \textcolor{keywordflow}{for} (std::size\_t signalIndex = 0U; signalIndex < definition-\/>\mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}.size(); ++signalIndex) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00043}00043 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} \&signal = definition-\/>\mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}[signalIndex];} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00044}00044 \mbox{\hyperlink{structDecodedSignalValue}{DecodedSignalValue}} decoded;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00045}00045 std::uint64\_t unsignedValue = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00046}00046 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00047}00047 decoded.\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}} = \&signal;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00048}00048 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00049}00049 \textcolor{keywordflow}{if} (!\mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{ExtractUnsigned}} (frame.\mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}}, signal, unsignedValue)) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00050}00050 decoded.\mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}} = \textcolor{keyword}{false};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00051}00051 result.\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}.push\_back (decoded);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00052}00052 \textcolor{keywordflow}{continue};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00053}00053 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00054}00054 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00055}00055 \textcolor{keywordflow}{if} (signal.\mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{valueType}} == \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{ValueType::Signed}})} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00056}00056 decoded.\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}} = \mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{SignExtend}} (unsignedValue, signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}});} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00057}00057 \textcolor{keywordflow}{else}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00058}00058 decoded.\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}} = \textcolor{keyword}{static\_cast<}std::int64\_t\textcolor{keyword}{>} (unsignedValue);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00059}00059 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00060}00060 decoded.\mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physicalValue}} =} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00061}00061 (\textcolor{keyword}{static\_cast<}\textcolor{keywordtype}{double}\textcolor{keyword}{>} (decoded.\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}}) * signal.\mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}}) + signal.\mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00062}00062 decoded.\mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}} = \textcolor{keyword}{true};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00063}00063 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00064}00064 result.\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}.push\_back (decoded);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00065}00065 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00066}00066 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00067}00067 \textcolor{keywordflow}{return} result;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00068}00068 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00069}00069 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00070}\mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{00070}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{DbcDecoder::ExtractUnsigned}} (\textcolor{keyword}{const} std::vector \&data,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00071}00071 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} \&signal,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00072}00072 std::uint64\_t \&value) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00073}00073 \textcolor{keywordflow}{if} ((signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}} == 0U) || (signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}} > 64U))} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00074}00074 \textcolor{keywordflow}{return} \textcolor{keyword}{false};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00075}00075 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00076}00076 \textcolor{keywordflow}{if} (signal.\mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byteOrder}} == \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{ByteOrder::Intel}})} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00077}00077 \textcolor{keywordflow}{return} \mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{ExtractIntel}} (data, signal.\mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}}, signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}}, value);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00078}00078 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00079}00079 \textcolor{keywordflow}{return} \mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{ExtractMotorola}} (data, signal.\mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}}, signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}}, value);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00080}00080 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00081}00081 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00082}\mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{00082}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{DbcDecoder::ExtractIntel}} (\textcolor{keyword}{const} std::vector \&data,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00083}00083 std::uint32\_t startBit,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00084}00084 std::uint32\_t length,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00085}00085 std::uint64\_t \&value) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00086}00086 value = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00087}00087 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00088}00088 \textcolor{keywordflow}{for} (std::uint32\_t bitIndex = 0U; bitIndex < length; ++bitIndex) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00089}00089 \textcolor{keyword}{const} std::uint32\_t absoluteBit = startBit + bitIndex;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00090}00090 \textcolor{keyword}{const} std::uint32\_t byteIndex = absoluteBit / 8U;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00091}00091 \textcolor{keyword}{const} std::uint32\_t bitInByte = absoluteBit \% 8U;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00092}00092 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00093}00093 \textcolor{keywordflow}{if} (byteIndex >= data.size())} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00094}00094 \textcolor{keywordflow}{return} \textcolor{keyword}{false};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00095}00095 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00096}00096 \textcolor{keyword}{const} std::uint64\_t bitValue =} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00097}00097 (\textcolor{keyword}{static\_cast<}std::uint64\_t\textcolor{keyword}{>} ((data[byteIndex] >> bitInByte) \& 0x01U) << bitIndex);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00098}00098 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00099}00099 value |= bitValue;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00100}00100 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00101}00101 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00102}00102 \textcolor{keywordflow}{return} \textcolor{keyword}{true};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00103}00103 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00104}00104 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00105}\mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{00105}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{DbcDecoder::ExtractMotorola}} (\textcolor{keyword}{const} std::vector \&data,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00106}00106 std::uint32\_t startBit,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00107}00107 std::uint32\_t length,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00108}00108 std::uint64\_t \&value) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00109}00109 \textcolor{comment}{/*}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00110}00110 \textcolor{comment}{ * DBC Motorola bit numbering:}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00111}00111 \textcolor{comment}{ * -\/ startBit points to the most significant bit of the signal}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00112}00112 \textcolor{comment}{ * -\/ inside a byte, bit numbering goes 7..0}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00113}00113 \textcolor{comment}{ * -\/ crossing byte boundary moves to the next byte, bit 7}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00114}00114 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00115}00115 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00116}00116 value = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00117}00117 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00118}00118 std::int32\_t currentBit = \textcolor{keyword}{static\_cast<}std::int32\_t\textcolor{keyword}{>} (startBit);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00119}00119 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00120}00120 \textcolor{keywordflow}{for} (std::uint32\_t bitIndex = 0U; bitIndex < length; ++bitIndex) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00121}00121 \textcolor{keywordflow}{if} (currentBit < 0)} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00122}00122 \textcolor{keywordflow}{return} \textcolor{keyword}{false};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00123}00123 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00124}00124 \textcolor{keyword}{const} std::uint32\_t absoluteBit = \textcolor{keyword}{static\_cast<}std::uint32\_t\textcolor{keyword}{>} (currentBit);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00125}00125 \textcolor{keyword}{const} std::uint32\_t byteIndex = absoluteBit / 8U;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00126}00126 \textcolor{keyword}{const} std::uint32\_t bitFromMsb = absoluteBit \% 8U;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00127}00127 \textcolor{keyword}{const} std::uint32\_t bitInByte = 7U -\/ bitFromMsb;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00128}00128 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00129}00129 \textcolor{keywordflow}{if} (byteIndex >= data.size())} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00130}00130 \textcolor{keywordflow}{return} \textcolor{keyword}{false};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00131}00131 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00132}00132 value <<= 1U;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00133}00133 value |= \textcolor{keyword}{static\_cast<}std::uint64\_t\textcolor{keyword}{>} ((data[byteIndex] >> bitInByte) \& 0x01U);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00134}00134 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00135}00135 \textcolor{keywordflow}{if} ((absoluteBit \% 8U) == 7U)} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00136}00136 currentBit = \textcolor{keyword}{static\_cast<}std::int32\_t\textcolor{keyword}{>} ((byteIndex + 1U) * 8U);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00137}00137 \textcolor{keywordflow}{else}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00138}00138 -\/-\/currentBit;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00139}00139 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00140}00140 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00141}00141 \textcolor{keywordflow}{return} \textcolor{keyword}{true};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00142}00142 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00143}00143 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00144}\mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{00144}} std::int64\_t \mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{DbcDecoder::SignExtend}} (std::uint64\_t value, std::uint32\_t bitLength) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00145}00145 \textcolor{keywordflow}{if} ((bitLength == 0U) || (bitLength >= 64U))} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00146}00146 \textcolor{keywordflow}{return} \textcolor{keyword}{static\_cast<}std::int64\_t\textcolor{keyword}{>} (value);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00147}00147 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00148}00148 \textcolor{keyword}{const} std::uint64\_t signMask = (\textcolor{keyword}{static\_cast<}std::uint64\_t\textcolor{keyword}{>} (1U) << (bitLength -\/ 1U));} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00149}00149 \textcolor{keyword}{const} std::uint64\_t valueMask = (\textcolor{keyword}{static\_cast<}std::uint64\_t\textcolor{keyword}{>} (1U) << bitLength) -\/ 1U;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00150}00150 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00151}00151 value \&= valueMask;} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00152}00152 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00153}00153 \textcolor{keywordflow}{if} ((value \& signMask) == 0U)} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00154}00154 \textcolor{keywordflow}{return} \textcolor{keyword}{static\_cast<}std::int64\_t\textcolor{keyword}{>} (value);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00155}00155 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00156}00156 \textcolor{keywordflow}{return} \textcolor{keyword}{static\_cast<}std::int64\_t\textcolor{keyword}{>} (value | (\string~valueMask));} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00157}00157 \}} + +\end{DoxyCode} diff --git a/docs/latex/dbc__decoder_8h.tex b/docs/latex/dbc__decoder_8h.tex new file mode 100644 index 0000000..58c7cec --- /dev/null +++ b/docs/latex/dbc__decoder_8h.tex @@ -0,0 +1,30 @@ +\hypertarget{dbc__decoder_8h}{}\doxysection{dbc\+\_\+decoder.\+h File Reference} +\label{dbc__decoder_8h}\index{dbc\_decoder.h@{dbc\_decoder.h}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$cstdint$>$}\newline +{\ttfamily \#include \char`\"{}decode\+\_\+database.\+h\char`\"{}}\newline +\doxysubsection*{Classes} +\begin{DoxyCompactItemize} +\item +struct \mbox{\hyperlink{structRawCanFrame}{Raw\+Can\+Frame}} +\begin{DoxyCompactList}\small\item\em Raw CAN frame used for runtime or trace decoding. \end{DoxyCompactList}\item +struct \mbox{\hyperlink{structDecodedSignalValue}{Decoded\+Signal\+Value}} +\begin{DoxyCompactList}\small\item\em One decoded signal value. \end{DoxyCompactList}\item +struct \mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} +\begin{DoxyCompactList}\small\item\em Fully decoded frame. \end{DoxyCompactList}\item +class \mbox{\hyperlink{classDbcDecoder}{Dbc\+Decoder}} +\begin{DoxyCompactList}\small\item\em Runtime CAN decoder using prebuilt decode database. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + diff --git a/docs/latex/dbc__decoder_8h_source.tex b/docs/latex/dbc__decoder_8h_source.tex new file mode 100644 index 0000000..09e45b7 --- /dev/null +++ b/docs/latex/dbc__decoder_8h_source.tex @@ -0,0 +1,115 @@ +\hypertarget{dbc__decoder_8h_source}{}\doxysection{dbc\+\_\+decoder.\+h} +\mbox{\hyperlink{dbc__decoder_8h}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_decoder.h}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_DECODER\_H}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_DECODER\_H}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00014}00014 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00017}00017 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00018}00018 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{decode__database_8h}{decode\_database.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00019}00019 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00020}00020 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00021}00021 \textcolor{comment}{ * @brief Raw CAN frame used for runtime or trace decoding.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00022}00022 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00023}\mbox{\hyperlink{structRawCanFrame}{00023}} \textcolor{keyword}{struct }\mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00024}\mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{00024}} std::uint32\_t \mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}}; \textcolor{comment}{/**< Normalized CAN ID. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00025}\mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{00025}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}}; \textcolor{comment}{/**< true for extended frame. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00026}\mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{00026}} std::vector \mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}}; \textcolor{comment}{/**< Payload bytes. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00027}00027 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00028}\mbox{\hyperlink{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}{00028}} \mbox{\hyperlink{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}{RawCanFrame}}()} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00029}00029 : \mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}} (0U)} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00030}00030 , \mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}} (false)} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00031}00031 , \mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}}() \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00032}00032 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00033}00033 \};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00034}00034 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00035}00035 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00036}00036 \textcolor{comment}{ * @brief One decoded signal value.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00037}00037 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00038}\mbox{\hyperlink{structDecodedSignalValue}{00038}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodedSignalValue}{DecodedSignalValue}} \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00039}\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{00039}} \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} *\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}}; \textcolor{comment}{/**< Signal definition. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00040}\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{00040}} std::int64\_t \mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}}; \textcolor{comment}{/**< Extracted raw integer value. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00041}\mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{00041}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physicalValue}}; \textcolor{comment}{/**< Converted physical value. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00042}\mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{00042}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}}; \textcolor{comment}{/**< true if decoding succeeded. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00043}00043 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00044}\mbox{\hyperlink{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}{00044}} \mbox{\hyperlink{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}{DecodedSignalValue}}()} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00045}00045 : \mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}} (nullptr)} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00046}00046 , \mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}} (0)} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00047}00047 , \mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physicalValue}} (0.0)} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00048}00048 , \mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}} (false) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00049}00049 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00050}00050 \};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00051}00051 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00052}00052 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00053}00053 \textcolor{comment}{ * @brief Fully decoded frame.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00054}00054 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00055}\mbox{\hyperlink{structDecodedFrameValue}{00055}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00056}\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{00056}} \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} *\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}}; \textcolor{comment}{/**< Frame definition. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00057}\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{00057}} std::vector \mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}; \textcolor{comment}{/**< Decoded signal values. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00058}\mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{00058}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}}; \textcolor{comment}{/**< true if frame was matched. */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00059}00059 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00060}\mbox{\hyperlink{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}{00060}} \mbox{\hyperlink{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}{DecodedFrameValue}}()} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00061}00061 : \mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}} (nullptr)} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00062}00062 , \mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}()} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00063}00063 , \mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}} (false) \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00064}00064 \}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00065}00065 \};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00066}00066 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00067}00067 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00068}00068 \textcolor{comment}{ * @brief Runtime CAN decoder using prebuilt decode database.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00069}00069 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00070}\mbox{\hyperlink{classDbcDecoder}{00070}} \textcolor{keyword}{class }\mbox{\hyperlink{classDbcDecoder}{DbcDecoder}} \{} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00071}00071 \textcolor{keyword}{public}:\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00072}00072 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00073}00073 \textcolor{comment}{ * @brief Find frame definition by CAN ID.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00074}00074 \textcolor{comment}{ * @param database Runtime decode database.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00075}00075 \textcolor{comment}{ * @param canId Normalized CAN ID.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00076}00076 \textcolor{comment}{ * @param isExtended true for extended frame.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00077}00077 \textcolor{comment}{ * @return Pointer to frame definition or nullptr.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00078}00078 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00079}00079 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} *\mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{FindFrame}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \&database,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00080}00080 std::uint32\_t canId,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00081}00081 \textcolor{keywordtype}{bool} isExtended) \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00082}00082 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00083}00083 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00084}00084 \textcolor{comment}{ * @brief Decode one raw CAN frame.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00085}00085 \textcolor{comment}{ * @param database Runtime decode database.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00086}00086 \textcolor{comment}{ * @param frame Raw CAN frame.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00087}00087 \textcolor{comment}{ * @return Decoded frame value.}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00088}00088 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00089}00089 \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} \mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{Decode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \&database,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00090}00090 \textcolor{keyword}{const} \mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} \&frame) \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00091}00091 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00092}00092 \textcolor{keyword}{private}:} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00093}00093 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{ExtractUnsigned}} (\textcolor{keyword}{const} std::vector \&data,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00094}00094 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} \&signal,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00095}00095 std::uint64\_t \&value);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00096}00096 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00097}00097 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{ExtractIntel}} (\textcolor{keyword}{const} std::vector \&data,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00098}00098 std::uint32\_t startBit,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00099}00099 std::uint32\_t length,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00100}00100 std::uint64\_t \&value);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00101}00101 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00102}00102 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{ExtractMotorola}} (\textcolor{keyword}{const} std::vector \&data,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00103}00103 std::uint32\_t startBit,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00104}00104 std::uint32\_t length,} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00105}00105 std::uint64\_t \&value);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00106}00106 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00107}00107 \textcolor{keyword}{static} std::int64\_t \mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{SignExtend}} (std::uint64\_t value, std::uint32\_t bitLength);} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00108}00108 \};} +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00109}00109 } +\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00110}00110 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_DECODER\_H */}\textcolor{preprocessor}{}} + +\end{DoxyCode} diff --git a/docs/latex/dbc__parser_8cpp.tex b/docs/latex/dbc__parser_8cpp.tex new file mode 100644 index 0000000..6b0fbe1 --- /dev/null +++ b/docs/latex/dbc__parser_8cpp.tex @@ -0,0 +1,31 @@ +\hypertarget{dbc__parser_8cpp}{}\doxysection{dbc\+\_\+parser.\+cpp File Reference} +\label{dbc__parser_8cpp}\index{dbc\_parser.cpp@{dbc\_parser.cpp}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include \char`\"{}dbc\+\_\+parser.\+h\char`\"{}}\newline +{\ttfamily \#include $<$fstream$>$}\newline +{\ttfamily \#include $<$sstream$>$}\newline +{\ttfamily \#include $<$stdexcept$>$}\newline +{\ttfamily \#include $<$cctype$>$}\newline +\doxysubsection*{Namespaces} +\begin{DoxyCompactItemize} +\item +namespace \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}}} +\end{DoxyCompactItemize} +\doxysubsection*{Functions} +\begin{DoxyCompactItemize} +\item +std\+::string \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text}} (const std\+::string \&text) +\begin{DoxyCompactList}\small\item\em Remove leading and trailing spaces. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + diff --git a/docs/latex/dbc__parser_8cpp_source.tex b/docs/latex/dbc__parser_8cpp_source.tex new file mode 100644 index 0000000..7bbd6b7 --- /dev/null +++ b/docs/latex/dbc__parser_8cpp_source.tex @@ -0,0 +1,361 @@ +\hypertarget{dbc__parser_8cpp_source}{}\doxysection{dbc\+\_\+parser.\+cpp} +\mbox{\hyperlink{dbc__parser_8cpp}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00002}00002 \textcolor{comment}{ * @file dbc\_parser.cpp}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__parser_8h}{dbc\_parser.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00013}00013 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00014}00014 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00016}00016 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00017}00017 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00018}00018 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00019}\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03}{00019}} \textcolor{keyword}{namespace }\{\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00020}00020 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00021}00021 \textcolor{comment}{ * @brief Remove leading and trailing spaces.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00022}00022 \textcolor{comment}{ * @param text Input text.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00023}00023 \textcolor{comment}{ * @return Trimmed text.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00024}00024 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00025}\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{00025}} std::string \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (\textcolor{keyword}{const} std::string \&text) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00026}00026 std::string::size\_type begin = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00027}00027 \textcolor{keywordflow}{while} ((begin < text.size()) \&\&} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00028}00028 std::isspace (\textcolor{keyword}{static\_cast<}\textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char}\textcolor{keyword}{>} (text[begin])))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00029}00029 ++begin;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00030}00030 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00031}00031 std::string::size\_type end = text.size();} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00032}00032 \textcolor{keywordflow}{while} ((end > begin) \&\&} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00033}00033 std::isspace (\textcolor{keyword}{static\_cast<}\textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char}\textcolor{keyword}{>} (text[end -\/ 1U])))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00034}00034 -\/-\/end;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00035}00035 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00036}00036 \textcolor{keywordflow}{return} text.substr (begin, end -\/ begin);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00037}00037 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00038}00038 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00039}00039 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00040}\mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{00040}} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{DbcParser::ParseFile}} (\textcolor{keyword}{const} std::string \&filePath)\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00041}00041 std::ifstream input (filePath.c\_str());} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00042}00042 \textcolor{keywordflow}{if} (!input.is\_open())} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00043}00043 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Failed to open DBC file: "{}} + filePath);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00044}00044 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00045}00045 \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} database;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00046}00046 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *currentFrame = \textcolor{keyword}{nullptr};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00047}00047 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00048}00048 std::string line;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00049}00049 \textcolor{keywordflow}{while} (std::getline (input, line)) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00050}00050 line = \mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{Trim}} (line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00051}00051 \textcolor{keywordflow}{if} (line.empty())} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00052}00052 \textcolor{keywordflow}{continue};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00053}00053 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00054}00054 \textcolor{keywordflow}{if} (\mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{IsFrameLine}} (line)) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00055}00055 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} frame = \mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{ParseFrameLine}} (line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00056}00056 database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.push\_back (frame);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00057}00057 currentFrame = \&database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.back();} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00058}00058 \} \textcolor{keywordflow}{else} \textcolor{keywordflow}{if} (\mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{IsSignalLine}} (line)) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00059}00059 \textcolor{keywordflow}{if} (currentFrame == \textcolor{keyword}{nullptr})} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00060}00060 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Signal found before any frame definition."{}});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00061}00061 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00062}00062 \mbox{\hyperlink{structSignalInfo}{SignalInfo}} signal = \mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{ParseSignalLine}} (line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00063}00063 currentFrame-\/>\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}.push\_back (signal);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00064}00064 \} \textcolor{keywordflow}{else} \textcolor{keywordflow}{if} (\mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{IsCommentLine}} (line))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00065}00065 \mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{ParseCommentLine}} (line, database);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00066}00066 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00067}00067 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00068}00068 \textcolor{keywordflow}{return} database;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00069}00069 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00070}00070 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00071}\mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{00071}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{DbcParser::IsFrameLine}} (\textcolor{keyword}{const} std::string \&line) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00072}00072 \textcolor{keywordflow}{return} (line.size() >= 4U) \&\& (line.compare (0U, 4U, \textcolor{stringliteral}{"{}BO\_ "{}}) == 0);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00073}00073 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00074}00074 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00075}\mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{00075}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{DbcParser::IsSignalLine}} (\textcolor{keyword}{const} std::string \&line) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00076}00076 \textcolor{keywordflow}{return} (line.size() >= 4U) \&\& (line.compare (0U, 4U, \textcolor{stringliteral}{"{}SG\_ "{}}) == 0);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00077}00077 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00078}00078 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00079}\mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{00079}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{DbcParser::IsCommentLine}} (\textcolor{keyword}{const} std::string \&line) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00080}00080 \textcolor{keywordflow}{return} (line.size() >= 4U) \&\& (line.compare (0U, 4U, \textcolor{stringliteral}{"{}CM\_ "{}}) == 0);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00081}00081 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00082}00082 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00083}\mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{00083}} std::string \mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{DbcParser::Trim}} (\textcolor{keyword}{const} std::string \&text) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00084}00084 \textcolor{keywordflow}{return} \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (text);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00085}00085 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00086}00086 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00087}\mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{00087}} std::vector \mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{DbcParser::SplitReceivers}} (\textcolor{keyword}{const} std::string \&text) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00088}00088 std::vector receivers;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00089}00089 std::string token;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00090}00090 std::istringstream stream (text);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00091}00091 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00092}00092 \textcolor{keywordflow}{while} (std::getline (stream, token, \textcolor{charliteral}{','})) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00093}00093 token = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (token);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00094}00094 \textcolor{keywordflow}{if} (!token.empty())} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00095}00095 receivers.push\_back (token);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00096}00096 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00097}00097 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00098}00098 \textcolor{keywordflow}{return} receivers;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00099}00099 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00100}00100 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00101}\mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{00101}} \textcolor{keywordtype}{void} \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{DbcParser::NormalizeCanId}} (std::uint32\_t rawCanId,} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00102}00102 std::uint32\_t \&normalizedCanId,} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00103}00103 \textcolor{keywordtype}{bool} \&isExtended) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00104}00104 \textcolor{comment}{/*}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00105}00105 \textcolor{comment}{ * DBC commonly stores extended identifiers with bit 31 set.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00106}00106 \textcolor{comment}{ * Example:}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00107}00107 \textcolor{comment}{ * raw id = 0x80000000 | actual\_29\_bit\_id}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00108}00108 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00109}00109 \textcolor{keywordflow}{if} ((rawCanId \& 0x80000000U) != 0U) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00110}00110 isExtended = \textcolor{keyword}{true};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00111}00111 normalizedCanId = (rawCanId \& 0x1FFFFFFFU);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00112}00112 \} \textcolor{keywordflow}{else} \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00113}00113 isExtended = (rawCanId > 0x7FFU);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00114}00114 normalizedCanId = rawCanId;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00115}00115 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00116}00116 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00117}00117 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00118}\mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{00118}} std::uint32\_t \mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{DbcParser::TryExtractPgn}} (std::uint32\_t canId, \textcolor{keywordtype}{bool} isExtended, \textcolor{keywordtype}{bool} \&hasPgn) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00119}00119 hasPgn = \textcolor{keyword}{false};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00120}00120 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00121}00121 \textcolor{keywordflow}{if} (!isExtended)} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00122}00122 \textcolor{keywordflow}{return} 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00123}00123 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00124}00124 \textcolor{keywordflow}{if} ((canId \& 0x1FFFFFFFU) != canId)} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00125}00125 \textcolor{keywordflow}{return} 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00126}00126 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00127}00127 \textcolor{keyword}{const} std::uint32\_t pf = (canId >> 16U) \& 0xFFU;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00128}00128 \textcolor{keyword}{const} std::uint32\_t ps = (canId >> 8U) \& 0xFFU;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00129}00129 \textcolor{keyword}{const} std::uint32\_t dp = (canId >> 24U) \& 0x01U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00130}00130 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00131}00131 std::uint32\_t pgn = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00132}00132 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00133}00133 \textcolor{keywordflow}{if} (pf < 240U)} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00134}00134 pgn = (dp << 16U) | (pf << 8U);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00135}00135 \textcolor{keywordflow}{else}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00136}00136 pgn = (dp << 16U) | (pf << 8U) | ps;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00137}00137 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00138}00138 hasPgn = \textcolor{keyword}{true};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00139}00139 \textcolor{keywordflow}{return} pgn;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00140}00140 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00141}00141 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00142}\mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{00142}} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{DbcParser::ParseFrameLine}} (\textcolor{keyword}{const} std::string \&line) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00143}00143 \textcolor{comment}{/*}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00144}00144 \textcolor{comment}{ * Example:}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00145}00145 \textcolor{comment}{ * BO\_ 256 EngineData: 8 EEC1}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00146}00146 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00147}00147 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00148}00148 std::istringstream stream (line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00149}00149 std::string token;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00150}00150 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} frame;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00151}00151 std::uint32\_t rawCanId = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00152}00152 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00153}00153 stream >> token;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00154}00154 \textcolor{keywordflow}{if} (token != \textcolor{stringliteral}{"{}BO\_"{}})} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00155}00155 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Invalid frame line: "{}} + line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00156}00156 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00157}00157 stream >> rawCanId;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00158}00158 \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{NormalizeCanId}} (rawCanId, frame.\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}}, frame.\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00159}00159 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00160}00160 stream >> token;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00161}00161 \textcolor{keywordflow}{if} (token.empty())} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00162}00162 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Missing frame name: "{}} + line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00163}00163 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00164}00164 \textcolor{keywordflow}{if} (token[token.size() -\/ 1U] == \textcolor{charliteral}{':'})} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00165}00165 token.erase (token.size() -\/ 1U, 1U);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00166}00166 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00167}00167 frame.\mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}} = token;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00168}00168 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00169}00169 \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00170}00170 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{int} dlcValue = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00171}00171 stream >> dlcValue;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00172}00172 frame.\mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}} = \textcolor{keyword}{static\_cast<}std::uint8\_t\textcolor{keyword}{>} (dlcValue);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00173}00173 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00174}00174 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00175}00175 stream >> frame.\mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00176}00176 frame.\mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}} = \mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{TryExtractPgn}} (frame.\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}}, frame.\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}}, frame.\mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00177}00177 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00178}00178 \textcolor{keywordflow}{return} frame;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00179}00179 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00180}00180 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00181}\mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{00181}} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{DbcParser::ParseSignalLine}} (\textcolor{keyword}{const} std::string \&line) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00182}00182 \textcolor{comment}{/*}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00183}00183 \textcolor{comment}{ * Example:}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00184}00184 \textcolor{comment}{ * SG\_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] "{}rpm"{} ECU1,ECU2}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00185}00185 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00186}00186 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00187}00187 \mbox{\hyperlink{structSignalInfo}{SignalInfo}} signal;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00188}00188 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00189}00189 std::string work = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00190}00190 \textcolor{keywordflow}{if} (work.compare (0U, 4U, \textcolor{stringliteral}{"{}SG\_ "{}}) != 0)} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00191}00191 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Invalid signal line: "{}} + line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00192}00192 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00193}00193 work.erase (0U, 4U);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00194}00194 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00195}00195 \textcolor{keyword}{const} std::string::size\_type colonPos = work.find (\textcolor{charliteral}{':'});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00196}00196 \textcolor{keywordflow}{if} (colonPos == std::string::npos)} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00197}00197 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Signal line missing ':' : "{}} + line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00198}00198 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00199}00199 signal.\mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}} = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (work.substr (0U, colonPos));} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00200}00200 std::string rest = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (work.substr (colonPos + 1U));} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00201}00201 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00202}00202 \textcolor{keyword}{const} std::string::size\_type pipePos = rest.find (\textcolor{charliteral}{'|'});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00203}00203 \textcolor{keyword}{const} std::string::size\_type atPos = rest.find (\textcolor{charliteral}{'@'});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00204}00204 \textcolor{keyword}{const} std::string::size\_type signPos = rest.find\_first\_of (\textcolor{stringliteral}{"{}+-\/"{}}, atPos);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00205}00205 \textcolor{keyword}{const} std::string::size\_type factorBegin = rest.find (\textcolor{charliteral}{'('});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00206}00206 \textcolor{keyword}{const} std::string::size\_type factorComma = rest.find (\textcolor{charliteral}{','}, factorBegin);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00207}00207 \textcolor{keyword}{const} std::string::size\_type factorEnd = rest.find (\textcolor{charliteral}{')'}, factorComma);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00208}00208 \textcolor{keyword}{const} std::string::size\_type rangeBegin = rest.find (\textcolor{charliteral}{'['});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00209}00209 \textcolor{keyword}{const} std::string::size\_type rangeSep = rest.find (\textcolor{charliteral}{'|'}, rangeBegin);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00210}00210 \textcolor{keyword}{const} std::string::size\_type rangeEnd = rest.find (\textcolor{charliteral}{']'}, rangeSep);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00211}00211 \textcolor{keyword}{const} std::string::size\_type unitBegin = rest.find (\textcolor{charliteral}{'"{}'}, rangeEnd);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00212}00212 \textcolor{keyword}{const} std::string::size\_type unitEnd = rest.find (\textcolor{charliteral}{'"{}'}, unitBegin + 1U);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00213}00213 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00214}00214 \textcolor{keywordflow}{if} ((pipePos == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00215}00215 (atPos == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00216}00216 (signPos == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00217}00217 (factorBegin == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00218}00218 (factorComma == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00219}00219 (factorEnd == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00220}00220 (rangeBegin == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00221}00221 (rangeSep == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00222}00222 (rangeEnd == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00223}00223 (unitBegin == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00224}00224 (unitEnd == std::string::npos))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00225}00225 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Unsupported signal syntax: "{}} + line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00226}00226 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00227}00227 signal.\mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}} = \textcolor{keyword}{static\_cast<}std::uint32\_t\textcolor{keyword}{>} (} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00228}00228 std::stoul (\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (0U, pipePos)))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00229}00229 );} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00230}00230 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00231}00231 signal.\mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}} = \textcolor{keyword}{static\_cast<}std::uint32\_t\textcolor{keyword}{>} (} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00232}00232 std::stoul (\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (pipePos + 1U, atPos -\/ pipePos -\/ 1U)))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00233}00233 );} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00234}00234 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00235}00235 \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00236}00236 \textcolor{keywordflow}{if} ((atPos + 1U) >= rest.size())} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00237}00237 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Invalid endianness in signal: "{}} + line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00238}00238 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00239}00239 \textcolor{keyword}{const} \textcolor{keywordtype}{char} endianChar = rest[atPos + 1U];} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00240}00240 signal.\mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{isLittleEndian}} = (endianChar == \textcolor{charliteral}{'1'});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00241}00241 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00242}00242 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00243}00243 \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00244}00244 \textcolor{keyword}{const} \textcolor{keywordtype}{char} signChar = rest[signPos];} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00245}00245 signal.\mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{isSigned}} = (signChar == \textcolor{charliteral}{'-\/'});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00246}00246 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00247}00247 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00248}00248 signal.\mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}} = std::stod (} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00249}00249 \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (factorBegin + 1U, factorComma -\/ factorBegin -\/ 1U))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00250}00250 );} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00251}00251 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00252}00252 signal.\mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}} = std::stod (} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00253}00253 \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (factorComma + 1U, factorEnd -\/ factorComma -\/ 1U))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00254}00254 );} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00255}00255 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00256}00256 signal.\mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}} = std::stod (} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00257}00257 \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (rangeBegin + 1U, rangeSep -\/ rangeBegin -\/ 1U))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00258}00258 );} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00259}00259 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00260}00260 signal.\mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}} = std::stod (} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00261}00261 \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (rangeSep + 1U, rangeEnd -\/ rangeSep -\/ 1U))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00262}00262 );} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00263}00263 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00264}00264 signal.\mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}} = rest.substr (unitBegin + 1U, unitEnd -\/ unitBegin -\/ 1U);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00265}00265 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00266}00266 \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00267}00267 \textcolor{keyword}{const} std::string receiversText = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (unitEnd + 1U));} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00268}00268 signal.\mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}} = \mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{SplitReceivers}} (receiversText);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00269}00269 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00270}00270 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00271}00271 \textcolor{keywordflow}{return} signal;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00272}00272 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00273}00273 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00274}\mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{00274}} \textcolor{keywordtype}{void} \mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{DbcParser::ParseCommentLine}} (\textcolor{keyword}{const} std::string \&line, \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00275}00275 \textcolor{comment}{/*}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00276}00276 \textcolor{comment}{ * Examples:}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00277}00277 \textcolor{comment}{ * CM\_ BO\_ 256 "{}Frame comment"{};}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00278}00278 \textcolor{comment}{ * CM\_ SG\_ 256 EngineSpeed "{}Signal comment"{};}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00279}00279 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00280}00280 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00281}00281 std::istringstream stream (line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00282}00282 std::string token;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00283}00283 stream >> token;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00284}00284 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00285}00285 \textcolor{keywordflow}{if} (token != \textcolor{stringliteral}{"{}CM\_"{}})} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00286}00286 \textcolor{keywordflow}{return};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00287}00287 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00288}00288 stream >> token;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00289}00289 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00290}00290 \textcolor{keywordflow}{if} (token == \textcolor{stringliteral}{"{}BO\_"{}}) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00291}00291 std::uint32\_t rawCanId = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00292}00292 std::uint32\_t canId = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00293}00293 \textcolor{keywordtype}{bool} isExtended = \textcolor{keyword}{false};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00294}00294 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00295}00295 stream >> rawCanId;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00296}00296 \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{NormalizeCanId}} (rawCanId, canId, isExtended);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00297}00297 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00298}00298 \textcolor{keyword}{const} std::string::size\_type quoteBegin = line.find (\textcolor{charliteral}{'"{}'});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00299}00299 \textcolor{keyword}{const} std::string::size\_type quoteEnd = line.rfind (\textcolor{charliteral}{'"{}'});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00300}00300 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00301}00301 \textcolor{keywordflow}{if} ((quoteBegin == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00302}00302 (quoteEnd == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00303}00303 (quoteEnd <= quoteBegin))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00304}00304 \textcolor{keywordflow}{return};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00305}00305 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00306}00306 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *frame = \mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{FindFrameById}} (database, canId, isExtended);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00307}00307 \textcolor{keywordflow}{if} (frame != \textcolor{keyword}{nullptr})} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00308}00308 frame-\/>\mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}} = line.substr (quoteBegin + 1U, quoteEnd -\/ quoteBegin -\/ 1U);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00309}00309 \} \textcolor{keywordflow}{else} \textcolor{keywordflow}{if} (token == \textcolor{stringliteral}{"{}SG\_"{}}) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00310}00310 std::uint32\_t rawCanId = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00311}00311 std::uint32\_t canId = 0U;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00312}00312 \textcolor{keywordtype}{bool} isExtended = \textcolor{keyword}{false};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00313}00313 std::string signalName;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00314}00314 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00315}00315 stream >> rawCanId;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00316}00316 stream >> signalName;} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00317}00317 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00318}00318 \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{NormalizeCanId}} (rawCanId, canId, isExtended);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00319}00319 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00320}00320 \textcolor{keyword}{const} std::string::size\_type quoteBegin = line.find (\textcolor{charliteral}{'"{}'});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00321}00321 \textcolor{keyword}{const} std::string::size\_type quoteEnd = line.rfind (\textcolor{charliteral}{'"{}'});} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00322}00322 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00323}00323 \textcolor{keywordflow}{if} ((quoteBegin == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00324}00324 (quoteEnd == std::string::npos) ||} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00325}00325 (quoteEnd <= quoteBegin))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00326}00326 \textcolor{keywordflow}{return};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00327}00327 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00328}00328 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *frame = \mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{FindFrameById}} (database, canId, isExtended);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00329}00329 \textcolor{keywordflow}{if} (frame != \textcolor{keyword}{nullptr}) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00330}00330 \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *signal = \mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{FindSignalByName}} (*frame, signalName);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00331}00331 \textcolor{keywordflow}{if} (signal != \textcolor{keyword}{nullptr})} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00332}00332 signal-\/>\mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}} = line.substr (quoteBegin + 1U, quoteEnd -\/ quoteBegin -\/ 1U);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00333}00333 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00334}00334 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00335}00335 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00336}00336 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00337}\mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{00337}} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *\mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{DbcParser::FindFrameById}} (\mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database,} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00338}00338 std::uint32\_t canId,} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00339}00339 \textcolor{keywordtype}{bool} isExtended) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00340}00340 \textcolor{keywordflow}{for} (std::size\_t index = 0U; index < database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.size(); ++index) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00341}00341 \textcolor{keywordflow}{if} ((database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[index].canId == canId) \&\&} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00342}00342 (database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[index].isExtended == isExtended))} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00343}00343 \textcolor{keywordflow}{return} \&database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[index];} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00344}00344 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00345}00345 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00346}00346 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00347}00347 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00348}00348 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00349}\mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{00349}} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *\mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{DbcParser::FindSignalByName}} (\mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame, \textcolor{keyword}{const} std::string \&signalName) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00350}00350 \textcolor{keywordflow}{for} (std::size\_t index = 0U; index < frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}.size(); ++index) \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00351}00351 \textcolor{keywordflow}{if} (frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}[index].name == signalName)} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00352}00352 \textcolor{keywordflow}{return} \&frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}[index];} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00353}00353 \}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00354}00354 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00355}00355 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00356}00356 \}} + +\end{DoxyCode} diff --git a/docs/latex/dbc__parser_8h.tex b/docs/latex/dbc__parser_8h.tex new file mode 100644 index 0000000..279248f --- /dev/null +++ b/docs/latex/dbc__parser_8h.tex @@ -0,0 +1,25 @@ +\hypertarget{dbc__parser_8h}{}\doxysection{dbc\+\_\+parser.\+h File Reference} +\label{dbc__parser_8h}\index{dbc\_parser.h@{dbc\_parser.h}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include $<$string$>$}\newline +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$cstdint$>$}\newline +{\ttfamily \#include \char`\"{}dbc\+\_\+database.\+h\char`\"{}}\newline +\doxysubsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \mbox{\hyperlink{classDbcParser}{Dbc\+Parser}} +\begin{DoxyCompactList}\small\item\em Minimal DBC parser. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{dbc__parser_8h_source}{dbc\+\_\+parser.\+h}}. + diff --git a/docs/latex/dbc__parser_8h_source.tex b/docs/latex/dbc__parser_8h_source.tex new file mode 100644 index 0000000..d432cc4 --- /dev/null +++ b/docs/latex/dbc__parser_8h_source.tex @@ -0,0 +1,74 @@ +\hypertarget{dbc__parser_8h_source}{}\doxysection{dbc\+\_\+parser.\+h} +\mbox{\hyperlink{dbc__parser_8h}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_parser.h}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_PARSER\_H}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_PARSER\_H}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00014}00014 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00018}00018 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00019}00019 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__database_8h}{dbc\_database.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00020}00020 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00021}00021 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00022}00022 \textcolor{comment}{ * @brief Minimal DBC parser.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00023}00023 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00024}00024 \textcolor{comment}{ * Supports:}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00025}00025 \textcolor{comment}{ * -\/ BO\_}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00026}00026 \textcolor{comment}{ * -\/ SG\_}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00027}00027 \textcolor{comment}{ * -\/ CM\_ BO\_}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00028}00028 \textcolor{comment}{ * -\/ CM\_ SG\_}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00029}00029 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00030}00030 \textcolor{comment}{ * Ignores:}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00031}00031 \textcolor{comment}{ * -\/ attributes}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00032}00032 \textcolor{comment}{ * -\/ multiplexing}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00033}00033 \textcolor{comment}{ * -\/ value tables}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00034}00034 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00035}\mbox{\hyperlink{classDbcParser}{00035}} \textcolor{keyword}{class }\mbox{\hyperlink{classDbcParser}{DbcParser}} \{} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00036}00036 \textcolor{keyword}{public}:\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00037}00037 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00038}00038 \textcolor{comment}{ * @brief Parse DBC file.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00039}00039 \textcolor{comment}{ * @param filePath Path to input file.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00040}00040 \textcolor{comment}{ * @return Parsed database.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00041}00041 \textcolor{comment}{ * @throws std::runtime\_error on file or parse errors.}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00042}00042 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00043}00043 \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{ParseFile}} (\textcolor{keyword}{const} std::string \&filePath) \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00044}00044 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00045}00045 \textcolor{keyword}{private}:} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00046}00046 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{IsFrameLine}} (\textcolor{keyword}{const} std::string \&line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00047}00047 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{IsSignalLine}} (\textcolor{keyword}{const} std::string \&line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00048}00048 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{IsCommentLine}} (\textcolor{keyword}{const} std::string \&line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00049}00049 \textcolor{keyword}{static} std::string \mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{Trim}} (\textcolor{keyword}{const} std::string \&text);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00050}00050 \textcolor{keyword}{static} std::vector \mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{SplitReceivers}} (\textcolor{keyword}{const} std::string \&text);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00051}00051 \textcolor{keyword}{static} std::uint32\_t \mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{TryExtractPgn}} (std::uint32\_t canId, \textcolor{keywordtype}{bool} isExtended, \textcolor{keywordtype}{bool} \&hasPgn);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00052}00052 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00053}00053 \textcolor{keyword}{static} \textcolor{keywordtype}{void} \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{NormalizeCanId}} (std::uint32\_t rawCanId,} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00054}00054 std::uint32\_t \&normalizedCanId,} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00055}00055 \textcolor{keywordtype}{bool} \&isExtended);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00056}00056 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00057}00057 \textcolor{keyword}{static} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{ParseFrameLine}} (\textcolor{keyword}{const} std::string \&line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00058}00058 \textcolor{keyword}{static} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{ParseSignalLine}} (\textcolor{keyword}{const} std::string \&line);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00059}00059 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00060}00060 \textcolor{keyword}{static} \textcolor{keywordtype}{void} \mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{ParseCommentLine}} (\textcolor{keyword}{const} std::string \&line, \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00061}00061 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00062}00062 \textcolor{keyword}{static} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *\mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{FindFrameById}} (\mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database,} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00063}00063 std::uint32\_t canId,} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00064}00064 \textcolor{keywordtype}{bool} isExtended);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00065}00065 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00066}00066 \textcolor{keyword}{static} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *\mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{FindSignalByName}} (\mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame, \textcolor{keyword}{const} std::string \&signalName);} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00067}00067 \};} +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00068}00068 } +\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00069}00069 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_PARSER\_H */}\textcolor{preprocessor}{}} + +\end{DoxyCode} diff --git a/docs/latex/dbc__tree__builder_8cpp.tex b/docs/latex/dbc__tree__builder_8cpp.tex new file mode 100644 index 0000000..be42ae0 --- /dev/null +++ b/docs/latex/dbc__tree__builder_8cpp.tex @@ -0,0 +1,17 @@ +\hypertarget{dbc__tree__builder_8cpp}{}\doxysection{dbc\+\_\+tree\+\_\+builder.\+cpp File Reference} +\label{dbc__tree__builder_8cpp}\index{dbc\_tree\_builder.cpp@{dbc\_tree\_builder.cpp}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include \char`\"{}dbc\+\_\+tree\+\_\+builder.\+h\char`\"{}}\newline + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{dbc__tree__builder_8cpp_source}{dbc\+\_\+tree\+\_\+builder.\+cpp}}. + diff --git a/docs/latex/dbc__tree__builder_8cpp_source.tex b/docs/latex/dbc__tree__builder_8cpp_source.tex new file mode 100644 index 0000000..be46d47 --- /dev/null +++ b/docs/latex/dbc__tree__builder_8cpp_source.tex @@ -0,0 +1,36 @@ +\hypertarget{dbc__tree__builder_8cpp_source}{}\doxysection{dbc\+\_\+tree\+\_\+builder.\+cpp} +\mbox{\hyperlink{dbc__tree__builder_8cpp}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00002}00002 \textcolor{comment}{ * @file dbc\_tree\_builder.cpp}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__tree__builder_8h}{dbc\_tree\_builder.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00013}00013 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00014}\mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{00014}} std::unique\_ptr \mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{DbcTreeBuilder::Build}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database)\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00015}00015 std::unique\_ptr root (\textcolor{keyword}{new} \mbox{\hyperlink{classTreeNode}{TreeNode}}());} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00016}00016 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00017}00017 \textcolor{keywordflow}{for} (std::size\_t frameIndex = 0U; frameIndex < database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.size(); ++frameIndex) \{} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00018}00018 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame = database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[frameIndex];} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00019}00019 std::unique\_ptr frameNode (\textcolor{keyword}{new} \mbox{\hyperlink{classTreeNode}{TreeNode}} (frame));} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00020}00020 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00021}00021 \textcolor{keywordflow}{for} (std::size\_t signalIndex = 0U; signalIndex < frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}.size(); ++signalIndex) \{} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00022}00022 \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \&signal = frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}[signalIndex];} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00023}00023 std::unique\_ptr signalNode (\textcolor{keyword}{new} \mbox{\hyperlink{classTreeNode}{TreeNode}} (signal));} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00024}00024 frameNode-\/>AddChild (std::move (signalNode));} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00025}00025 \}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00026}00026 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00027}00027 root-\/>AddChild (std::move (frameNode));} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00028}00028 \}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00029}00029 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00030}00030 \textcolor{keywordflow}{return} root;} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00031}00031 \}} + +\end{DoxyCode} diff --git a/docs/latex/dbc__tree__builder_8h.tex b/docs/latex/dbc__tree__builder_8h.tex new file mode 100644 index 0000000..9513cbb --- /dev/null +++ b/docs/latex/dbc__tree__builder_8h.tex @@ -0,0 +1,24 @@ +\hypertarget{dbc__tree__builder_8h}{}\doxysection{dbc\+\_\+tree\+\_\+builder.\+h File Reference} +\label{dbc__tree__builder_8h}\index{dbc\_tree\_builder.h@{dbc\_tree\_builder.h}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include \char`\"{}dbc\+\_\+database.\+h\char`\"{}}\newline +{\ttfamily \#include \char`\"{}tree\+\_\+node.\+h\char`\"{}}\newline +\doxysubsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \mbox{\hyperlink{classDbcTreeBuilder}{Dbc\+Tree\+Builder}} +\begin{DoxyCompactList}\small\item\em Builds a simple tree from parsed DBC database. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{dbc__tree__builder_8h_source}{dbc\+\_\+tree\+\_\+builder.\+h}}. + diff --git a/docs/latex/dbc__tree__builder_8h_source.tex b/docs/latex/dbc__tree__builder_8h_source.tex new file mode 100644 index 0000000..afb9f12 --- /dev/null +++ b/docs/latex/dbc__tree__builder_8h_source.tex @@ -0,0 +1,38 @@ +\hypertarget{dbc__tree__builder_8h_source}{}\doxysection{dbc\+\_\+tree\+\_\+builder.\+h} +\mbox{\hyperlink{dbc__tree__builder_8h}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_tree\_builder.h}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_TREE\_BUILDER\_H}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_TREE\_BUILDER\_H}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00014}00014 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00016}00016 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00017}00017 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__database_8h}{dbc\_database.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00018}00018 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{tree__node_8h}{tree\_node.h}}"{}}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00019}00019 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00020}00020 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00021}00021 \textcolor{comment}{ * @brief Builds a simple tree from parsed DBC database.}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00022}00022 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00023}\mbox{\hyperlink{classDbcTreeBuilder}{00023}} \textcolor{keyword}{class }\mbox{\hyperlink{classDbcTreeBuilder}{DbcTreeBuilder}} \{} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00024}00024 \textcolor{keyword}{public}:\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00025}00025 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00026}00026 \textcolor{comment}{ * @brief Build tree representation of parsed DBC data.}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00027}00027 \textcolor{comment}{ * @param database Parsed database.}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00028}00028 \textcolor{comment}{ * @return Root node of the tree.}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00029}00029 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00030}00030 std::unique\_ptr \mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{Build}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database) \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00031}00031 \};} +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00032}00032 } +\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00033}00033 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_TREE\_BUILDER\_H */}\textcolor{preprocessor}{}} + +\end{DoxyCode} diff --git a/docs/latex/decode__database_8h.tex b/docs/latex/decode__database_8h.tex new file mode 100644 index 0000000..723b99c --- /dev/null +++ b/docs/latex/decode__database_8h.tex @@ -0,0 +1,95 @@ +\hypertarget{decode__database_8h}{}\doxysection{decode\+\_\+database.\+h File Reference} +\label{decode__database_8h}\index{decode\_database.h@{decode\_database.h}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include $<$string$>$}\newline +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$unordered\+\_\+map$>$}\newline +{\ttfamily \#include $<$cstdint$>$}\newline +\doxysubsection*{Classes} +\begin{DoxyCompactItemize} +\item +struct \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} +\begin{DoxyCompactList}\small\item\em Runtime-\/ready signal definition. \end{DoxyCompactList}\item +struct \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} +\begin{DoxyCompactList}\small\item\em Runtime-\/ready frame definition. \end{DoxyCompactList}\item +struct \mbox{\hyperlink{structFrameKey}{Frame\+Key}} +\begin{DoxyCompactList}\small\item\em Key for fast frame lookup. \end{DoxyCompactList}\item +struct \mbox{\hyperlink{structFrameKeyHasher}{Frame\+Key\+Hasher}} +\begin{DoxyCompactList}\small\item\em Hasher for frame key. \end{DoxyCompactList}\item +struct \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} +\begin{DoxyCompactList}\small\item\em Runtime decode database with fast lookup by CAN ID. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Enumerations} +\begin{DoxyCompactItemize} +\item +enum class \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{Byte\+Order}} \{ \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}} +, \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}{Motorola}} + \} +\begin{DoxyCompactList}\small\item\em Signal byte order used for runtime decoding. \end{DoxyCompactList}\item +enum class \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{Value\+Type}} \{ \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{Unsigned}} +, \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{Signed}} + \} +\begin{DoxyCompactList}\small\item\em Signal numeric type. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +\doxysubsection{Enumeration Type Documentation} +\mbox{\Hypertarget{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}\label{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}} +\index{decode\_database.h@{decode\_database.h}!ByteOrder@{ByteOrder}} +\index{ByteOrder@{ByteOrder}!decode\_database.h@{decode\_database.h}} +\doxysubsubsection{\texorpdfstring{ByteOrder}{ByteOrder}} +{\footnotesize\ttfamily enum class \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{Byte\+Order}}\hspace{0.3cm}{\ttfamily [strong]}} + + + +Signal byte order used for runtime decoding. + +\begin{DoxyEnumFields}{Enumerator} +\raisebox{\heightof{T}}[0pt][0pt]{\index{Intel@{Intel}!decode\_database.h@{decode\_database.h}}\index{decode\_database.h@{decode\_database.h}!Intel@{Intel}}}\mbox{\Hypertarget{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}\label{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}} +Intel&\\ +\hline + +\raisebox{\heightof{T}}[0pt][0pt]{\index{Motorola@{Motorola}!decode\_database.h@{decode\_database.h}}\index{decode\_database.h@{decode\_database.h}!Motorola@{Motorola}}}\mbox{\Hypertarget{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}\label{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}} +Motorola&\\ +\hline + +\end{DoxyEnumFields} + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00023}{23}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + +\mbox{\Hypertarget{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}\label{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}} +\index{decode\_database.h@{decode\_database.h}!ValueType@{ValueType}} +\index{ValueType@{ValueType}!decode\_database.h@{decode\_database.h}} +\doxysubsubsection{\texorpdfstring{ValueType}{ValueType}} +{\footnotesize\ttfamily enum class \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{Value\+Type}}\hspace{0.3cm}{\ttfamily [strong]}} + + + +Signal numeric type. + +\begin{DoxyEnumFields}{Enumerator} +\raisebox{\heightof{T}}[0pt][0pt]{\index{Unsigned@{Unsigned}!decode\_database.h@{decode\_database.h}}\index{decode\_database.h@{decode\_database.h}!Unsigned@{Unsigned}}}\mbox{\Hypertarget{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}\label{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}} +Unsigned&\\ +\hline + +\raisebox{\heightof{T}}[0pt][0pt]{\index{Signed@{Signed}!decode\_database.h@{decode\_database.h}}\index{decode\_database.h@{decode\_database.h}!Signed@{Signed}}}\mbox{\Hypertarget{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}\label{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}} +Signed&\\ +\hline + +\end{DoxyEnumFields} + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00031}{31}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + diff --git a/docs/latex/decode__database_8h_source.tex b/docs/latex/decode__database_8h_source.tex new file mode 100644 index 0000000..00dd311 --- /dev/null +++ b/docs/latex/decode__database_8h_source.tex @@ -0,0 +1,142 @@ +\hypertarget{decode__database_8h_source}{}\doxysection{decode\+\_\+database.\+h} +\mbox{\hyperlink{decode__database_8h}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00002}00002 \textcolor{comment}{ * @file decode\_database.h}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DECODE\_DATABASE\_H}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DECODE\_DATABASE\_H}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00014}00014 } +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00018}00018 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00019}00019 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00020}00020 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00021}00021 \textcolor{comment}{ * @brief Signal byte order used for runtime decoding.}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00022}00022 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00023}\mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{00023}} \textcolor{keyword}{enum class} \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{ByteOrder}} \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00024}00024 \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}},} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00025}00025 \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}{Motorola}}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00026}00026 \};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00027}00027 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00028}00028 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00029}00029 \textcolor{comment}{ * @brief Signal numeric type.}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00030}00030 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00031}\mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{00031}} \textcolor{keyword}{enum class} \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{ValueType}} \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00032}00032 \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{Unsigned}},} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00033}00033 \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{Signed}}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00034}00034 \};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00035}00035 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00036}00036 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00037}00037 \textcolor{comment}{ * @brief Runtime-\/ready signal definition.}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00038}00038 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00039}\mbox{\hyperlink{structDecodeSignal}{00039}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00040}\mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{00040}} std::string \mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}}; \textcolor{comment}{/**< Signal name. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00041}\mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{00041}} std::uint32\_t \mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}}; \textcolor{comment}{/**< DBC start bit. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00042}\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{00042}} std::uint32\_t \mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}}; \textcolor{comment}{/**< Signal length in bits. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00043}\mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{00043}} \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{ByteOrder}} \mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byteOrder}}; \textcolor{comment}{/**< Intel or Motorola. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00044}\mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{00044}} \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{ValueType}} \mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{valueType}}; \textcolor{comment}{/**< Signed or unsigned. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00045}\mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{00045}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}}; \textcolor{comment}{/**< Scaling factor. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00046}\mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{00046}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}}; \textcolor{comment}{/**< Physical offset. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00047}\mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{00047}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{minimum}}; \textcolor{comment}{/**< Minimum physical value. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00048}\mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{00048}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{maximum}}; \textcolor{comment}{/**< Maximum physical value. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00049}\mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{00049}} std::string \mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}}; \textcolor{comment}{/**< Physical unit. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00050}\mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{00050}} std::vector \mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{receivers}}; \textcolor{comment}{/**< Receivers. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00051}\mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{00051}} std::string \mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{comment}}; \textcolor{comment}{/**< Comment. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00052}00052 } +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00053}\mbox{\hyperlink{structDecodeSignal_a93fd97267e2614979440261628e493f5}{00053}} \mbox{\hyperlink{structDecodeSignal_a93fd97267e2614979440261628e493f5}{DecodeSignal}}()} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00054}00054 : \mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}}()} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00055}00055 , \mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}} (0U)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00056}00056 , \mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}} (0U)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00057}00057 , \mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byteOrder}} (\mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{ByteOrder}}::\mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}})} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00058}00058 , \mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{valueType}} (\mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{ValueType}}::\mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{Unsigned}})} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00059}00059 , \mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}} (1.0)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00060}00060 , \mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}} (0.0)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00061}00061 , \mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{minimum}} (0.0)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00062}00062 , \mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{maximum}} (0.0)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00063}00063 , \mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}}()} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00064}00064 , \mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{receivers}}()} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00065}00065 , \mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{comment}}() \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00066}00066 \}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00067}00067 \};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00068}00068 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00069}00069 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00070}00070 \textcolor{comment}{ * @brief Runtime-\/ready frame definition.}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00071}00071 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00072}\mbox{\hyperlink{structDecodeFrame}{00072}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00073}\mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{00073}} std::string \mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}}; \textcolor{comment}{/**< Frame name. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00074}\mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{00074}} std::uint32\_t \mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{canId}}; \textcolor{comment}{/**< Normalized CAN ID. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00075}\mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{00075}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{isExtended}}; \textcolor{comment}{/**< true for extended frame. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00076}\mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{00076}} std::uint8\_t \mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{dlc}}; \textcolor{comment}{/**< Payload length. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00077}\mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{00077}} std::uint32\_t \mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{pgn}}; \textcolor{comment}{/**< PGN if available. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00078}\mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{00078}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{hasPgn}}; \textcolor{comment}{/**< true if PGN is valid. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00079}\mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{00079}} std::string \mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{transmitter}}; \textcolor{comment}{/**< Transmitter ECU. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00080}\mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{00080}} std::string \mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{comment}}; \textcolor{comment}{/**< Frame comment. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00081}\mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{00081}} std::vector \mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}; \textcolor{comment}{/**< Signal definitions. */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00082}00082 } +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00083}\mbox{\hyperlink{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}{00083}} \mbox{\hyperlink{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}{DecodeFrame}}()} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00084}00084 : \mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}}()} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00085}00085 , \mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{canId}} (0U)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00086}00086 , \mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{isExtended}} (false)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00087}00087 , \mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{dlc}} (0U)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00088}00088 , \mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{pgn}} (0U)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00089}00089 , \mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{hasPgn}} (false)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00090}00090 , \mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{transmitter}}()} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00091}00091 , \mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{comment}}()} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00092}00092 , \mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}() \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00093}00093 \}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00094}00094 \};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00095}00095 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00096}00096 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00097}00097 \textcolor{comment}{ * @brief Key for fast frame lookup.}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00098}00098 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00099}\mbox{\hyperlink{structFrameKey}{00099}} \textcolor{keyword}{struct }\mbox{\hyperlink{structFrameKey}{FrameKey}} \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00100}\mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{00100}} std::uint32\_t \mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00101}\mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{00101}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00102}00102 } +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00103}\mbox{\hyperlink{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}{00103}} \mbox{\hyperlink{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}{FrameKey}}()} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00104}00104 : \mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}} (0U)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00105}00105 , \mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}} (false) \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00106}00106 \}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00107}00107 } +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00108}\mbox{\hyperlink{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}{00108}} \mbox{\hyperlink{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}{FrameKey}} (std::uint32\_t \textcolor{keywordtype}{id}, \textcolor{keywordtype}{bool} extended)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00109}00109 : \mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}} (id)} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00110}00110 , \mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}} (extended) \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00111}00111 \}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00112}00112 } +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00113}\mbox{\hyperlink{structFrameKey_aaaec9f914e127787247fcda5e183b01f}{00113}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structFrameKey_aaaec9f914e127787247fcda5e183b01f}{operator== }}(\textcolor{keyword}{const} \mbox{\hyperlink{structFrameKey}{FrameKey}} \&other)\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00114}00114 \textcolor{keywordflow}{return} (\mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}} == other.\mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}}) \&\& (\mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}} == other.\mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}});} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00115}00115 \}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00116}00116 \};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00117}00117 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00118}00118 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00119}00119 \textcolor{comment}{ * @brief Hasher for frame key.}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00120}00120 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00121}\mbox{\hyperlink{structFrameKeyHasher}{00121}} \textcolor{keyword}{struct }\mbox{\hyperlink{structFrameKeyHasher}{FrameKeyHasher}} \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00122}\mbox{\hyperlink{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}{00122}} std::size\_t \mbox{\hyperlink{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}{operator() }}(\textcolor{keyword}{const} \mbox{\hyperlink{structFrameKey}{FrameKey}} \&key)\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00123}00123 \textcolor{keyword}{const} std::size\_t a = \textcolor{keyword}{static\_cast<}std::size\_t\textcolor{keyword}{>} (key.\mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}});} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00124}00124 \textcolor{keyword}{const} std::size\_t b = key.\mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}} ? 1U : 0U;} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00125}00125 \textcolor{keywordflow}{return} (a * 1315423911U) \string^ b;} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00126}00126 \}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00127}00127 \};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00128}00128 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00129}00129 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00130}00130 \textcolor{comment}{ * @brief Runtime decode database with fast lookup by CAN ID.}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00131}00131 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00132}\mbox{\hyperlink{structDecodeDatabase}{00132}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \{} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00133}\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{00133}} std::vector \mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00134}\mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{00134}} std::unordered\_map \mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frameIndexByKey}};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00135}00135 \};} +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00136}00136 } +\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00137}00137 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DECODE\_DATABASE\_H */}\textcolor{preprocessor}{}} + +\end{DoxyCode} diff --git a/docs/latex/doxygen.sty b/docs/latex/doxygen.sty new file mode 100644 index 0000000..bde67ed --- /dev/null +++ b/docs/latex/doxygen.sty @@ -0,0 +1,596 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} + +% Packages used by this style file +\RequirePackage{alltt} +%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{calc} +\RequirePackage{float} +%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{verbatim} +\RequirePackage[table]{xcolor} +\RequirePackage{longtable_doxygen} +\RequirePackage{tabu_doxygen} +\RequirePackage{fancyvrb} +\RequirePackage{tabularx} +\RequirePackage{multicol} +\RequirePackage{multirow} +\RequirePackage{hanging} +\RequirePackage{ifpdf} +\RequirePackage{adjustbox} +\RequirePackage{amssymb} +\RequirePackage{stackengine} +\RequirePackage{enumitem} +\RequirePackage{alphalph} +\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis +\RequirePackage{enumitem} + +%---------- Internal commands used in this style file ---------------- + +\newcommand{\ensurespace}[1]{% + \begingroup% + \setlength{\dimen@}{#1}% + \vskip\z@\@plus\dimen@% + \penalty -100\vskip\z@\@plus -\dimen@% + \vskip\dimen@% + \penalty 9999% + \vskip -\dimen@% + \vskip\z@skip% hide the previous |\vskip| from |\addvspace| + \endgroup% +} + +\newcommand{\DoxyHorRuler}[1]{% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{#1=0}% + {% + \hrule% + }% + {% + \hrulefilll% + }% +} +\newcommand{\DoxyLabelFont}{} +\newcommand{\entrylabel}[1]{% + {% + \parbox[b]{\labelwidth-4pt}{% + \makebox[0pt][l]{\DoxyLabelFont#1}% + \vspace{1.5\baselineskip}% + }% + }% +} + +\newenvironment{DoxyDesc}[1]{% + \ensurespace{4\baselineskip}% + \begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + %\setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + }% + \item[#1]% +}{% + \end{list}% +} + +\newsavebox{\xrefbox} +\newlength{\xreflength} +\newcommand{\xreflabel}[1]{% + \sbox{\xrefbox}{#1}% + \setlength{\xreflength}{\wd\xrefbox}% + \ifthenelse{\xreflength>\labelwidth}{% + \begin{minipage}{\textwidth}% + \setlength{\parindent}{0pt}% + \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% + \end{minipage}% + }{% + \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% + }% +} + +%---------- Commands used by doxygen LaTeX output generator ---------- + +% Used by
 ... 
+\newenvironment{DoxyPre}{% + \small% + \begin{alltt}% +}{% + \end{alltt}% + \normalsize% +} +% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output. +\newlength{\CodeWidthChar} +\newlength{\CodeHeightChar} +\settowidth{\CodeWidthChar}{?} +\settoheight{\CodeHeightChar}{?} +% Necessary for hanging indent +\newlength{\DoxyCodeWidth} + +\newcommand\DoxyCodeLine[1]{\hangpara{\DoxyCodeWidth}{1}{#1}\par} + +\newcommand\NiceSpace{% + \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}% +} + +% Used by @code ... @endcode +\newenvironment{DoxyCode}[1]{% + \par% + \scriptsize% + \normalfont\ttfamily% + \rightskip0pt plus 1fil% + \settowidth{\DoxyCodeWidth}{000000}% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{\equal{#1}{0}} + { + {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces% + } + { + {\lccode`~32 \lowercase{\global\let~}}\obeyspaces% + } + +}{% + \normalfont% + \normalsize% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% +} + +% Redefining not defined characters, i.e. "Replacement Character" in tex output. +\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{% + \textcolor{white}{\sffamily\bfseries\small ?}}{% + \rotatebox{45}{$\blacksquare$}}}} + +% Used by @example, @include, @includelineno and @dontinclude +\newenvironment{DoxyCodeInclude}[1]{% + \DoxyCode{#1}% +}{% + \endDoxyCode% +} + +% Used by @verbatim ... @endverbatim +\newenvironment{DoxyVerb}{% + \par% + \footnotesize% + \verbatim% +}{% + \endverbatim% + \normalsize% +} + +% Used by @verbinclude +\newenvironment{DoxyVerbInclude}{% + \DoxyVerb% +}{% + \endDoxyVerb% +} + +% Used by numbered lists (using '-#' or
    ...
) +\setlistdepth{12} +\newlist{DoxyEnumerate}{enumerate}{12} +\setlist[DoxyEnumerate,1]{label=\arabic*.} +\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,3]{label=\roman*.} +\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,5]{label=\arabic*.} +\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,7]{label=\roman*.} +\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,9]{label=\arabic*.} +\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,11]{label=\roman*.} +\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.} + +% Used by bullet lists (using '-', @li, @arg, or
    ...
) +\setlistdepth{12} +\newlist{DoxyItemize}{itemize}{12} +\setlist[DoxyItemize]{label=\textperiodcentered} + +\setlist[DoxyItemize,1]{label=\textbullet} +\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash} +\setlist[DoxyItemize,3]{label=\textasteriskcentered} +\setlist[DoxyItemize,4]{label=\textperiodcentered} + +% Used by description lists (using
...
) +\newenvironment{DoxyDescription}{% + \description% +}{% + \enddescription% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if caption is specified) +\newenvironment{DoxyImage}{% + \begin{figure}[H]% + \centering% +}{% + \end{figure}% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if no caption is specified) +\newenvironment{DoxyImageNoCaption}{% + \begin{center}% +}{% + \end{center}% +} + +% Used by @image +% (only if inline is specified) +\newenvironment{DoxyInlineImage}{% +}{% +} + +% Used by @attention +\newenvironment{DoxyAttention}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @author and @authors +\newenvironment{DoxyAuthor}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @date +\newenvironment{DoxyDate}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @invariant +\newenvironment{DoxyInvariant}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @note +\newenvironment{DoxyNote}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @post +\newenvironment{DoxyPostcond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @pre +\newenvironment{DoxyPrecond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @copyright +\newenvironment{DoxyCopyright}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @remark +\newenvironment{DoxyRemark}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @return and @returns +\newenvironment{DoxyReturn}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @since +\newenvironment{DoxySince}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @see +\newenvironment{DoxySeeAlso}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @version +\newenvironment{DoxyVersion}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @warning +\newenvironment{DoxyWarning}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @par and @paragraph +\newenvironment{DoxyParagraph}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by parameter lists +\newenvironment{DoxyParams}[2][]{% + \tabulinesep=1mm% + \par% + \ifthenelse{\equal{#1}{}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description + {\ifthenelse{\equal{#1}{1}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc + } + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields of simple structs +\newenvironment{DoxyFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields simple class style enums +\newenvironment{DoxyEnumFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for parameters within a detailed function description +\newenvironment{DoxyParamCaption}{% + \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}% +}{% +} + +% Used by return value lists +\newenvironment{DoxyRetVals}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by exception lists +\newenvironment{DoxyExceptions}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by template parameter lists +\newenvironment{DoxyTemplParams}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for member lists +\newenvironment{DoxyCompactItemize}{% + \begin{itemize}% + \setlength{\itemsep}{-3pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \setlength{\partopsep}{0pt}% +}{% + \end{itemize}% +} + +% Used for member descriptions +\newenvironment{DoxyCompactList}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + \setlength{\itemsep}{0pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \renewcommand{\makelabel}{\hfill}% + }% +}{% + \end{list}% +} + +% Used for reference lists (@bug, @deprecated, @todo, etc.) +\newenvironment{DoxyRefList}{% + \begin{list}{}{% + \setlength{\labelwidth}{10pt}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \renewcommand{\makelabel}{\xreflabel}% + }% +}{% + \end{list}% +} + +% Used by @bug, @deprecated, @todo, etc. +\newenvironment{DoxyRefDesc}[1]{% + \begin{list}{}{% + \renewcommand\makelabel[1]{\textbf{##1}}% + \settowidth\labelwidth{\makelabel{#1}}% + \setlength\leftmargin{\labelwidth+\labelsep}% + }% +}{% + \end{list}% +} + +% Used by parameter lists and simple sections +\newenvironment{Desc} +{\begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + } +}{% + \end{list}% +} + +% Used by tables +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% +\newenvironment{TabularC}[1]% +{\tabulinesep=1mm +\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}% +{\end{longtabu*}\par}% + +\newenvironment{TabularNC}[1]% +{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}% +{\end{tabu}\par}% + +% Used for member group headers +\newenvironment{Indent}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + }% + \item[]\ignorespaces% +}{% + \unskip% + \end{list}% +} + +% Used when hyperlinks are turned off +\newcommand{\doxyref}[3]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used to link to a table when hyperlinks are turned on +\newcommand{\doxytablelink}[2]{% + \ref{#1}% +} + +% Used to link to a table when hyperlinks are turned off +\newcommand{\doxytableref}[3]{% + \ref{#3}% +} + +% Used by @addindex +\newcommand{\lcurly}{\{} +\newcommand{\rcurly}{\}} + +% Colors used for syntax highlighting +\definecolor{comment}{rgb}{0.5,0.0,0.0} +\definecolor{keyword}{rgb}{0.0,0.5,0.0} +\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} +\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} +\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} +\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} +\definecolor{charliteral}{rgb}{0.0,0.5,0.5} +\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} +\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} +\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} +\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} + +% Color used for table heading +\newcommand{\tableheadbgcolor}{lightgray}% + +% Version of hypertarget with correct landing location +\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}} + +% possibility to have sections etc. be within the margins +% unfortunately had to copy part of book.cls and add \raggedright +\makeatletter +\newcommand\doxysection{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\raggedright\normalfont\Large\bfseries}} +\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\large\bfseries}} +\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxyparagraph{\@startsection{paragraph}{4}{\z@}% + {3.25ex \@plus1ex \@minus.2ex}% + {-1em}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubparagraph{\@startsection{subparagraph}{5}{\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\raggedright\normalfont\normalsize\bfseries}} +\makeatother +% Define caption that is also suitable in a table +\makeatletter +\def\doxyfigcaption{% +\H@refstepcounter{figure}% +\@dblarg{\@caption{figure}}} +\makeatother + +% Define alpha enumarative names for counters > 26 +\makeatletter +\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname} +\def\@enumalphalphcnt#1{\alphalph{#1}} +\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname} +\def\@enumAlphAlphcnt#1{\AlphAlph{#1}} +\makeatother +\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa} +\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA} diff --git a/docs/latex/files.tex b/docs/latex/files.tex new file mode 100644 index 0000000..6547fd2 --- /dev/null +++ b/docs/latex/files.tex @@ -0,0 +1,18 @@ +\doxysection{File List} +Here is a list of all files with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\mbox{\hyperlink{dbc__database_8h}{dbc\+\_\+database.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__database_8h}}{} +\item\contentsline{section}{\mbox{\hyperlink{dbc__decode__builder_8cpp}{dbc\+\_\+decode\+\_\+builder.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__decode__builder_8cpp}}{} +\item\contentsline{section}{\mbox{\hyperlink{dbc__decode__builder_8h}{dbc\+\_\+decode\+\_\+builder.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__decode__builder_8h}}{} +\item\contentsline{section}{\mbox{\hyperlink{dbc__decoder_8cpp}{dbc\+\_\+decoder.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__decoder_8cpp}}{} +\item\contentsline{section}{\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__decoder_8h}}{} +\item\contentsline{section}{\mbox{\hyperlink{dbc__parser_8cpp}{dbc\+\_\+parser.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__parser_8cpp}}{} +\item\contentsline{section}{\mbox{\hyperlink{dbc__parser_8h}{dbc\+\_\+parser.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__parser_8h}}{} +\item\contentsline{section}{\mbox{\hyperlink{dbc__tree__builder_8cpp}{dbc\+\_\+tree\+\_\+builder.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__tree__builder_8cpp}}{} +\item\contentsline{section}{\mbox{\hyperlink{dbc__tree__builder_8h}{dbc\+\_\+tree\+\_\+builder.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__tree__builder_8h}}{} +\item\contentsline{section}{\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{decode__database_8h}}{} +\item\contentsline{section}{\mbox{\hyperlink{frame__info_8h}{frame\+\_\+info.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{frame__info_8h}}{} +\item\contentsline{section}{\mbox{\hyperlink{main_8cpp}{main.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{main_8cpp}}{} +\item\contentsline{section}{\mbox{\hyperlink{signal__info_8h}{signal\+\_\+info.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{signal__info_8h}}{} +\item\contentsline{section}{\mbox{\hyperlink{tree__node_8cpp}{tree\+\_\+node.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{tree__node_8cpp}}{} +\item\contentsline{section}{\mbox{\hyperlink{tree__node_8h}{tree\+\_\+node.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{tree__node_8h}}{} +\end{DoxyCompactList} diff --git a/docs/latex/frame__info_8h.tex b/docs/latex/frame__info_8h.tex new file mode 100644 index 0000000..f5a7eac --- /dev/null +++ b/docs/latex/frame__info_8h.tex @@ -0,0 +1,25 @@ +\hypertarget{frame__info_8h}{}\doxysection{frame\+\_\+info.\+h File Reference} +\label{frame__info_8h}\index{frame\_info.h@{frame\_info.h}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include $<$string$>$}\newline +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$cstdint$>$}\newline +{\ttfamily \#include \char`\"{}signal\+\_\+info.\+h\char`\"{}}\newline +\doxysubsection*{Classes} +\begin{DoxyCompactItemize} +\item +struct \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} +\begin{DoxyCompactList}\small\item\em Describes one CAN frame from a DBC file. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + diff --git a/docs/latex/frame__info_8h_source.tex b/docs/latex/frame__info_8h_source.tex new file mode 100644 index 0000000..db57c2c --- /dev/null +++ b/docs/latex/frame__info_8h_source.tex @@ -0,0 +1,53 @@ +\hypertarget{frame__info_8h_source}{}\doxysection{frame\+\_\+info.\+h} +\mbox{\hyperlink{frame__info_8h}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00002}00002 \textcolor{comment}{ * @file frame\_info.h}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef FRAME\_INFO\_H}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00013}00013 \textcolor{preprocessor}{\#define FRAME\_INFO\_H}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00014}00014 } +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00018}00018 } +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00019}00019 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{signal__info_8h}{signal\_info.h}}"{}}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00020}00020 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00021}00021 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00022}00022 \textcolor{comment}{ * @brief Describes one CAN frame from a DBC file.}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00023}00023 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00024}\mbox{\hyperlink{structFrameInfo}{00024}} \textcolor{keyword}{struct }\mbox{\hyperlink{structFrameInfo}{FrameInfo}} \{} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00025}\mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{00025}} std::string \mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}}; \textcolor{comment}{/**< Frame name. */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00026}\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{00026}} std::uint32\_t \mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}}; \textcolor{comment}{/**< Normalized CAN identifier. */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00027}\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{00027}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}}; \textcolor{comment}{/**< true for extended frame. */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00028}\mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{00028}} std::uint32\_t \mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}}; \textcolor{comment}{/**< J1939 PGN if applicable. */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00029}\mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{00029}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}}; \textcolor{comment}{/**< true if PGN was derived. */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00030}\mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{00030}} std::uint8\_t \mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}}; \textcolor{comment}{/**< Frame payload length. */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00031}\mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{00031}} std::string \mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}}; \textcolor{comment}{/**< Transmitter ECU name. */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00032}\mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{00032}} std::string \mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}}; \textcolor{comment}{/**< Optional frame comment. */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00033}\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{00033}} std::vector \mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}; \textcolor{comment}{/**< Signals contained in the frame. */}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00034}00034 } +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00035}\mbox{\hyperlink{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}{00035}} \mbox{\hyperlink{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}{FrameInfo}}()} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00036}00036 : \mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}}()} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00037}00037 , \mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}} (0U)} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00038}00038 , \mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}} (false)} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00039}00039 , \mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}} (0U)} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00040}00040 , \mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}} (false)} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00041}00041 , \mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}} (0U)} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00042}00042 , \mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}}()} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00043}00043 , \mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}}()} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00044}00044 , \mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}() \{} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00045}00045 \}} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00046}00046 \};} +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00047}00047 } +\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00048}00048 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* FRAME\_INFO\_H */}\textcolor{preprocessor}{}} + +\end{DoxyCode} diff --git a/docs/latex/longtable_doxygen.sty b/docs/latex/longtable_doxygen.sty new file mode 100644 index 0000000..a0eb314 --- /dev/null +++ b/docs/latex/longtable_doxygen.sty @@ -0,0 +1,448 @@ +%% +%% This is file `longtable.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% longtable.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% The source is maintained by the LaTeX Project team and bug +%% reports for it can be opened at http://latex-project.org/bugs.html +%% (but please observe conditions on bug reports sent to that address!) +%% +%% Copyright 1993-2016 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'. +%% -------------------------------------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file may only be distributed together with a copy of the LaTeX +%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle' +%% without such generated files. +%% +%% The list of all files belonging to the LaTeX `Tools Bundle' is +%% given in the file `manifest.txt'. +%% +%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{longtable_doxygen} + [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen] +\def\LT@err{\PackageError{longtable}} +\def\LT@warn{\PackageWarning{longtable}} +\def\LT@final@warn{% + \AtEndDocument{% + \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}% + \global\let\LT@final@warn\relax} +\DeclareOption{errorshow}{% + \def\LT@warn{\PackageInfo{longtable}}} +\DeclareOption{pausing}{% + \def\LT@warn#1{% + \LT@err{#1}{This is not really an error}}} +\DeclareOption{set}{} +\DeclareOption{final}{} +\ProcessOptions +\newskip\LTleft \LTleft=\fill +\newskip\LTright \LTright=\fill +\newskip\LTpre \LTpre=\bigskipamount +\newskip\LTpost \LTpost=\bigskipamount +\newcount\LTchunksize \LTchunksize=20 +\let\c@LTchunksize\LTchunksize +\newdimen\LTcapwidth \LTcapwidth=4in +\newbox\LT@head +\newbox\LT@firsthead +\newbox\LT@foot +\newbox\LT@lastfoot +\newcount\LT@cols +\newcount\LT@rows +\newcounter{LT@tables} +\newcounter{LT@chunks}[LT@tables] +\ifx\c@table\undefined + \newcounter{table} + \def\fnum@table{\tablename~\thetable} +\fi +\ifx\tablename\undefined + \def\tablename{Table} +\fi +\newtoks\LT@p@ftn +\mathchardef\LT@end@pen=30000 +\def\longtable{% + \par + \ifx\multicols\@undefined + \else + \ifnum\col@number>\@ne + \@twocolumntrue + \fi + \fi + \if@twocolumn + \LT@err{longtable not in 1-column mode}\@ehc + \fi + \begingroup + \@ifnextchar[\LT@array{\LT@array[x]}} +\def\LT@array[#1]#2{% + \refstepcounter{table}\stepcounter{LT@tables}% + \if l#1% + \LTleft\z@ \LTright\fill + \else\if r#1% + \LTleft\fill \LTright\z@ + \else\if c#1% + \LTleft\fill \LTright\fill + \fi\fi\fi + \let\LT@mcol\multicolumn + \let\LT@@tabarray\@tabarray + \let\LT@@hl\hline + \def\@tabarray{% + \let\hline\LT@@hl + \LT@@tabarray}% + \let\\\LT@tabularcr\let\tabularnewline\\% + \def\newpage{\noalign{\break}}% + \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}% + \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}% + \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption + \@tempdima\ht\strutbox + \let\@endpbox\LT@endpbox + \ifx\extrarowheight\@undefined + \let\@acol\@tabacol + \let\@classz\@tabclassz \let\@classiv\@tabclassiv + \def\@startpbox{\vtop\LT@startpbox}% + \let\@@startpbox\@startpbox + \let\@@endpbox\@endpbox + \let\LT@LL@FM@cr\@tabularcr + \else + \advance\@tempdima\extrarowheight + \col@sep\tabcolsep + \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr + \fi + \setbox\@arstrutbox\hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% + \let\@sharp##\let\protect\relax + \begingroup + \@mkpream{#2}% + \xdef\LT@bchunk{% + \global\advance\c@LT@chunks\@ne + \global\LT@rows\z@\setbox\z@\vbox\bgroup + \LT@setprevdepth + \tabskip\LTleft \noexpand\halign to\hsize\bgroup + \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}% + \endgroup + \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols + \LT@make@row + \m@th\let\par\@empty + \everycr{}\lineskip\z@\baselineskip\z@ + \LT@bchunk} +\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}} +\def\LT@start{% + \let\LT@start\endgraf + \endgraf\penalty\z@\vskip\LTpre + \dimen@\pagetotal + \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \ht\LT@foot + \dimen@ii\vfuzz + \vfuzz\maxdimen + \setbox\tw@\copy\z@ + \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox + \setbox\tw@\vbox{\unvbox\tw@}% + \vfuzz\dimen@ii + \advance\dimen@ \ht + \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@\dp + \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@ -\pagegoal + \ifdim \dimen@>\z@\vfil\break\fi + \global\@colroom\@colht + \ifvoid\LT@foot\else + \advance\vsize-\ht\LT@foot + \global\advance\@colroom-\ht\LT@foot + \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@ + \maxdepth\z@ + \fi + \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak + \output{\LT@output}} +\def\endlongtable{% + \crcr + \noalign{% + \let\LT@entry\LT@entry@chop + \xdef\LT@save@row{\LT@save@row}}% + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \if@filesw + {\let\LT@entry\LT@entry@write\immediate\write\@auxout{% + \gdef\expandafter\noexpand + \csname LT@\romannumeral\c@LT@tables\endcsname + {\LT@save@row}}}% + \fi + \ifx\LT@save@row\LT@@save@row + \else + \LT@warn{Column \@width s have changed\MessageBreak + in table \thetable}% + \LT@final@warn + \fi + \endgraf\penalty -\LT@end@pen + \endgroup + \global\@mparbottom\z@ + \pagegoal\vsize + \endgraf\penalty\z@\addvspace\LTpost + \ifvoid\footins\else\insert\footins{}\fi} +\def\LT@nofcols#1&{% + \futurelet\@let@token\LT@n@fcols} +\def\LT@n@fcols{% + \advance\LT@cols\@ne + \ifx\@let@token\LT@nofcols + \expandafter\@gobble + \else + \expandafter\LT@nofcols + \fi} +\def\LT@tabularcr{% + \relax\iffalse{\fi\ifnum0=`}\fi + \@ifstar + {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr + \LT@t@bularcr}% + {\LT@t@bularcr}} +\let\LT@crcr\crcr +\let\LT@setprevdepth\relax +\def\LT@t@bularcr{% + \global\advance\LT@rows\@ne + \ifnum\LT@rows=\LTchunksize + \gdef\LT@setprevdepth{% + \prevdepth\z@\global + \global\let\LT@setprevdepth\relax}% + \expandafter\LT@xtabularcr + \else + \ifnum0=`{}\fi + \expandafter\LT@LL@FM@cr + \fi} +\def\LT@xtabularcr{% + \@ifnextchar[\LT@argtabularcr\LT@ntabularcr} +\def\LT@ntabularcr{% + \ifnum0=`{}\fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@argtabularcr[#1]{% + \ifnum0=`{}\fi + \ifdim #1>\z@ + \unskip\@xargarraycr{#1}% + \else + \@yargarraycr{#1}% + \fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@echunk{% + \crcr\LT@save@row\cr\egroup + \global\setbox\@ne\lastbox + \unskip + \egroup} +\def\LT@entry#1#2{% + \ifhmode\@firstofone{&}\fi\omit + \ifnum#1=\c@LT@chunks + \else + \kern#2\relax + \fi} +\def\LT@entry@chop#1#2{% + \noexpand\LT@entry + {\ifnum#1>\c@LT@chunks + 1}{0pt% + \else + #1}{#2% + \fi}} +\def\LT@entry@write{% + \noexpand\LT@entry^^J% + \@spaces} +\def\LT@kill{% + \LT@echunk + \LT@get@widths + \expandafter\LT@rebox\LT@bchunk} +\def\LT@rebox#1\bgroup{% + #1\bgroup + \unvbox\z@ + \unskip + \setbox\z@\lastbox} +\def\LT@blank@row{% + \xdef\LT@save@row{\expandafter\LT@build@blank + \romannumeral\number\LT@cols 001 }} +\def\LT@build@blank#1{% + \if#1m% + \noexpand\LT@entry{1}{0pt}% + \expandafter\LT@build@blank + \fi} +\def\LT@make@row{% + \global\expandafter\let\expandafter\LT@save@row + \csname LT@\romannumeral\c@LT@tables\endcsname + \ifx\LT@save@row\relax + \LT@blank@row + \else + {\let\LT@entry\or + \if!% + \ifcase\expandafter\expandafter\expandafter\LT@cols + \expandafter\@gobble\LT@save@row + \or + \else + \relax + \fi + !% + \else + \aftergroup\LT@blank@row + \fi}% + \fi} +\let\setlongtables\relax +\def\LT@get@widths{% + \setbox\tw@\hbox{% + \unhbox\@ne + \let\LT@old@row\LT@save@row + \global\let\LT@save@row\@empty + \count@\LT@cols + \loop + \unskip + \setbox\tw@\lastbox + \ifhbox\tw@ + \LT@def@row + \advance\count@\m@ne + \repeat}% + \ifx\LT@@save@row\@undefined + \let\LT@@save@row\LT@save@row + \fi} +\def\LT@def@row{% + \let\LT@entry\or + \edef\@tempa{% + \ifcase\expandafter\count@\LT@old@row + \else + {1}{0pt}% + \fi}% + \let\LT@entry\relax + \xdef\LT@save@row{% + \LT@entry + \expandafter\LT@max@sel\@tempa + \LT@save@row}} +\def\LT@max@sel#1#2{% + {\ifdim#2=\wd\tw@ + #1% + \else + \number\c@LT@chunks + \fi}% + {\the\wd\tw@}} +\def\LT@hline{% + \noalign{\ifnum0=`}\fi + \penalty\@M + \futurelet\@let@token\LT@@hline} +\def\LT@@hline{% + \ifx\@let@token\hline + \global\let\@gtempa\@gobble + \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}% + \else + \global\let\@gtempa\@empty + \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\LT@sep}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\penalty\@M}% + \@gtempa} +\def\LT@caption{% + \noalign\bgroup + \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n} +\def\LT@c@ption#1[#2]#3{% + \LT@makecaption#1\fnum@table{#3}% + \def\@tempa{#2}% + \ifx\@tempa\@empty\else + {\let\\\space + \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}% + \fi} +\def\LT@capti@n{% + \@ifstar + {\egroup\LT@c@ption\@gobble[]}% + {\egroup\@xdblarg{\LT@c@ption\@firstofone}}} +\def\LT@makecaption#1#2#3{% + \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{% + \sbox\@tempboxa{#1{#2: }#3}% + \ifdim\wd\@tempboxa>\hsize + #1{#2: }#3% + \else + \hbox to\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \endgraf\vskip\baselineskip}% + \hss}}} +\def\LT@output{% + \ifnum\outputpenalty <-\@Mi + \ifnum\outputpenalty > -\LT@end@pen + \LT@err{floats and marginpars not allowed in a longtable}\@ehc + \else + \setbox\z@\vbox{\unvbox\@cclv}% + \ifdim \ht\LT@lastfoot>\ht\LT@foot + \dimen@\pagegoal + \advance\dimen@-\ht\LT@lastfoot + \ifdim\dimen@<\ht\z@ + \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}% + \@makecol + \@outputpage + \setbox\z@\vbox{\box\LT@head}% + \fi + \fi + \global\@colroom\@colht + \global\vsize\@colht + \vbox + {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}% + \fi + \else + \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}% + \@makecol + \@outputpage + \global\vsize\@colroom + \copy\LT@head\nobreak + \fi} +\def\LT@end@hd@ft#1{% + \LT@echunk + \ifx\LT@start\endgraf + \LT@err + {Longtable head or foot not at start of table}% + {Increase LTchunksize}% + \fi + \setbox#1\box\z@ + \LT@get@widths + \LT@bchunk} +\def\endfirsthead{\LT@end@hd@ft\LT@firsthead} +\def\endhead{\LT@end@hd@ft\LT@head} +\def\endfoot{\LT@end@hd@ft\LT@foot} +\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot} +\def\LT@startpbox#1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \vrule \@height \ht\@arstrutbox \@width \z@} +\def\LT@endpbox{% + \@finalstrut\@arstrutbox + \egroup + \the\LT@p@ftn + \global\LT@p@ftn{}% + \hfil} +\def\LT@p@ftntext#1{% + \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}% + \global\LT@p@ftn\expandafter{\@tempa{#1}}}% + +\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen} +\endinput +%% +%% End of file `longtable.sty'. diff --git a/docs/latex/main_8cpp.tex b/docs/latex/main_8cpp.tex new file mode 100644 index 0000000..0900b42 --- /dev/null +++ b/docs/latex/main_8cpp.tex @@ -0,0 +1,87 @@ +\hypertarget{main_8cpp}{}\doxysection{main.\+cpp File Reference} +\label{main_8cpp}\index{main.cpp@{main.cpp}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include $<$iostream$>$}\newline +{\ttfamily \#include $<$iomanip$>$}\newline +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$cstddef$>$}\newline +{\ttfamily \#include \char`\"{}dbc\+\_\+parser.\+h\char`\"{}}\newline +{\ttfamily \#include \char`\"{}dbc\+\_\+tree\+\_\+builder.\+h\char`\"{}}\newline +{\ttfamily \#include \char`\"{}dbc\+\_\+decode\+\_\+builder.\+h\char`\"{}}\newline +{\ttfamily \#include \char`\"{}dbc\+\_\+decoder.\+h\char`\"{}}\newline +\doxysubsection*{Functions} +\begin{DoxyCompactItemize} +\item +static void \mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{Print\+Tree}} (const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$node, int indent) +\item +static void \mbox{\hyperlink{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}{Print\+Decoded\+Frame}} (const \mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} \&decoded) +\item +int \mbox{\hyperlink{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}{main}} (int argc, char $\ast$argv\mbox{[}$\,$\mbox{]}) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{main_8cpp_source}{main.\+cpp}}. + + + +\doxysubsection{Function Documentation} +\mbox{\Hypertarget{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}\label{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}} +\index{main.cpp@{main.cpp}!main@{main}} +\index{main@{main}!main.cpp@{main.cpp}} +\doxysubsubsection{\texorpdfstring{main()}{main()}} +{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{argc, }\item[{char $\ast$}]{argv\mbox{[}$\,$\mbox{]} }\end{DoxyParamCaption})} + + + +Definition at line \mbox{\hyperlink{main_8cpp_source_l00097}{97}} of file \mbox{\hyperlink{main_8cpp_source}{main.\+cpp}}. + + + +References \mbox{\hyperlink{dbc__tree__builder_8cpp_source_l00014}{Dbc\+Tree\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00024}{Raw\+Can\+Frame\+::can\+Id}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00026}{Raw\+Can\+Frame\+::data}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, \mbox{\hyperlink{decode__database_8h_source_l00133}{Decode\+Database\+::frames}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00025}{Raw\+Can\+Frame\+::is\+Extended}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Dbc\+Parser\+::\+Parse\+File()}}, \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}\label{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}} +\index{main.cpp@{main.cpp}!PrintDecodedFrame@{PrintDecodedFrame}} +\index{PrintDecodedFrame@{PrintDecodedFrame}!main.cpp@{main.cpp}} +\doxysubsubsection{\texorpdfstring{PrintDecodedFrame()}{PrintDecodedFrame()}} +{\footnotesize\ttfamily static void Print\+Decoded\+Frame (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} \&}]{decoded }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + + + +Definition at line \mbox{\hyperlink{main_8cpp_source_l00075}{75}} of file \mbox{\hyperlink{main_8cpp_source}{main.\+cpp}}. + + + +References \mbox{\hyperlink{dbc__decoder_8h_source_l00039}{Decoded\+Signal\+Value\+::definition}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00056}{Decoded\+Frame\+Value\+::definition}}, \mbox{\hyperlink{decode__database_8h_source_l00040}{Decode\+Signal\+::name}}, \mbox{\hyperlink{decode__database_8h_source_l00073}{Decode\+Frame\+::name}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00041}{Decoded\+Signal\+Value\+::physical\+Value}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00040}{Decoded\+Signal\+Value\+::raw\+Value}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00057}{Decoded\+Frame\+Value\+::signals}}, \mbox{\hyperlink{decode__database_8h_source_l00049}{Decode\+Signal\+::unit}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00042}{Decoded\+Signal\+Value\+::valid}}, and \mbox{\hyperlink{dbc__decoder_8h_source_l00058}{Decoded\+Frame\+Value\+::valid}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}. + +\mbox{\Hypertarget{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}\label{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}} +\index{main.cpp@{main.cpp}!PrintTree@{PrintTree}} +\index{PrintTree@{PrintTree}!main.cpp@{main.cpp}} +\doxysubsubsection{\texorpdfstring{PrintTree()}{PrintTree()}} +{\footnotesize\ttfamily static void Print\+Tree (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$}]{node, }\item[{int}]{indent }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + + + +Definition at line \mbox{\hyperlink{main_8cpp_source_l00023}{23}} of file \mbox{\hyperlink{main_8cpp_source}{main.\+cpp}}. + + + +References \mbox{\hyperlink{frame__info_8h_source_l00026}{Frame\+Info\+::can\+Id}}, \mbox{\hyperlink{frame__info_8h_source_l00030}{Frame\+Info\+::dlc}}, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}}, \mbox{\hyperlink{tree__node_8cpp_source_l00047}{Tree\+Node\+::\+Get\+Child()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00043}{Tree\+Node\+::\+Get\+Child\+Count()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00069}{Tree\+Node\+::\+Get\+Frame()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00065}{Tree\+Node\+::\+Get\+Name()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00073}{Tree\+Node\+::\+Get\+Signal()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00061}{Tree\+Node\+::\+Get\+Type()}}, \mbox{\hyperlink{frame__info_8h_source_l00029}{Frame\+Info\+::has\+Pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00027}{Frame\+Info\+::is\+Extended}}, \mbox{\hyperlink{signal__info_8h_source_l00025}{Signal\+Info\+::length}}, \mbox{\hyperlink{frame__info_8h_source_l00028}{Frame\+Info\+::pgn}}, \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}}, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}}, \mbox{\hyperlink{signal__info_8h_source_l00024}{Signal\+Info\+::start\+Bit}}, and \mbox{\hyperlink{signal__info_8h_source_l00032}{Signal\+Info\+::unit}}. + + + +Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + diff --git a/docs/latex/main_8cpp_source.tex b/docs/latex/main_8cpp_source.tex new file mode 100644 index 0000000..a7ad458 --- /dev/null +++ b/docs/latex/main_8cpp_source.tex @@ -0,0 +1,141 @@ +\hypertarget{main_8cpp_source}{}\doxysection{main.\+cpp} +\mbox{\hyperlink{main_8cpp}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00002}00002 \textcolor{comment}{ * @file main.cpp}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00013}00013 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00014}00014 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00016}00016 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00017}00017 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00018}00018 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__parser_8h}{dbc\_parser.h}}"{}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00019}00019 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__tree__builder_8h}{dbc\_tree\_builder.h}}"{}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00020}00020 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__decode__builder_8h}{dbc\_decode\_builder.h}}"{}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00021}00021 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__decoder_8h}{dbc\_decoder.h}}"{}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00022}00022 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00023}\mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{00023}} \textcolor{keyword}{static} \textcolor{keywordtype}{void} \mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{PrintTree}} (\textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} *node, \textcolor{keywordtype}{int} indent) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00024}00024 \textcolor{keywordflow}{if} (node == \textcolor{keyword}{nullptr})} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00025}00025 \textcolor{keywordflow}{return};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00026}00026 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00027}00027 \textcolor{keywordflow}{for} (\textcolor{keywordtype}{int} i = 0; i < indent; ++i)} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00028}00028 std::cout << \textcolor{stringliteral}{"{} "{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00029}00029 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00030}00030 \textcolor{keywordflow}{switch} (node-\/>\mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{GetType}}()) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00031}00031 \textcolor{keywordflow}{case} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{NodeType::Root}}:} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00032}00032 std::cout << \textcolor{stringliteral}{"{}[root] "{}} << node-\/>\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{GetName}}() << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00033}00033 \textcolor{keywordflow}{break};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00034}00034 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00035}00035 \textcolor{keywordflow}{case} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{NodeType::Frame}}: \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00036}00036 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *frame = node-\/>\mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{GetFrame}}();} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00037}00037 std::cout << \textcolor{stringliteral}{"{}[frame] "{}} << node-\/>\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{GetName}}();} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00038}00038 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00039}00039 \textcolor{keywordflow}{if} (frame != \textcolor{keyword}{nullptr}) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00040}00040 std::cout << \textcolor{stringliteral}{"{} id=0x"{}} << std::hex << frame-\/>\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}} << std::dec} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00041}00041 << \textcolor{stringliteral}{"{} ext="{}} << (frame-\/>\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}} ? \textcolor{stringliteral}{"{}yes"{}} : \textcolor{stringliteral}{"{}no"{}})} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00042}00042 << \textcolor{stringliteral}{"{} dlc="{}} << \textcolor{keyword}{static\_cast<}\textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{int}\textcolor{keyword}{>} (frame-\/>\mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}});} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00043}00043 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00044}00044 \textcolor{keywordflow}{if} (frame-\/>\mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}})} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00045}00045 std::cout << \textcolor{stringliteral}{"{} pgn="{}} << frame-\/>\mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00046}00046 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00047}00047 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00048}00048 std::cout << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00049}00049 \textcolor{keywordflow}{break};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00050}00050 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00051}00051 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00052}00052 \textcolor{keywordflow}{case} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{NodeType::Signal}}: \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00053}00053 \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *signal = node-\/>\mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{GetSignal}}();} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00054}00054 std::cout << \textcolor{stringliteral}{"{}[signal] "{}} << node-\/>\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{GetName}}();} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00055}00055 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00056}00056 \textcolor{keywordflow}{if} (signal != \textcolor{keyword}{nullptr}) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00057}00057 std::cout << \textcolor{stringliteral}{"{} start="{}} << signal-\/>\mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00058}00058 << \textcolor{stringliteral}{"{} len="{}} << signal-\/>\mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00059}00059 << \textcolor{stringliteral}{"{} unit="{}} << signal-\/>\mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00060}00060 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00061}00061 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00062}00062 std::cout << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00063}00063 \textcolor{keywordflow}{break};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00064}00064 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00065}00065 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00066}00066 \textcolor{keywordflow}{default}:} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00067}00067 std::cout << \textcolor{stringliteral}{"{}[unknown]\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00068}00068 \textcolor{keywordflow}{break};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00069}00069 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00070}00070 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00071}00071 \textcolor{keywordflow}{for} (std::size\_t i = 0U; i < node-\/>\mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{GetChildCount}}(); ++i)} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00072}00072 \mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{PrintTree}} (node-\/>\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{GetChild}} (i), indent + 1);} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00073}00073 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00074}00074 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00075}\mbox{\hyperlink{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}{00075}} \textcolor{keyword}{static} \textcolor{keywordtype}{void} \mbox{\hyperlink{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}{PrintDecodedFrame}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} \&decoded) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00076}00076 \textcolor{keywordflow}{if} (!decoded.\mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}} || (decoded.\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}} == \textcolor{keyword}{nullptr})) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00077}00077 std::cout << \textcolor{stringliteral}{"{}No frame definition found.\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00078}00078 \textcolor{keywordflow}{return};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00079}00079 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00080}00080 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00081}00081 std::cout << \textcolor{stringliteral}{"{}Decoded frame: "{}} << decoded.\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}}-\/>\mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}} << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00082}00082 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00083}00083 \textcolor{keywordflow}{for} (std::size\_t index = 0U; index < decoded.\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}.size(); ++index) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00084}00084 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodedSignalValue}{DecodedSignalValue}} \&signal = decoded.\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}[index];} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00085}00085 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00086}00086 \textcolor{keywordflow}{if} ((signal.\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}} == \textcolor{keyword}{nullptr}) || !signal.\mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}})} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00087}00087 \textcolor{keywordflow}{continue};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00088}00088 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00089}00089 std::cout << \textcolor{stringliteral}{"{} "{}} << signal.\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}}-\/>\mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00090}00090 << \textcolor{stringliteral}{"{} raw="{}} << signal.\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00091}00091 << \textcolor{stringliteral}{"{} physical="{}} << signal.\mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physicalValue}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00092}00092 << \textcolor{stringliteral}{"{} "{}} << signal.\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}}-\/>\mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00093}00093 << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00094}00094 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00095}00095 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00096}00096 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00097}\mbox{\hyperlink{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}{00097}} \textcolor{keywordtype}{int} \mbox{\hyperlink{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}{main}} (\textcolor{keywordtype}{int} argc, \textcolor{keywordtype}{char} *argv[]) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00098}00098 \textcolor{keywordflow}{if} (argc < 2) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00099}00099 std::cerr << \textcolor{stringliteral}{"{}Usage: dbc\_demo \(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00100}00100 \textcolor{keywordflow}{return} 1;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00101}00101 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00102}00102 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00103}00103 \textcolor{keywordflow}{try} \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00104}00104 \mbox{\hyperlink{classDbcParser}{DbcParser}} parser;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00105}00105 \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} database = parser.\mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{ParseFile}} (argv[1]);} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00106}00106 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00107}00107 \mbox{\hyperlink{classDbcTreeBuilder}{DbcTreeBuilder}} treeBuilder;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00108}00108 std::unique\_ptr root = treeBuilder.\mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{Build}} (database);} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00109}00109 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00110}00110 std::cout << \textcolor{stringliteral}{"{}=== Parsed tree ===\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00111}00111 \mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{PrintTree}} (root.get(), 0);} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00112}00112 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00113}00113 \mbox{\hyperlink{classDbcDecodeBuilder}{DbcDecodeBuilder}} decodeBuilder;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00114}00114 \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} decodeDatabase = decodeBuilder.\mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{Build}} (database);} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00115}00115 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00116}00116 \textcolor{comment}{/*}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00117}00117 \textcolor{comment}{ * Example raw frame.}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00118}00118 \textcolor{comment}{ * Replace with live CAN frame or trace record later.}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00119}00119 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00120}00120 \mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} rawFrame;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00121}00121 rawFrame.\mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}} = decodeDatabase.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.empty() ? 0U : decodeDatabase.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}[0].canId;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00122}00122 rawFrame.\mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}} = decodeDatabase.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.empty() ? false : decodeDatabase.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}[0].isExtended;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00123}00123 rawFrame.\mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}}.resize (8U, 0U);} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00124}00124 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00125}00125 \mbox{\hyperlink{classDbcDecoder}{DbcDecoder}} decoder;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00126}00126 \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} decoded = decoder.\mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{Decode}} (decodeDatabase, rawFrame);} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00127}00127 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00128}00128 std::cout << \textcolor{stringliteral}{"{}\(\backslash\)n=== Decoded frame ===\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00129}00129 \mbox{\hyperlink{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}{PrintDecodedFrame}} (decoded);} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00130}00130 \} \textcolor{keywordflow}{catch} (\textcolor{keyword}{const} std::exception \&ex) \{} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00131}00131 std::cerr << \textcolor{stringliteral}{"{}Error: "{}} << ex.what() << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00132}00132 \textcolor{keywordflow}{return} 2;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00133}00133 \}} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00134}00134 } +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00135}00135 \textcolor{keywordflow}{return} 0;} +\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00136}00136 \}} + +\end{DoxyCode} diff --git a/docs/latex/md_README.tex b/docs/latex/md_README.tex new file mode 100644 index 0000000..7311a11 --- /dev/null +++ b/docs/latex/md_README.tex @@ -0,0 +1,914 @@ +\hypertarget{md_README_autotoc_md1}{}\doxysection{Overview}\label{md_README_autotoc_md1} +This module provides a minimal but extensible DBC parser and runtime decode foundation for the {\bfseries{Frame\+Tap}} project. + +Its purpose is to\+: + + +\begin{DoxyItemize} +\item parse DBC files +\item store parsed frame and signal metadata +\item build a tree for future UI integration +\item build a runtime-\/ready decode database +\item decode live CAN frames +\item decode CAN trace records using the same decoder +\end{DoxyItemize} + +The implementation follows a simple and practical design\+: + + +\begin{DoxyItemize} +\item parser logic is separated from UI logic +\item runtime decode structures are separated from tree structures +\item Qt is not required at the parser or decoder level +\item the same decode engine can be reused for live traffic and trace replay +\end{DoxyItemize} + +This is {\bfseries{not a full production-\/grade DBC implementation yet}}, but it is a strong architectural base. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md3}{}\doxysection{High-\/\+Level Architecture}\label{md_README_autotoc_md3} +The module is divided into two main paths.\hypertarget{md_README_autotoc_md4}{}\doxysubsection{1. Parse and UI path}\label{md_README_autotoc_md4} +Used for\+: + + +\begin{DoxyItemize} +\item browsing frames and signals +\item later integration with Qt {\ttfamily Model/\+View} +\item displaying metadata +\end{DoxyItemize} + +Pipeline\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{DBC file} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DbcParser} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DbcDatabase} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DbcTreeBuilder} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{TreeNode hierarchy} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{future Qt UI} + +\end{DoxyCode} +\hypertarget{md_README_autotoc_md5}{}\doxysubsection{2. Runtime decode path}\label{md_README_autotoc_md5} +Used for\+: + + +\begin{DoxyItemize} +\item live CAN decoding +\item CAN trace decoding +\item fast lookup by CAN ID +\end{DoxyItemize} + +Pipeline\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{DBC file} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DbcParser} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DbcDatabase} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DbcDecodeBuilder} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DecodeDatabase} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DbcDecoder} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{Decoded values} + +\end{DoxyCode} + + +This separation is intentional. + +The tree is useful for UI, but it is {\bfseries{not}} the main data structure for runtime decoding. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md7}{}\doxysection{Why the Runtime Decode Layer Exists}\label{md_README_autotoc_md7} +A tree structure is convenient for browsing, but a runtime decoder needs something different\+: + + +\begin{DoxyItemize} +\item fast lookup by CAN ID +\item direct access to signal decode definitions +\item minimal overhead during repeated decoding +\item the same logic for live frames and trace frames +\end{DoxyItemize} + +Because of that, the design uses a dedicated runtime-\/ready structure\+: + + +\begin{DoxyItemize} +\item {\ttfamily \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}}} +\item {\ttfamily \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}}} +\item {\ttfamily \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}}} +\end{DoxyItemize} + +This avoids forcing UI-\/oriented structures into a decode role they were not meant for. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md9}{}\doxysection{Module Layout}\label{md_README_autotoc_md9} +\hypertarget{md_README_autotoc_md10}{}\doxysubsection{Parsed DBC structures}\label{md_README_autotoc_md10} +Files\+: + + +\begin{DoxyItemize} +\item {\ttfamily \mbox{\hyperlink{signal__info_8h}{signal\+\_\+info.\+h}}} +\item {\ttfamily \mbox{\hyperlink{frame__info_8h}{frame\+\_\+info.\+h}}} +\item {\ttfamily \mbox{\hyperlink{dbc__database_8h}{dbc\+\_\+database.\+h}}} +\end{DoxyItemize} + +These store a readable representation of the parsed DBC file.\hypertarget{md_README_autotoc_md11}{}\doxysubsection{UI tree structures}\label{md_README_autotoc_md11} +Files\+: + + +\begin{DoxyItemize} +\item {\ttfamily \mbox{\hyperlink{tree__node_8h}{tree\+\_\+node.\+h}}} +\item {\ttfamily \mbox{\hyperlink{tree__node_8cpp}{tree\+\_\+node.\+cpp}}} +\item {\ttfamily \mbox{\hyperlink{dbc__tree__builder_8h}{dbc\+\_\+tree\+\_\+builder.\+h}}} +\item {\ttfamily \mbox{\hyperlink{dbc__tree__builder_8cpp}{dbc\+\_\+tree\+\_\+builder.\+cpp}}} +\end{DoxyItemize} + +These convert parsed DBC content into a tree hierarchy suitable for UI and model/view usage later.\hypertarget{md_README_autotoc_md12}{}\doxysubsection{Runtime decode structures}\label{md_README_autotoc_md12} +Files\+: + + +\begin{DoxyItemize} +\item {\ttfamily \mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}} +\item {\ttfamily \mbox{\hyperlink{dbc__decode__builder_8h}{dbc\+\_\+decode\+\_\+builder.\+h}}} +\item {\ttfamily \mbox{\hyperlink{dbc__decode__builder_8cpp}{dbc\+\_\+decode\+\_\+builder.\+cpp}}} +\end{DoxyItemize} + +These convert parsed DBC content into a structure optimized for decoding.\hypertarget{md_README_autotoc_md13}{}\doxysubsection{Runtime decoder}\label{md_README_autotoc_md13} +Files\+: + + +\begin{DoxyItemize} +\item {\ttfamily \mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}} +\item {\ttfamily \mbox{\hyperlink{dbc__decoder_8cpp}{dbc\+\_\+decoder.\+cpp}}} +\end{DoxyItemize} + +These perform actual decoding of raw CAN frames using {\ttfamily \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}}}.\hypertarget{md_README_autotoc_md14}{}\doxysubsection{Parser}\label{md_README_autotoc_md14} +Files\+: + + +\begin{DoxyItemize} +\item {\ttfamily \mbox{\hyperlink{dbc__parser_8h}{dbc\+\_\+parser.\+h}}} +\item {\ttfamily \mbox{\hyperlink{dbc__parser_8cpp}{dbc\+\_\+parser.\+cpp}}} +\end{DoxyItemize} + +These parse the DBC file itself.\hypertarget{md_README_autotoc_md15}{}\doxysubsection{Demo}\label{md_README_autotoc_md15} +File\+: + + +\begin{DoxyItemize} +\item {\ttfamily \mbox{\hyperlink{main_8cpp}{main.\+cpp}}} +\end{DoxyItemize} + +Used as a small integration example. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md17}{}\doxysection{Parsed Data Structures}\label{md_README_autotoc_md17} +\hypertarget{md_README_autotoc_md18}{}\doxysection{$<$tt$>$\+Signal\+Info$<$/tt$>$}\label{md_README_autotoc_md18} +Represents one signal as parsed from the DBC file. + +Fields\+: + + +\begin{DoxyItemize} +\item {\ttfamily name} +\item {\ttfamily start\+Bit} +\item {\ttfamily length} +\item {\ttfamily is\+Little\+Endian} +\item {\ttfamily is\+Signed} +\item {\ttfamily factor} +\item {\ttfamily offset} +\item {\ttfamily minimum} +\item {\ttfamily maximum} +\item {\ttfamily unit} +\item {\ttfamily receivers} +\item {\ttfamily comment} +\end{DoxyItemize} + +Notes\+: + + +\begin{DoxyItemize} +\item {\ttfamily receivers} is a list because a signal may have more than one receiver ECU +\item {\ttfamily factor} and {\ttfamily offset} define physical conversion +\item this structure is close to DBC content and easy to inspect +\end{DoxyItemize} + +Physical value rule\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{physical = raw * factor + offset} + +\end{DoxyCode} + + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md20}{}\doxysection{$<$tt$>$\+Frame\+Info$<$/tt$>$}\label{md_README_autotoc_md20} +Represents one frame as parsed from the DBC file. + +Fields\+: + + +\begin{DoxyItemize} +\item {\ttfamily name} +\item {\ttfamily can\+Id} +\item {\ttfamily is\+Extended} +\item {\ttfamily pgn} +\item {\ttfamily has\+Pgn} +\item {\ttfamily dlc} +\item {\ttfamily transmitter} +\item {\ttfamily comment} +\item {\ttfamily signals} +\end{DoxyItemize} + +Notes\+: + + +\begin{DoxyItemize} +\item {\ttfamily signals} is a list of {\ttfamily \mbox{\hyperlink{structSignalInfo}{Signal\+Info}}} +\item {\ttfamily is\+Extended} is determined during CAN ID normalization +\item {\ttfamily pgn} is derived using simplified J1939 logic when applicable +\end{DoxyItemize} + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md22}{}\doxysection{$<$tt$>$\+Dbc\+Database$<$/tt$>$}\label{md_README_autotoc_md22} +Top-\/level parsed DBC container. + +Conceptually\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{DbcDatabase} +\DoxyCodeLine{ └── vector} + +\end{DoxyCode} + + +This is the central structure produced by {\ttfamily \mbox{\hyperlink{classDbcParser}{Dbc\+Parser}}}. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md24}{}\doxysection{UI Tree Layer}\label{md_README_autotoc_md24} +\hypertarget{md_README_autotoc_md25}{}\doxysection{$<$tt$>$\+Tree\+Node$<$/tt$>$}\label{md_README_autotoc_md25} +The UI tree contains three node types\+: + + +\begin{DoxyItemize} +\item {\ttfamily Root} +\item {\ttfamily Frame} +\item {\ttfamily Signal} +\end{DoxyItemize} + +Example hierarchy\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{dbc} +\DoxyCodeLine{ ├── EngineData} +\DoxyCodeLine{ │ ├── EngineSpeed} +\DoxyCodeLine{ │ ├── OilTemp} +\DoxyCodeLine{ │ └── CoolantTemp} +\DoxyCodeLine{ └── VehicleData} +\DoxyCodeLine{ ├── VehicleSpeed} +\DoxyCodeLine{ └── Odometer} + +\end{DoxyCode} + + +Each node stores either\+: + + +\begin{DoxyItemize} +\item {\ttfamily \mbox{\hyperlink{structFrameInfo}{Frame\+Info}}} +\item {\ttfamily \mbox{\hyperlink{structSignalInfo}{Signal\+Info}}} +\end{DoxyItemize} + +The tree is intended for browsing and later Qt model integration. + +It is {\bfseries{not}} the primary runtime decode structure. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md27}{}\doxysection{Runtime Decode Layer}\label{md_README_autotoc_md27} +\hypertarget{md_README_autotoc_md28}{}\doxysection{Purpose}\label{md_README_autotoc_md28} +The decode layer exists so that decoding can be fast and independent from UI concerns. + +Instead of searching a tree, the decoder uses a prepared database with direct lookup. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md30}{}\doxysection{$<$tt$>$\+Byte\+Order$<$/tt$>$}\label{md_README_autotoc_md30} +Runtime byte order enum\+: + + +\begin{DoxyItemize} +\item {\ttfamily Intel} +\item {\ttfamily Motorola} +\end{DoxyItemize} + +This is better for decode code than passing around raw DBC characters. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md32}{}\doxysection{$<$tt$>$\+Value\+Type$<$/tt$>$}\label{md_README_autotoc_md32} +Numeric type enum\+: + + +\begin{DoxyItemize} +\item {\ttfamily Unsigned} +\item {\ttfamily Signed} +\end{DoxyItemize} + +This is clearer than combining multiple boolean flags during runtime logic. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md34}{}\doxysection{$<$tt$>$\+Decode\+Signal$<$/tt$>$}\label{md_README_autotoc_md34} +Represents one runtime-\/ready signal definition. + +Fields\+: + + +\begin{DoxyItemize} +\item {\ttfamily name} +\item {\ttfamily start\+Bit} +\item {\ttfamily length} +\item {\ttfamily byte\+Order} +\item {\ttfamily value\+Type} +\item {\ttfamily factor} +\item {\ttfamily offset} +\item {\ttfamily minimum} +\item {\ttfamily maximum} +\item {\ttfamily unit} +\item {\ttfamily receivers} +\item {\ttfamily comment} +\end{DoxyItemize} + +This structure contains all information required for extracting and converting a signal value from raw frame data. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md36}{}\doxysection{$<$tt$>$\+Decode\+Frame$<$/tt$>$}\label{md_README_autotoc_md36} +Represents one runtime-\/ready frame definition. + +Fields\+: + + +\begin{DoxyItemize} +\item {\ttfamily name} +\item {\ttfamily can\+Id} +\item {\ttfamily is\+Extended} +\item {\ttfamily dlc} +\item {\ttfamily pgn} +\item {\ttfamily has\+Pgn} +\item {\ttfamily transmitter} +\item {\ttfamily comment} +\item {\ttfamily signals} +\end{DoxyItemize} + +This structure is used directly by the decoder. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md38}{}\doxysection{$<$tt$>$\+Frame\+Key$<$/tt$>$}\label{md_README_autotoc_md38} +Fast lookup key for runtime frame matching. + +Fields\+: + + +\begin{DoxyItemize} +\item {\ttfamily can\+Id} +\item {\ttfamily is\+Extended} +\end{DoxyItemize} + +This matters because the same numeric identifier must not be confused between standard and extended frames. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md40}{}\doxysection{$<$tt$>$\+Decode\+Database$<$/tt$>$}\label{md_README_autotoc_md40} +Top-\/level runtime decode container. + +Fields\+: + + +\begin{DoxyItemize} +\item {\ttfamily frames} +\item {\ttfamily frame\+Index\+By\+Key} +\end{DoxyItemize} + +Conceptually\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{DecodeDatabase} +\DoxyCodeLine{ ├── vector} +\DoxyCodeLine{ └── unordered\_map} + +\end{DoxyCode} + + +This gives the decoder fast access to a frame definition using CAN ID and frame type. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md42}{}\doxysection{Decoder Layer}\label{md_README_autotoc_md42} +\hypertarget{md_README_autotoc_md43}{}\doxysection{$<$tt$>$\+Raw\+Can\+Frame$<$/tt$>$}\label{md_README_autotoc_md43} +Represents a raw CAN frame to decode. + +Fields\+: + + +\begin{DoxyItemize} +\item {\ttfamily can\+Id} +\item {\ttfamily is\+Extended} +\item {\ttfamily data} +\end{DoxyItemize} + +This same structure can be used for\+: + + +\begin{DoxyItemize} +\item live CAN bus input +\item replayed trace records +\item unit tests +\end{DoxyItemize} + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md45}{}\doxysection{$<$tt$>$\+Decoded\+Signal\+Value$<$/tt$>$}\label{md_README_autotoc_md45} +Represents one decoded signal result. + +Fields\+: + + +\begin{DoxyItemize} +\item {\ttfamily definition} +\item {\ttfamily raw\+Value} +\item {\ttfamily physical\+Value} +\item {\ttfamily valid} +\end{DoxyItemize} + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md47}{}\doxysection{$<$tt$>$\+Decoded\+Frame\+Value$<$/tt$>$}\label{md_README_autotoc_md47} +Represents one decoded frame result. + +Fields\+: + + +\begin{DoxyItemize} +\item {\ttfamily definition} +\item {\ttfamily signals} +\item {\ttfamily valid} +\end{DoxyItemize} + +This is the decoder output for one raw frame. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md49}{}\doxysection{$<$tt$>$\+Dbc\+Decoder$<$/tt$>$}\label{md_README_autotoc_md49} +Main runtime decoder class. + +Responsibilities\+: + + +\begin{DoxyItemize} +\item find a frame definition by CAN ID +\item decode all signals in a frame +\item extract raw values +\item sign-\/extend signed values +\item convert raw values into physical values +\end{DoxyItemize} + +Main methods\+: + + +\begin{DoxyItemize} +\item {\ttfamily Find\+Frame(...)} +\item {\ttfamily Decode(...)} +\end{DoxyItemize} + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md51}{}\doxysection{Parser Support}\label{md_README_autotoc_md51} +The current parser supports the following DBC elements\+: + + +\begin{DoxyItemize} +\item {\ttfamily BO\+\_\+} +\item {\ttfamily SG\+\_\+} +\item {\ttfamily CM\+\_\+ BO\+\_\+} +\item {\ttfamily CM\+\_\+ SG\+\_\+} +\end{DoxyItemize} + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md53}{}\doxysection{Supported DBC Syntax}\label{md_README_autotoc_md53} +\hypertarget{md_README_autotoc_md54}{}\doxysection{Frame definition}\label{md_README_autotoc_md54} +Example\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{BO\_ 256 EngineData: 8 EEC1} + +\end{DoxyCode} + + +Parsed fields\+: + + +\begin{DoxyItemize} +\item frame CAN ID +\item frame name +\item DLC +\item transmitter ECU +\end{DoxyItemize} + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md56}{}\doxysection{Signal definition}\label{md_README_autotoc_md56} +Example\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{SG\_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] "{}rpm"{} ECU1,ECU2} + +\end{DoxyCode} + + +Parsed fields\+: + + +\begin{DoxyItemize} +\item signal name +\item start bit +\item signal length +\item byte order +\item signedness +\item factor +\item offset +\item minimum +\item maximum +\item unit +\item receivers +\end{DoxyItemize} + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md58}{}\doxysection{Comments}\label{md_README_autotoc_md58} +Frame comment example\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{CM\_ BO\_ 256 "{}Engine data frame"{};} + +\end{DoxyCode} + + +Signal comment example\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{CM\_ SG\_ 256 EngineSpeed "{}Actual engine speed"{};} + +\end{DoxyCode} + + +Stored in\+: + + +\begin{DoxyItemize} +\item {\ttfamily \mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{Frame\+Info\+::comment}}} +\item {\ttfamily \mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{Signal\+Info\+::comment}}} +\end{DoxyItemize} + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md60}{}\doxysection{CAN ID Normalization}\label{md_README_autotoc_md60} +The parser normalizes frame identifiers. + +Common DBC behavior\+: + + +\begin{DoxyItemize} +\item extended identifiers may be stored with bit 31 set +\item the actual 29-\/bit identifier must be extracted from that value +\end{DoxyItemize} + +The parser therefore stores\+: + + +\begin{DoxyItemize} +\item normalized {\ttfamily can\+Id} +\item separate {\ttfamily is\+Extended} flag +\end{DoxyItemize} + +This is important both for correct lookup and for future interoperability with live CAN APIs. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md62}{}\doxysection{PGN Extraction}\label{md_README_autotoc_md62} +PGN is derived only when the frame is treated as extended. + +The current logic is simplified J1939 extraction\+: + + +\begin{DoxyItemize} +\item {\ttfamily pf} +\item {\ttfamily ps} +\item {\ttfamily dp} +\end{DoxyItemize} + +This is enough for a practical start but should not be treated as full J1939 validation. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md64}{}\doxysection{Decode Flow}\label{md_README_autotoc_md64} +Typical runtime decode flow\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{RawCanFrame} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{Find frame in DecodeDatabase} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{For each signal:} +\DoxyCodeLine{ extract raw bits} +\DoxyCodeLine{ apply sign extension if needed} +\DoxyCodeLine{ convert to physical value} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DecodedFrameValue} + +\end{DoxyCode} + + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md66}{}\doxysection{Intel and Motorola Extraction}\label{md_README_autotoc_md66} +The decoder currently has separate extraction paths\+: + + +\begin{DoxyItemize} +\item {\ttfamily Extract\+Intel(...)} +\item {\ttfamily Extract\+Motorola(...)} +\end{DoxyItemize} + +This is important because byte order is not just metadata once decoding starts. + +Intel and Motorola require different bit extraction logic. + +This is one of the main reasons why the runtime decode layer should be explicit and prepared in advance. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md68}{}\doxysection{Example Usage}\label{md_README_autotoc_md68} +\hypertarget{md_README_autotoc_md69}{}\doxysection{Parse DBC}\label{md_README_autotoc_md69} + +\begin{DoxyCode}{0} +\DoxyCodeLine{\mbox{\hyperlink{classDbcParser}{DbcParser}} parser;} +\DoxyCodeLine{\mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} database = parser.\mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{ParseFile}}(\textcolor{stringliteral}{"{}example.dbc"{}});} + +\end{DoxyCode} +\hypertarget{md_README_autotoc_md70}{}\doxysection{Build UI tree}\label{md_README_autotoc_md70} + +\begin{DoxyCode}{0} +\DoxyCodeLine{\mbox{\hyperlink{classDbcTreeBuilder}{DbcTreeBuilder}} treeBuilder;} +\DoxyCodeLine{std::unique\_ptr root = treeBuilder.\mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{Build}}(database);} + +\end{DoxyCode} +\hypertarget{md_README_autotoc_md71}{}\doxysection{Build runtime decode database}\label{md_README_autotoc_md71} + +\begin{DoxyCode}{0} +\DoxyCodeLine{\mbox{\hyperlink{classDbcDecodeBuilder}{DbcDecodeBuilder}} decodeBuilder;} +\DoxyCodeLine{\mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} decodeDatabase = decodeBuilder.\mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{Build}}(database);} + +\end{DoxyCode} +\hypertarget{md_README_autotoc_md72}{}\doxysection{Decode a raw frame}\label{md_README_autotoc_md72} + +\begin{DoxyCode}{0} +\DoxyCodeLine{\mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} rawFrame;} +\DoxyCodeLine{rawFrame.\mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}} = 0x123;} +\DoxyCodeLine{rawFrame.\mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}} = \textcolor{keyword}{false};} +\DoxyCodeLine{rawFrame.\mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}} = \{0x01, 0x02, 0x03, 0x04\};} +\DoxyCodeLine{} +\DoxyCodeLine{\mbox{\hyperlink{classDbcDecoder}{DbcDecoder}} decoder;} +\DoxyCodeLine{\mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} decoded = decoder.\mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{Decode}}(decodeDatabase, rawFrame);} + +\end{DoxyCode} + + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md74}{}\doxysection{Unified Decode Strategy}\label{md_README_autotoc_md74} +A key design goal is that the same decoder should work for both\+: + + +\begin{DoxyItemize} +\item live CAN frames +\item trace replay frames +\end{DoxyItemize} + +That means this architecture supports\+:\hypertarget{md_README_autotoc_md75}{}\doxysubsection{live path}\label{md_README_autotoc_md75} + +\begin{DoxyCode}{0} +\DoxyCodeLine{live CAN input} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{RawCanFrame} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DbcDecoder} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{decoded signal values} + +\end{DoxyCode} +\hypertarget{md_README_autotoc_md76}{}\doxysubsection{trace path}\label{md_README_autotoc_md76} + +\begin{DoxyCode}{0} +\DoxyCodeLine{trace reader} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{RawCanFrame} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{DbcDecoder} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{decoded signal values} + +\end{DoxyCode} + + +This avoids duplicating decode logic in two separate parts of the application. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md78}{}\doxysection{Intended Use in Frame\+Tap}\label{md_README_autotoc_md78} +This module is meant to support at least the following Frame\+Tap workflows\+: + + +\begin{DoxyItemize} +\item load a DBC file +\item browse frames and signals +\item search signals +\item drag a signal into a plot later +\item decode live CAN traffic +\item decode recorded traces +\item convert raw values into physical values +\item show metadata like units, comments, transmitter, receivers, and PGN +\end{DoxyItemize} + +Example combined workflow\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{Load DBC} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{Parse into DbcDatabase} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{Build UI tree} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{Build DecodeDatabase} +\DoxyCodeLine{ ↓} +\DoxyCodeLine{Use same decode engine for:} +\DoxyCodeLine{ -\/ live frames} +\DoxyCodeLine{ -\/ trace replay} + +\end{DoxyCode} + + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md80}{}\doxysection{Why the Tree Is Not Enough}\label{md_README_autotoc_md80} +The tree exists for browsing. + +However, runtime decode should not rely on tree traversal because that would introduce unnecessary coupling and inefficiency. + +A runtime decoder needs\+: + + +\begin{DoxyItemize} +\item fast key-\/based access +\item minimal interpretation at decode time +\item direct signal definitions already prepared +\end{DoxyItemize} + +That is why {\ttfamily \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}}} is a separate layer. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md82}{}\doxysection{Why No Abstract Factory Is Used}\label{md_README_autotoc_md82} +At the current stage, abstract factory is intentionally avoided. + +The current design is already clean\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{parser → parsed database → decode database} +\DoxyCodeLine{ ↘ tree builder → UI tree} + +\end{DoxyCode} + + +Introducing factory layers now would increase complexity without solving an immediate problem. + +If later the project requires multiple output representations or multiple build strategies, that can be added then. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md84}{}\doxysection{Current Limitations}\label{md_README_autotoc_md84} +This is still a minimal implementation. + +Not supported yet\+: + + +\begin{DoxyItemize} +\item multiplexed signals +\item {\ttfamily VAL\+\_\+} tables +\item {\ttfamily BA\+\_\+} attributes +\item {\ttfamily BA\+\_\+\+DEF\+\_\+} definitions +\item advanced comment handling +\item full DBC grammar coverage +\item full J1939 validation +\item extensive edge-\/case handling for unusual DBC formatting +\end{DoxyItemize} + +Motorola extraction is implemented, but it should still be verified carefully against real-\/world DBC files and expected values. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md86}{}\doxysection{Recommended Next Steps}\label{md_README_autotoc_md86} +A practical development order would be\+:\hypertarget{md_README_autotoc_md87}{}\doxysubsection{Stage 1 -\/ already implemented}\label{md_README_autotoc_md87} + +\begin{DoxyItemize} +\item {\ttfamily BO\+\_\+} +\item {\ttfamily SG\+\_\+} +\item {\ttfamily CM\+\_\+} +\item normalized CAN ID +\item {\ttfamily is\+Extended} +\item transmitter +\item receivers +\item comments +\item tree representation +\item runtime decode database +\item runtime decoder +\end{DoxyItemize}\hypertarget{md_README_autotoc_md88}{}\doxysubsection{Stage 2}\label{md_README_autotoc_md88} +Recommended additions\+: + + +\begin{DoxyItemize} +\item parent pointer in {\ttfamily \mbox{\hyperlink{classTreeNode}{Tree\+Node}}} +\item Qt model adapter +\item {\ttfamily VAL\+\_\+} support for enum-\/style signals +\item better display strings for UI +\item selective decoding of only chosen signals +\end{DoxyItemize}\hypertarget{md_README_autotoc_md89}{}\doxysubsection{Stage 3}\label{md_README_autotoc_md89} +Recommended additions\+: + + +\begin{DoxyItemize} +\item multiplexing support +\item attribute parsing +\item richer J1939 support +\item CSV export of decoded traces +\item optimized filtering and signal selection +\end{DoxyItemize}\hypertarget{md_README_autotoc_md90}{}\doxysubsection{Stage 4}\label{md_README_autotoc_md90} +Advanced functionality\+: + + +\begin{DoxyItemize} +\item live plot integration +\item signal subscriptions +\item per-\/signal trace decode pipelines +\item decoder-\/assisted export formats +\end{DoxyItemize} + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md92}{}\doxysection{Build Integration}\label{md_README_autotoc_md92} +The module does not depend on any specific build system. + +It can be integrated with\+: + + +\begin{DoxyItemize} +\item CMake +\item qmake +\item Makefile +\end{DoxyItemize} + +Just add the source files to the project. + +\DoxyHorRuler{0} +\hypertarget{md_README_autotoc_md94}{}\doxysection{Summary}\label{md_README_autotoc_md94} +This module is now split into two intentionally separate layers\+:\hypertarget{md_README_autotoc_md95}{}\doxysubsection{Parsed representation}\label{md_README_autotoc_md95} +Used for\+: + + +\begin{DoxyItemize} +\item storing parsed DBC content +\item browsing +\item UI tree generation +\end{DoxyItemize}\hypertarget{md_README_autotoc_md96}{}\doxysubsection{Runtime decode representation}\label{md_README_autotoc_md96} +Used for\+: + + +\begin{DoxyItemize} +\item fast frame lookup +\item live CAN decode +\item trace decode +\item physical value conversion +\end{DoxyItemize} + +That separation is the main architectural improvement. + +In short, the system now looks like this\+: + + +\begin{DoxyCode}{0} +\DoxyCodeLine{DBC parser → DbcDatabase → DecodeDatabase → DbcDecoder} +\DoxyCodeLine{ ↘ TreeNode → future UI} + +\end{DoxyCode} + + +This gives Frame\+Tap a much better foundation for real use, because both browsing and decoding are supported without forcing one representation to do the other\textquotesingle{}s job. \ No newline at end of file diff --git a/docs/latex/namespaceanonymous__namespace_02dbc__parser_8cpp_03.tex b/docs/latex/namespaceanonymous__namespace_02dbc__parser_8cpp_03.tex new file mode 100644 index 0000000..417b9f5 --- /dev/null +++ b/docs/latex/namespaceanonymous__namespace_02dbc__parser_8cpp_03.tex @@ -0,0 +1,36 @@ +\hypertarget{namespaceanonymous__namespace_02dbc__parser_8cpp_03}{}\doxysection{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\} Namespace Reference} +\label{namespaceanonymous__namespace_02dbc__parser_8cpp_03}\index{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}@{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}}} +\doxysubsection*{Functions} +\begin{DoxyCompactItemize} +\item +std\+::string \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{Trim\+Text}} (const std\+::string \&text) +\begin{DoxyCompactList}\small\item\em Remove leading and trailing spaces. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Function Documentation} +\mbox{\Hypertarget{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}\label{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}} +\index{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}@{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}}!TrimText@{TrimText}} +\index{TrimText@{TrimText}!anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}@{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}}} +\doxysubsubsection{\texorpdfstring{TrimText()}{TrimText()}} +{\footnotesize\ttfamily std\+::string anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{text }\end{DoxyParamCaption})} + + + +Remove leading and trailing spaces. + + +\begin{DoxyParams}{Parameters} +{\em text} & Input text. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Trimmed text. +\end{DoxyReturn} + + +Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00025}{25}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}. + + + +Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00087}{Dbc\+Parser\+::\+Split\+Receivers()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00083}{Dbc\+Parser\+::\+Trim()}}. + diff --git a/docs/latex/namespaces.tex b/docs/latex/namespaces.tex new file mode 100644 index 0000000..7d6b055 --- /dev/null +++ b/docs/latex/namespaces.tex @@ -0,0 +1,4 @@ +\doxysection{Namespace List} +Here is a list of all namespaces with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}}} }{\pageref{namespaceanonymous__namespace_02dbc__parser_8cpp_03}}{} +\end{DoxyCompactList} diff --git a/docs/latex/refman.tex b/docs/latex/refman.tex new file mode 100644 index 0000000..b273085 --- /dev/null +++ b/docs/latex/refman.tex @@ -0,0 +1,248 @@ + % Handle batch mode + % to overcome problems with too many open files + \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage} + % Set document class depending on configuration + \documentclass[twoside]{book} + %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package + \usepackage{ifthen} + \ifx\requestedLaTeXdate\undefined + \usepackage{array} + \else + \usepackage{array}[=2016-10-06] + \fi + %% + % Packages required by doxygen + \usepackage{fixltx2e} % for \textsubscript + \usepackage{doxygen} + \usepackage{graphicx} + \usepackage[utf8]{inputenc} + \usepackage{makeidx} + \PassOptionsToPackage{warn}{textcomp} + \usepackage{textcomp} + \usepackage[nointegrals]{wasysym} + \usepackage{ifxetex} + % NLS support packages + % Define default fonts + % Font selection + \usepackage[T1]{fontenc} + % set main and monospaced font + \usepackage[scaled=.90]{helvet} +\usepackage{courier} +\renewcommand{\familydefault}{\sfdefault} + \usepackage{sectsty} + \allsectionsfont{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \renewcommand{\DoxyLabelFont}{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} + % Arguments of doxygenemoji: + % 1) '::' form of the emoji, already LaTeX-escaped + % 2) file with the name of the emoji without the .png extension + % in case image exist use this otherwise use the '::' form + \newcommand{\doxygenemoji}[2]{% + \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}% + } + % Page & text layout + \usepackage{geometry} + \geometry{% + letterpaper,% + top=2.5cm,% + bottom=2.5cm,% + left=2.5cm,% + right=2.5cm% + } + % Allow a bit of overflow to go unnoticed by other means + \tolerance=750 + \hfuzz=15pt + \hbadness=750 + \setlength{\emergencystretch}{15pt} + \setlength{\parindent}{0cm} + \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}} + \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}} + \doxynormalparskip + % Redefine paragraph/subparagraph environments, using sectsty fonts + \makeatletter + \renewcommand{\paragraph}{% + \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@parafont% + }% + } + \renewcommand{\subparagraph}{% + \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@subparafont% + }% + } + \makeatother + \makeatletter + \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@} + \makeatother + % Headers & footers + \usepackage{fancyhdr} + \pagestyle{fancyplain} + \renewcommand{\footrulewidth}{0.4pt} + \fancypagestyle{fancyplain}{ + \fancyhf{} + \fancyhead[LE, RO]{\bfseries\thepage} + \fancyhead[LO]{\bfseries\rightmark} + \fancyhead[RE]{\bfseries\leftmark} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + } + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + \renewcommand{\headrulewidth}{0pt} + } + \pagestyle{fancyplain} + \renewcommand{\chaptermark}[1]{% + \markboth{#1}{}% + } + \renewcommand{\sectionmark}[1]{% + \markright{\thesection\ #1}% + } + % ToC, LoF, LoT, bibliography, and index + % Indices & bibliography + \usepackage{natbib} + \usepackage[titles]{tocloft} + \setcounter{tocdepth}{3} + \setcounter{secnumdepth}{5} + % creating indexes + \makeindex + \usepackage{newunicodechar} + \newunicodechar{⁻}{${}^{-}$}% Superscript minus + \newunicodechar{²}{${}^{2}$}% Superscript two + \newunicodechar{³}{${}^{3}$}% Superscript three + % Hyperlinks + % Hyperlinks (required, but should be loaded last) + \ifpdf + \usepackage[pdftex,pagebackref=true]{hyperref} + \else + \ifxetex + \usepackage[pagebackref=true]{hyperref} + \else + \usepackage[ps2pdf,pagebackref=true]{hyperref} + \fi + \fi + \hypersetup{% + colorlinks=true,% + linkcolor=blue,% + citecolor=blue,% + unicode,% + pdftitle={DBC framework},% + pdfsubject={}% + } + % Custom commands used by the header + % Custom commands + \newcommand{\clearemptydoublepage}{% + \newpage{\pagestyle{empty}\cleardoublepage}% + } + % caption style definition + \usepackage{caption} + \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top} + % in page table of contents + \usepackage{etoc} + \etocsettocstyle{\doxytocparskip}{\doxynormalparskip} + % prevent numbers overlap the titles in toc + \renewcommand{\numberline}[1]{#1~} +% End of preamble, now comes the document contents +%===== C O N T E N T S ===== +\begin{document} + \raggedbottom + % Titlepage & ToC + % To avoid duplicate page anchors due to reuse of same numbers for + % the index (be it as roman numbers) + \hypersetup{pageanchor=false, + bookmarksnumbered=true, + pdfencoding=unicode + } + \pagenumbering{alph} + \begin{titlepage} + \vspace*{7cm} + \begin{center}% + {\Large DBC framework}\\ + \vspace*{1cm} + {\large Generated by Doxygen 1.9.4}\\ + \end{center} + \end{titlepage} + \clearemptydoublepage + \pagenumbering{roman} + \tableofcontents + \clearemptydoublepage + \pagenumbering{arabic} + % re-enable anchors again + \hypersetup{pageanchor=true} +%--- Begin generated contents --- +\chapter{DBC Parser and Runtime Decode Module Documentation} +\label{md_README} +\Hypertarget{md_README} +\input{md_README} +\chapter{Namespace Index} +\input{namespaces} +\chapter{Class Index} +\input{annotated} +\chapter{File Index} +\input{files} +\chapter{Namespace Documentation} +\input{namespaceanonymous__namespace_02dbc__parser_8cpp_03} +\chapter{Class Documentation} +\input{structDbcDatabase} +\input{classDbcDecodeBuilder} +\input{classDbcDecoder} +\input{classDbcParser} +\input{classDbcTreeBuilder} +\input{structDecodeDatabase} +\input{structDecodedFrameValue} +\input{structDecodedSignalValue} +\input{structDecodeFrame} +\input{structDecodeSignal} +\input{structFrameInfo} +\input{structFrameKey} +\input{structFrameKeyHasher} +\input{structRawCanFrame} +\input{structSignalInfo} +\input{classTreeNode} +\chapter{File Documentation} +\input{dbc__database_8h} +\input{dbc__database_8h_source} +\input{dbc__decode__builder_8cpp} +\input{dbc__decode__builder_8cpp_source} +\input{dbc__decode__builder_8h} +\input{dbc__decode__builder_8h_source} +\input{dbc__decoder_8cpp} +\input{dbc__decoder_8cpp_source} +\input{dbc__decoder_8h} +\input{dbc__decoder_8h_source} +\input{dbc__parser_8cpp} +\input{dbc__parser_8cpp_source} +\input{dbc__parser_8h} +\input{dbc__parser_8h_source} +\input{dbc__tree__builder_8cpp} +\input{dbc__tree__builder_8cpp_source} +\input{dbc__tree__builder_8h} +\input{dbc__tree__builder_8h_source} +\input{decode__database_8h} +\input{decode__database_8h_source} +\input{frame__info_8h} +\input{frame__info_8h_source} +\input{main_8cpp} +\input{main_8cpp_source} +\input{README_8md} +\input{signal__info_8h} +\input{signal__info_8h_source} +\input{tree__node_8cpp} +\input{tree__node_8cpp_source} +\input{tree__node_8h} +\input{tree__node_8h_source} +%--- End generated contents --- +% Index + \backmatter + \newpage + \phantomsection + \clearemptydoublepage + \addcontentsline{toc}{chapter}{\indexname} + \printindex +% Required for some languages (in combination with latexdocumentpre from the header) +\end{document} diff --git a/docs/latex/signal__info_8h.tex b/docs/latex/signal__info_8h.tex new file mode 100644 index 0000000..2474814 --- /dev/null +++ b/docs/latex/signal__info_8h.tex @@ -0,0 +1,24 @@ +\hypertarget{signal__info_8h}{}\doxysection{signal\+\_\+info.\+h File Reference} +\label{signal__info_8h}\index{signal\_info.h@{signal\_info.h}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include $<$string$>$}\newline +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$cstdint$>$}\newline +\doxysubsection*{Classes} +\begin{DoxyCompactItemize} +\item +struct \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} +\begin{DoxyCompactList}\small\item\em Describes one signal inside a DBC frame. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + diff --git a/docs/latex/signal__info_8h_source.tex b/docs/latex/signal__info_8h_source.tex new file mode 100644 index 0000000..36a5e8e --- /dev/null +++ b/docs/latex/signal__info_8h_source.tex @@ -0,0 +1,57 @@ +\hypertarget{signal__info_8h_source}{}\doxysection{signal\+\_\+info.\+h} +\mbox{\hyperlink{signal__info_8h}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00002}00002 \textcolor{comment}{ * @file signal\_info.h}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef SIGNAL\_INFO\_H}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00013}00013 \textcolor{preprocessor}{\#define SIGNAL\_INFO\_H}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00014}00014 } +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00018}00018 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00019}00019 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00020}00020 \textcolor{comment}{ * @brief Describes one signal inside a DBC frame.}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00021}00021 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00022}\mbox{\hyperlink{structSignalInfo}{00022}} \textcolor{keyword}{struct }\mbox{\hyperlink{structSignalInfo}{SignalInfo}} \{} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00023}\mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{00023}} std::string \mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}}; \textcolor{comment}{/**< Signal name. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00024}\mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{00024}} std::uint32\_t \mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}}; \textcolor{comment}{/**< Start bit in DBC notation. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00025}\mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{00025}} std::uint32\_t \mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}}; \textcolor{comment}{/**< Signal length in bits. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00026}\mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{00026}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{isLittleEndian}}; \textcolor{comment}{/**< true for Intel, false for Motorola. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00027}\mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{00027}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{isSigned}}; \textcolor{comment}{/**< true if signal is signed. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00028}\mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{00028}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}}; \textcolor{comment}{/**< Scaling factor. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00029}\mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{00029}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}}; \textcolor{comment}{/**< Physical offset. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00030}\mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{00030}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}}; \textcolor{comment}{/**< Minimum physical value. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00031}\mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{00031}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}}; \textcolor{comment}{/**< Maximum physical value. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00032}\mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{00032}} std::string \mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}}; \textcolor{comment}{/**< Physical unit. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00033}\mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{00033}} std::vector \mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}}; \textcolor{comment}{/**< Signal receivers. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00034}\mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{00034}} std::string \mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}}; \textcolor{comment}{/**< Optional signal comment. */}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00035}00035 } +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00036}\mbox{\hyperlink{structSignalInfo_aa2d2cd238118015258e271dce92a971e}{00036}} \mbox{\hyperlink{structSignalInfo_aa2d2cd238118015258e271dce92a971e}{SignalInfo}}()} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00037}00037 : \mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}}()} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00038}00038 , \mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}} (0U)} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00039}00039 , \mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}} (0U)} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00040}00040 , \mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{isLittleEndian}} (true)} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00041}00041 , \mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{isSigned}} (false)} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00042}00042 , \mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}} (1.0)} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00043}00043 , \mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}} (0.0)} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00044}00044 , \mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}} (0.0)} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00045}00045 , \mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}} (0.0)} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00046}00046 , \mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}}()} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00047}00047 , \mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}}()} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00048}00048 , \mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}}() \{} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00049}00049 \}} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00050}00050 \};} +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00051}00051 } +\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00052}00052 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* SIGNAL\_INFO\_H */}\textcolor{preprocessor}{}} + +\end{DoxyCode} diff --git a/docs/latex/structDbcDatabase.tex b/docs/latex/structDbcDatabase.tex new file mode 100644 index 0000000..b7ee57e --- /dev/null +++ b/docs/latex/structDbcDatabase.tex @@ -0,0 +1,45 @@ +\hypertarget{structDbcDatabase}{}\doxysection{Dbc\+Database Struct Reference} +\label{structDbcDatabase}\index{DbcDatabase@{DbcDatabase}} + + +Parsed DBC content stored in a simple internal form. + + + + +{\ttfamily \#include $<$dbc\+\_\+database.\+h$>$} + +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +std\+::vector$<$ \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $>$ \mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Parsed DBC content stored in a simple internal form. + +Definition at line \mbox{\hyperlink{dbc__database_8h_source_l00022}{22}} of file \mbox{\hyperlink{dbc__database_8h_source}{dbc\+\_\+database.\+h}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}\label{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}} +\index{DbcDatabase@{DbcDatabase}!frames@{frames}} +\index{frames@{frames}!DbcDatabase@{DbcDatabase}} +\doxysubsubsection{\texorpdfstring{frames}{frames}} +{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structFrameInfo}{Frame\+Info}}$>$ Dbc\+Database\+::frames} + +All frames found in the DBC file. + +Definition at line \mbox{\hyperlink{dbc__database_8h_source_l00023}{23}} of file \mbox{\hyperlink{dbc__database_8h_source}{dbc\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__tree__builder_8cpp_source_l00014}{Dbc\+Tree\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00337}{Dbc\+Parser\+::\+Find\+Frame\+By\+Id()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Dbc\+Parser\+::\+Parse\+File()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{dbc__database_8h}{dbc\+\_\+database.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structDecodeDatabase.tex b/docs/latex/structDecodeDatabase.tex new file mode 100644 index 0000000..e20ba9c --- /dev/null +++ b/docs/latex/structDecodeDatabase.tex @@ -0,0 +1,61 @@ +\hypertarget{structDecodeDatabase}{}\doxysection{Decode\+Database Struct Reference} +\label{structDecodeDatabase}\index{DecodeDatabase@{DecodeDatabase}} + + +Runtime decode database with fast lookup by CAN ID. + + + + +{\ttfamily \#include $<$decode\+\_\+database.\+h$>$} + +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +std\+::vector$<$ \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} $>$ \mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}} +\item +std\+::unordered\+\_\+map$<$ \mbox{\hyperlink{structFrameKey}{Frame\+Key}}, std\+::size\+\_\+t, \mbox{\hyperlink{structFrameKeyHasher}{Frame\+Key\+Hasher}} $>$ \mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frame\+Index\+By\+Key}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Runtime decode database with fast lookup by CAN ID. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00132}{132}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}\label{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}} +\index{DecodeDatabase@{DecodeDatabase}!frameIndexByKey@{frameIndexByKey}} +\index{frameIndexByKey@{frameIndexByKey}!DecodeDatabase@{DecodeDatabase}} +\doxysubsubsection{\texorpdfstring{frameIndexByKey}{frameIndexByKey}} +{\footnotesize\ttfamily std\+::unordered\+\_\+map$<$\mbox{\hyperlink{structFrameKey}{Frame\+Key}}, std\+::size\+\_\+t, \mbox{\hyperlink{structFrameKeyHasher}{Frame\+Key\+Hasher}}$>$ Decode\+Database\+::frame\+Index\+By\+Key} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00134}{134}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00014}{Dbc\+Decoder\+::\+Find\+Frame()}}. + +\mbox{\Hypertarget{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}\label{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}} +\index{DecodeDatabase@{DecodeDatabase}!frames@{frames}} +\index{frames@{frames}!DecodeDatabase@{DecodeDatabase}} +\doxysubsubsection{\texorpdfstring{frames}{frames}} +{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}}$>$ Decode\+Database\+::frames} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00133}{133}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00014}{Dbc\+Decoder\+::\+Find\+Frame()}}, and \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structDecodeFrame.tex b/docs/latex/structDecodeFrame.tex new file mode 100644 index 0000000..5ded82b --- /dev/null +++ b/docs/latex/structDecodeFrame.tex @@ -0,0 +1,191 @@ +\hypertarget{structDecodeFrame}{}\doxysection{Decode\+Frame Struct Reference} +\label{structDecodeFrame}\index{DecodeFrame@{DecodeFrame}} + + +Runtime-\/ready frame definition. + + + + +{\ttfamily \#include $<$decode\+\_\+database.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}{Decode\+Frame}} () +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +std\+::string \mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{can\+Id}} +\item +bool \mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{is\+Extended}} +\item +std\+::uint8\+\_\+t \mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{dlc}} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{pgn}} +\item +bool \mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{has\+Pgn}} +\item +std\+::string \mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{transmitter}} +\item +std\+::string \mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{comment}} +\item +std\+::vector$<$ \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} $>$ \mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Runtime-\/ready frame definition. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00072}{72}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}\label{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}} +\index{DecodeFrame@{DecodeFrame}!DecodeFrame@{DecodeFrame}} +\index{DecodeFrame@{DecodeFrame}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{DecodeFrame()}{DecodeFrame()}} +{\footnotesize\ttfamily Decode\+Frame\+::\+Decode\+Frame (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00083}{83}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}\label{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}} +\index{DecodeFrame@{DecodeFrame}!canId@{canId}} +\index{canId@{canId}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{canId}{canId}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Decode\+Frame\+::can\+Id} + +Normalized CAN ID. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00074}{74}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}\label{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}} +\index{DecodeFrame@{DecodeFrame}!comment@{comment}} +\index{comment@{comment}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{comment}{comment}} +{\footnotesize\ttfamily std\+::string Decode\+Frame\+::comment} + +Frame comment. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00080}{80}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}\label{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}} +\index{DecodeFrame@{DecodeFrame}!dlc@{dlc}} +\index{dlc@{dlc}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{dlc}{dlc}} +{\footnotesize\ttfamily std\+::uint8\+\_\+t Decode\+Frame\+::dlc} + +Payload length. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00076}{76}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}\label{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}} +\index{DecodeFrame@{DecodeFrame}!hasPgn@{hasPgn}} +\index{hasPgn@{hasPgn}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{hasPgn}{hasPgn}} +{\footnotesize\ttfamily bool Decode\+Frame\+::has\+Pgn} + +true if PGN is valid. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00078}{78}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}\label{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}} +\index{DecodeFrame@{DecodeFrame}!isExtended@{isExtended}} +\index{isExtended@{isExtended}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{isExtended}{isExtended}} +{\footnotesize\ttfamily bool Decode\+Frame\+::is\+Extended} + +true for extended frame. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00075}{75}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}\label{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}} +\index{DecodeFrame@{DecodeFrame}!name@{name}} +\index{name@{name}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{name}{name}} +{\footnotesize\ttfamily std\+::string Decode\+Frame\+::name} + +Frame name. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00073}{73}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + +\mbox{\Hypertarget{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}\label{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}} +\index{DecodeFrame@{DecodeFrame}!pgn@{pgn}} +\index{pgn@{pgn}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{pgn}{pgn}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Decode\+Frame\+::pgn} + +PGN if available. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00077}{77}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}\label{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}} +\index{DecodeFrame@{DecodeFrame}!signals@{signals}} +\index{signals@{signals}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{signals}{signals}} +{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}}$>$ Decode\+Frame\+::signals} + +Signal definitions. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00081}{81}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}. + +\mbox{\Hypertarget{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}\label{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}} +\index{DecodeFrame@{DecodeFrame}!transmitter@{transmitter}} +\index{transmitter@{transmitter}!DecodeFrame@{DecodeFrame}} +\doxysubsubsection{\texorpdfstring{transmitter}{transmitter}} +{\footnotesize\ttfamily std\+::string Decode\+Frame\+::transmitter} + +Transmitter ECU. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00079}{79}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structDecodeSignal.tex b/docs/latex/structDecodeSignal.tex new file mode 100644 index 0000000..a1df328 --- /dev/null +++ b/docs/latex/structDecodeSignal.tex @@ -0,0 +1,239 @@ +\hypertarget{structDecodeSignal}{}\doxysection{Decode\+Signal Struct Reference} +\label{structDecodeSignal}\index{DecodeSignal@{DecodeSignal}} + + +Runtime-\/ready signal definition. + + + + +{\ttfamily \#include $<$decode\+\_\+database.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structDecodeSignal_a93fd97267e2614979440261628e493f5}{Decode\+Signal}} () +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +std\+::string \mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{start\+Bit}} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}} +\item +\mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{Byte\+Order}} \mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byte\+Order}} +\item +\mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{Value\+Type}} \mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{value\+Type}} +\item +double \mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}} +\item +double \mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}} +\item +double \mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{minimum}} +\item +double \mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{maximum}} +\item +std\+::string \mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}} +\item +std\+::vector$<$ std\+::string $>$ \mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{receivers}} +\item +std\+::string \mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{comment}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Runtime-\/ready signal definition. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00039}{39}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{structDecodeSignal_a93fd97267e2614979440261628e493f5}\label{structDecodeSignal_a93fd97267e2614979440261628e493f5}} +\index{DecodeSignal@{DecodeSignal}!DecodeSignal@{DecodeSignal}} +\index{DecodeSignal@{DecodeSignal}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{DecodeSignal()}{DecodeSignal()}} +{\footnotesize\ttfamily Decode\+Signal\+::\+Decode\+Signal (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00053}{53}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}\label{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}} +\index{DecodeSignal@{DecodeSignal}!byteOrder@{byteOrder}} +\index{byteOrder@{byteOrder}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{byteOrder}{byteOrder}} +{\footnotesize\ttfamily \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{Byte\+Order}} Decode\+Signal\+::byte\+Order} + +Intel or Motorola. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00043}{43}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Dbc\+Decoder\+::\+Extract\+Unsigned()}}. + +\mbox{\Hypertarget{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}\label{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}} +\index{DecodeSignal@{DecodeSignal}!comment@{comment}} +\index{comment@{comment}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{comment}{comment}} +{\footnotesize\ttfamily std\+::string Decode\+Signal\+::comment} + +Comment. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00051}{51}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeSignal_a428c39913a366a8476dd291061354391}\label{structDecodeSignal_a428c39913a366a8476dd291061354391}} +\index{DecodeSignal@{DecodeSignal}!factor@{factor}} +\index{factor@{factor}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{factor}{factor}} +{\footnotesize\ttfamily double Decode\+Signal\+::factor} + +Scaling factor. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00045}{45}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}. + +\mbox{\Hypertarget{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}\label{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}} +\index{DecodeSignal@{DecodeSignal}!length@{length}} +\index{length@{length}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{length}{length}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Decode\+Signal\+::length} + +Signal length in bits. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00042}{42}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Dbc\+Decoder\+::\+Extract\+Unsigned()}}. + +\mbox{\Hypertarget{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}\label{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}} +\index{DecodeSignal@{DecodeSignal}!maximum@{maximum}} +\index{maximum@{maximum}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{maximum}{maximum}} +{\footnotesize\ttfamily double Decode\+Signal\+::maximum} + +Maximum physical value. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00048}{48}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}\label{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}} +\index{DecodeSignal@{DecodeSignal}!minimum@{minimum}} +\index{minimum@{minimum}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{minimum}{minimum}} +{\footnotesize\ttfamily double Decode\+Signal\+::minimum} + +Minimum physical value. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00047}{47}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}\label{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}} +\index{DecodeSignal@{DecodeSignal}!name@{name}} +\index{name@{name}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{name}{name}} +{\footnotesize\ttfamily std\+::string Decode\+Signal\+::name} + +Signal name. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00040}{40}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + +\mbox{\Hypertarget{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}\label{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}} +\index{DecodeSignal@{DecodeSignal}!offset@{offset}} +\index{offset@{offset}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{offset}{offset}} +{\footnotesize\ttfamily double Decode\+Signal\+::offset} + +Physical offset. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00046}{46}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}. + +\mbox{\Hypertarget{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}\label{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}} +\index{DecodeSignal@{DecodeSignal}!receivers@{receivers}} +\index{receivers@{receivers}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{receivers}{receivers}} +{\footnotesize\ttfamily std\+::vector$<$std\+::string$>$ Decode\+Signal\+::receivers} + +Receivers. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00050}{50}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}. + +\mbox{\Hypertarget{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}\label{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}} +\index{DecodeSignal@{DecodeSignal}!startBit@{startBit}} +\index{startBit@{startBit}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{startBit}{startBit}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Decode\+Signal\+::start\+Bit} + +DBC start bit. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00041}{41}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Dbc\+Decoder\+::\+Extract\+Unsigned()}}. + +\mbox{\Hypertarget{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}\label{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}} +\index{DecodeSignal@{DecodeSignal}!unit@{unit}} +\index{unit@{unit}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{unit}{unit}} +{\footnotesize\ttfamily std\+::string Decode\+Signal\+::unit} + +Physical unit. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00049}{49}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + +\mbox{\Hypertarget{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}\label{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}} +\index{DecodeSignal@{DecodeSignal}!valueType@{valueType}} +\index{valueType@{valueType}!DecodeSignal@{DecodeSignal}} +\doxysubsubsection{\texorpdfstring{valueType}{valueType}} +{\footnotesize\ttfamily \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{Value\+Type}} Decode\+Signal\+::value\+Type} + +Signed or unsigned. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00044}{44}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structDecodedFrameValue.tex b/docs/latex/structDecodedFrameValue.tex new file mode 100644 index 0000000..6007866 --- /dev/null +++ b/docs/latex/structDecodedFrameValue.tex @@ -0,0 +1,95 @@ +\hypertarget{structDecodedFrameValue}{}\doxysection{Decoded\+Frame\+Value Struct Reference} +\label{structDecodedFrameValue}\index{DecodedFrameValue@{DecodedFrameValue}} + + +Fully decoded frame. + + + + +{\ttfamily \#include $<$dbc\+\_\+decoder.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}{Decoded\+Frame\+Value}} () +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +const \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} $\ast$ \mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}} +\item +std\+::vector$<$ \mbox{\hyperlink{structDecodedSignalValue}{Decoded\+Signal\+Value}} $>$ \mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}} +\item +bool \mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Fully decoded frame. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00055}{55}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}\label{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}} +\index{DecodedFrameValue@{DecodedFrameValue}!DecodedFrameValue@{DecodedFrameValue}} +\index{DecodedFrameValue@{DecodedFrameValue}!DecodedFrameValue@{DecodedFrameValue}} +\doxysubsubsection{\texorpdfstring{DecodedFrameValue()}{DecodedFrameValue()}} +{\footnotesize\ttfamily Decoded\+Frame\+Value\+::\+Decoded\+Frame\+Value (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00060}{60}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}\label{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}} +\index{DecodedFrameValue@{DecodedFrameValue}!definition@{definition}} +\index{definition@{definition}!DecodedFrameValue@{DecodedFrameValue}} +\doxysubsubsection{\texorpdfstring{definition}{definition}} +{\footnotesize\ttfamily const \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}}$\ast$ Decoded\+Frame\+Value\+::definition} + +Frame definition. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00056}{56}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + +\mbox{\Hypertarget{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}\label{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}} +\index{DecodedFrameValue@{DecodedFrameValue}!signals@{signals}} +\index{signals@{signals}!DecodedFrameValue@{DecodedFrameValue}} +\doxysubsubsection{\texorpdfstring{signals}{signals}} +{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structDecodedSignalValue}{Decoded\+Signal\+Value}}$>$ Decoded\+Frame\+Value\+::signals} + +Decoded signal values. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00057}{57}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + +\mbox{\Hypertarget{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}\label{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}} +\index{DecodedFrameValue@{DecodedFrameValue}!valid@{valid}} +\index{valid@{valid}!DecodedFrameValue@{DecodedFrameValue}} +\doxysubsubsection{\texorpdfstring{valid}{valid}} +{\footnotesize\ttfamily bool Decoded\+Frame\+Value\+::valid} + +true if frame was matched. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00058}{58}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structDecodedSignalValue.tex b/docs/latex/structDecodedSignalValue.tex new file mode 100644 index 0000000..1101ed5 --- /dev/null +++ b/docs/latex/structDecodedSignalValue.tex @@ -0,0 +1,111 @@ +\hypertarget{structDecodedSignalValue}{}\doxysection{Decoded\+Signal\+Value Struct Reference} +\label{structDecodedSignalValue}\index{DecodedSignalValue@{DecodedSignalValue}} + + +One decoded signal value. + + + + +{\ttfamily \#include $<$dbc\+\_\+decoder.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}{Decoded\+Signal\+Value}} () +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +const \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} $\ast$ \mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}} +\item +std\+::int64\+\_\+t \mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{raw\+Value}} +\item +double \mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physical\+Value}} +\item +bool \mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +One decoded signal value. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00038}{38}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}\label{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}} +\index{DecodedSignalValue@{DecodedSignalValue}!DecodedSignalValue@{DecodedSignalValue}} +\index{DecodedSignalValue@{DecodedSignalValue}!DecodedSignalValue@{DecodedSignalValue}} +\doxysubsubsection{\texorpdfstring{DecodedSignalValue()}{DecodedSignalValue()}} +{\footnotesize\ttfamily Decoded\+Signal\+Value\+::\+Decoded\+Signal\+Value (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00044}{44}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}\label{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}} +\index{DecodedSignalValue@{DecodedSignalValue}!definition@{definition}} +\index{definition@{definition}!DecodedSignalValue@{DecodedSignalValue}} +\doxysubsubsection{\texorpdfstring{definition}{definition}} +{\footnotesize\ttfamily const \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}}$\ast$ Decoded\+Signal\+Value\+::definition} + +Signal definition. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00039}{39}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + +\mbox{\Hypertarget{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}\label{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}} +\index{DecodedSignalValue@{DecodedSignalValue}!physicalValue@{physicalValue}} +\index{physicalValue@{physicalValue}!DecodedSignalValue@{DecodedSignalValue}} +\doxysubsubsection{\texorpdfstring{physicalValue}{physicalValue}} +{\footnotesize\ttfamily double Decoded\+Signal\+Value\+::physical\+Value} + +Converted physical value. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00041}{41}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + +\mbox{\Hypertarget{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}\label{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}} +\index{DecodedSignalValue@{DecodedSignalValue}!rawValue@{rawValue}} +\index{rawValue@{rawValue}!DecodedSignalValue@{DecodedSignalValue}} +\doxysubsubsection{\texorpdfstring{rawValue}{rawValue}} +{\footnotesize\ttfamily std\+::int64\+\_\+t Decoded\+Signal\+Value\+::raw\+Value} + +Extracted raw integer value. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00040}{40}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + +\mbox{\Hypertarget{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}\label{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}} +\index{DecodedSignalValue@{DecodedSignalValue}!valid@{valid}} +\index{valid@{valid}!DecodedSignalValue@{DecodedSignalValue}} +\doxysubsubsection{\texorpdfstring{valid}{valid}} +{\footnotesize\ttfamily bool Decoded\+Signal\+Value\+::valid} + +true if decoding succeeded. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00042}{42}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structFrameInfo.tex b/docs/latex/structFrameInfo.tex new file mode 100644 index 0000000..d150190 --- /dev/null +++ b/docs/latex/structFrameInfo.tex @@ -0,0 +1,191 @@ +\hypertarget{structFrameInfo}{}\doxysection{Frame\+Info Struct Reference} +\label{structFrameInfo}\index{FrameInfo@{FrameInfo}} + + +Describes one CAN frame from a DBC file. + + + + +{\ttfamily \#include $<$frame\+\_\+info.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}{Frame\+Info}} () +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +std\+::string \mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{can\+Id}} +\item +bool \mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{is\+Extended}} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}} +\item +bool \mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{has\+Pgn}} +\item +std\+::uint8\+\_\+t \mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}} +\item +std\+::string \mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}} +\item +std\+::string \mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}} +\item +std\+::vector$<$ \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $>$ \mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Describes one CAN frame from a DBC file. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00024}{24}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}\label{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}} +\index{FrameInfo@{FrameInfo}!FrameInfo@{FrameInfo}} +\index{FrameInfo@{FrameInfo}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{FrameInfo()}{FrameInfo()}} +{\footnotesize\ttfamily Frame\+Info\+::\+Frame\+Info (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00035}{35}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}\label{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}} +\index{FrameInfo@{FrameInfo}!canId@{canId}} +\index{canId@{canId}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{canId}{canId}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Frame\+Info\+::can\+Id} + +Normalized CAN identifier. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00026}{26}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{structFrameInfo_ace75121294f9d89b762080ab5643293c}\label{structFrameInfo_ace75121294f9d89b762080ab5643293c}} +\index{FrameInfo@{FrameInfo}!comment@{comment}} +\index{comment@{comment}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{comment}{comment}} +{\footnotesize\ttfamily std\+::string Frame\+Info\+::comment} + +Optional frame comment. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00032}{32}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Dbc\+Parser\+::\+Parse\+Comment\+Line()}}. + +\mbox{\Hypertarget{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}\label{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}} +\index{FrameInfo@{FrameInfo}!dlc@{dlc}} +\index{dlc@{dlc}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{dlc}{dlc}} +{\footnotesize\ttfamily std\+::uint8\+\_\+t Frame\+Info\+::dlc} + +Frame payload length. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00030}{30}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}\label{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}} +\index{FrameInfo@{FrameInfo}!hasPgn@{hasPgn}} +\index{hasPgn@{hasPgn}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{hasPgn}{hasPgn}} +{\footnotesize\ttfamily bool Frame\+Info\+::has\+Pgn} + +true if PGN was derived. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00029}{29}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}\label{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}} +\index{FrameInfo@{FrameInfo}!isExtended@{isExtended}} +\index{isExtended@{isExtended}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{isExtended}{isExtended}} +{\footnotesize\ttfamily bool Frame\+Info\+::is\+Extended} + +true for extended frame. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00027}{27}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}\label{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}} +\index{FrameInfo@{FrameInfo}!name@{name}} +\index{name@{name}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{name}{name}} +{\footnotesize\ttfamily std\+::string Frame\+Info\+::name} + +Frame name. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00025}{25}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}. + +\mbox{\Hypertarget{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}\label{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}} +\index{FrameInfo@{FrameInfo}!pgn@{pgn}} +\index{pgn@{pgn}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{pgn}{pgn}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Frame\+Info\+::pgn} + +J1939 PGN if applicable. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00028}{28}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}\label{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}} +\index{FrameInfo@{FrameInfo}!signals@{signals}} +\index{signals@{signals}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{signals}{signals}} +{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structSignalInfo}{Signal\+Info}}$>$ Frame\+Info\+::signals} + +Signals contained in the frame. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00033}{33}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__tree__builder_8cpp_source_l00014}{Dbc\+Tree\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00349}{Dbc\+Parser\+::\+Find\+Signal\+By\+Name()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Dbc\+Parser\+::\+Parse\+File()}}. + +\mbox{\Hypertarget{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}\label{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}} +\index{FrameInfo@{FrameInfo}!transmitter@{transmitter}} +\index{transmitter@{transmitter}!FrameInfo@{FrameInfo}} +\doxysubsubsection{\texorpdfstring{transmitter}{transmitter}} +{\footnotesize\ttfamily std\+::string Frame\+Info\+::transmitter} + +Transmitter ECU name. + +Definition at line \mbox{\hyperlink{frame__info_8h_source_l00031}{31}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{frame__info_8h}{frame\+\_\+info.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structFrameKey.tex b/docs/latex/structFrameKey.tex new file mode 100644 index 0000000..174e5b8 --- /dev/null +++ b/docs/latex/structFrameKey.tex @@ -0,0 +1,110 @@ +\hypertarget{structFrameKey}{}\doxysection{Frame\+Key Struct Reference} +\label{structFrameKey}\index{FrameKey@{FrameKey}} + + +Key for fast frame lookup. + + + + +{\ttfamily \#include $<$decode\+\_\+database.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}{Frame\+Key}} () +\item +\mbox{\hyperlink{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}{Frame\+Key}} (std\+::uint32\+\_\+t id, bool extended) +\item +bool \mbox{\hyperlink{structFrameKey_aaaec9f914e127787247fcda5e183b01f}{operator==}} (const \mbox{\hyperlink{structFrameKey}{Frame\+Key}} \&other) const +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{can\+Id}} +\item +bool \mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{is\+Extended}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Key for fast frame lookup. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00099}{99}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}\label{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}} +\index{FrameKey@{FrameKey}!FrameKey@{FrameKey}} +\index{FrameKey@{FrameKey}!FrameKey@{FrameKey}} +\doxysubsubsection{\texorpdfstring{FrameKey()}{FrameKey()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily Frame\+Key\+::\+Frame\+Key (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00103}{103}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + +\mbox{\Hypertarget{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}\label{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}} +\index{FrameKey@{FrameKey}!FrameKey@{FrameKey}} +\index{FrameKey@{FrameKey}!FrameKey@{FrameKey}} +\doxysubsubsection{\texorpdfstring{FrameKey()}{FrameKey()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily Frame\+Key\+::\+Frame\+Key (\begin{DoxyParamCaption}\item[{std\+::uint32\+\_\+t}]{id, }\item[{bool}]{extended }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00108}{108}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{structFrameKey_aaaec9f914e127787247fcda5e183b01f}\label{structFrameKey_aaaec9f914e127787247fcda5e183b01f}} +\index{FrameKey@{FrameKey}!operator==@{operator==}} +\index{operator==@{operator==}!FrameKey@{FrameKey}} +\doxysubsubsection{\texorpdfstring{operator==()}{operator==()}} +{\footnotesize\ttfamily bool Frame\+Key\+::operator== (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structFrameKey}{Frame\+Key}} \&}]{other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00113}{113}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +References \mbox{\hyperlink{decode__database_8h_source_l00100}{can\+Id}}, and \mbox{\hyperlink{decode__database_8h_source_l00101}{is\+Extended}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}\label{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}} +\index{FrameKey@{FrameKey}!canId@{canId}} +\index{canId@{canId}!FrameKey@{FrameKey}} +\doxysubsubsection{\texorpdfstring{canId}{canId}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Frame\+Key\+::can\+Id} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00100}{100}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{decode__database_8h_source_l00122}{Frame\+Key\+Hasher\+::operator()()}}, and \mbox{\hyperlink{decode__database_8h_source_l00113}{operator==()}}. + +\mbox{\Hypertarget{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}\label{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}} +\index{FrameKey@{FrameKey}!isExtended@{isExtended}} +\index{isExtended@{isExtended}!FrameKey@{FrameKey}} +\doxysubsubsection{\texorpdfstring{isExtended}{isExtended}} +{\footnotesize\ttfamily bool Frame\+Key\+::is\+Extended} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00101}{101}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +Referenced by \mbox{\hyperlink{decode__database_8h_source_l00122}{Frame\+Key\+Hasher\+::operator()()}}, and \mbox{\hyperlink{decode__database_8h_source_l00113}{operator==()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structFrameKeyHasher.tex b/docs/latex/structFrameKeyHasher.tex new file mode 100644 index 0000000..1bec1a6 --- /dev/null +++ b/docs/latex/structFrameKeyHasher.tex @@ -0,0 +1,45 @@ +\hypertarget{structFrameKeyHasher}{}\doxysection{Frame\+Key\+Hasher Struct Reference} +\label{structFrameKeyHasher}\index{FrameKeyHasher@{FrameKeyHasher}} + + +Hasher for frame key. + + + + +{\ttfamily \#include $<$decode\+\_\+database.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +std\+::size\+\_\+t \mbox{\hyperlink{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}{operator()}} (const \mbox{\hyperlink{structFrameKey}{Frame\+Key}} \&key) const +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Hasher for frame key. + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00121}{121}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}\label{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}} +\index{FrameKeyHasher@{FrameKeyHasher}!operator()@{operator()}} +\index{operator()@{operator()}!FrameKeyHasher@{FrameKeyHasher}} +\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}} +{\footnotesize\ttfamily std\+::size\+\_\+t Frame\+Key\+Hasher\+::operator() (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structFrameKey}{Frame\+Key}} \&}]{key }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{decode__database_8h_source_l00122}{122}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}. + + + +References \mbox{\hyperlink{decode__database_8h_source_l00100}{Frame\+Key\+::can\+Id}}, and \mbox{\hyperlink{decode__database_8h_source_l00101}{Frame\+Key\+::is\+Extended}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structRawCanFrame.tex b/docs/latex/structRawCanFrame.tex new file mode 100644 index 0000000..f0c23e9 --- /dev/null +++ b/docs/latex/structRawCanFrame.tex @@ -0,0 +1,95 @@ +\hypertarget{structRawCanFrame}{}\doxysection{Raw\+Can\+Frame Struct Reference} +\label{structRawCanFrame}\index{RawCanFrame@{RawCanFrame}} + + +Raw CAN frame used for runtime or trace decoding. + + + + +{\ttfamily \#include $<$dbc\+\_\+decoder.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}{Raw\+Can\+Frame}} () +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{can\+Id}} +\item +bool \mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{is\+Extended}} +\item +std\+::vector$<$ std\+::uint8\+\_\+t $>$ \mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Raw CAN frame used for runtime or trace decoding. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00023}{23}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}\label{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}} +\index{RawCanFrame@{RawCanFrame}!RawCanFrame@{RawCanFrame}} +\index{RawCanFrame@{RawCanFrame}!RawCanFrame@{RawCanFrame}} +\doxysubsubsection{\texorpdfstring{RawCanFrame()}{RawCanFrame()}} +{\footnotesize\ttfamily Raw\+Can\+Frame\+::\+Raw\+Can\+Frame (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00028}{28}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}\label{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}} +\index{RawCanFrame@{RawCanFrame}!canId@{canId}} +\index{canId@{canId}!RawCanFrame@{RawCanFrame}} +\doxysubsubsection{\texorpdfstring{canId}{canId}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Raw\+Can\+Frame\+::can\+Id} + +Normalized CAN ID. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00024}{24}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}. + +\mbox{\Hypertarget{structRawCanFrame_a0acb487612104c99c9907344c035df83}\label{structRawCanFrame_a0acb487612104c99c9907344c035df83}} +\index{RawCanFrame@{RawCanFrame}!data@{data}} +\index{data@{data}!RawCanFrame@{RawCanFrame}} +\doxysubsubsection{\texorpdfstring{data}{data}} +{\footnotesize\ttfamily std\+::vector$<$std\+::uint8\+\_\+t$>$ Raw\+Can\+Frame\+::data} + +Payload bytes. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00026}{26}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}. + +\mbox{\Hypertarget{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}\label{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}} +\index{RawCanFrame@{RawCanFrame}!isExtended@{isExtended}} +\index{isExtended@{isExtended}!RawCanFrame@{RawCanFrame}} +\doxysubsubsection{\texorpdfstring{isExtended}{isExtended}} +{\footnotesize\ttfamily bool Raw\+Can\+Frame\+::is\+Extended} + +true for extended frame. + +Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00025}{25}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/structSignalInfo.tex b/docs/latex/structSignalInfo.tex new file mode 100644 index 0000000..89b97d8 --- /dev/null +++ b/docs/latex/structSignalInfo.tex @@ -0,0 +1,239 @@ +\hypertarget{structSignalInfo}{}\doxysection{Signal\+Info Struct Reference} +\label{structSignalInfo}\index{SignalInfo@{SignalInfo}} + + +Describes one signal inside a DBC frame. + + + + +{\ttfamily \#include $<$signal\+\_\+info.\+h$>$} + +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{structSignalInfo_aa2d2cd238118015258e271dce92a971e}{Signal\+Info}} () +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +std\+::string \mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{start\+Bit}} +\item +std\+::uint32\+\_\+t \mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}} +\item +bool \mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{is\+Little\+Endian}} +\item +bool \mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{is\+Signed}} +\item +double \mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}} +\item +double \mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}} +\item +double \mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}} +\item +double \mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}} +\item +std\+::string \mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}} +\item +std\+::vector$<$ std\+::string $>$ \mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}} +\item +std\+::string \mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Describes one signal inside a DBC frame. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00022}{22}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{structSignalInfo_aa2d2cd238118015258e271dce92a971e}\label{structSignalInfo_aa2d2cd238118015258e271dce92a971e}} +\index{SignalInfo@{SignalInfo}!SignalInfo@{SignalInfo}} +\index{SignalInfo@{SignalInfo}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{SignalInfo()}{SignalInfo()}} +{\footnotesize\ttfamily Signal\+Info\+::\+Signal\+Info (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00036}{36}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +\doxysubsection{Member Data Documentation} +\mbox{\Hypertarget{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}\label{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}} +\index{SignalInfo@{SignalInfo}!comment@{comment}} +\index{comment@{comment}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{comment}{comment}} +{\footnotesize\ttfamily std\+::string Signal\+Info\+::comment} + +Optional signal comment. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00034}{34}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Dbc\+Parser\+::\+Parse\+Comment\+Line()}}. + +\mbox{\Hypertarget{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}\label{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}} +\index{SignalInfo@{SignalInfo}!factor@{factor}} +\index{factor@{factor}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{factor}{factor}} +{\footnotesize\ttfamily double Signal\+Info\+::factor} + +Scaling factor. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00028}{28}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}. + +\mbox{\Hypertarget{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}\label{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}} +\index{SignalInfo@{SignalInfo}!isLittleEndian@{isLittleEndian}} +\index{isLittleEndian@{isLittleEndian}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{isLittleEndian}{isLittleEndian}} +{\footnotesize\ttfamily bool Signal\+Info\+::is\+Little\+Endian} + +true for Intel, false for Motorola. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00026}{26}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}. + +\mbox{\Hypertarget{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}\label{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}} +\index{SignalInfo@{SignalInfo}!isSigned@{isSigned}} +\index{isSigned@{isSigned}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{isSigned}{isSigned}} +{\footnotesize\ttfamily bool Signal\+Info\+::is\+Signed} + +true if signal is signed. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00027}{27}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}. + +\mbox{\Hypertarget{structSignalInfo_a1008b5201f71848177217bd52fb84baa}\label{structSignalInfo_a1008b5201f71848177217bd52fb84baa}} +\index{SignalInfo@{SignalInfo}!length@{length}} +\index{length@{length}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{length}{length}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Signal\+Info\+::length} + +Signal length in bits. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00025}{25}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}\label{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}} +\index{SignalInfo@{SignalInfo}!maximum@{maximum}} +\index{maximum@{maximum}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{maximum}{maximum}} +{\footnotesize\ttfamily double Signal\+Info\+::maximum} + +Maximum physical value. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00031}{31}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}. + +\mbox{\Hypertarget{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}\label{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}} +\index{SignalInfo@{SignalInfo}!minimum@{minimum}} +\index{minimum@{minimum}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{minimum}{minimum}} +{\footnotesize\ttfamily double Signal\+Info\+::minimum} + +Minimum physical value. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00030}{30}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}. + +\mbox{\Hypertarget{structSignalInfo_a379e422a00cad56f896cacf60455b088}\label{structSignalInfo_a379e422a00cad56f896cacf60455b088}} +\index{SignalInfo@{SignalInfo}!name@{name}} +\index{name@{name}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{name}{name}} +{\footnotesize\ttfamily std\+::string Signal\+Info\+::name} + +Signal name. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00023}{23}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}. + +\mbox{\Hypertarget{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}\label{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}} +\index{SignalInfo@{SignalInfo}!offset@{offset}} +\index{offset@{offset}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{offset}{offset}} +{\footnotesize\ttfamily double Signal\+Info\+::offset} + +Physical offset. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00029}{29}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}. + +\mbox{\Hypertarget{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}\label{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}} +\index{SignalInfo@{SignalInfo}!receivers@{receivers}} +\index{receivers@{receivers}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{receivers}{receivers}} +{\footnotesize\ttfamily std\+::vector$<$std\+::string$>$ Signal\+Info\+::receivers} + +Signal receivers. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00033}{33}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}. + +\mbox{\Hypertarget{structSignalInfo_ace290724f9801521609aedaa946d61f1}\label{structSignalInfo_ace290724f9801521609aedaa946d61f1}} +\index{SignalInfo@{SignalInfo}!startBit@{startBit}} +\index{startBit@{startBit}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{startBit}{startBit}} +{\footnotesize\ttfamily std\+::uint32\+\_\+t Signal\+Info\+::start\+Bit} + +Start bit in DBC notation. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00024}{24}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + +\mbox{\Hypertarget{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}\label{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}} +\index{SignalInfo@{SignalInfo}!unit@{unit}} +\index{unit@{unit}!SignalInfo@{SignalInfo}} +\doxysubsubsection{\texorpdfstring{unit}{unit}} +{\footnotesize\ttfamily std\+::string Signal\+Info\+::unit} + +Physical unit. + +Definition at line \mbox{\hyperlink{signal__info_8h_source_l00032}{32}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}. + + + +Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}. + + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{signal__info_8h}{signal\+\_\+info.\+h}}\end{DoxyCompactItemize} diff --git a/docs/latex/tabu_doxygen.sty b/docs/latex/tabu_doxygen.sty new file mode 100644 index 0000000..3f17d1d --- /dev/null +++ b/docs/latex/tabu_doxygen.sty @@ -0,0 +1,2557 @@ +%% +%% This is file `tabu.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% tabu.dtx (with options: `package') +%% +%% This is a generated file. +%% Copyright (FC) 2010-2011 - lppl +%% +%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars +%% +%% ********************************************************************************************** +%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal +%% \begin{tabu} to { preamble } => target specified +%% \begin{tabu} spread { preamble } => target relative to the ``natural width'' +%% +%% tabu works in text and in math modes. +%% +%% X columns: automatic width adjustment + horizontal and vertical alignment +%% \begin{tabu} { X[4c] X[1c] X[-2ml] } +%% +%% Horizontal lines and / or leaders: +%% \hline\hline => double horizontal line +%% \firsthline\hline => for nested tabulars +%% \lasthline\hline => for nested tabulars +%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader) +%% Automatic lines / leaders : +%% \everyrow{\hline\hline} +%% +%% Vertical lines and / or leaders: +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] } +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] } +%% +%% Fixed vertical spacing adjustment: +%% \extrarowheight= \extrarowdepth= +%% or: \extrarowsep= => may be prefixed by \global +%% +%% Dynamic vertical spacing adjustment: +%% \abovetabulinesep= \belowtabulinesep= +%% or: \tabulinesep= => may be prefixed by \global +%% +%% delarray.sty shortcuts: in math and text modes +%% \begin{tabu} .... \({ preamble }\) +%% +%% Algorithms reports: +%% \tracingtabu=1 \tracingtabu=2 +%% +%% ********************************************************************************************** +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% +%% This work consists of the main source file tabu.dtx +%% and the derived files +%% tabu.sty, tabu.pdf, tabu.ins +%% +%% tabu : Flexible LaTeX tabulars +%% lppl copyright 2010-2011 by FC +%% + +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen] +\RequirePackage{array}[2008/09/09] +\RequirePackage{varwidth}[2009/03/30] +\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined} +\let\tabu@AtEnd\@empty +\def\TMP@EnsureCode#1={% + \edef\tabu@AtEnd{\tabu@AtEnd + \catcode#1 \the\catcode#1}% + \catcode#1=% +}% \TMP@EnsureCode +\TMP@EnsureCode 33 = 12 % ! +\TMP@EnsureCode 58 = 12 % : (for siunitx) +\TMP@EnsureCode124 = 12 % | +\TMP@EnsureCode 36 = 3 % $ = math shift +\TMP@EnsureCode 38 = 4 % & = tab alignment character +\TMP@EnsureCode 32 = 10 % space +\TMP@EnsureCode 94 = 7 % ^ +\TMP@EnsureCode 95 = 8 % _ +%% Constants -------------------------------------------------------- +\newcount \c@taburow \def\thetaburow {\number\c@taburow} +\newcount \tabu@nbcols +\newcount \tabu@cnt +\newcount \tabu@Xcol +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcount \tabu@alloc \tabu@alloc=\m@ne +\newcount \tabu@nested +\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc} +\newdimen \tabu@target +\newdimen \tabu@spreadtarget +\newdimen \tabu@naturalX +\newdimen \tabucolX +\let\tabu@DELTA \@tempdimc +\let\tabu@thick \@tempdima +\let\tabu@on \@tempdimb +\let\tabu@off \@tempdimc +\newdimen \tabu@Xsum +\newdimen \extrarowdepth +\newdimen \abovetabulinesep +\newdimen \belowtabulinesep +\newdimen \tabustrutrule \tabustrutrule \z@ +\newtoks \tabu@thebody +\newtoks \tabu@footnotes +\newsavebox \tabu@box +\newsavebox \tabu@arstrutbox +\newsavebox \tabu@hleads +\newsavebox \tabu@vleads +\newif \iftabu@colortbl +\newif \iftabu@siunitx +\newif \iftabu@measuring +\newif \iftabu@spread +\newif \iftabu@negcoef +\newif \iftabu@everyrow +\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue} +\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse} +\newif \iftabu@long +\newif \iftabuscantokens +\def\tabu@rescan {\tabu@verbatim \scantokens } +%% Utilities (for internal usage) ----------------------------------- +\def\tabu@gobblespace #1 {#1} +\def\tabu@gobbletoken #1#2{#1} +\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex} +\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble + \else\ifx \@sptoken\@let@token + \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX + \fi\fi +}% \tabu@gobblex +\def\tabu@X{^^J} +{\obeyspaces +\global\let\tabu@spxiii= % saves an active space (for \ifx) +\gdef\tabu@@spxiii{ }} +\def\tabu@ifenvir {% only for \multicolumn + \expandafter\tabu@if@nvir\csname\@currenvir\endcsname +}% \tabu@ifenvir +\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else + \ifx\longtabu#1first\else + second\fi\fi oftwo\endcsname +}% \tabu@ifenvir +\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi} +{\catcode`\&=3 +\gdef\tabu@strtrim #1{% #1 = control sequence to trim + \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi + \let\tabu@c@l@r \@empty \let#1\@empty + \else \expandafter \tabu@trimspaces #1\@nnil + \fi +}% \tabu@strtrim +\gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }% +\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&} +\gdef\tabu@lastspace #1{\def #3{#1}% + \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi + \tabu@trimspaces #1\@nnil} +}% \catcode +\def\tabu@sanitizearg #1#2{{% + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2% + \expandafter}\expandafter\def\expandafter#2\expandafter{#2}% +}% \tabu@sanitizearg +\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}% + \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!! +}% \tabu@textbar +\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi} +\def\tabu@everyrow@egroup{% + \iftabu@everyrow \expandafter \endgroup \the\toks@ + \else \ifnum0=`{\fi}% + \fi +}% \tabu@everyrow@egroup +\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \z@}% +}% \tabu@arstrut +\def\tabu@rearstrut {% + \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax + \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax + \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima + \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi + \tabu@mkarstrut + \fi +}% \tabu@rearstrut +\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi} +\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox + \hbox to\z@{\hbox to\z@{\hss + {\tabu@DBG{cyan}\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \z@ + width \tabustrutrule}\kern-\tabustrutrule + {\tabu@DBG{pink}\vrule + height \z@ + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \tabustrutrule}}}% +}% \tabu@DBG@arstrut +\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@ + \@nextchar}}% +\def\tabu@savedecl{\ifcat$\d@llarend\else + \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode +}% \tabu@savedecl +\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@} +\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k } +\let\tabu@trialh@@k \@empty +\def\tabu@nowrite #1#{{\afterassignment}\toks@} +\let\tabu@write\write +\let\tabu@immediate\immediate +\def\tabu@WRITE{\begingroup + \def\immediate\write{\aftergroup\endgroup + \tabu@immediate\tabu@write}% +}% \tabu@WRITE +\expandafter\def\expandafter\tabu@GenericError\expandafter{% + \expandafter\tabu@WRITE\GenericError} +\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}} +\def\tabu@noxfootnote [#1]{\@gobble} +\def\tabu@nocolor #1#{\@gobble} +\newcommand*\tabu@norowcolor[2][]{} +\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}% + \futurelet\@let@token \tabu@m@ybesiunitx} +\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {% + \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi + \tabu@temp}% \tabu@m@ybesiunitx +}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname +\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}% +%% Fixed vertical spacing adjustment: \extrarowsep ------------------ +\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}% + \iftabu@everyrow \aftergroup\tabu@Gextra + \else \aftergroup\tabu@n@Gextra + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra +}% \extrarowsep +\def\tabu@extra {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setextrasep \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extra +\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2} +\def\tabu@extr@ #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extr@ +\def\tabu@setextrasep {\extrarowheight=\extrarowdepth + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth +}% \tabu@setextrasep +\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi} +\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi} +\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra} +\let\tabu@C@extra \z@ +\let\tabu@G@extra \@empty +%% Dynamic vertical spacing adjustment: \tabulinesep ---------------- +\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}% + \iftabu@everyrow \aftergroup\tabu@Glinesep + \else \aftergroup\tabu@n@Glinesep + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep +}% \tabulinesep +\def\tabu@linesep {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setlinesep \abovetabulinesep + \fi \tabu@temp}% +}% \tabu@linesep +\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2} +\def\tabu@sets@p #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep + \fi \tabu@temp}% +}% \tabu@sets@p +\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep +}% \tabu@setlinesep +\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi} +\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi} +\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep} +\let\tabu@C@linesep \z@ +\let\tabu@G@linesep \@empty +%% \global\extrarowsep and \global\tabulinesep ------------------- +\def\tabu@Gsave #1#2#3#4{\xdef#1{#1% + \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}% +}% \tabu@Gsave +\def\tabu@Grestore#1#2{% + \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax + \ifcat$\the\toks\currentgrouplevel$\else + \global\let#1\@empty \global\let#2\z@ + \the\toks\currentgrouplevel + \fi +}% \tabu@Grestore +%% Setting code for every row --------------------------------------- +\newcommand*\everyrow{\tabu@everyrow@bgroup + \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop +}% \everyrow +\def\tabu@evrstartstop {\@ifnextchar^% + {\afterassignment \tabu@evrstartstop \tabu@stop=}% + {\ifx ^\@let@token + \afterassignment\tabu@evrstartstop \tabu@start=% + \else \afterassignment\tabu@everyr@w \toks@ + \fi}% +}% \tabu@evrstartstop +\def\tabu@everyr@w {% + \xdef\tabu@everyrow{% + \noexpand\tabu@everyrowfalse + \let\noalign \relax + \noexpand\tabu@rowfontreset + \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors + \let\noexpand\tabu@docline \noexpand\tabu@docline@evr + \the\toks@ + \noexpand\tabu@evrh@@k + \noexpand\tabu@rearstrut + \global\advance\c@taburow \@ne}% + \iftabu@everyrow \toks@\expandafter + {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}% + \else \xdef\tabu@evr@G{\the\toks@}% + \fi + \tabu@everyrow@egroup +}% \tabu@everyr@w +\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only +\tabu@evr{} +%% line style and leaders ------------------------------------------- +\newcommand*\newtabulinestyle [1]{% + {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}% +}% \newtabulinestyle +\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}% + \tabu@sanitizearg {#1}\@tempa + \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi + \global\expandafter\let + \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi +}% \tabu@newlinestyle +\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}% + \iftabu@everyrow + \toks@\expandafter{\expandafter \def \expandafter + \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}% + \gdef\tabu@ls@{\tabu@ls@L}% + \else + \global\let\tabu@ls@G \tabu@thestyle + \gdef\tabu@ls@{\tabu@ls@G}% + \fi + \tabu@everyrow@egroup +}% \tabulinestyle +\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor} +\def\tabu@rulecolor #1{\toks@{}% + \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1% + \tabu@temp + \tabu@rulearc +}% \tabu@rulecolor +\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp + \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}% + \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}% + \fi + \tabu@temp +}% \tabu@ruledrsc@ +\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}} +\def\tabu@rule@drsc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}% + \else \toks@{\def\CT@drsc@{\color #1{#2}}}% + \fi + \else + \ifx \\#1#2\\\global\let\CT@drsc@ \relax + \else \gdef\CT@drsc@{\color #1{#2}}% + \fi + \fi + \tabu@rulearc +}% \tabu@rule@drsc@ +\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}} +\def\tabu@rule@arc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}% + \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}% + \fi + \toks@\expandafter{\the\toks@ + \let\tabu@arc@L \CT@arc@ + \let\tabu@drsc@L \CT@drsc@ + \ignorespaces}% + \else + \ifx \\#1#2\\\gdef\CT@arc@{}% + \else \gdef\CT@arc@{\color #1{#2}}% + \fi + \global\let\tabu@arc@G \CT@arc@ + \global\let\tabu@drsc@G \CT@drsc@ + \fi + \tabu@everyrow@egroup +}% \tabu@rule@arc@ +\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1} +\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}} +\def\tabu@rowc@lors #1#2#3{% + \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil + \@defaultunits \tabu@start =\number0#1\relax \@nnil + \ifnum \count@<\tw@ \count@=\tw@ \fi + \advance\tabu@start \m@ne + \ifnum \tabu@start<\z@ \tabu@start \z@ \fi + \tabu@rowcolorseries #3\in@..\in@ \@nnil +}% \tabu@rowcolors +\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {% + \ifx \in@#1\relax + \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}% + \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@ + \fi + \else + \ifx \\#2\\\tabu@rowcolorserieserror \fi + \tabu@sanitizearg{#1}\tabu@temp + \tabu@sanitizearg{#2}\@tempa + \advance\count@ \m@ne + \iftabu@everyrow + \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{% + \ifnum ##2=\c@taburow + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi + \ifnum \c@taburow<##2 \else + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@ + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}\fi}% + }\edef\x{\noexpand\tabu@rc@ {\the\count@} + {\the\tabu@start} + {\tabu@temp} + {\@tempa}% + }\x + \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}% + \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}% + \else % inside \noalign + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}% + \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}% + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}% + \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{% + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}}% + }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x + \global\let\tabu@rc@G \tabu@rc@ + \fi + \fi + \tabu@everyrow@egroup +}% \tabu@rowcolorseries +\tabuDisableCommands {\let\tabu@rc@ \@empty } +\def\tabu@rowcolorserieserror {\PackageError{tabu} + {Invalid syntax for \string\taburowcolors + \MessageBreak Please look at the documentation!}\@ehd +}% \tabu@rowcolorserieserror +\newcommand*\tabureset {% + \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@ + \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}% +}% \tabureset +%% Parsing the line styles ------------------------------------------ +\def\tabu@getline #1{\begingroup + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa + \let\tabu@thestyle \relax + \ifcsname tabu@linestyle@\@tempa \endcsname + \edef\tabu@thestyle{\endgroup + \def\tabu@thestyle{\expandafter\noexpand + \csname tabu@linestyle@\@tempa\endcsname}% + }\tabu@thestyle + \else \expandafter\tabu@definestyle \tabu@temp \@nil + \fi +}% \tabu@getline +\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter + \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen + \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined + \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs + \def\tabu@temp{\tabu@getparam{thick}}% + \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}% + \fi + {% + \let\tabu@ \relax + \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-)) + \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}% + \expandafter}\expandafter + \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-) + \def\;{\def\:}% + \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10) + \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-) + \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi + \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi + \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi + \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen + \tabu@on \tabulineon \fi\fi + \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen + \tabu@off \tabulineoff \fi\fi + \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi + \in@true % + \else \in@false % + \fi + \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}% + \else \edef\tabu@thick{\the\tabu@thick}% + \fi + \edef \tabu@thestyle ##1##2{\endgroup + \def\tabu@thestyle{% + \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick} + {\the\tabu@on}{##1} + {\the\tabu@off}{##2}% + \else \noexpand\tabu@rulesstyle + {##1\vrule width \tabu@thick}% + {##1\leaders \hrule height \tabu@thick \hfil}% + \fi}% + }\expandafter \expandafter + \expandafter \tabu@thestyle \expandafter + \expandafter \expandafter + {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}% +}% \tabu@definestyle +{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active + \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}} + \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space} +}% \catcode +\def\tabu@oxiii #1{% + \ifcase \ifx n#1\z@ \else + \ifx f#1\@ne\else + \tw@ \fi\fi + \expandafter\tabu@onxiii + \or \expandafter\tabu@ofxiii + \else o% + \fi#1}% +\def\tabu@onxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx \tabu@spxiii#2\@ne\else + \tw@ \fi\fi\fi + \tabu@getparam{on}#2\expandafter\@gobble + \or \expandafter\tabu@onxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}}% +\def\tabu@ofxiii #1#2{% + \ifx #2f\expandafter\tabu@offxiii + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@offxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx\tabu@spxiii#2\@ne \else + \tw@ \fi\fi\fi + \tabu@getparam{off}#2\expandafter\@gobble + \or \expandafter\tabu@offxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=} +\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef + \ifx \tabu@#1\else % no more spec + \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi +}% \tabu@getcolor +\def\tabu@getc@l@r #1\tabu@ {% + \def\tabu@temp{#1}\tabu@strtrim \tabu@temp + \ifx \tabu@temp\@empty + \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists + \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r + \else \let\tabu@c@lon \tabu@c@l@r + \fi + %\else \tabu@warncolour{\tabu@temp}% + \fi%\fi + \tabu@ % next spec +}% \tabu@getc@l@r +\def\tabu@warncolour #1{\PackageWarning{tabu} + {Color #1 is not defined. Default color used}% +}% \tabu@warncolour +\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}% + \ifx \tabu@leaders\tabu@leaders@G \else + \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi +}% \tabu@leadersstyle +\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined + \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}% +}% \tabu@rulesstyle +%% The leaders boxes ------------------------------------------------ +\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color + {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor + {% % but the leaders boxes should have colors ! + \def\@therule{\vrule}\def\@thick{height}\def\@length{width}% + \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}% + \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thehleaders \tabu@theleaders + }% + {% + \def\@therule{\hrule}\def\@thick{width}\def\@length{height}% + \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}% + \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thevleaders \tabu@theleaders + }% + \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}% + }% +}% \tabu@LEADERS +\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@} +\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color + \global\setbox \tabu@leads=\@box{% + {#3\tabu@therule{#1}{#2}}% + \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi + {#3\tabu@therule{#1}{#2}}}% + \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss + {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}% + \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {% + {##1\tabu@therule{#1}{#2}}% + \xleaders \copy\tabu@leads \@ss + \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}% + }\tabu@theleaders{#3}% +}% \tabu@l@@d@rs +%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ---------- +\newcommand*\tabu {\tabu@longfalse + \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}% + \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endtabu*\endcsname{\endtabu}% + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {tabu} +\let\tabu@tabular \tabular % +\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu} +\newcommand*\longtabu {\tabu@longtrue + \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi + \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}% + \LTchunksize=\@M + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}% + \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts } + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {longtabu} +\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu} +\def\tabu@nolongtabu{\PackageError{tabu} + {longtabu requires the longtable package}\@ehd} +%% Read the target and then : \tabular or \@array ------------------ +\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget } +\def\tabu@sett@rget {\tabu@target \z@ + \ifcase \ifx \bgroup\@let@token \z@ \else + \ifx \@sptoken\@let@token \@ne \else + \if t\@let@token \tw@ \else + \if s\@let@token \thr@@\else + \z@\fi\fi\fi\fi + \expandafter\tabu@begin + \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget + \or \expandafter\tabu@to + \or \expandafter\tabu@spread + \fi +}% \tabu@sett@rget +\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget} +\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget} +\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target } +\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget } +\def\tabu@linegoalt@rget {% + \ifx \tabu@temp\LNGL@setlinegoal + \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal + \tabu@begin +}% \tabu@linegoalt@rget +\def\tabu@begin #1#{% + \iftabu@measuring \expandafter\tabu@nestedmeasure \fi + \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty + \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}% + \fi + \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil +}% \tabu@begin +\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup + \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}% + \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }% +}% \tabu@tabu@ +\def\tabu@nestedmeasure {% + \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax + \tabu@spreadtrue + \else \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}% + \expandafter\tabu@collectbody\expandafter\tabu@quickrule + \expandafter\endgroup + \fi +}% \tabu@nestedmeasure +\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target} +%% \tabu@setup \tabu@init \tabu@indent +\def\tabu@setup{\tabu@alloc@ + \ifcase \tabu@nested + \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@ + \let\tabu@afterendpar \par + \fi\fi\fi + \def\tabu@aligndefault{c}\tabu@init \tabu@indent + \else % + \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth + \fi + \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined + \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}% + \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu... + \let\@endpbox \tabu@endpbox % idem " " " " " " + \let\@tabarray \tabu@tabarray % idem " " " " " " + \tabu@setcleanup \tabu@setreset +}% \tabu@setup +\def\tabu@init{\tabu@starttimer \tabu@measuringfalse + \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}% + \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline + \let\firstline \tabu@firstline \let\lastline \tabu@lastline + \let\hline \tabu@hline \let\@xhline \tabu@xhline + \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox + \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi + \tabu@trivlist % + \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext + \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering + \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft + \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering + \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft + \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont + \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x + \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar + \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok + \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn + \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!! + \let\tabu@endpbox \@endpbox % idem " " " " " " " + \let\tabu@tabarray \@tabarray % idem " " " " " " " + \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray) + \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi +}% \tabu@init +\def\tabu@indent{% correction for indentation + \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget + \everypar\expandafter{% + \the\everypar\everypar\expandafter{\the\everypar}% + \setbox\z@=\lastbox + \ifdim\wd\z@>\z@ \edef\tabu@thetarget + {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi + \box\z@}% + \fi\fi +}% \tabu@indent +\def\tabu@setcleanup {% saves last global assignments + \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax + \def\tabu@aftergroupcleanup{% + \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}% + \else + \def\tabu@aftergroupcleanup{% + \aftergroup\aftergroup\aftergroup\tabu@cleanup + \let\tabu@aftergroupcleanup \relax}% + \fi + \let\tabu@arc@Gsave \tabu@arc@G + \let\tabu@arc@G \tabu@arc@L % + \let\tabu@drsc@Gsave \tabu@drsc@G + \let\tabu@drsc@G \tabu@drsc@L % + \let\tabu@ls@Gsave \tabu@ls@G + \let\tabu@ls@G \tabu@ls@L % + \let\tabu@rc@Gsave \tabu@rc@G + \let\tabu@rc@G \tabu@rc@L % + \let\tabu@evr@Gsave \tabu@evr@G + \let\tabu@evr@G \tabu@evr@L % + \let\tabu@celllalign@save \tabu@celllalign + \let\tabu@cellralign@save \tabu@cellralign + \let\tabu@cellleft@save \tabu@cellleft + \let\tabu@cellright@save \tabu@cellright + \let\tabu@@celllalign@save \tabu@@celllalign + \let\tabu@@cellralign@save \tabu@@cellralign + \let\tabu@@cellleft@save \tabu@@cellleft + \let\tabu@@cellright@save \tabu@@cellright + \let\tabu@rowfontreset@save \tabu@rowfontreset + \let\tabu@@rowfontreset@save\tabu@@rowfontreset + \let\tabu@rowfontreset \@empty + \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset + \edef\c@taburow@save {\the\c@taburow}% + \edef\tabu@naturalX@save {\the\tabu@naturalX}% + \let\tabu@naturalXmin@save \tabu@naturalXmin + \let\tabu@naturalXmax@save \tabu@naturalXmax + \let\tabu@mkarstrut@save \tabu@mkarstrut + \edef\tabu@clarstrut{% + \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax + \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax + \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}% +}% \tabu@setcleanup +\def\tabu@cleanup {\begingroup + \globaldefs\@ne \tabu@everyrowtrue + \let\tabu@arc@G \tabu@arc@Gsave + \let\CT@arc@ \tabu@arc@G + \let\tabu@drsc@G \tabu@drsc@Gsave + \let\CT@drsc@ \tabu@drsc@G + \let\tabu@ls@G \tabu@ls@Gsave + \let\tabu@ls@ \tabu@ls@G + \let\tabu@rc@G \tabu@rc@Gsave + \let\tabu@rc@ \tabu@rc@G + \let\CT@do@color \relax + \let\tabu@evr@G \tabu@evr@Gsave + \let\tabu@celllalign \tabu@celllalign@save + \let\tabu@cellralign \tabu@cellralign@save + \let\tabu@cellleft \tabu@cellleft@save + \let\tabu@cellright \tabu@cellright@save + \let\tabu@@celllalign \tabu@@celllalign@save + \let\tabu@@cellralign \tabu@@cellralign@save + \let\tabu@@cellleft \tabu@@cellleft@save + \let\tabu@@cellright \tabu@@cellright@save + \let\tabu@rowfontreset \tabu@rowfontreset@save + \let\tabu@@rowfontreset \tabu@@rowfontreset@save + \tabu@naturalX =\tabu@naturalX@save + \let\tabu@naturalXmax \tabu@naturalXmax@save + \let\tabu@naturalXmin \tabu@naturalXmin@save + \let\tabu@mkarstrut \tabu@mkarstrut@save + \c@taburow =\c@taburow@save + \ifcase \tabu@nested \tabu@alloc \m@ne\fi + \endgroup % + \ifcase \tabu@nested + \the\tabu@footnotes \global\tabu@footnotes{}% + \tabu@afterendpar \tabu@elapsedtime + \fi + \tabu@clarstrut + \everyrow\expandafter {\tabu@evr@G}% +}% \tabu@cleanup +\let\tabu@afterendpar \relax +\def\tabu@setreset {% + \edef\tabu@savedparams {% \relax for \tabu@message@save + \ifmmode \col@sep \the\arraycolsep + \else \col@sep \the\tabcolsep \fi \relax + \arrayrulewidth \the\arrayrulewidth \relax + \doublerulesep \the\doublerulesep \relax + \extratabsurround \the\extratabsurround \relax + \extrarowheight \the\extrarowheight \relax + \extrarowdepth \the\extrarowdepth \relax + \abovetabulinesep \the\abovetabulinesep \relax + \belowtabulinesep \the\belowtabulinesep \relax + \def\noexpand\arraystretch{\arraystretch}% + \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}% + \begingroup + \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu + \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi + \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi + \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L + \expandafter \endgroup \expandafter + \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena + \let\tabu@arc@G \tabu@arc@L + \let\tabu@drsc@G \tabu@drsc@L + \let\tabu@ls@G \tabu@ls@L + \let\tabu@rc@G \tabu@rc@L + \let\tabu@evr@G \tabu@evr@L}% + \def\tabu@reset{\tabu@savedparams + \tabu@everyrowtrue \c@taburow \z@ + \let\CT@arc@ \tabu@arc@L + \let\CT@drsc@ \tabu@drsc@L + \let\tabu@ls@ \tabu@ls@L + \let\tabu@rc@ \tabu@rc@L + \global\tabu@alloc \tabu@alloc@save + \everyrow\expandafter{\tabu@evr@L}}% +}% \tabu@reset +\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}} +\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}} +%% The Rewriting Process ------------------------------------------- +\def\tabu@newcolumntype #1{% + \expandafter\tabu@new@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@newcolumntype +\def\tabu@new@columntype #1#2#3{% + \def#1##1#3{\NC@{##1}}% + \let#2\relax \newcommand*#2% +}% \tabu@new@columntype +\def\tabu@privatecolumntype #1{% + \expandafter\tabu@private@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\expandafter\endcsname + \csname tabu@NC@find@\string#1\expandafter\endcsname + \csname tabu@NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@privatecolumntype +\def\tabu@private@columntype#1#2#3#4{% + \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}% + \tabu@new@columntype#3#4% +}% \tabu@private@columntype +\let\tabu@privatecolumns \@empty +\newcommand*\tabucolumn [1]{\expandafter \def \expandafter + \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns + \NC@do #1}}% +\let\tabu@highprioritycolumns \@empty +%% The | ``column'' : rewriting process -------------------------- +\tabu@privatecolumntype |{\tabu@rewritevline} +\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}% + \expandafter \NC@find \tabu@rewritten} +\def\tabu@lines #1{% + \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi + \NC@list\expandafter{\the\NC@list \NC@do #1}% +}% \tabu@lines@ +\def\tabu@vlinearg #1{% + \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}% + \else\tabu@getline {#1}% + \fi + \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}% + }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}% + \expandafter \tabu@keepls \tabu@thestyle \@nil +}% \tabu@vlinearg +\def\tabu@keepls #1\@nil{% + \ifcat $\@cdr #1\@nil $% + \ifx \relax#1\else + \ifx \tabu@ls@#1\else + \let#1\relax + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@savels\noexpand#1}\fi\fi\fi +}% \tabu@keepls +\def\tabu@thevline {\begingroup + \ifdefined\tabu@leaders + \setbox\@tempboxa=\vtop to\dimexpr + \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}% + \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox + \box\@tempboxa + \else + \tabu@thevrule + \fi \endgroup +}% \tabu@thevline +\def\tabu@savels #1{% + \expandafter\let\csname\string#1\endcsname #1% + \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset + \tabu@resetls#1}}% +\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}% +%% \multicolumn inside tabu environment ----------------------------- +\tabu@newcolumntype \tabu@rewritemulticolumn{% + \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \tabu@savedecl + \tabu@privatecolumns + \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}% + \let\tabu@savels \relax + \NC@find +}% \tabu@rewritemulticolumn +\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup} +\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI} +\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup + \tabu@everyrowtrue + \NC@list{\NC@do \tabu@rewritemulticolumn}% + \expandafter\@gobbletwo % gobbles \multispan{#1} + \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}% + {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi + {#3}}% +}% \tabu@multic@lumn +%% The X column(s): rewriting process ----------------------------- +\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}} +\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten } +\def\tabu@siunitx #1{\@ifnextchar \bgroup + {\tabu@rewriteX@Ss{#1}} + {\tabu@nosiunitx{#1}}} +\def\tabu@rewriteX@Ss #1#2{\@temptokena{}% + \@defaultunits \let\tabu@temp =#2\relax\@nnil + \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi + \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}% + }\expandafter\NC@find \the\@temptokena \relax + }\expandafter\NC@rewrite@S \@gobble #2\relax + \else \tabu@siunitxerror + \fi + \expandafter \NC@find \tabu@rewritten +}% \tabu@rewriteX@Ss +\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column ! + \MessageBreak X column can only embed siunitx S or s columns}\@ehd +}% \tabu@siunitxerror +\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}% + \iftabu@measuring + \else \tabu@measuringtrue % first X column found in the preamble + \let\@halignto \relax \let\tabu@halignto \relax + \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@ + \else \tabu@spreadtarget \z@ \fi + \ifdim \tabu@target=\z@ + \setlength\tabu@target \tabu@thetarget + \tabu@message{\tabu@message@defaulttarget}% + \else \tabu@message{\tabu@message@target}\fi + \fi +}% \tabu@rewriteX +\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax + \def\tabu@rewritten{l}} +\def\tabu@Xarg #1#2#3{% + \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty + \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty + \ifx\\#1\\% + \def\tabu@rewritten{p}\tabucolX \p@ % + \else + \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@ + \tabu@Xparse {}#1\relax + \fi + \tabu@Xrewritten{#2}{#3}% +}% \tabu@Xarg +\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest} +\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}} +\def\tabu@Xtest{% + \ifcase \ifx \relax\@let@token \z@ \else + \if ,\@let@token \m@ne\else + \if p\@let@token 1\else + \if m\@let@token 2\else + \if b\@let@token 3\else + \if l\@let@token 4\else + \if c\@let@token 5\else + \if r\@let@token 6\else + \if j\@let@token 7\else + \if L\@let@token 8\else + \if C\@let@token 9\else + \if R\@let@token 10\else + \if J\@let@token 11\else + \ifx \@sptoken\@let@token 12\else + \if .\@let@token 13\else + \if -\@let@token 13\else + \ifcat $\@let@token 14\else + 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \or \tabu@Xtype {p}% + \or \tabu@Xtype {m}% + \or \tabu@Xtype {b}% + \or \tabu@Xalign \raggedright\relax + \or \tabu@Xalign \centering\relax + \or \tabu@Xalign \raggedleft\relax + \or \tabu@Xalign \tabu@justify\relax + \or \tabu@Xalign \RaggedRight\raggedright + \or \tabu@Xalign \Centering\centering + \or \tabu@Xalign \RaggedLeft\raggedleft + \or \tabu@Xalign \justifying\tabu@justify + \or \expandafter \tabu@Xparsespace + \or \expandafter \tabu@Xcoef + \or \expandafter \tabu@Xm@th + \or \tabu@Xcoef{}% + \else\expandafter \tabu@Xparse + \fi +}% \tabu@Xtest +\def\tabu@Xalign #1#2{% + \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu} + {Duplicate horizontal alignment specification}\fi + \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax + \else \def\tabu@Xlcr{#2}\let#2\relax\fi + \expandafter\tabu@Xparse +}% \tabu@Xalign +\def\tabu@Xtype #1{% + \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu} + {Duplicate vertical alignment specification}\fi + \def\tabu@rewritten{#1}\expandafter\tabu@Xparse +}% \tabu@Xtype +\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}% + \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi +}% \tabu@Xcoef +\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@ + \tabu@Xparse{}% +}% \tabu@Xc@ef +\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp} +\def\tabu@Xd@sp{\let\tabu@Xmath=$% + \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}% + \expandafter\tabu@Xparse + \else \expandafter\tabu@Xparse\expandafter{\expandafter}% + \fi +}% \tabu@Xd@sp +\def\tabu@Xrewritten {% + \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi + \ifdim \tabucolX<\z@ \tabu@negcoeftrue + \else\ifdim \tabucolX=\z@ \tabucolX \p@ + \fi\fi + \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}% + \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}% + \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{% + >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}% + \tabu@rewritten {\tabu@hsize \tabu@temp}% + <{##2\ifx$\tabu@Xmath$\fi}}% + }\tabu@rewritten +}% \tabu@Xrewritten +\def\tabu@hsize #1#2{% + \ifdim #2\p@<\z@ + \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else + \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi + \fi + \else #2\tabucolX + \fi +}% \tabu@hsize +%% \usetabu and \preamble: rewriting process --------------------- +\tabu@privatecolumntype \usetabu [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\let\tabu@rewriteX \tabu@rewriteXrestore + \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}% + \fi +}% \NC@rewrite@\usetabu +\tabu@privatecolumntype \preamble [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}% + \fi +}% \NC@rewrite@\preamble +%% Controlling the rewriting process ------------------------------- +\tabu@newcolumntype \tabu@rewritefirst{% + \iftabu@long \aftergroup \tabu@longpream % + \else \aftergroup \tabu@pream + \fi + \let\tabu@ \relax \let\tabu@hsize \relax + \let\tabu@Xcoefs \@empty \let\tabu@savels \relax + \tabu@Xcol \z@ \tabu@cnt \tw@ + \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse + \global\setbox\@arstrutbox \box\@arstrutbox + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \NC@list\expandafter{\the\NC@list \NC@do X}% + \iftabu@siunitx % + \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi + \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}% + \expandafter\def\expandafter\tabu@NC@list\expandafter{% + \the\expandafter\NC@list \tabu@NC@list}% % * | X S + \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu + \expandafter \NC@do \expandafter\preamble + \the\NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \tabu@savedecl + \tabu@privatecolumns + \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle +}% NC@rewrite@\tabu@rewritefirst +\tabu@newcolumntype \tabu@rewritemiddle{% + \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast +}% \NC@rewrite@\tabu@rewritemiddle +\tabu@newcolumntype \tabu@rewritelast{% + \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne + \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \else \let\tabu@prev\tabu@temp + \fi + \ifcase \tabu@cnt \expandafter\tabu@endrewrite + \else \expandafter\NC@find \expandafter\tabu@rewritemiddle + \fi +}% \NC@rewrite@\tabu@rewritelast +%% Choosing the strategy -------------------------------------------- +\def\tabu@endrewrite {% + \let\tabu@temp \NC@find + \ifx \@arrayright\relax \let\@arrayright \@empty \fi + \count@=% + \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print + \iftabu@measuring + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@target \csname tabu@\the\tabu@nested.T\endcsname + \tabucolX \csname tabu@\the\tabu@nested.X\endcsname + \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}% + \fi + \else\iftabu@measuring 4 % X columns + \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer + \tabu@target \the\tabu@target + \tabu@spreadtarget \the\tabu@spreadtarget}% + \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}% + \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}% + \let\tabu@Xcoefs \relax + \else\ifcase\tabu@nested \thr@@ % outer, no X + \global\let\tabu@afterendpar \relax + \else \@ne % inner, no X, outer in mode 1 or 2 + \fi + \ifdefined\tabu@usetabu + \else \ifdim\tabu@target=\z@ + \else \let\tabu@temp \tabu@extracolsep + \fi\fi + \fi + \fi + \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}% + \tabu@temp +}% \tabu@endrewrite +\def\tabu@extracolsep{\@defaultunits \expandafter\let + \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil + \ifx \tabu@temp\@sptoken + \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep + \else + \edef\tabu@temp{\noexpand\NC@find + \if |\noexpand\tabu@temp @% + \else\if !\noexpand\tabu@temp @% + \else !% + \fi\fi + {\noexpand\extracolsep\noexpand\@flushglue}}% + \fi + \tabu@temp +}% \tabu@extrac@lsep +%% Implementing the strategy ---------------------------------------- +\long\def\tabu@pream #1\@preamble {% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\tabu@aftergroupcleanup}% + \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody + \@preamble}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@pream +\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@longpream +\def\tabu@select {% + \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi + \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi + \ifcase \count@ + \global\let\tabu@elapsedtime \relax + \tabu@seteverycr + \expandafter \tabuthepreamble % vertical adjustment (inherited from outer) + \or % exit in vertical measure + struts per cell because no X and outer in mode 3 + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \tabu@seteverycr + \expandafter \tabuthepreamble + \or % exit without measure because no X and outer in mode 4 + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@seteverycr + \expandafter \tabuthepreamble + \else % needs trials + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@savecounters + \expandafter \tabu@setstrategy + \fi +}% \tabu@select +\def\tabu@@ {\gdef\tabu@mkpreambuffer} +%% Protections to set up before trials ------------------------------ +\def\tabu@setstrategy {\begingroup % + \tabu@trialh@@k \tabu@cnt \z@ % number of trials + \hbadness \@M \let\hbadness \@tempcnta + \hfuzz \maxdimen \let\hfuzz \@tempdima + \let\write \tabu@nowrite\let\GenericError \tabu@GenericError + \let\savetabu \@gobble \let\tabudefaulttarget \linewidth + \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote + \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor + \let\tabu@aftergroupcleanup \relax % only after the last trial + \tabu@mkpreambuffer + \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init + \def\tabu@lasttry{\m@ne\p@}\fi + \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi % + \tabu@collectbody \tabu@strategy % +}% \tabu@setstrategy +\def\tabu@savecounters{% + \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}% + \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax +}% \tabu@savecounters +\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0) + \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs + \ifdim \dimen@>\z@ + \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \fi +}% \tabucolX@init +\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum + \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@ + \else -#2\p@ \tabu@negcoeftrue + \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \tabu@wddef{#1}{0pt}% + \fi +}% \tabu@Xinit +%% Collecting the environment body ---------------------------------- +\long\def\tabu@collectbody #1#2\end #3{% + \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}% + \ifx \tabu@stack\@empty + \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}% + \def\tabu@end@envir{\end{#3}}% + \iftabuscantokens + \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}% + \else \def\tabu@endenvir {\let\endarray \@empty + \end{#3}\tabu@gobbleX}% + \fi + \else \def\tabu@endenvir {\end{#3}}\fi}% + \let\tabu@collectbody \tabu@endofcollect + \else\def\tabu@temp{#3}% + \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }% + \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}% + \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}% + \else \toks@\expandafter{\the\toks@ #2\end{#3}}% + \fi\fi\fi + \fi + \tabu@collectbody{#1}% +}% \tabu@collectbody +\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}% +\def\tabu@endofcollect #1{\ifnum0=`{}\fi + \expandafter\endgroup \the\toks@ #1% +}% \tabu@endofcollect +%% The trials: switching between strategies ------------------------- +\def\tabu@strategy {\relax % stops \count@ assignment ! + \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished) + \expandafter \tabu@endoftrials + \or % case 1 = exit in vertical measure (outer in mode 3) + \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}% + \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}% + \expandafter \tabu@endoftrials + \or % case 2 = exit with a rule replacing the table (outer in mode 4) + \expandafter \tabu@quickend + \or % case 3 = outer is in mode 3 because of no X + \begingroup + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \expandafter \tabu@measuring + \else % case 4 = horizontal measure + \begingroup + \global\let\tabu@elapsedtime \tabu@message@etime + \long\def\multicolumn##1##2##3{\multispan{##1}}% + \let\tabu@startpboxORI \@startpbox + \iftabu@spread + \def\tabu@naturalXmax {\z@}% + \let\tabu@naturalXmin \tabu@naturalXmax + \tabu@evr{\global\tabu@naturalX \z@}% + \let\@startpbox \tabu@startpboxmeasure + \else\iftabu@negcoef + \let\@startpbox \tabu@startpboxmeasure + \else \let\@startpbox \tabu@startpboxquick + \fi\fi + \expandafter \tabu@measuring + \fi +}% \tabu@strategy +\def\tabu@measuring{\expandafter \tabu@trial \expandafter + \count@ \the\count@ \tabu@endtrial +}% \tabu@measuring +\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi} +\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \csname tabu@adl@endtrial\endcsname + \endarray}$\egroup % got \tabu@box +}% \tabu@shorttrial +\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \tabuendlongtrial}\egroup % got \tabu@box +}% \tabu@longtrial +\def\tabuendlongtrial{% no @ allowed for \scantokens + \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne + \LT@get@widths +}% \tabuendlongtrial +\def\tabu@adl@endtrial{% + \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails ! +\def\tabu@seteverycr {\tabu@reset + \everycr \expandafter{\the\everycr \tabu@everycr}% + \let\everycr \tabu@noeverycr % +}% \tabu@seteverycr +\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@} +\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr} +\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi} +\def\tabu@endoftrials {% + \iftabuscantokens \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\expandafter \tabu@closetrialsgroup \expandafter + \tabu@rescan \expandafter{% + \expandafter\tabuthepreamble + \the\expandafter\tabu@thebody + \iftabu@long \else \endarray \fi}} + {\expandafter\tabu@closetrialsgroup \expandafter + \tabuthepreamble + \the\tabu@thebody}% + \tabu@endenvir % Finish ! +}% \tabu@endoftrials +\def\tabu@closetrialsgroup {% + \toks@\expandafter{\tabu@endenvir}% + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target + \tabu@cnt \the\tabu@cnt + \def\noexpand\tabu@endenvir{\the\toks@}% + %Quid de \@halignto = \tabu@halignto ?? + }% \tabu@bufferX + \tabu@bufferX + \ifcase\tabu@nested % print out (outer in mode 0) + \global\tabu@cnt \tabu@cnt + \tabu@evr{\tabu@verticaldynamicadjustment}% + \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty + \let\@finalstrut \tabu@finalstrut + \else % vertical measure of nested tabu + \tabu@evr{\tabu@verticalinit}% + \tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \fi + \tabu@clckpt \let\@halignto \tabu@halignto + \let\@halignto \@empty + \tabu@seteverycr + \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@ + \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts) + \fi\fi +}% \tabu@closetrialsgroup +\def\tabu@quickend {\expandafter \endgroup \expandafter + \tabu@target \the\tabu@target \tabu@quickrule + \let\endarray \relax \tabu@endenvir +}% \tabu@quickend +\def\tabu@endtrial {\relax % stops \count@ assignment ! + \ifcase \count@ \tabu@err % case 0 = impossible here + \or \tabu@err % case 1 = impossible here + \or \tabu@err % case 2 = impossible here + \or % case 3 = outer goes into mode 0 + \def\tabu@bufferX{\endgroup}\count@ \z@ + \else % case 4 = outer goes into mode 3 + \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3) + \else \tabu@arith % or 2 (outer in mode 4) + \fi + \count@=% + \ifcase\tabu@nested \thr@@ % outer goes into mode 3 + \else\iftabu@measuring \tw@ % outer is in mode 4 + \else \@ne % outer is in mode 3 + \fi\fi + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% + \fi + \expandafter \tabu@bufferX \expandafter + \count@ \the\count@ \tabu@strategy +}% \tabu@endtrial +\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}} +%% The algorithms: compute the widths / stop or go on --------------- +\def\tabu@arithnegcoef {% + \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs +}% \tabu@arithnegcoef +\def\tabu@arith@negcoef #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition + \advance\@tempdima #2\tabucolX + \else + \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated + \advance\dimen@ -#2\p@ + \advance\@tempdima -#2\tabucolX + \else + \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised + \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised + \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target) + \fi + \fi + \fi +}% \tabu@arith@negcoef +\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@ + \ifdim \@tempdima=\z@ + \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}% + \else + \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2} + *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}% + \fi +}% \tabu@givespace +\def\tabu@arith {\advance\tabu@cnt \@ne + \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi + \tabu@arithnegcoef + \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax % + \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax + \tabu@message{\tabu@message@arith}% + \ifdim \tabu@DELTA <\tabu@hfuzz + \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ? + \let\tabu@ \tabu@givespace \tabu@Xcoefs + \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message + \else % already converged: nothing to do but nearly impossible... + \fi + \tabucolX \maxdimen + \tabu@measuringfalse + \else % need for narrower X columns + \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax + \tabu@measuringtrue + \@whilesw \iftabu@measuring\fi {% + \advance\tabu@cnt \@ne + \tabu@arithnegcoef + \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here + \tabu@message{\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else + \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@ + \fi}% + \ifdim -\tabu@DELTA<\tabu@hfuzz + \advance\@tempdima \@tempdimb % for message + \tabu@measuringfalse + \else + \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax + \fi + }% + \fi + \tabu@message{\tabu@message@reached}% + \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% +}% \tabu@arith +\def\tabu@spreadarith {% + \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs + \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}% + \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax + \iftabu@measuring + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}% + \else + \tabu@message{\tabu@message@spreadarith}% + \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target + \tabu@message{(tabu) spread + \ifdim \@tempdimc>\tabu@target useless here: default target used% + \else too large: reduced to fit default target\fi.}% + \else + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}% + \fi + \begingroup \let\tabu@wddef \@gobbletwo + \@tempdimb \@tempdima + \tabucolX@init + \tabu@arithnegcoef + \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax + \expandafter\endgroup \expandafter\tabucolX \the\tabucolX + \tabu@arith + \fi +}% \tabu@spreadarith +\def\tabu@spread@arith #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ + \else \advance\@tempdima \tabu@wd{#1}\relax + \fi +}% \tabu@spread@arith +%% Reporting in the .log file --------------------------------------- +\def\tabu@message@defaulttarget{% + \ifnum\tabu@nested=\z@^^J(tabu) Default target: + \ifx\tabudefaulttarget\linewidth \string\linewidth + \ifdim \tabu@thetarget=\linewidth \else + -\the\dimexpr\linewidth-\tabu@thetarget\fi = + \else\ifx\tabudefaulttarget\linegoal\string\linegoal= + \fi\fi + \else (tabu) Default target (nested): \fi + \the\tabu@target \on@line + \ifnum\tabu@nested=\z@ , page \the\c@page\fi} +\def\tabu@message@target {^^J(tabu) Target specified: + \the\tabu@target \on@line, page \the\c@page} +\def\tabu@message@arith {\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else + \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@ + \fi +}% \tabu@message@arith +\def\tabu@message@spreadarith {\tabu@spreadheader + \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@ + \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@ + \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@ + \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target + \else \@tempdimc+\tabu@spreadtarget \fi + {}{}{}{}{}\@@} +\def\tabu@message@negcoef #1#2{ + \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]: + \space width = \tabu@wd {#1} + \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname + \ifdim -\tabu@pt#2\tabucolX<\tabu@target + < \number-\rem@pt#2 X + = \the\dimexpr -\tabu@pt#2\tabucolX \relax + \else + <= \the\tabu@target\space < \number-\rem@pt#2 X\fi} +\def\tabu@message@reached{\tabu@header + ******* Reached Target: + hfuzz = \tabu@hfuzz\on@line\space *******} +\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}% + \tabu@message{(tabu)\tabu@spaces Time elapsed during measure: + \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec + \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime) + -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax + *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space + cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}} +\def\tabu@message@verticalsp {% + \ifdim \@tempdima>\tabu@ht + \ifdim \@tempdimb>\tabu@dp + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@ + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J% + \else + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J% + \fi + \else\ifdim \@tempdimb>\tabu@dp + \tabu@spaces\tabu@spaces\tabu@spaces + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi + \fi +}% \tabu@message@verticalsp +\edef\tabu@spaces{\@spaces} +\def\tabu@strippt{\expandafter\tabu@pt\the} +{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}} +\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr} +\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt} +\def\do #1{% + \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{% + \ifnum##1<10 #1 #1\else + \ifnum##1<100 #1 \else + \ifnum##1<\@m #1\fi\fi\fi + ##1.##2##3##4##5##6##7##8#1}% + \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }% + \def\tabu@titles{\ifnum \tabu@nested=\z@ + (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target + #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}% + \def\tabu@spreadheader{% + (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min. + #1 New Target^^J% + (tabu) sprd} + \def\tabu@message@save {\begingroup + \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@} + \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt + \dimexpr####1\p@{ }{ }}}% + \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}% + \let\CT@arc@ \relax \let\@preamble \@gobble + \let\tabu@savedpream \@firstofone + \let\tabu@savedparams \@firstofone + \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}% + \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}% + \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}% + \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}% + \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}% + \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}% + \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}% + \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}% + \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}% + \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}% + \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }% + \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}% + \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}% + \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}% + \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}% + \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}% + \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}% + \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}% + \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}% + \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}% + \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo + \tabu@message{% + (tabu) \string\savetabu{\tabu@temp}: \on@line^^J% + \tabu@usetabu \@nil^^J}% + \endgroup} +}\do{ } +%% Measuring the natural width (varwidth) - store the results ------- +\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop + \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}% + \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ? + \iftabu@spread \else % if spread -> measure + \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure + \let\@startpbox \tabu@startpboxORI % restore immediately (nesting) + \tabu@measuringtrue % for the quick option... + \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi + \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target + \tabu@target=\tabu@temp\tabucolX \fi\fi + \setbox\tabu@box \hbox \bgroup + \begin{varwidth}\tabu@target + \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width... + \narrowragged \arraybackslash \parfillskip \@flushglue + \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi + \bgroup \aftergroup\tabu@endpboxmeasure + \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi + \else \expandafter\@gobble + \tabu@startpboxquick{#1}% \@gobble \bgroup + \fi +}% \tabu@startpboxmeasure +\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty + \bgroup\color@begingroup} +\def\tabu@endpboxmeasure {% + \@finalstrut \@arstrutbox + \end{varwidth}\egroup % + \ifdim \tabu@temp\p@ <\z@ % neg coef + \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box + \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}% + \tabu@debug{\tabu@message@endpboxmeasure}% + \fi + \else % spread coef>0 + \global\advance \tabu@naturalX \wd\tabu@box + \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax + \ifdim \tabu@naturalXmax <\tabu@naturalX + \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi + \ifdim \tabu@naturalXmin <\@tempdima + \xdef\tabu@naturalXmin {\the\@tempdima}\fi + \fi + \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target +}% \tabu@endpboxmeasure +\def\tabu@wddef #1{\expandafter\xdef + \csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd + \the\tabu@Xcol. X[\tabu@temp]: + target = \the\tabucolX \space + \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol + =\tabu@wd\tabu@Xcol +}% \tabu@message@endpboxmeasure +\def\tabu@startpboxquick {\bgroup + \let\@startpbox \tabu@startpboxORI % restore immediately + \let\tabu \tabu@quick % \begin is expanded before... + \expandafter\@gobble \@startpbox % gobbles \bgroup +}% \tabu@startpboxquick +\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick +}% \tabu@quick +\def\tabu@endquick {% + \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else + \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax + \endgroup + \else \let\endtabu \relax + \tabu@end@envir + \fi +}% \tabu@quick +\def\tabu@endtabu {\end{tabu}} +\def\tabu@endtabus {\end{tabu*}} +%% Measuring the heights and depths - store the results ------------- +\def\tabu@verticalmeasure{\everypar{}% + \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group + \setbox\tabu@box =\hbox\bgroup + \let\tabu@verticalspacing \tabu@verticalsp@lcr + \d@llarbegin % after \hbox ... + \else + \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop + \else\ifnum\currentgrouptype=12\vcenter + \else\vbox\fi\fi}% + \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup + \let\tabu@verticalspacing \tabu@verticalsp@pmb + \fi +}% \tabu@verticalmeasure +\def\tabu@verticalsp@lcr{% + \d@llarend \egroup % + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \noindent\vrule height\@tempdima depth\@tempdimb +}% \tabu@verticalsp@lcr +\def\tabu@verticalsp@pmb{% inserts struts as needed + \par \expandafter\egroup + \expandafter$\expandafter + \egroup \expandafter + \@tempdimc \the\prevdepth + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \let\@finalstrut \@gobble + \hrule height\@tempdima depth\@tempdimb width\hsize +%% \box\tabu@box +}% \tabu@verticalsp@pmb + +\def\tabu@verticalinit{% + \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset ! + \advance\c@taburow \@ne + \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}% + \advance\c@taburow \m@ne +}% \tabu@verticalinit +\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@verticaldynamicadjustment {% + \advance\c@taburow \@ne + \extrarowheight \dimexpr\tabu@ht - \ht\strutbox + \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox + \let\arraystretch \@empty + \advance\c@taburow \m@ne +}% \tabu@verticaldynamicadjustment +\def\tabuphantomline{\crcr \noalign{% + {\globaldefs \@ne + \setbox\@arstrutbox \box\voidb@x + \let\tabu@@celllalign \tabu@celllalign + \let\tabu@@cellralign \tabu@cellralign + \let\tabu@@cellleft \tabu@cellleft + \let\tabu@@cellright \tabu@cellright + \let\tabu@@thevline \tabu@thevline + \let\tabu@celllalign \@empty + \let\tabu@cellralign \@empty + \let\tabu@cellright \@empty + \let\tabu@cellleft \@empty + \let\tabu@thevline \relax}% + \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}% + \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr + \noalign{\tabu@rearstrut + {\globaldefs\@ne + \let\tabu@celllalign \tabu@@celllalign + \let\tabu@cellralign \tabu@@cellralign + \let\tabu@cellleft \tabu@@cellleft + \let\tabu@cellright \tabu@@cellright + \let\tabu@thevline \tabu@@thevline}}}% + \expandafter}\the\toks@ +}% \tabuphantomline +%% \firsthline and \lasthline corrections --------------------------- +\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}} +\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline} +\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}} +\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline} +\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument) + \noalign{\ifnum0=`}\fi + {\CT@arc@\hrule height\arrayrulewidth}% + \futurelet \tabu@temp \tabu@xhline +}% \tabu@hline +\def\tabu@xhline{% + \ifx \tabu@temp \hline + {\ifx \CT@drsc@\relax \vskip + \else\ifx \CT@drsc@\@empty \vskip + \else \CT@drsc@\hrule height + \fi\fi + \doublerulesep}% + \fi + \ifnum0=`{\fi}% +}% \tabu@xhline +\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@ + \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}% + \tabu@hlineAZsurround +}% \tabu@hlineAZ +\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{% + \extratabsurround #1\let\tabucline \tabucline@scan + \let\hline \tabu@hlinescan \let\firsthline \hline + \let\cline \tabu@clinescan \let\lasthline \hline + \expandafter \futurelet \expandafter \tabu@temp + \expandafter \tabu@nexthlineAZ \tabu@temp +}% \tabu@hlineAZsurround +\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline} +\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}} +\def\tabucline@scan{\@testopt \tabucline@sc@n {}} +\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}} +\def\tabu@nexthlineAZ{% + \ifx \tabu@temp\hline \else + \ifx \tabu@temp\cline \else + \ifx \tabu@temp\tabucline \else + \tabu@hlinecorrection + \fi\fi\fi +}% \tabu@nexthlineAZ +\def\tabu@xhlineAZ #1{% + \toks@\expandafter{\the\toks@ #1}% + \@tempdimc \tabu@thick % The last line width + \ifcase\count@ \@tempdimb \tabu@thick % The first line width + \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax + \fi + \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ +}% \tabu@xhlineAZ +\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1 + \@tempdima \dimexpr \ht\@arstrutbox+\dimen@ + \edef\firsthline{% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + height \the\dimexpr\@tempdima+\extratabsurround + depth \dp\@arstrutbox + width \tabustrutrule}\hss}\cr + \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb + +\dp\@arstrutbox \relax}% + \the\toks@ + }\ifnum0=`{\fi + \expandafter}\firsthline % we are then ! +}% \tabu@firsthlinecorrection +\def\tabu@lasthlinecorrection{% + \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc + \edef\lasthline{% + \the\toks@ + \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@ + +\extratabsurround-\@tempdimc + height \z@ + width \tabustrutrule}\hss}\cr + }\ifnum0=`{\fi + \expandafter}\lasthline % we are then ! +}% \tabu@lasthlinecorrection +\def\tabu@LT@@hline{% + \ifx\LT@next\hline + \global\let\LT@next \@gobble + \ifx \CT@drsc@\relax + \gdef\CT@LT@sep{% + \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}% + \else + \gdef\CT@LT@sep{% + \multispan\LT@cols{% + \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}% + \fi + \else + \global\let\LT@next\empty + \gdef\CT@LT@sep{% + \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \CT@LT@sep + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \noalign{\penalty\@M}% + \LT@next +}% \tabu@LT@@hline +%% Horizontal lines : \tabucline ------------------------------------ +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline} +\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}% + \ifnum \tabu@stop<\z@ \toks@{}% + \else \tabu@clinearg{#1}\tabu@thestyle + \edef\tabucline{\toks@{% + \ifnum \tabu@start>\z@ \omit + \tabu@multispan\tabu@start {\span\omit}&\fi + \omit \tabu@multispan\tabu@stop {\span\omit}% + \tabu@thehline\cr + }}\tabucline + \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}% + \fi + \futurelet \tabu@temp \tabu@xcline +}% \tabu@cline +\def\tabu@clinearg #1{% + \ifx\\#1\\\let\tabu@thestyle \tabu@ls@ + \else \@defaultunits \expandafter\let\expandafter\@tempa + \romannumeral-`\0#1\relax \@nnil + \ifx \hbox\@tempa \tabu@clinebox{#1}% + \else\ifx \box\@tempa \tabu@clinebox{#1}% + \else\ifx \vbox\@tempa \tabu@clinebox{#1}% + \else\ifx \vtop\@tempa \tabu@clinebox{#1}% + \else\ifx \copy\@tempa \tabu@clinebox{#1}% + \else\ifx \leaders\@tempa \tabu@clineleads{#1}% + \else\ifx \cleaders\@tempa \tabu@clineleads{#1}% + \else\ifx \xleaders\@tempa \tabu@clineleads{#1}% + \else\tabu@getline {#1}% + \fi\fi\fi\fi\fi\fi\fi\fi + \fi +}% \tabu@clinearg +\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}} +\def\tabu@clineleads #1{% + \let\tabu@thestyle \relax \let\tabu@leaders \@undefined + \gdef\tabu@thehrule{#1}} +\def\tabu@thehline{\begingroup + \ifdefined\tabu@leaders + \noexpand\tabu@thehleaders + \else \noexpand\tabu@thehrule + \fi \endgroup +}% \tabu@thehline +\def\tabu@xcline{% + \ifx \tabu@temp\tabucline + \toks@\expandafter{\the\toks@ \noalign + {\ifx\CT@drsc@\relax \vskip + \else \CT@drsc@\hrule height + \fi + \doublerulesep}}% + \fi + \tabu@docline +}% \tabu@xcline +\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@} +\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}% + \ifnum0=`{\fi}\aftergroup\tabu@doclineafter} +\def\tabu@multispan #1#2{% + \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan + \else \expandafter\@gobbletwo + \fi {#1-1}{#2}% +}% \tabu@multispan +\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil} +\def\tabu@start@stop #1-#2\@nnil{% + \@defaultunits \tabu@start\number 0#1\relax \@nnil + \@defaultunits \tabu@stop \number 0#2\relax \@nnil + \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne + \else\ifnum \tabu@stop=\z@ \tabu@nbcols + \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols + \else \tabu@stop + \fi\fi\fi + \advance\tabu@start \m@ne + \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi +}% \tabu@start@stop +%% Numbers: siunitx S columns (and \tabudecimal) ------------------- +\def\tabu@tabudecimal #1{% + \def\tabu@decimal{#1}\@temptokena{}% + \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces + \tabu@scandecimal +}% \tabu@tabudecimal +\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@} +\def\tabu@skipdecimal#1{#1\tabu@scandecimal} +\def\tabu@getdecimal@ignorespaces{% + \ifcase 0\ifx\tabu@temp\ignorespaces\else + \ifx\tabu@temp\@sptoken1\else + 2\fi\fi\relax + \let\tabu@getdecimal@ \tabu@getdecimal + \expandafter\tabu@skipdecimal + \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal + \else \expandafter\tabu@skipdecimal + \fi +}% \tabu@getdecimal@ignorespaces +\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}% + \tabu@scandecimal} +\def\do#1{% + \def\tabu@get@decimalspace#1{% + \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}% +}\do{ } +\let\tabu@@tabudecimal \tabu@tabudecimal +\def\tabu@getdecimal{% + \ifcase 0\ifx 0\tabu@temp\else + \ifx 1\tabu@temp\else + \ifx 2\tabu@temp\else + \ifx 3\tabu@temp\else + \ifx 4\tabu@temp\else + \ifx 5\tabu@temp\else + \ifx 6\tabu@temp\else + \ifx 7\tabu@temp\else + \ifx 8\tabu@temp\else + \ifx 9\tabu@temp\else + \ifx .\tabu@temp\else + \ifx ,\tabu@temp\else + \ifx -\tabu@temp\else + \ifx +\tabu@temp\else + \ifx e\tabu@temp\else + \ifx E\tabu@temp\else + \ifx\tabu@cellleft\tabu@temp1\else + \ifx\ignorespaces\tabu@temp1\else + \ifx\@sptoken\tabu@temp2\else + 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \expandafter\tabu@get@decimal + \or \expandafter\tabu@skipdecimal + \or \expandafter\tabu@get@decimalspace + \else\expandafter\tabu@printdecimal + \fi +}% \tabu@getdecimal +\def\tabu@printdecimal{% + \edef\tabu@temp{\the\@temptokena}% + \ifx\tabu@temp\@empty\else + \ifx\tabu@temp\space\else + \expandafter\tabu@decimal\expandafter{\the\@temptokena}% + \fi\fi +}% \tabu@printdecimal +%% Verbatim inside X columns ---------------------------------------- +\def\tabu@verbatim{% + \let\verb \tabu@verb + \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd +}% \tabu@verbatim +\let\tabu@ltx@verb \verb +\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb} +\def\tabu@fancyvrb {% + \def\tabu@FV@DefineCheckEnd ##1{% + \def\tabu@FV@DefineCheckEnd{% + ##1% + \let\FV@CheckEnd \tabu@FV@CheckEnd + \let\FV@@CheckEnd \tabu@FV@@CheckEnd + \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd + \edef\FV@EndScanning{% + \def\noexpand\next{\noexpand\end{\FV@EnvironName}}% + \global\let\noexpand\FV@EnvironName\relax + \noexpand\next}% + \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}% + }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd} +}% \tabu@fancyvrb +\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil} +\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}} +\begingroup +\catcode`\[1 \catcode`\]2 +\@makeother\{ \@makeother\} + \edef\x[\endgroup + \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3% + ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}} +\def\tabu@FV@ListProcessLine #1{% + \hbox {%to \hsize{% + \kern\leftmargin + \hbox {%to \linewidth{% + \FV@LeftListNumber + \FV@LeftListFrame + \FancyVerbFormatLine{#1}\hss +%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on) +%% \FV@RightListFrame}% + \FV@RightListFrame + \FV@RightListNumber}% +%% DG/SR modification end + \hss}} +%% \savetabu -------------------------------------------------------- +\newcommand*\savetabu[1]{\noalign{% + \tabu@sanitizearg{#1}\tabu@temp + \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else + \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}% + \ifdefined\tabu@restored \expandafter\let + \csname tabu@saved@\tabu@temp \endcsname \tabu@restored + \else {\tabu@save}% + \fi + \fi}% +}% \savetabu +\def\tabu@save {% + \toks0\expandafter{\tabu@saved@}% + \iftabu@negcoef + \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}% + \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi + \toks1\expandafter{\tabu@savedpream}% + \toks2\expandafter{\tabu@savedpreamble}% + \let\@preamble \relax + \let\tabu@savedpream \relax \let\tabu@savedparams \relax + \edef\tabu@preamble{% + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \edef\tabu@usetabu{% + \def\@preamble {\noexpand\the\toks2}% + \tabu@target \the\tabu@target \relax + \tabucolX \the\tabucolX \relax + \tabu@nbcols \the\tabu@nbcols \relax + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \let\tabu@aligndefault \relax \let\@sharp \relax + \edef\@tempa{\noexpand\tabu@s@ved + {\tabu@usetabu} + {\tabu@preamble} + {\the\toks1}}\@tempa + \tabu@message@save +}% \tabu@save +\long\def\tabu@s@ved #1#2#3{% + \def\tabu@usetabu{#1}% + \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{% + \ifodd ##1% \usetabu + \tabu@measuringfalse \tabu@spreadfalse % Just in case... + \gdef\tabu@usetabu {% + \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi + \global\let\tabu@usetabu \@undefined + \def\@halignto {to\tabu@target}% + #1% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \else % \preamble + \gdef\tabu@preamble {% + \global\let\tabu@preamble \@undefined + #2% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \fi + #3}% +}% \tabu@s@ved +\def\tabu@aligndefault@text {\tabu@aligndefault}% +\def\tabu@warn@usetabu {\PackageWarning{tabu} + {Specifying a target with \string\usetabu\space is useless + \MessageBreak The target cannot be changed!}} +\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi} +\def\tabu@savewarn#1#2{\PackageInfo{tabu} + {User-name `#1' already used for \string\savetabu + \MessageBreak #2}}% +\def\tabu@saveerr#1{\PackageError{tabu} + {User-name `#1' is unknown for \string\usetabu + \MessageBreak I cannot restore an unknown preamble!}\@ehd} +%% \rowfont --------------------------------------------------------- +\newskip \tabu@cellskip +\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi + {\ifnum0=`}\fi \tabu@row@font} +\newcommand*\tabu@row@font[2][]{% + \ifnum7=\currentgrouptype + \global\let\tabu@@cellleft \tabu@cellleft + \global\let\tabu@@cellright \tabu@cellright + \global\let\tabu@@celllalign \tabu@celllalign + \global\let\tabu@@cellralign \tabu@cellralign + \global\let\tabu@@rowfontreset\tabu@rowfontreset + \fi + \global\let\tabu@rowfontreset \tabu@rowfont@reset + \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}% + \ifcsname tabu@cell@#1\endcsname % row alignment + \csname tabu@cell@#1\endcsname \fi + \ifnum0=`{\fi}% end of group / noalign group +}% \rowfont +\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}% +\def\tabu@rowfont@reset{% + \global\let\tabu@rowfontreset \tabu@@rowfontreset + \global\let\tabu@cellleft \tabu@@cellleft + \global\let\tabu@cellright \tabu@@cellright + \global\let\tabu@cellfont \@empty + \global\let\tabu@celllalign \tabu@@celllalign + \global\let\tabu@cellralign \tabu@@cellralign +}% \tabu@@rowfontreset +\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl +%% \tabu@prepnext@tok ----------------------------------------------- +\newif \iftabu@cellright +\def\tabu@prepnext@tok{% + \ifnum \count@<\z@ % + \@tempcnta \@M % + \tabu@nbcols\z@ + \let\tabu@fornoopORI \@fornoop + \tabu@cellrightfalse + \else + \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left + \advance \tabu@nbcols \@ne + \iftabu@cellright % before-previous token is right and is finished + \tabu@cellrightfalse % + \tabu@righttok + \fi + \tabu@lefttok + \or % (case 1) previous token is right + \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop + \else % special column: do not change the token + \iftabu@cellright % before-previous token is right + \tabu@cellrightfalse + \tabu@righttok + \fi + \fi % \ifcase + \fi + \tabu@prepnext@tokORI +}% \tabu@prepnext@tok +\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@} +\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{% + \ifx \in@#2\else + \let\@fornoop \tabu@fornoopORI + \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}% + \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}% + \expandafter\prepnext@tok + \fi +}% \tabu@lastnoop +\def\tabu@righttok{% + \advance \count@ \m@ne + \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}% + \advance \count@ \@ne +}% \tabu@righttok +\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign + \the\toks\count@ \tabu@cellleft}% after because of $ +}% \tabu@lefttok +%% Neutralisation of glues ------------------------------------------ +\let\tabu@cellleft \@empty +\let\tabu@cellright \@empty +\tabu@celllalign@def{\tabu@cellleft}% +\let\tabu@cellralign \@empty +\def\tabu@cell@align #1#2#3{% + \let\tabu@maybesiunitx \toks@ \tabu@celllalign + \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}% + \toks@\expandafter{\tabu@cellralign #2}% + \xdef\tabu@cellralign{\the\toks@}% + \toks@\expandafter{\tabu@cellleft #3}% + \xdef\tabu@cellleft{\the\toks@}% +}% \tabu@cell@align +\def\tabu@cell@l{% force alignment to left + \tabu@cell@align + {\tabu@removehfil \raggedright \tabu@cellleft}% left + {\tabu@flush1\tabu@ignorehfil}% right + \raggedright +}% \tabu@cell@l +\def\tabu@cell@c{% force alignment to center + \tabu@cell@align + {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \centering +}% \tabu@cell@c +\def\tabu@cell@r{% force alignment to right + \tabu@cell@align + {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft} + \tabu@ignorehfil + \raggedleft +}% \tabu@cell@r +\def\tabu@cell@j{% force justification (for p, m, b columns) + \tabu@cell@align + {\tabu@justify\tabu@cellleft} + {} + \tabu@justify +}% \tabu@cell@j +\def\tabu@justify{% + \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip + \parfillskip\@flushglue +}% \tabu@justify +%% ragged2e settings +\def\tabu@cell@L{% force alignment to left (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedRight \tabu@cellleft} + {\tabu@flush 1\tabu@ignorehfil} + \RaggedRight +}% \tabu@cell@L +\def\tabu@cell@C{% force alignment to center (ragged2e) + \tabu@cell@align + {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \Centering +}% \tabu@cell@C +\def\tabu@cell@R{% force alignment to right (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft} + \tabu@ignorehfil + \RaggedLeft +}% \tabu@cell@R +\def\tabu@cell@J{% force justification (ragged2e) + \tabu@cell@align + {\justifying \tabu@cellleft} + {} + \justifying +}% \tabu@cell@J +\def\tabu@flush#1{% + \iftabu@colortbl % colortbl uses \hfill rather than \hfil + \hskip \ifnum13<\currentgrouptype \stretch{#1}% + \else \ifdim#1pt<\p@ \tabu@cellskip + \else \stretch{#1} + \fi\fi \relax + \else % array.sty + \ifnum 13<\currentgrouptype + \hfil \hskip1sp \relax \fi + \fi +}% \tabu@flush +\let\tabu@hfil \hfil +\let\tabu@hfill \hfill +\let\tabu@hskip \hskip +\def\tabu@removehfil{% + \iftabu@colortbl + \unkern \tabu@cellskip =\lastskip + \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip + \else \tabu@cellskip \z@skip + \fi + \else + \ifdim\lastskip=1sp\unskip\fi + \ifnum\gluestretchorder\lastskip =\@ne + \hfilneg % \hfilneg for array.sty but not for colortbl... + \fi + \fi +}% \tabu@removehfil +\def\tabu@ignorehfil{\aftergroup \tabu@nohfil} +\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil + \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group +}% \tabu@nohfil +\def\tabu@colortblalignments {% if colortbl + \def\tabu@nohfil{% + \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group + \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff... + \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local +}% \tabu@colortblalignments +%% Taking care of footnotes and hyperfootnotes ---------------------- +\long\def\tabu@footnotetext #1{% + \edef\@tempa{\the\tabu@footnotes + \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}% + \global\tabu@footnotes\expandafter{\@tempa {#1}}}% +\long\def\tabu@xfootnotetext [#1]#2{% + \global\tabu@footnotes\expandafter{\the\tabu@footnotes + \footnotetext [{#1}]{#2}}} +\let\tabu@xfootnote \@xfootnote +\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }} +\long\def\tabu@Hy@xfootnote [#1]{% + \begingroup + \value\@mpfn #1\relax + \protected@xdef \@thefnmark {\thempfn}% + \endgroup + \@footnotemark \tabu@Hy@ftntxt {#1}% +}% \tabu@Hy@xfootnote +\long\def\tabu@Hy@ftntxt #1#2{% + \edef\@tempa{% + \the\tabu@footnotes + \begingroup + \value\@mpfn #1\relax + \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}% + \expandafter \noexpand \expandafter + \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}% + }% + \global\tabu@footnotes\expandafter{\@tempa {#2}% + \endgroup}% +}% \tabu@Hy@ftntxt +\long\def\tabu@Hy@footnotetext #1#2{% + \H@@footnotetext{% + \ifHy@nesting + \hyper@@anchor {#1}{#2}% + \else + \Hy@raisedlink{% + \hyper@@anchor {#1}{\relax}% + }% + \def\@currentHref {#1}% + \let\@currentlabelname \@empty + #2% + \fi + }% +}% \tabu@Hy@footnotetext +%% No need for \arraybackslash ! ------------------------------------ +\def\tabu@latextwoe {% +\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@centering \centering \arraybackslash +\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash +\tabu@temp \tabu@raggedright \raggedright \arraybackslash +}% \tabu@latextwoe +\def\tabu@raggedtwoe {% +\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@Centering \Centering \arraybackslash +\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash +\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash +\tabu@temp \tabu@justifying \justifying \arraybackslash +}% \tabu@raggedtwoe +\def\tabu@normalcrbackslash{\let\\\@normalcr} +\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{% + \expandafter\tabu@normalcrbackslash \@trivlist}} +%% Utilities: \fbox \fcolorbox and \tabudecimal ------------------- +\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox} +\def\tabu@beginfbox {\bgroup \kern\fboxsep + \bgroup\aftergroup\tabu@endfbox} +\def\tabu@endfbox {\kern\fboxsep\egroup\egroup + \@frameb@x\relax} +\def\tabu@color@b@x #1#2{\leavevmode \bgroup + \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}% + \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox +}% \tabu@color@b@x +\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup + \aftergroup\tabu@endcolor@b@x \set@color} +\def\tabu@endcolor@b@x {\kern\fboxsep \egroup + \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@ + \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@ + \tabu@docolor@b@x \egroup +}% \tabu@endcolor@b@x +%% Corrections (arydshln, delarray, colortbl) ----------------------- +\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray + \iftabu@colortbl + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \def\tabu@endarray{% + \crcr \egroup \egroup % + \@arrayright % + \gdef\@preamble{}\CT@end}% + \fi + \else + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \PackageWarning{tabu} + {\string\@arrayright\space is missing from the + \MessageBreak definition of \string\endarray. + \MessageBreak Compatibility with delarray.sty is broken.}% + \fi\fi +}% \tabu@fix@arrayright +\def\tabu@adl@xarraydashrule #1#2#3{% + \ifnum\@lastchclass=\adl@class@start\else + \ifnum\@lastchclass=\@ne\else + \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1) + \adl@leftrulefalse \fi\fi % must be treated the same + \fi + \ifadl@zwvrule\else \ifadl@inactive\else + \@addtopreamble{\vrule\@width\arrayrulewidth + \@height\z@ \@depth\z@}\fi \fi + \ifadl@leftrule + \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}% + {\number#1}#3}% + \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}% + {\number#2}#3} + \fi +}% \tabu@adl@xarraydashrule +\def\tabu@adl@act@endpbox {% + \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox + \egroup \egroup + \adl@colhtdp \box\adl@box \hfil +}% \tabu@adl@act@endpbox +\def\tabu@adl@fix {% + \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln + \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln + \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln + \let\@preamerror \@preamerr % arydshln +}% \tabu@adl@fix +%% Correction for longtable' \@startbox definition ------------------ +%% => \everypar is ``missing'' : TeX should be in vertical mode +\def\tabu@LT@startpbox #1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \everypar{% + \vrule \@height \ht\@arstrutbox \@width \z@ + \everypar{}}% +}% \tabu@LT@startpbox +%% \tracingtabu and the package options ------------------ +\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}} +\DeclareOption{linegoal}{% + \AtEndOfPackage{% + \RequirePackage{linegoal}[2010/12/07]% + \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX +}} +\DeclareOption{scantokens}{\tabuscantokenstrue} +\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}} +\def\tracingtabu {\begingroup\@ifnextchar=% + {\afterassignment\tabu@tracing\count@} + {\afterassignment\tabu@tracing\count@1\relax}} +\def\tabu@tracing{\expandafter\endgroup + \expandafter\tabu@tr@cing \the\count@ \relax +}% \tabu@tracing +\def\tabu@tr@cing #1\relax {% + \ifnum#1>\thr@@ \let\tabu@tracinglines\message + \else \let\tabu@tracinglines\@gobble + \fi + \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG + \def\tabu@mkarstrut {\tabu@DBG@arstrut}% + \tabustrutrule 1.5\p@ + \else \let\tabu@DBG \@gobble + \def\tabu@mkarstrut {\tabu@arstrut}% + \tabustrutrule \z@ + \fi + \ifnum#1>\@ne \let\tabu@debug \message + \else \let\tabu@debug \@gobble + \fi + \ifnum#1>\z@ + \let\tabu@message \message + \let\tabu@tracing@save \tabu@message@save + \let\tabu@starttimer \tabu@pdftimer + \else + \let\tabu@message \@gobble + \let\tabu@tracing@save \@gobble + \let\tabu@starttimer \relax + \fi +}% \tabu@tr@cing +%% Setup \AtBeginDocument +\AtBeginDocument{\tabu@AtBeginDocument} +\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined + \ifdefined\arrayrulecolor \tabu@colortbltrue % + \tabu@colortblalignments % different glues are used + \else \tabu@colortblfalse \fi + \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi + \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi + \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@ + \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname % + \expandafter\ifx + \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax + \tabu@siunitxtrue + \else \let\tabu@maybesiunitx \@firstofone % + \let\tabu@siunitx \tabu@nosiunitx + \tabu@siunitxfalse + \fi + \ifdefined\adl@array % + \else \let\tabu@adl@fix \relax + \let\tabu@adl@endtrial \@empty \fi + \ifdefined\longtable % + \else \let\longtabu \tabu@nolongtabu \fi + \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi + \csname\ifcsname ifHy@hyperfootnotes\endcsname % + ifHy@hyperfootnotes\else iffalse\fi\endcsname + \let\tabu@footnotetext \tabu@Hy@ftntext + \let\tabu@xfootnote \tabu@Hy@xfootnote \fi + \ifdefined\FV@DefineCheckEnd% + \tabu@fancyvrb \fi + \ifdefined\color % + \let\tabu@color \color + \def\tabu@leavevmodecolor ##1{% + \def\tabu@leavevmodecolor {\leavevmode ##1}% + }\expandafter\tabu@leavevmodecolor\expandafter{\color}% + \else + \let\tabu@color \tabu@nocolor + \let\tabu@leavevmodecolor \@firstofone \fi + \tabu@latextwoe + \ifdefined\@raggedtwoe@everyselectfont % + \tabu@raggedtwoe + \else + \let\tabu@cell@L \tabu@cell@l + \let\tabu@cell@R \tabu@cell@r + \let\tabu@cell@C \tabu@cell@c + \let\tabu@cell@J \tabu@cell@j \fi + \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}% + \ifin@ \let\tabu@endarray \endarray + \else \tabu@fix@arrayright \fi% + \everyrow{}% +}% \tabu@AtBeginDocument +\def\tabu@warn@cellspace{% + \PackageWarning{tabu}{% + Package cellspace has some limitations + \MessageBreak And redefines some macros of array.sty. + \MessageBreak Please use \string\tabulinesep\space to control + \MessageBreak vertical spacing of lines inside tabu environment}% +}% \tabu@warn@cellspace +%% tabu Package initialisation +\tabuscantokensfalse +\let\tabu@arc@G \relax +\let\tabu@drsc@G \relax +\let\tabu@evr@G \@empty +\let\tabu@rc@G \@empty +\def\tabu@ls@G {\tabu@linestyle@}% +\let\tabu@@rowfontreset \@empty % +\let\tabu@@celllalign \@empty +\let\tabu@@cellralign \@empty +\let\tabu@@cellleft \@empty +\let\tabu@@cellright \@empty +\def\tabu@naturalXmin {\z@} +\def\tabu@naturalXmax {\z@} +\let\tabu@rowfontreset \@empty +\def\tabulineon {4pt}\let\tabulineoff \tabulineon +\tabu@everyrowtrue +\ifdefined\pdfelapsedtime % + \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}% +\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax +\fi +\tracingtabu=\z@ +\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@ +\tabulinestyle{} +\taburowcolors{} +\let\tabudefaulttarget \linewidth +\ProcessOptions* % \ProcessOptions* is quicker ! +\endinput +%% +%% End of file `tabu.sty'. diff --git a/docs/latex/tree__node_8cpp.tex b/docs/latex/tree__node_8cpp.tex new file mode 100644 index 0000000..eb258fd --- /dev/null +++ b/docs/latex/tree__node_8cpp.tex @@ -0,0 +1,17 @@ +\hypertarget{tree__node_8cpp}{}\doxysection{tree\+\_\+node.\+cpp File Reference} +\label{tree__node_8cpp}\index{tree\_node.cpp@{tree\_node.cpp}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include \char`\"{}tree\+\_\+node.\+h\char`\"{}}\newline + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}. + diff --git a/docs/latex/tree__node_8cpp_source.tex b/docs/latex/tree__node_8cpp_source.tex new file mode 100644 index 0000000..64c5d3a --- /dev/null +++ b/docs/latex/tree__node_8cpp_source.tex @@ -0,0 +1,80 @@ +\hypertarget{tree__node_8cpp_source}{}\doxysection{tree\+\_\+node.\+cpp} +\mbox{\hyperlink{tree__node_8cpp}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00002}00002 \textcolor{comment}{ * @file tree\_node.cpp}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{tree__node_8h}{tree\_node.h}}"{}}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00013}00013 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00014}\mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{00014}} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode::TreeNode}}()} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00015}00015 : m\_type (\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}}::\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}})} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00016}00016 , m\_name (\textcolor{stringliteral}{"{}dbc"{}})} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00017}00017 , m\_children()} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00018}00018 , m\_frame()} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00019}00019 , m\_signal() \{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00020}00020 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00021}00021 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00022}\mbox{\hyperlink{classTreeNode_a8e38dd591d8801d7ee3a7dbad90c67fc}{00022}} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode::TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame)} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00023}00023 : m\_type (\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}}::\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}})} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00024}00024 , m\_name (frame.name)} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00025}00025 , m\_children()} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00026}00026 , m\_frame (new \mbox{\hyperlink{structFrameInfo}{FrameInfo}} (frame))} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00027}00027 , m\_signal() \{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00028}00028 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00029}00029 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00030}\mbox{\hyperlink{classTreeNode_ab9f00f5253d56461bb2d420fd639c5ae}{00030}} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode::TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \&signal)} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00031}00031 : m\_type (\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}}::\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}})} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00032}00032 , m\_name (signal.name)} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00033}00033 , m\_children()} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00034}00034 , m\_frame()} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00035}00035 , m\_signal (new \mbox{\hyperlink{structSignalInfo}{SignalInfo}} (signal)) \{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00036}00036 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00037}00037 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00038}\mbox{\hyperlink{classTreeNode_a6161f2ebb92184eab4215d121870e788}{00038}} \textcolor{keywordtype}{void} \mbox{\hyperlink{classTreeNode_a6161f2ebb92184eab4215d121870e788}{TreeNode::AddChild}} (std::unique\_ptr child) \{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00039}00039 \textcolor{keywordflow}{if} (child)} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00040}00040 \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}.push\_back (std::move (child));} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00041}00041 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00042}00042 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00043}\mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{00043}} std::size\_t \mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{TreeNode::GetChildCount}}()\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00044}00044 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}.size();} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00045}00045 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00046}00046 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00047}\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{00047}} \textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} *\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{TreeNode::GetChild}} (std::size\_t index)\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00048}00048 \textcolor{keywordflow}{if} (index >= \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}.size())} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00049}00049 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00050}00050 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00051}00051 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}[index].get();} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00052}00052 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00053}00053 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00054}\mbox{\hyperlink{classTreeNode_a81047bd7d2a4cc96b9ef5e20d0d63b5f}{00054}} \mbox{\hyperlink{classTreeNode}{TreeNode}} *\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{TreeNode::GetChild}} (std::size\_t index) \{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00055}00055 \textcolor{keywordflow}{if} (index >= \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}.size())} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00056}00056 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00057}00057 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00058}00058 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}[index].get();} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00059}00059 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00060}00060 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00061}\mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{00061}} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}} \mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{TreeNode::GetType}}()\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00062}00062 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}{m\_type}};} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00063}00063 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00064}00064 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00065}\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{00065}} \textcolor{keyword}{const} std::string \&\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{TreeNode::GetName}}()\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00066}00066 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}{m\_name}};} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00067}00067 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00068}00068 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00069}\mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{00069}} \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *\mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{TreeNode::GetFrame}}()\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00070}00070 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}{m\_frame}}.get();} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00071}00071 \}} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00072}00072 } +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00073}\mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{00073}} \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *\mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{TreeNode::GetSignal}}()\textcolor{keyword}{ const }\{} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00074}00074 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}{m\_signal}}.get();} +\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00075}00075 \}} + +\end{DoxyCode} diff --git a/docs/latex/tree__node_8h.tex b/docs/latex/tree__node_8h.tex new file mode 100644 index 0000000..30d9a85 --- /dev/null +++ b/docs/latex/tree__node_8h.tex @@ -0,0 +1,66 @@ +\hypertarget{tree__node_8h}{}\doxysection{tree\+\_\+node.\+h File Reference} +\label{tree__node_8h}\index{tree\_node.h@{tree\_node.h}} + + +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + + +{\ttfamily \#include $<$string$>$}\newline +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include $<$cstddef$>$}\newline +{\ttfamily \#include \char`\"{}frame\+\_\+info.\+h\char`\"{}}\newline +{\ttfamily \#include \char`\"{}signal\+\_\+info.\+h\char`\"{}}\newline +\doxysubsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \mbox{\hyperlink{classTreeNode}{Tree\+Node}} +\begin{DoxyCompactList}\small\item\em Tree node for later use in model/view or other hierarchy consumers. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Enumerations} +\begin{DoxyCompactItemize} +\item +enum class \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} \{ \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}} +, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}} +, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}} + \} +\begin{DoxyCompactList}\small\item\em Type of a tree node. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) + +Licensed under the MIT License. See LICENSE file in the project root for full license text. + +Definition in file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}. + + + +\doxysubsection{Enumeration Type Documentation} +\mbox{\Hypertarget{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}\label{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}} +\index{tree\_node.h@{tree\_node.h}!NodeType@{NodeType}} +\index{NodeType@{NodeType}!tree\_node.h@{tree\_node.h}} +\doxysubsubsection{\texorpdfstring{NodeType}{NodeType}} +{\footnotesize\ttfamily enum class \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}}\hspace{0.3cm}{\ttfamily [strong]}} + + + +Type of a tree node. + +\begin{DoxyEnumFields}{Enumerator} +\raisebox{\heightof{T}}[0pt][0pt]{\index{Root@{Root}!tree\_node.h@{tree\_node.h}}\index{tree\_node.h@{tree\_node.h}!Root@{Root}}}\mbox{\Hypertarget{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}\label{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}} +Root&\\ +\hline + +\raisebox{\heightof{T}}[0pt][0pt]{\index{Frame@{Frame}!tree\_node.h@{tree\_node.h}}\index{tree\_node.h@{tree\_node.h}!Frame@{Frame}}}\mbox{\Hypertarget{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}\label{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}} +Frame&\\ +\hline + +\raisebox{\heightof{T}}[0pt][0pt]{\index{Signal@{Signal}!tree\_node.h@{tree\_node.h}}\index{tree\_node.h@{tree\_node.h}!Signal@{Signal}}}\mbox{\Hypertarget{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}\label{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}} +Signal&\\ +\hline + +\end{DoxyEnumFields} + + +Definition at line \mbox{\hyperlink{tree__node_8h_source_l00026}{26}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}. + diff --git a/docs/latex/tree__node_8h_source.tex b/docs/latex/tree__node_8h_source.tex new file mode 100644 index 0000000..d5af660 --- /dev/null +++ b/docs/latex/tree__node_8h_source.tex @@ -0,0 +1,125 @@ +\hypertarget{tree__node_8h_source}{}\doxysection{tree\+\_\+node.\+h} +\mbox{\hyperlink{tree__node_8h}{Go to the documentation of this file.}} +\begin{DoxyCode}{0} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00001}00001 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00002}00002 \textcolor{comment}{ * @file tree\_node.h}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00003}00003 \textcolor{comment}{ * @brief}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00004}00004 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00007}00007 \textcolor{comment}{ *}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00010}00010 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00011}00011 } +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef TREE\_NODE\_H}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00013}00013 \textcolor{preprocessor}{\#define TREE\_NODE\_H}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00014}00014 } +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00018}00018 \textcolor{preprocessor}{\#include }} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00019}00019 } +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00020}00020 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{frame__info_8h}{frame\_info.h}}"{}}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00021}00021 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{signal__info_8h}{signal\_info.h}}"{}}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00022}00022 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00023}00023 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00024}00024 \textcolor{comment}{ * @brief Type of a tree node.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00025}00025 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00026}\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{00026}} \textcolor{keyword}{enum class} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}} \{} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00027}00027 \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}},} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00028}00028 \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}},} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00029}00029 \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00030}00030 \};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00031}00031 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00032}00032 \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00033}00033 \textcolor{comment}{ * @brief Tree node for later use in model/view or other hierarchy consumers.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00034}00034 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00035}\mbox{\hyperlink{classTreeNode}{00035}} \textcolor{keyword}{class }\mbox{\hyperlink{classTreeNode}{TreeNode}} \{} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00036}00036 \textcolor{keyword}{public}:\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00037}00037 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00038}00038 \textcolor{comment}{ * @brief Create root node.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00039}00039 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00040}00040 \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode}}();} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00041}00041 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00042}00042 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00043}00043 \textcolor{comment}{ * @brief Create frame node.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00044}00044 \textcolor{comment}{ * @param frame Frame payload.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00045}00045 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00046}00046 \textcolor{keyword}{explicit} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame);} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00047}00047 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00048}00048 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00049}00049 \textcolor{comment}{ * @brief Create signal node.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00050}00050 \textcolor{comment}{ * @param signal Signal payload.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00051}00051 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00052}00052 \textcolor{keyword}{explicit} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \&signal);} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00053}00053 } +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00054}\mbox{\hyperlink{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}{00054}} \mbox{\hyperlink{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}{\string~TreeNode}}() = \textcolor{keywordflow}{default};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00055}00055 } +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00056}\mbox{\hyperlink{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}{00056}} \mbox{\hyperlink{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}{TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} \&) = \textcolor{keyword}{delete};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00057}\mbox{\hyperlink{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}{00057}} \mbox{\hyperlink{classTreeNode}{TreeNode}} \&\mbox{\hyperlink{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}{operator= }}(\textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} \&) = \textcolor{keyword}{delete};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00058}00058 } +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00059}\mbox{\hyperlink{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}{00059}} \mbox{\hyperlink{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}{TreeNode}} (\mbox{\hyperlink{classTreeNode}{TreeNode}} \&\&) = \textcolor{keywordflow}{default};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00060}\mbox{\hyperlink{classTreeNode_a88fbcbec9c64d888b19c5edb95059a95}{00060}} \mbox{\hyperlink{classTreeNode}{TreeNode}} \&\mbox{\hyperlink{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}{operator= }}(\mbox{\hyperlink{classTreeNode}{TreeNode}} \&\&) = \textcolor{keywordflow}{default};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00061}00061 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00062}00062 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00063}00063 \textcolor{comment}{ * @brief Add child node.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00064}00064 \textcolor{comment}{ * @param child Child node to add.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00065}00065 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00066}00066 \textcolor{keywordtype}{void} \mbox{\hyperlink{classTreeNode_a6161f2ebb92184eab4215d121870e788}{AddChild}} (std::unique\_ptr child);} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00067}00067 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00068}00068 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00069}00069 \textcolor{comment}{ * @brief Get child count.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00070}00070 \textcolor{comment}{ * @return Number of children.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00071}00071 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00072}00072 std::size\_t \mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{GetChildCount}}() \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00073}00073 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00074}00074 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00075}00075 \textcolor{comment}{ * @brief Get child by index.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00076}00076 \textcolor{comment}{ * @param index Child index.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00077}00077 \textcolor{comment}{ * @return Child pointer or nullptr if index is invalid.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00078}00078 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00079}00079 \textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} *\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{GetChild}} (std::size\_t index) \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00080}00080 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00081}00081 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00082}00082 \textcolor{comment}{ * @brief Get mutable child by index.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00083}00083 \textcolor{comment}{ * @param index Child index.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00084}00084 \textcolor{comment}{ * @return Child pointer or nullptr if index is invalid.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00085}00085 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00086}00086 \mbox{\hyperlink{classTreeNode}{TreeNode}} *\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{GetChild}} (std::size\_t index);} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00087}00087 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00088}00088 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00089}00089 \textcolor{comment}{ * @brief Get node type.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00090}00090 \textcolor{comment}{ * @return Node type.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00091}00091 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00092}00092 \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}} \mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{GetType}}() \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00093}00093 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00094}00094 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00095}00095 \textcolor{comment}{ * @brief Get display name.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00096}00096 \textcolor{comment}{ * @return Node name.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00097}00097 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00098}00098 \textcolor{keyword}{const} std::string \&\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{GetName}}() \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00099}00099 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00100}00100 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00101}00101 \textcolor{comment}{ * @brief Get frame payload if node is frame.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00102}00102 \textcolor{comment}{ * @return Pointer to frame info or nullptr.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00103}00103 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00104}00104 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *\mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{GetFrame}}() \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00105}00105 \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00106}00106 \textcolor{comment}{ /**}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00107}00107 \textcolor{comment}{ * @brief Get signal payload if node is signal.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00108}00108 \textcolor{comment}{ * @return Pointer to signal info or nullptr.}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00109}00109 \textcolor{comment}{ */}} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00110}00110 \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *\mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{GetSignal}}() \textcolor{keyword}{const};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00111}00111 } +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00112}00112 \textcolor{keyword}{private}:} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00113}\mbox{\hyperlink{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}{00113}} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}} \mbox{\hyperlink{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}{m\_type}};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00114}\mbox{\hyperlink{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}{00114}} std::string \mbox{\hyperlink{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}{m\_name}};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00115}\mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{00115}} std::vector > \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00116}\mbox{\hyperlink{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}{00116}} std::unique\_ptr \mbox{\hyperlink{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}{m\_frame}};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00117}\mbox{\hyperlink{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}{00117}} std::unique\_ptr \mbox{\hyperlink{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}{m\_signal}};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00118}00118 \};} +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00119}00119 } +\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00120}00120 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* TREE\_NODE\_H */}\textcolor{preprocessor}{}} + +\end{DoxyCode}