Closes #33
This commit is contained in:
1 parent
f60faea2e7
commit
f03882d3f4
86 files changed
+3539
-2688
No files matched your search
@@ -520,199 +520,207 @@ $(document).ready(function(){initNavTree('dbc__statement__handler_8cpp_source.ht
|
||||
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> RegisterType<DbcMultiplexingHandler>(<span class="stringliteral">"SG_MUL_VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> RegisterType<DbcFrameHandler>(<span class="stringliteral">"BO_"</span>);</div>
|
||||
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> RegisterType<DbcSignalHandler>(<span class="stringliteral">"SG_"</span>);</div>
|
||||
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> RegisterType<DbcCommentHandler>(<span class="stringliteral">"CM_"</span>);</div>
|
||||
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> RegisterType<DbcValueDescriptionHandler>(<span class="stringliteral">"VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> RegisterType<DbcAttributeHandler>(<span class="stringliteral">"BA_DEF_"</span>);</div>
|
||||
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> RegisterType<DbcAttributeHandler>(<span class="stringliteral">"BA_DEF_DEF_"</span>);</div>
|
||||
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> RegisterType<DbcAttributeHandler>(<span class="stringliteral">"BA_"</span>);</div>
|
||||
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span>}</div>
|
||||
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> RegisterType<DbcUnsupportedSignalTypeHandler>(<span class="stringliteral">"SIG_VALTYPE_"</span>);</div>
|
||||
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> RegisterType<DbcCommentHandler>(<span class="stringliteral">"CM_"</span>);</div>
|
||||
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> RegisterType<DbcValueDescriptionHandler>(<span class="stringliteral">"VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> RegisterType<DbcAttributeHandler>(<span class="stringliteral">"BA_DEF_"</span>);</div>
|
||||
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> RegisterType<DbcAttributeHandler>(<span class="stringliteral">"BA_DEF_DEF_"</span>);</div>
|
||||
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> RegisterType<DbcAttributeHandler>(<span class="stringliteral">"BA_"</span>);</div>
|
||||
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span>}</div>
|
||||
</div>
|
||||
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> </div>
|
||||
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"><a class="line" href="classDbcHeaderHandler.html#a1e43a9dcf157f4d4418032d9e9711693"> 421</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classDbcHeaderHandler.html#a1e43a9dcf157f4d4418032d9e9711693">DbcHeaderHandler::Handle</a>(<span class="keyword">const</span> std::string &, <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &)<span class="keyword"> const </span>{}</div>
|
||||
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> </div>
|
||||
<div class="foldopen" id="foldopen00423" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"><a class="line" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed"> 423</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a>(<span class="keyword">const</span> std::string &line,</div>
|
||||
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &context)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> std::istringstream stream(line);</div>
|
||||
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> std::string keyword;</div>
|
||||
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> stream >> keyword;</div>
|
||||
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> <span class="keyword">const</span> HandlerMap::const_iterator handler = m_handlers.find(keyword);</div>
|
||||
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <span class="keywordflow">if</span> (handler == m_handlers.end())</div>
|
||||
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> handler->second->Handle(line, context);</div>
|
||||
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span>}</div>
|
||||
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> </div>
|
||||
<div class="foldopen" id="foldopen00422" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"><a class="line" href="classDbcUnsupportedSignalTypeHandler.html#ae4132fcdbb134d51143133c1fb83a9df"> 422</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classDbcUnsupportedSignalTypeHandler.html#ae4132fcdbb134d51143133c1fb83a9df">DbcUnsupportedSignalTypeHandler::Handle</a>(<span class="keyword">const</span> std::string &, <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"SIG_VALTYPE_ declarations are unsupported; refusing potentially incorrect integer decoding."</span>);</div>
|
||||
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span>}</div>
|
||||
</div>
|
||||
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> </div>
|
||||
<div class="foldopen" id="foldopen00435" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"><a class="line" href="classDbcValueDescriptionHandler.html#a653e13364f396b54244edc2c0fdd831a"> 435</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classDbcValueDescriptionHandler.html#a653e13364f396b54244edc2c0fdd831a">DbcValueDescriptionHandler::Handle</a>(<span class="keyword">const</span> std::string &line, <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &context)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> <span class="keyword">static</span> <span class="keyword">const</span> std::regex header(R<span class="stringliteral">"(^VAL_[ \t]+([^ \t]+)[ \t]+([^ \t;]+)[ \t]+(.*)$)");</span></div>
|
||||
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span><span class="stringliteral"> </span><span class="keyword">static</span> <span class="keyword">const</span> std::regex pair(R<span class="stringliteral">"dbc(^([^ \t]+)[ \t]+"((?:[^"\\]|\\["\\])*)")dbc");</span></div>
|
||||
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span><span class="stringliteral"> std::smatch fields;</span></div>
|
||||
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span><span class="stringliteral"> </span><span class="keywordflow">if</span> (!std::regex_match(line, fields, header))</div>
|
||||
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed or unsupported VAL_ statement."</span>);</div>
|
||||
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> <span class="keyword">const</span> std::uint32_t rawId = ParseDecimal(fields[1].str(), std::numeric_limits<std::uint32_t>::max(), <span class="stringliteral">"VAL_ CAN ID"</span>);</div>
|
||||
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> <span class="keywordflow">if</span> ((rawId & 0x60000000U) != 0U)</div>
|
||||
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"VAL_ CAN ID exceeds the 29-bit identifier range."</span>);</div>
|
||||
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> <a class="code hl_struct" href="structPendingValueDescriptions.html">PendingValueDescriptions</a> pending;</div>
|
||||
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> NormalizeCanId(rawId, pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a5f0082ceeaee77e2f823661547aad844">canId</a>, pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a60f185e8d91010927c4aa3b4a750c9f4">isExtended</a>);</div>
|
||||
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#ac35446db10ebda5a12349759613f8c90">signalName</a> = fields[2].str();</div>
|
||||
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a5c19cff09b0e83bd3cd6085213c17da8">lineNumber</a> = context.<a class="code hl_variable" href="structDbcParseContext.html#a57f5a7f613ecd0dadbafa7af736b7e54">lineNumber</a>;</div>
|
||||
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> std::string rest = fields[3].str();</div>
|
||||
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <span class="keywordflow">while</span> (rest != <span class="stringliteral">";"</span>) {</div>
|
||||
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> <span class="keywordflow">if</span> (!std::regex_search(rest, fields, pair))</div>
|
||||
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed VAL_ value/description pair or missing semicolon."</span>);</div>
|
||||
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <span class="keyword">const</span> std::string number = fields[1].str();</div>
|
||||
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> <span class="keyword">const</span> RawSignalValue key = ParseValueKey(number);</div>
|
||||
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> <span class="keyword">const</span> std::string description = UnescapeDescription(fields[2].str());</div>
|
||||
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> <span class="keywordflow">if</span> (!pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a10ecbaeaed2cc3ac82fada73e7e041dd">descriptions</a>.emplace(key, description).second)</div>
|
||||
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Duplicate VAL_ value key: "</span> + number);</div>
|
||||
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="keyword">const</span> std::size_t consumed = <span class="keyword">static_cast<</span>std::size_t<span class="keyword">></span>(fields.length());</div>
|
||||
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> rest.erase(0, consumed);</div>
|
||||
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <span class="keywordflow">if</span> (!rest.empty() && rest[0] != <span class="charliteral">';'</span> && rest[0] != <span class="charliteral">' '</span> && rest[0] != <span class="charliteral">'\t'</span>)</div>
|
||||
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Missing whitespace between VAL_ pairs."</span>);</div>
|
||||
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> rest = dbc_detail::TrimText(rest);</div>
|
||||
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> }</div>
|
||||
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> <span class="keywordflow">if</span> (pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a10ecbaeaed2cc3ac82fada73e7e041dd">descriptions</a>.empty())</div>
|
||||
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"VAL_ requires at least one value/description pair."</span>);</div>
|
||||
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> context.<a class="code hl_variable" href="structDbcParseContext.html#ac22cba614ada3a28c7dcc1ea338b0e01">pendingValues</a>.push_back(std::move(pending));</div>
|
||||
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span>}</div>
|
||||
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> </div>
|
||||
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"><a class="line" href="classDbcHeaderHandler.html#a1e43a9dcf157f4d4418032d9e9711693"> 426</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classDbcHeaderHandler.html#a1e43a9dcf157f4d4418032d9e9711693">DbcHeaderHandler::Handle</a>(<span class="keyword">const</span> std::string &, <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &)<span class="keyword"> const </span>{}</div>
|
||||
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> </div>
|
||||
<div class="foldopen" id="foldopen00428" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"><a class="line" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed"> 428</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a>(<span class="keyword">const</span> std::string &line,</div>
|
||||
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &context)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> std::istringstream stream(line);</div>
|
||||
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> std::string keyword;</div>
|
||||
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> stream >> keyword;</div>
|
||||
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> <span class="keyword">const</span> HandlerMap::const_iterator handler = m_handlers.find(keyword);</div>
|
||||
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> <span class="keywordflow">if</span> (handler == m_handlers.end())</div>
|
||||
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> handler->second->Handle(line, context);</div>
|
||||
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span>}</div>
|
||||
</div>
|
||||
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> </div>
|
||||
<div class="foldopen" id="foldopen00468" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"><a class="line" href="structDbcParseContext.html#ab5552dad944fde7fa6add6464ddb5369"> 468</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="structDbcParseContext.html#ab5552dad944fde7fa6add6464ddb5369">DbcParseContext::ResolveValueDescriptions</a>(<span class="keyword">const</span> std::string &filePath) {</div>
|
||||
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structPendingValueDescriptions.html">PendingValueDescriptions</a> &pending: <a class="code hl_variable" href="structDbcParseContext.html#ac22cba614ada3a28c7dcc1ea338b0e01">pendingValues</a>) {</div>
|
||||
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> <span class="keywordflow">try</span> {</div>
|
||||
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *frame = FindUniqueFrame(<a class="code hl_variable" href="structDbcParseContext.html#a79bad0b8302e2156670461bab529259c">database</a>, pending.canId, pending.isExtended);</div>
|
||||
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *signal = FindUniqueSignal(*frame, pending.signalName);</div>
|
||||
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> ValueDescriptions::value_type &entry: pending.descriptions) {</div>
|
||||
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> <span class="keywordflow">if</span> (!signal-><a class="code hl_variable" href="structSignalInfo.html#a43f47d0433d0cc39076bd7278b46af9c">valueDescriptions</a>.insert(entry).second)</div>
|
||||
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Duplicate VAL_ value key for signal: "</span> + pending.signalName);</div>
|
||||
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> }</div>
|
||||
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &error) {</div>
|
||||
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classDbcDiagnosticError.html">DbcDiagnosticError</a>(DbcDiagnosticCode::InvalidValueDescription,</div>
|
||||
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> filePath, pending.lineNumber, error.what());</div>
|
||||
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> }</div>
|
||||
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> }</div>
|
||||
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span>}</div>
|
||||
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> </div>
|
||||
<div class="foldopen" id="foldopen00440" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"><a class="line" href="classDbcValueDescriptionHandler.html#a653e13364f396b54244edc2c0fdd831a"> 440</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classDbcValueDescriptionHandler.html#a653e13364f396b54244edc2c0fdd831a">DbcValueDescriptionHandler::Handle</a>(<span class="keyword">const</span> std::string &line, <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &context)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> <span class="keyword">static</span> <span class="keyword">const</span> std::regex header(R<span class="stringliteral">"(^VAL_[ \t]+([^ \t]+)[ \t]+([^ \t;]+)[ \t]+(.*)$)");</span></div>
|
||||
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span><span class="stringliteral"> </span><span class="keyword">static</span> <span class="keyword">const</span> std::regex pair(R<span class="stringliteral">"dbc(^([^ \t]+)[ \t]+"((?:[^"\\]|\\["\\])*)")dbc");</span></div>
|
||||
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span><span class="stringliteral"> std::smatch fields;</span></div>
|
||||
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span><span class="stringliteral"> </span><span class="keywordflow">if</span> (!std::regex_match(line, fields, header))</div>
|
||||
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed or unsupported VAL_ statement."</span>);</div>
|
||||
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> <span class="keyword">const</span> std::uint32_t rawId = ParseDecimal(fields[1].str(), std::numeric_limits<std::uint32_t>::max(), <span class="stringliteral">"VAL_ CAN ID"</span>);</div>
|
||||
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> <span class="keywordflow">if</span> ((rawId & 0x60000000U) != 0U)</div>
|
||||
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"VAL_ CAN ID exceeds the 29-bit identifier range."</span>);</div>
|
||||
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <a class="code hl_struct" href="structPendingValueDescriptions.html">PendingValueDescriptions</a> pending;</div>
|
||||
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> NormalizeCanId(rawId, pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a5f0082ceeaee77e2f823661547aad844">canId</a>, pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a60f185e8d91010927c4aa3b4a750c9f4">isExtended</a>);</div>
|
||||
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#ac35446db10ebda5a12349759613f8c90">signalName</a> = fields[2].str();</div>
|
||||
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a5c19cff09b0e83bd3cd6085213c17da8">lineNumber</a> = context.<a class="code hl_variable" href="structDbcParseContext.html#a57f5a7f613ecd0dadbafa7af736b7e54">lineNumber</a>;</div>
|
||||
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> std::string rest = fields[3].str();</div>
|
||||
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> <span class="keywordflow">while</span> (rest != <span class="stringliteral">";"</span>) {</div>
|
||||
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> <span class="keywordflow">if</span> (!std::regex_search(rest, fields, pair))</div>
|
||||
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed VAL_ value/description pair or missing semicolon."</span>);</div>
|
||||
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="keyword">const</span> std::string number = fields[1].str();</div>
|
||||
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> <span class="keyword">const</span> RawSignalValue key = ParseValueKey(number);</div>
|
||||
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <span class="keyword">const</span> std::string description = UnescapeDescription(fields[2].str());</div>
|
||||
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> <span class="keywordflow">if</span> (!pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a10ecbaeaed2cc3ac82fada73e7e041dd">descriptions</a>.emplace(key, description).second)</div>
|
||||
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Duplicate VAL_ value key: "</span> + number);</div>
|
||||
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> <span class="keyword">const</span> std::size_t consumed = <span class="keyword">static_cast<</span>std::size_t<span class="keyword">></span>(fields.length());</div>
|
||||
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> rest.erase(0, consumed);</div>
|
||||
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="keywordflow">if</span> (!rest.empty() && rest[0] != <span class="charliteral">';'</span> && rest[0] != <span class="charliteral">' '</span> && rest[0] != <span class="charliteral">'\t'</span>)</div>
|
||||
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Missing whitespace between VAL_ pairs."</span>);</div>
|
||||
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> rest = dbc_detail::TrimText(rest);</div>
|
||||
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> }</div>
|
||||
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <span class="keywordflow">if</span> (pending.<a class="code hl_variable" href="structPendingValueDescriptions.html#a10ecbaeaed2cc3ac82fada73e7e041dd">descriptions</a>.empty())</div>
|
||||
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"VAL_ requires at least one value/description pair."</span>);</div>
|
||||
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> context.<a class="code hl_variable" href="structDbcParseContext.html#ac22cba614ada3a28c7dcc1ea338b0e01">pendingValues</a>.push_back(std::move(pending));</div>
|
||||
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span>}</div>
|
||||
</div>
|
||||
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> </div>
|
||||
<div class="foldopen" id="foldopen00484" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"><a class="line" href="classDbcMultiplexingHandler.html#a16f9e9f898640200477d2dcc8bab442e"> 484</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classDbcMultiplexingHandler.html#a16f9e9f898640200477d2dcc8bab442e">DbcMultiplexingHandler::Handle</a>(<span class="keyword">const</span> std::string &line, <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &context)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> <span class="keyword">static</span> <span class="keyword">const</span> std::regex syntax(R<span class="stringliteral">"(^SG_MUL_VAL_[ \t]+([0-9]+)[ \t]+([^ \t;]+)[ \t]+([^ \t;]+)[ \t]+(.+);[ \t]*$)");</span></div>
|
||||
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span><span class="stringliteral"> </span><span class="keyword">static</span> <span class="keyword">const</span> std::regex rangeSyntax(R<span class="stringliteral">"(^[ \t]*([0-9]+)[ \t]*-[ \t]*([0-9]+)[ \t]*$)");</span></div>
|
||||
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span><span class="stringliteral"> std::smatch fields;</span></div>
|
||||
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span><span class="stringliteral"> </span><span class="keywordflow">if</span> (!std::regex_match(line, fields, syntax))</div>
|
||||
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed SG_MUL_VAL_ statement."</span>);</div>
|
||||
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> <a class="code hl_struct" href="structPendingMultiplexing.html">PendingMultiplexing</a> pending;</div>
|
||||
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> NormalizeCanId(ParseCanId(fields[1].str()), pending.canId, pending.isExtended);</div>
|
||||
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> pending.signalName = fields[2].str();</div>
|
||||
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> pending.selectorName = fields[3].str();</div>
|
||||
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> pending.lineNumber = context.<a class="code hl_variable" href="structDbcParseContext.html#a57f5a7f613ecd0dadbafa7af736b7e54">lineNumber</a>;</div>
|
||||
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> <span class="keyword">const</span> std::string list = fields[4].str();</div>
|
||||
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> std::size_t begin = 0U;</div>
|
||||
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> <span class="keywordflow">for</span> (;;) {</div>
|
||||
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> <span class="keyword">const</span> std::size_t comma = list.find(<span class="charliteral">','</span>, begin);</div>
|
||||
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> <span class="keyword">const</span> std::string item = list.substr(begin, comma == std::string::npos ? comma : comma - begin);</div>
|
||||
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> <span class="keywordflow">if</span> (!std::regex_match(item, fields, rangeSyntax))</div>
|
||||
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed multiplex range."</span>);</div>
|
||||
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> <a class="code hl_struct" href="structMultiplexRange.html">MultiplexRange</a> range;</div>
|
||||
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <span class="keyword">const</span> std::string lower = fields[1].str();</div>
|
||||
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keyword">const</span> std::string upper = fields[2].str();</div>
|
||||
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <span class="keyword">const</span> std::from_chars_result low = std::from_chars(lower.data(), lower.data() + lower.size(), range.minimum);</div>
|
||||
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keyword">const</span> std::from_chars_result high = std::from_chars(upper.data(), upper.data() + upper.size(), range.maximum);</div>
|
||||
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> <span class="keywordflow">if</span> (low.ec != std::errc() || high.ec != std::errc() || range.minimum > range.maximum)</div>
|
||||
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Invalid multiplex range."</span>);</div>
|
||||
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> pending.ranges.push_back(range);</div>
|
||||
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <span class="keywordflow">if</span> (comma == std::string::npos)</div>
|
||||
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keywordflow">break</span>;</div>
|
||||
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> begin = comma + 1U;</div>
|
||||
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> }</div>
|
||||
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> context.pendingMultiplexing.push_back(std::move(pending));</div>
|
||||
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span>}</div>
|
||||
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> </div>
|
||||
<div class="foldopen" id="foldopen00473" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"><a class="line" href="structDbcParseContext.html#ab5552dad944fde7fa6add6464ddb5369"> 473</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="structDbcParseContext.html#ab5552dad944fde7fa6add6464ddb5369">DbcParseContext::ResolveValueDescriptions</a>(<span class="keyword">const</span> std::string &filePath) {</div>
|
||||
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structPendingValueDescriptions.html">PendingValueDescriptions</a> &pending: <a class="code hl_variable" href="structDbcParseContext.html#ac22cba614ada3a28c7dcc1ea338b0e01">pendingValues</a>) {</div>
|
||||
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> <span class="keywordflow">try</span> {</div>
|
||||
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *frame = FindUniqueFrame(<a class="code hl_variable" href="structDbcParseContext.html#a79bad0b8302e2156670461bab529259c">database</a>, pending.canId, pending.isExtended);</div>
|
||||
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *signal = FindUniqueSignal(*frame, pending.signalName);</div>
|
||||
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> ValueDescriptions::value_type &entry: pending.descriptions) {</div>
|
||||
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> <span class="keywordflow">if</span> (!signal-><a class="code hl_variable" href="structSignalInfo.html#a43f47d0433d0cc39076bd7278b46af9c">valueDescriptions</a>.insert(entry).second)</div>
|
||||
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Duplicate VAL_ value key for signal: "</span> + pending.signalName);</div>
|
||||
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> }</div>
|
||||
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &error) {</div>
|
||||
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classDbcDiagnosticError.html">DbcDiagnosticError</a>(DbcDiagnosticCode::InvalidValueDescription,</div>
|
||||
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> filePath, pending.lineNumber, error.what());</div>
|
||||
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> }</div>
|
||||
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> }</div>
|
||||
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span>}</div>
|
||||
</div>
|
||||
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> </div>
|
||||
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span><span class="keywordtype">void</span> DbcParseContext::ResolveMultiplexing(<span class="keyword">const</span> std::string &filePath) {</div>
|
||||
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structPendingMultiplexing.html">PendingMultiplexing</a> &pending: pendingMultiplexing) {</div>
|
||||
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> <span class="keywordflow">try</span> {</div>
|
||||
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *frame = FindUniqueFrame(<a class="code hl_variable" href="structDbcParseContext.html#a79bad0b8302e2156670461bab529259c">database</a>, pending.canId, pending.isExtended, <span class="stringliteral">"SG_MUL_VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *signal = FindUniqueSignal(*frame, pending.signalName, <span class="stringliteral">"SG_MUL_VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *selector = FindUniqueSignal(*frame, pending.selectorName, <span class="stringliteral">"SG_MUL_VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> <span class="keywordflow">if</span> (!IsMultiplexSelector(selector-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role) || selector-><a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>)</div>
|
||||
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Referenced signal must be an unsigned multiplex selector."</span>);</div>
|
||||
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <span class="keywordflow">if</span> (!signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa91e54403c78a663686b2fd22282afaf">selector</a>.empty() && signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa91e54403c78a663686b2fd22282afaf">selector</a> != pending.selectorName)</div>
|
||||
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Multiple parent selectors for one signal are unsupported."</span>);</div>
|
||||
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structMultiplexRange.html">MultiplexRange</a> &range: pending.ranges) {</div>
|
||||
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> <span class="keywordflow">if</span> (selector-><a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a> < 64U && range.maximum >= (std::uint64_t(1U) << selector-><a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>))</div>
|
||||
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Branch value exceeds selector raw range."</span>);</div>
|
||||
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> }</div>
|
||||
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa91e54403c78a663686b2fd22282afaf">selector</a> = pending.selectorName;</div>
|
||||
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa174ac4a3af9b361d2de7517dfd4b69e">ranges</a>.insert(signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa174ac4a3af9b361d2de7517dfd4b69e">ranges</a>.end(), pending.ranges.begin(), pending.ranges.end());</div>
|
||||
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> <span class="keywordflow">if</span> (!IsMultiplexSelector(signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role))</div>
|
||||
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role = MultiplexRole::Branch;</div>
|
||||
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role = MultiplexRole::BranchSelector;</div>
|
||||
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &error) {</div>
|
||||
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classDbcDiagnosticError.html">DbcDiagnosticError</a>(DbcDiagnosticCode::InvalidMultiplexing, filePath, pending.lineNumber, error.what());</div>
|
||||
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> }</div>
|
||||
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> }</div>
|
||||
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span>}</div>
|
||||
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> </div>
|
||||
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span><span class="keyword">namespace </span>{</div>
|
||||
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> std::vector<std::uint64_t> SignalBits(<span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &signal) {</div>
|
||||
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> std::vector<std::uint64_t> bits;</div>
|
||||
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> std::uint64_t bit = signal.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a>;</div>
|
||||
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> <span class="keywordflow">for</span> (std::uint32_t index = 0U; index < signal.<a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>; ++index) {</div>
|
||||
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> bits.push_back(bit);</div>
|
||||
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> bit = NextSignalBit(bit, signal.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a>);</div>
|
||||
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> }</div>
|
||||
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> <span class="keywordflow">return</span> bits;</div>
|
||||
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> }</div>
|
||||
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> </div>
|
||||
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> <span class="keywordtype">bool</span> SignalsOverlap(<span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &first, <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &second) {</div>
|
||||
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> <span class="keyword">const</span> std::vector<std::uint64_t> firstBits = SignalBits(first);</div>
|
||||
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> <span class="keyword">const</span> std::vector<std::uint64_t> secondBits = SignalBits(second);</div>
|
||||
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::uint64_t firstBit : firstBits) {</div>
|
||||
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::uint64_t secondBit : secondBits) {</div>
|
||||
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> <span class="keywordflow">if</span> (firstBit == secondBit)</div>
|
||||
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> }</div>
|
||||
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> }</div>
|
||||
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> }</div>
|
||||
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span>}</div>
|
||||
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> </div>
|
||||
<div class="foldopen" id="foldopen00567" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"><a class="line" href="structDbcParseContext.html#a908056de0a97316a4ebecb3f99cc400b"> 567</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="structDbcParseContext.html#a908056de0a97316a4ebecb3f99cc400b">DbcParseContext::ValidateMultiplexing</a>(<span class="keyword">const</span> std::string &filePath)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> <span class="keywordflow">for</span> (std::size_t frameIndex = 0U; frameIndex < <a class="code hl_variable" href="structDbcParseContext.html#a79bad0b8302e2156670461bab529259c">database</a>.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++frameIndex) {</div>
|
||||
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> <span class="keyword">const</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> &frame = <a class="code hl_variable" href="structDbcParseContext.html#a79bad0b8302e2156670461bab529259c">database</a>.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[frameIndex];</div>
|
||||
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> <span class="keywordflow">try</span> {</div>
|
||||
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> <span class="keyword">const</span> <a class="code hl_class" href="classdbc__detail_1_1MultiplexGraph.html">dbc_detail::MultiplexGraph</a> graph(frame.signals);</div>
|
||||
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index < frame.signals.size(); ++index) {</div>
|
||||
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &signal = frame.signals[index];</div>
|
||||
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> <span class="keywordflow">if</span> (IsMultiplexSelector(signal.<a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role) && signal.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>)</div>
|
||||
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classdbc__detail_1_1MultiplexError.html">dbc_detail::MultiplexError</a>(index, <span class="stringliteral">"Multiplex selectors must be unsigned."</span>);</div>
|
||||
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> <span class="keywordflow">for</span> (std::size_t previous = 0U; previous < index; ++previous) {</div>
|
||||
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> <span class="keywordflow">if</span> (!graph.AreMutuallyExclusive(index, previous) && SignalsOverlap(signal, frame.signals[previous]))</div>
|
||||
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classdbc__detail_1_1MultiplexError.html">dbc_detail::MultiplexError</a>(index, <span class="stringliteral">"Signals overlap without mutually exclusive multiplexing conditions."</span>);</div>
|
||||
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> }</div>
|
||||
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> }</div>
|
||||
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code hl_class" href="classdbc__detail_1_1MultiplexError.html">dbc_detail::MultiplexError</a> &error) {</div>
|
||||
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classDbcDiagnosticError.html">DbcDiagnosticError</a>(DbcDiagnosticCode::InvalidMultiplexing, filePath,</div>
|
||||
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> <a class="code hl_variable" href="structDbcParseContext.html#af8b411c938a2ea9100c4aaae452e6546">signalLines</a>[frameIndex][error.index], error.what());</div>
|
||||
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> }</div>
|
||||
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> }</div>
|
||||
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span>}</div>
|
||||
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> </div>
|
||||
<div class="foldopen" id="foldopen00489" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"><a class="line" href="classDbcMultiplexingHandler.html#a16f9e9f898640200477d2dcc8bab442e"> 489</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classDbcMultiplexingHandler.html#a16f9e9f898640200477d2dcc8bab442e">DbcMultiplexingHandler::Handle</a>(<span class="keyword">const</span> std::string &line, <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &context)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> <span class="keyword">static</span> <span class="keyword">const</span> std::regex syntax(R<span class="stringliteral">"(^SG_MUL_VAL_[ \t]+([0-9]+)[ \t]+([^ \t;]+)[ \t]+([^ \t;]+)[ \t]+(.+);[ \t]*$)");</span></div>
|
||||
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span><span class="stringliteral"> </span><span class="keyword">static</span> <span class="keyword">const</span> std::regex rangeSyntax(R<span class="stringliteral">"(^[ \t]*([0-9]+)[ \t]*-[ \t]*([0-9]+)[ \t]*$)");</span></div>
|
||||
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span><span class="stringliteral"> std::smatch fields;</span></div>
|
||||
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span><span class="stringliteral"> </span><span class="keywordflow">if</span> (!std::regex_match(line, fields, syntax))</div>
|
||||
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed SG_MUL_VAL_ statement."</span>);</div>
|
||||
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> <a class="code hl_struct" href="structPendingMultiplexing.html">PendingMultiplexing</a> pending;</div>
|
||||
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> NormalizeCanId(ParseCanId(fields[1].str()), pending.canId, pending.isExtended);</div>
|
||||
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> pending.signalName = fields[2].str();</div>
|
||||
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> pending.selectorName = fields[3].str();</div>
|
||||
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> pending.lineNumber = context.<a class="code hl_variable" href="structDbcParseContext.html#a57f5a7f613ecd0dadbafa7af736b7e54">lineNumber</a>;</div>
|
||||
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> <span class="keyword">const</span> std::string list = fields[4].str();</div>
|
||||
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> std::size_t begin = 0U;</div>
|
||||
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> <span class="keywordflow">for</span> (;;) {</div>
|
||||
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <span class="keyword">const</span> std::size_t comma = list.find(<span class="charliteral">','</span>, begin);</div>
|
||||
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keyword">const</span> std::string item = list.substr(begin, comma == std::string::npos ? comma : comma - begin);</div>
|
||||
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <span class="keywordflow">if</span> (!std::regex_match(item, fields, rangeSyntax))</div>
|
||||
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed multiplex range."</span>);</div>
|
||||
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> <a class="code hl_struct" href="structMultiplexRange.html">MultiplexRange</a> range;</div>
|
||||
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> <span class="keyword">const</span> std::string lower = fields[1].str();</div>
|
||||
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> <span class="keyword">const</span> std::string upper = fields[2].str();</div>
|
||||
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <span class="keyword">const</span> std::from_chars_result low = std::from_chars(lower.data(), lower.data() + lower.size(), range.minimum);</div>
|
||||
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keyword">const</span> std::from_chars_result high = std::from_chars(upper.data(), upper.data() + upper.size(), range.maximum);</div>
|
||||
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> <span class="keywordflow">if</span> (low.ec != std::errc() || high.ec != std::errc() || range.minimum > range.maximum)</div>
|
||||
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Invalid multiplex range."</span>);</div>
|
||||
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> pending.ranges.push_back(range);</div>
|
||||
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> <span class="keywordflow">if</span> (comma == std::string::npos)</div>
|
||||
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> <span class="keywordflow">break</span>;</div>
|
||||
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> begin = comma + 1U;</div>
|
||||
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> }</div>
|
||||
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> context.pendingMultiplexing.push_back(std::move(pending));</div>
|
||||
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span>}</div>
|
||||
</div>
|
||||
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> </div>
|
||||
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span><span class="keywordtype">void</span> DbcParseContext::ResolveMultiplexing(<span class="keyword">const</span> std::string &filePath) {</div>
|
||||
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structPendingMultiplexing.html">PendingMultiplexing</a> &pending: pendingMultiplexing) {</div>
|
||||
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> <span class="keywordflow">try</span> {</div>
|
||||
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *frame = FindUniqueFrame(<a class="code hl_variable" href="structDbcParseContext.html#a79bad0b8302e2156670461bab529259c">database</a>, pending.canId, pending.isExtended, <span class="stringliteral">"SG_MUL_VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *signal = FindUniqueSignal(*frame, pending.signalName, <span class="stringliteral">"SG_MUL_VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *selector = FindUniqueSignal(*frame, pending.selectorName, <span class="stringliteral">"SG_MUL_VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> <span class="keywordflow">if</span> (!IsMultiplexSelector(selector-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role) || selector-><a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>)</div>
|
||||
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Referenced signal must be an unsigned multiplex selector."</span>);</div>
|
||||
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> <span class="keywordflow">if</span> (!signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa91e54403c78a663686b2fd22282afaf">selector</a>.empty() && signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa91e54403c78a663686b2fd22282afaf">selector</a> != pending.selectorName)</div>
|
||||
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Multiple parent selectors for one signal are unsupported."</span>);</div>
|
||||
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structMultiplexRange.html">MultiplexRange</a> &range: pending.ranges) {</div>
|
||||
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> <span class="keywordflow">if</span> (selector-><a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a> < 64U && range.maximum >= (std::uint64_t(1U) << selector-><a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>))</div>
|
||||
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Branch value exceeds selector raw range."</span>);</div>
|
||||
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> }</div>
|
||||
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa91e54403c78a663686b2fd22282afaf">selector</a> = pending.selectorName;</div>
|
||||
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa174ac4a3af9b361d2de7517dfd4b69e">ranges</a>.insert(signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.<a class="code hl_variable" href="structMultiplexing.html#aa174ac4a3af9b361d2de7517dfd4b69e">ranges</a>.end(), pending.ranges.begin(), pending.ranges.end());</div>
|
||||
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> <span class="keywordflow">if</span> (!IsMultiplexSelector(signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role))</div>
|
||||
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role = MultiplexRole::Branch;</div>
|
||||
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> signal-><a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role = MultiplexRole::BranchSelector;</div>
|
||||
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &error) {</div>
|
||||
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classDbcDiagnosticError.html">DbcDiagnosticError</a>(DbcDiagnosticCode::InvalidMultiplexing, filePath, pending.lineNumber, error.what());</div>
|
||||
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> }</div>
|
||||
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> }</div>
|
||||
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span>}</div>
|
||||
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> </div>
|
||||
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span><span class="keyword">namespace </span>{</div>
|
||||
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> std::vector<std::uint64_t> SignalBits(<span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &signal) {</div>
|
||||
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> std::vector<std::uint64_t> bits;</div>
|
||||
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> std::uint64_t bit = signal.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a>;</div>
|
||||
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> <span class="keywordflow">for</span> (std::uint32_t index = 0U; index < signal.<a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>; ++index) {</div>
|
||||
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> bits.push_back(bit);</div>
|
||||
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> bit = NextSignalBit(bit, signal.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a>);</div>
|
||||
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> }</div>
|
||||
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> <span class="keywordflow">return</span> bits;</div>
|
||||
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> }</div>
|
||||
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> </div>
|
||||
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> <span class="keywordtype">bool</span> SignalsOverlap(<span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &first, <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &second) {</div>
|
||||
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> <span class="keyword">const</span> std::vector<std::uint64_t> firstBits = SignalBits(first);</div>
|
||||
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> <span class="keyword">const</span> std::vector<std::uint64_t> secondBits = SignalBits(second);</div>
|
||||
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::uint64_t firstBit : firstBits) {</div>
|
||||
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::uint64_t secondBit : secondBits) {</div>
|
||||
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> <span class="keywordflow">if</span> (firstBit == secondBit)</div>
|
||||
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> }</div>
|
||||
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> }</div>
|
||||
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> }</div>
|
||||
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span>}</div>
|
||||
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> </div>
|
||||
<div class="foldopen" id="foldopen00572" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"><a class="line" href="structDbcParseContext.html#a908056de0a97316a4ebecb3f99cc400b"> 572</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="structDbcParseContext.html#a908056de0a97316a4ebecb3f99cc400b">DbcParseContext::ValidateMultiplexing</a>(<span class="keyword">const</span> std::string &filePath)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="keywordflow">for</span> (std::size_t frameIndex = 0U; frameIndex < <a class="code hl_variable" href="structDbcParseContext.html#a79bad0b8302e2156670461bab529259c">database</a>.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++frameIndex) {</div>
|
||||
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> <span class="keyword">const</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> &frame = <a class="code hl_variable" href="structDbcParseContext.html#a79bad0b8302e2156670461bab529259c">database</a>.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[frameIndex];</div>
|
||||
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> <span class="keywordflow">try</span> {</div>
|
||||
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> <span class="keyword">const</span> <a class="code hl_class" href="classdbc__detail_1_1MultiplexGraph.html">dbc_detail::MultiplexGraph</a> graph(frame.signals);</div>
|
||||
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index < frame.signals.size(); ++index) {</div>
|
||||
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &signal = frame.signals[index];</div>
|
||||
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> <span class="keywordflow">if</span> (IsMultiplexSelector(signal.<a class="code hl_variable" href="structSignalInfo.html#a8a2e29f307c75926a1bd824266d23ca8">multiplexing</a>.role) && signal.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>)</div>
|
||||
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classdbc__detail_1_1MultiplexError.html">dbc_detail::MultiplexError</a>(index, <span class="stringliteral">"Multiplex selectors must be unsigned."</span>);</div>
|
||||
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> <span class="keywordflow">for</span> (std::size_t previous = 0U; previous < index; ++previous) {</div>
|
||||
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> <span class="keywordflow">if</span> (!graph.AreMutuallyExclusive(index, previous) && SignalsOverlap(signal, frame.signals[previous]))</div>
|
||||
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classdbc__detail_1_1MultiplexError.html">dbc_detail::MultiplexError</a>(index, <span class="stringliteral">"Signals overlap without mutually exclusive multiplexing conditions."</span>);</div>
|
||||
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> }</div>
|
||||
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> }</div>
|
||||
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code hl_class" href="classdbc__detail_1_1MultiplexError.html">dbc_detail::MultiplexError</a> &error) {</div>
|
||||
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classDbcDiagnosticError.html">DbcDiagnosticError</a>(DbcDiagnosticCode::InvalidMultiplexing, filePath,</div>
|
||||
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> <a class="code hl_variable" href="structDbcParseContext.html#af8b411c938a2ea9100c4aaae452e6546">signalLines</a>[frameIndex][error.index], error.what());</div>
|
||||
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> }</div>
|
||||
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> }</div>
|
||||
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span>}</div>
|
||||
</div>
|
||||
<div class="ttc" id="aclassDbcCommentHandler_html_aa4fce77b585a441d251d8535ef7a51a6"><div class="ttname"><a href="classDbcCommentHandler.html#aa4fce77b585a441d251d8535ef7a51a6">DbcCommentHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00339">dbc_statement_handler.cpp:339</a></div></div>
|
||||
<div class="ttc" id="aclassDbcDiagnosticError_html"><div class="ttname"><a href="classDbcDiagnosticError.html">DbcDiagnosticError</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00032">dbc_statement_handler.h:32</a></div></div>
|
||||
<div class="ttc" id="aclassDbcFrameHandler_html_a0d3f43bbcc5e191460bc31827e74ce89"><div class="ttname"><a href="classDbcFrameHandler.html#a0d3f43bbcc5e191460bc31827e74ce89">DbcFrameHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00311">dbc_statement_handler.cpp:311</a></div></div>
|
||||
<div class="ttc" id="aclassDbcHeaderHandler_html_a1e43a9dcf157f4d4418032d9e9711693"><div class="ttname"><a href="classDbcHeaderHandler.html#a1e43a9dcf157f4d4418032d9e9711693">DbcHeaderHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00421">dbc_statement_handler.cpp:421</a></div></div>
|
||||
<div class="ttc" id="aclassDbcMultiplexingHandler_html_a16f9e9f898640200477d2dcc8bab442e"><div class="ttname"><a href="classDbcMultiplexingHandler.html#a16f9e9f898640200477d2dcc8bab442e">DbcMultiplexingHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00484">dbc_statement_handler.cpp:484</a></div></div>
|
||||
<div class="ttc" id="aclassDbcHeaderHandler_html_a1e43a9dcf157f4d4418032d9e9711693"><div class="ttname"><a href="classDbcHeaderHandler.html#a1e43a9dcf157f4d4418032d9e9711693">DbcHeaderHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00426">dbc_statement_handler.cpp:426</a></div></div>
|
||||
<div class="ttc" id="aclassDbcMultiplexingHandler_html_a16f9e9f898640200477d2dcc8bab442e"><div class="ttname"><a href="classDbcMultiplexingHandler.html#a16f9e9f898640200477d2dcc8bab442e">DbcMultiplexingHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00489">dbc_statement_handler.cpp:489</a></div></div>
|
||||
<div class="ttc" id="aclassDbcSignalHandler_html_ad7d891ec1414fb645f85ccd410f2737b"><div class="ttname"><a href="classDbcSignalHandler.html#ad7d891ec1414fb645f85ccd410f2737b">DbcSignalHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00325">dbc_statement_handler.cpp:325</a></div></div>
|
||||
<div class="ttc" id="aclassDbcStatementDispatcher_html_a2f064359b59d8644b8a8196653d47482"><div class="ttname"><a href="classDbcStatementDispatcher.html#a2f064359b59d8644b8a8196653d47482">DbcStatementDispatcher::DbcStatementDispatcher</a></div><div class="ttdeci">DbcStatementDispatcher()</div><div class="ttdoc">Register supported statement handlers through TypeFactory.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00403">dbc_statement_handler.cpp:403</a></div></div>
|
||||
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &line, DbcParseContext &context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00423">dbc_statement_handler.cpp:423</a></div></div>
|
||||
<div class="ttc" id="aclassDbcValueDescriptionHandler_html_a653e13364f396b54244edc2c0fdd831a"><div class="ttname"><a href="classDbcValueDescriptionHandler.html#a653e13364f396b54244edc2c0fdd831a">DbcValueDescriptionHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00435">dbc_statement_handler.cpp:435</a></div></div>
|
||||
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &line, DbcParseContext &context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00428">dbc_statement_handler.cpp:428</a></div></div>
|
||||
<div class="ttc" id="aclassDbcUnsupportedSignalTypeHandler_html_ae4132fcdbb134d51143133c1fb83a9df"><div class="ttname"><a href="classDbcUnsupportedSignalTypeHandler.html#ae4132fcdbb134d51143133c1fb83a9df">DbcUnsupportedSignalTypeHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00422">dbc_statement_handler.cpp:422</a></div></div>
|
||||
<div class="ttc" id="aclassDbcValueDescriptionHandler_html_a653e13364f396b54244edc2c0fdd831a"><div class="ttname"><a href="classDbcValueDescriptionHandler.html#a653e13364f396b54244edc2c0fdd831a">DbcValueDescriptionHandler::Handle</a></div><div class="ttdeci">void Handle(const std::string &line, DbcParseContext &context) const override</div><div class="ttdoc">Process a trimmed statement using state belonging to this parse.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00440">dbc_statement_handler.cpp:440</a></div></div>
|
||||
<div class="ttc" id="aclassdbc__detail_1_1MultiplexError_html"><div class="ttname"><a href="classdbc__detail_1_1MultiplexError.html">dbc_detail::MultiplexError</a></div><div class="ttdef"><b>Definition</b> <a href="multiplex__graph_8h_source.html#l00011">multiplex_graph.h:11</a></div></div>
|
||||
<div class="ttc" id="aclassdbc__detail_1_1MultiplexGraph_html"><div class="ttname"><a href="classdbc__detail_1_1MultiplexGraph.html">dbc_detail::MultiplexGraph</a></div><div class="ttdef"><b>Definition</b> <a href="multiplex__graph_8h_source.html#l00019">multiplex_graph.h:19</a></div></div>
|
||||
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
|
||||
@@ -721,9 +729,9 @@ $(document).ready(function(){initNavTree('dbc__statement__handler_8cpp_source.ht
|
||||
<div class="ttc" id="astructDbcParseContext_html_a57f5a7f613ecd0dadbafa7af736b7e54"><div class="ttname"><a href="structDbcParseContext.html#a57f5a7f613ecd0dadbafa7af736b7e54">DbcParseContext::lineNumber</a></div><div class="ttdeci">std::size_t lineNumber</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00064">dbc_statement_handler.h:64</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_a79bad0b8302e2156670461bab529259c"><div class="ttname"><a href="structDbcParseContext.html#a79bad0b8302e2156670461bab529259c">DbcParseContext::database</a></div><div class="ttdeci">DbcDatabase & database</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00061">dbc_statement_handler.h:61</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_a854abba7bbf4adfc948554c254156e60"><div class="ttname"><a href="structDbcParseContext.html#a854abba7bbf4adfc948554c254156e60">DbcParseContext::pendingComments</a></div><div class="ttdeci">std::vector< PendingComment > pendingComments</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00074">dbc_statement_handler.h:74</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_a908056de0a97316a4ebecb3f99cc400b"><div class="ttname"><a href="structDbcParseContext.html#a908056de0a97316a4ebecb3f99cc400b">DbcParseContext::ValidateMultiplexing</a></div><div class="ttdeci">void ValidateMultiplexing(const std::string &filePath) const</div><div class="ttdoc">Validate selectors, branch ranges, and signal overlap.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00567">dbc_statement_handler.cpp:567</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_a908056de0a97316a4ebecb3f99cc400b"><div class="ttname"><a href="structDbcParseContext.html#a908056de0a97316a4ebecb3f99cc400b">DbcParseContext::ValidateMultiplexing</a></div><div class="ttdeci">void ValidateMultiplexing(const std::string &filePath) const</div><div class="ttdoc">Validate selectors, branch ranges, and signal overlap.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00572">dbc_statement_handler.cpp:572</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_a93f8ece0f3d16bd79f631ae07afa7b54"><div class="ttname"><a href="structDbcParseContext.html#a93f8ece0f3d16bd79f631ae07afa7b54">DbcParseContext::enableJ1939</a></div><div class="ttdeci">bool enableJ1939</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00063">dbc_statement_handler.h:63</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_ab5552dad944fde7fa6add6464ddb5369"><div class="ttname"><a href="structDbcParseContext.html#ab5552dad944fde7fa6add6464ddb5369">DbcParseContext::ResolveValueDescriptions</a></div><div class="ttdeci">void ResolveValueDescriptions(const std::string &filePath)</div><div class="ttdoc">Resolve deferred raw descriptions against unique targets.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00468">dbc_statement_handler.cpp:468</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_ab5552dad944fde7fa6add6464ddb5369"><div class="ttname"><a href="structDbcParseContext.html#ab5552dad944fde7fa6add6464ddb5369">DbcParseContext::ResolveValueDescriptions</a></div><div class="ttdeci">void ResolveValueDescriptions(const std::string &filePath)</div><div class="ttdoc">Resolve deferred raw descriptions against unique targets.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00473">dbc_statement_handler.cpp:473</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_ac22cba614ada3a28c7dcc1ea338b0e01"><div class="ttname"><a href="structDbcParseContext.html#ac22cba614ada3a28c7dcc1ea338b0e01">DbcParseContext::pendingValues</a></div><div class="ttdeci">std::vector< PendingValueDescriptions > pendingValues</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00065">dbc_statement_handler.h:65</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_aeae343c57a244634489a0e0b960155d7"><div class="ttname"><a href="structDbcParseContext.html#aeae343c57a244634489a0e0b960155d7">DbcParseContext::ResolveComments</a></div><div class="ttdeci">void ResolveComments(const std::string &filePath)</div><div class="ttdoc">Resolve deferred comments after all definitions are known.</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00385">dbc_statement_handler.cpp:385</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html_af31b56247edff7f025957ae023a56913"><div class="ttname"><a href="structDbcParseContext.html#af31b56247edff7f025957ae023a56913">DbcParseContext::currentFrame</a></div><div class="ttdeci">FrameInfo * currentFrame</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00062">dbc_statement_handler.h:62</a></div></div>
|
||||
|
||||
Reference in new issue
Block a user