Closes #13
This commit is contained in:
1 parent
bce707daf6
commit
51fcdb88ac
174 files changed
+5220
-2213
No files matched your search
@@ -472,157 +472,170 @@ $(document).ready(function(){initNavTree('dbc__statement__handler_8cpp_source.ht
|
||||
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span>}</div>
|
||||
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> </div>
|
||||
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span>DbcStatementDispatcher::DbcStatementDispatcher() {</div>
|
||||
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> RegisterType<DbcUnsupportedMultiplexingHandler>(<span class="stringliteral">"SG_MUL_VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> RegisterType<DbcFrameHandler>(<span class="stringliteral">"BO_"</span>);</div>
|
||||
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> RegisterType<DbcSignalHandler>(<span class="stringliteral">"SG_"</span>);</div>
|
||||
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> RegisterType<DbcCommentHandler>(<span class="stringliteral">"CM_"</span>);</div>
|
||||
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> RegisterType<DbcValueDescriptionHandler>(<span class="stringliteral">"VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span>}</div>
|
||||
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> </div>
|
||||
<div class="foldopen" id="foldopen00382" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"><a class="line" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed"> 382</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="l00383" name="l00383"></a><span class="lineno"> 383</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &context)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> std::istringstream stream(line);</div>
|
||||
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> std::string keyword;</div>
|
||||
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> stream >> keyword;</div>
|
||||
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <span class="keyword">const</span> HandlerMap::const_iterator handler = m_handlers.find(keyword);</div>
|
||||
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <span class="keywordflow">if</span> (handler == m_handlers.end())</div>
|
||||
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> handler->second->Handle(line, context);</div>
|
||||
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span>}</div>
|
||||
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> RegisterType<DbcHeaderHandler>(<span class="stringliteral">"VERSION"</span>);</div>
|
||||
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> RegisterType<DbcHeaderHandler>(<span class="stringliteral">"NS_"</span>);</div>
|
||||
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> RegisterType<DbcHeaderHandler>(<span class="stringliteral">"NS_:"</span>);</div>
|
||||
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> RegisterType<DbcHeaderHandler>(<span class="stringliteral">"BS_"</span>);</div>
|
||||
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> RegisterType<DbcHeaderHandler>(<span class="stringliteral">"BS_:"</span>);</div>
|
||||
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> RegisterType<DbcHeaderHandler>(<span class="stringliteral">"BU_"</span>);</div>
|
||||
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> RegisterType<DbcHeaderHandler>(<span class="stringliteral">"BU_:"</span>);</div>
|
||||
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> RegisterType<DbcUnsupportedMultiplexingHandler>(<span class="stringliteral">"SG_MUL_VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> RegisterType<DbcFrameHandler>(<span class="stringliteral">"BO_"</span>);</div>
|
||||
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> RegisterType<DbcSignalHandler>(<span class="stringliteral">"SG_"</span>);</div>
|
||||
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> RegisterType<DbcCommentHandler>(<span class="stringliteral">"CM_"</span>);</div>
|
||||
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> RegisterType<DbcValueDescriptionHandler>(<span class="stringliteral">"VAL_"</span>);</div>
|
||||
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span>}</div>
|
||||
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> </div>
|
||||
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span><span class="keywordtype">void</span> DbcHeaderHandler::Handle(<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="l00390" name="l00390"></a><span class="lineno"> 390</span> </div>
|
||||
<div class="foldopen" id="foldopen00391" data-start="{" data-end="}">
|
||||
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"><a class="line" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed"> 391</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="l00392" name="l00392"></a><span class="lineno"> 392</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> &context)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> std::istringstream stream(line);</div>
|
||||
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> std::string keyword;</div>
|
||||
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> stream >> keyword;</div>
|
||||
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> <span class="keyword">const</span> HandlerMap::const_iterator handler = m_handlers.find(keyword);</div>
|
||||
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> <span class="keywordflow">if</span> (handler == m_handlers.end())</div>
|
||||
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> handler->second->Handle(line, context);</div>
|
||||
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span>}</div>
|
||||
</div>
|
||||
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> </div>
|
||||
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span><span class="keywordtype">void</span> DbcValueDescriptionHandler::Handle(<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="l00395" name="l00395"></a><span class="lineno"> 395</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="l00396" name="l00396"></a><span class="lineno"> 396</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="l00397" name="l00397"></a><span class="lineno"> 397</span><span class="stringliteral"> std::smatch fields;</span></div>
|
||||
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span><span class="stringliteral"> </span><span class="keywordflow">if</span> (!std::regex_match(line, fields, header))</div>
|
||||
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed or unsupported VAL_ statement."</span>);</div>
|
||||
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</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="l00401" name="l00401"></a><span class="lineno"> 401</span> <span class="keywordflow">if</span> ((rawId & 0x60000000U) != 0U)</div>
|
||||
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</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="l00403" name="l00403"></a><span class="lineno"> 403</span> <a class="code hl_struct" href="structPendingValueDescriptions.html">PendingValueDescriptions</a> pending;</div>
|
||||
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> NormalizeCanId(rawId, pending.canId, pending.isExtended);</div>
|
||||
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> pending.signalName = fields[2].str();</div>
|
||||
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> pending.lineNumber = context.lineNumber;</div>
|
||||
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> std::string rest = fields[3].str();</div>
|
||||
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> <span class="keywordflow">while</span> (rest != <span class="stringliteral">";"</span>) {</div>
|
||||
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> <span class="keywordflow">if</span> (!std::regex_search(rest, fields, pair))</div>
|
||||
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</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="l00411" name="l00411"></a><span class="lineno"> 411</span> <span class="keyword">const</span> std::string number = fields[1].str();</div>
|
||||
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> <span class="keyword">const</span> RawSignalValue key = ParseValueKey(number);</div>
|
||||
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> <span class="keyword">const</span> std::string description = UnescapeDescription(fields[2].str());</div>
|
||||
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <span class="keywordflow">if</span> (!pending.descriptions.emplace(key, description).second)</div>
|
||||
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Duplicate VAL_ value key: "</span> + number);</div>
|
||||
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</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="l00417" name="l00417"></a><span class="lineno"> 417</span> rest.erase(0, consumed);</div>
|
||||
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</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="l00419" name="l00419"></a><span class="lineno"> 419</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Missing whitespace between VAL_ pairs."</span>);</div>
|
||||
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> rest = dbc_detail::TrimText(rest);</div>
|
||||
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> }</div>
|
||||
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> <span class="keywordflow">if</span> (pending.descriptions.empty())</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">"VAL_ requires at least one value/description pair."</span>);</div>
|
||||
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> context.pendingValues.push_back(std::move(pending));</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"> 426</span> </div>
|
||||
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span><span class="keywordtype">void</span> DbcParseContext::ResolveValueDescriptions(<span class="keyword">const</span> std::string &filePath) {</div>
|
||||
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structPendingValueDescriptions.html">PendingValueDescriptions</a> &pending: pendingValues) {</div>
|
||||
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <span class="keywordflow">try</span> {</div>
|
||||
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *frame = FindUniqueFrame(database, pending.canId, pending.isExtended);</div>
|
||||
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *signal = FindUniqueSignal(*frame, pending.signalName);</div>
|
||||
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> ValueDescriptions::value_type &entry: pending.descriptions) {</div>
|
||||
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</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="l00434" name="l00434"></a><span class="lineno"> 434</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="l00435" name="l00435"></a><span class="lineno"> 435</span> }</div>
|
||||
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &error) {</div>
|
||||
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="keywordflow">throw</span> std::runtime_error(filePath + <span class="stringliteral">":"</span> + std::to_string(pending.lineNumber) + <span class="stringliteral">": "</span> + error.what());</div>
|
||||
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> }</div>
|
||||
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> }</div>
|
||||
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span>}</div>
|
||||
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> </div>
|
||||
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span><span class="keywordtype">void</span> DbcUnsupportedMultiplexingHandler::Handle(<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="l00443" name="l00443"></a><span class="lineno"> 443</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Extended and nested multiplexing are unsupported."</span>);</div>
|
||||
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span>}</div>
|
||||
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> </div>
|
||||
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span><span class="keyword">namespace </span>{</div>
|
||||
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</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="l00448" name="l00448"></a><span class="lineno"> 448</span> std::vector<std::uint64_t> bits;</div>
|
||||
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> std::uint64_t bit = signal.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a>;</div>
|
||||
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</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="l00451" name="l00451"></a><span class="lineno"> 451</span> bits.push_back(bit);</div>
|
||||
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> bit = NextSignalBit(bit, signal.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a>);</div>
|
||||
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> }</div>
|
||||
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> <span class="keywordflow">return</span> bits;</div>
|
||||
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> }</div>
|
||||
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> </div>
|
||||
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="keywordtype">bool</span> AreMutuallyExclusive(<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="l00458" name="l00458"></a><span class="lineno"> 458</span> <span class="keywordflow">return</span> first.multiplexing.role == MultiplexRole::Branch &&</div>
|
||||
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> second.multiplexing.role == MultiplexRole::Branch &&</div>
|
||||
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> first.multiplexing.value != second.multiplexing.value;</div>
|
||||
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> }</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> std::string ValidateBranch(<span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &signal, <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *selector) {</div>
|
||||
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="keywordflow">if</span> (signal.multiplexing.role != MultiplexRole::Branch)</div>
|
||||
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> <span class="keywordflow">return</span> {};</div>
|
||||
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> <span class="keywordflow">if</span> (selector == <span class="keyword">nullptr</span>)</div>
|
||||
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> <span class="keywordflow">return</span> <span class="stringliteral">"Multiplexed branch has no selector."</span>;</div>
|
||||
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <span class="keywordflow">if</span> (selector-><a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a> < 64U && signal.multiplexing.value >= (std::uint64_t(1U) << selector-><a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>))</div>
|
||||
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> <span class="keywordflow">return</span> <span class="stringliteral">"Branch value exceeds selector raw range."</span>;</div>
|
||||
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> <span class="keywordflow">return</span> {};</div>
|
||||
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> </div>
|
||||
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span><span class="keywordtype">void</span> DbcValueDescriptionHandler::Handle(<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="l00404" name="l00404"></a><span class="lineno"> 404</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="l00405" name="l00405"></a><span class="lineno"> 405</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="l00406" name="l00406"></a><span class="lineno"> 406</span><span class="stringliteral"> std::smatch fields;</span></div>
|
||||
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span><span class="stringliteral"> </span><span class="keywordflow">if</span> (!std::regex_match(line, fields, header))</div>
|
||||
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Malformed or unsupported VAL_ statement."</span>);</div>
|
||||
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</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="l00410" name="l00410"></a><span class="lineno"> 410</span> <span class="keywordflow">if</span> ((rawId & 0x60000000U) != 0U)</div>
|
||||
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</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="l00412" name="l00412"></a><span class="lineno"> 412</span> <a class="code hl_struct" href="structPendingValueDescriptions.html">PendingValueDescriptions</a> pending;</div>
|
||||
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> NormalizeCanId(rawId, pending.canId, pending.isExtended);</div>
|
||||
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> pending.signalName = fields[2].str();</div>
|
||||
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> pending.lineNumber = context.lineNumber;</div>
|
||||
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> std::string rest = fields[3].str();</div>
|
||||
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> <span class="keywordflow">while</span> (rest != <span class="stringliteral">";"</span>) {</div>
|
||||
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> <span class="keywordflow">if</span> (!std::regex_search(rest, fields, pair))</div>
|
||||
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</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="l00420" name="l00420"></a><span class="lineno"> 420</span> <span class="keyword">const</span> std::string number = fields[1].str();</div>
|
||||
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> <span class="keyword">const</span> RawSignalValue key = ParseValueKey(number);</div>
|
||||
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> <span class="keyword">const</span> std::string description = UnescapeDescription(fields[2].str());</div>
|
||||
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> <span class="keywordflow">if</span> (!pending.descriptions.emplace(key, description).second)</div>
|
||||
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Duplicate VAL_ value key: "</span> + number);</div>
|
||||
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</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="l00426" name="l00426"></a><span class="lineno"> 426</span> rest.erase(0, consumed);</div>
|
||||
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</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="l00428" name="l00428"></a><span class="lineno"> 428</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Missing whitespace between VAL_ pairs."</span>);</div>
|
||||
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> rest = dbc_detail::TrimText(rest);</div>
|
||||
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> }</div>
|
||||
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> <span class="keywordflow">if</span> (pending.descriptions.empty())</div>
|
||||
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</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="l00433" name="l00433"></a><span class="lineno"> 433</span> context.pendingValues.push_back(std::move(pending));</div>
|
||||
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span>}</div>
|
||||
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> </div>
|
||||
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span><span class="keywordtype">void</span> DbcParseContext::ResolveValueDescriptions(<span class="keyword">const</span> std::string &filePath) {</div>
|
||||
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structPendingValueDescriptions.html">PendingValueDescriptions</a> &pending: pendingValues) {</div>
|
||||
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> <span class="keywordflow">try</span> {</div>
|
||||
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> *frame = FindUniqueFrame(database, pending.canId, pending.isExtended);</div>
|
||||
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *signal = FindUniqueSignal(*frame, pending.signalName);</div>
|
||||
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> ValueDescriptions::value_type &entry: pending.descriptions) {</div>
|
||||
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</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="l00443" name="l00443"></a><span class="lineno"> 443</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="l00444" name="l00444"></a><span class="lineno"> 444</span> }</div>
|
||||
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &error) {</div>
|
||||
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classDbcDiagnosticError.html">DbcDiagnosticError</a>(DbcDiagnosticCode::InvalidValueDescription,</div>
|
||||
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> filePath, pending.lineNumber, error.what());</div>
|
||||
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> }</div>
|
||||
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> }</div>
|
||||
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span>}</div>
|
||||
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> </div>
|
||||
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span><span class="keywordtype">void</span> DbcUnsupportedMultiplexingHandler::Handle(<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="l00453" name="l00453"></a><span class="lineno"> 453</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Extended and nested multiplexing are unsupported."</span>);</div>
|
||||
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span>}</div>
|
||||
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> </div>
|
||||
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span><span class="keyword">namespace </span>{</div>
|
||||
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</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="l00458" name="l00458"></a><span class="lineno"> 458</span> std::vector<std::uint64_t> bits;</div>
|
||||
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> std::uint64_t bit = signal.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a>;</div>
|
||||
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</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="l00461" name="l00461"></a><span class="lineno"> 461</span> bits.push_back(bit);</div>
|
||||
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> bit = NextSignalBit(bit, signal.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a>);</div>
|
||||
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> }</div>
|
||||
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="keywordflow">return</span> bits;</div>
|
||||
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> }</div>
|
||||
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> </div>
|
||||
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> <span class="keywordtype">bool</span> AreMutuallyExclusive(<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="l00468" name="l00468"></a><span class="lineno"> 468</span> <span class="keywordflow">return</span> first.multiplexing.role == MultiplexRole::Branch &&</div>
|
||||
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> second.multiplexing.role == MultiplexRole::Branch &&</div>
|
||||
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> first.multiplexing.value != second.multiplexing.value;</div>
|
||||
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> }</div>
|
||||
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> </div>
|
||||
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *FindSelector(<span class="keyword">const</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> &frame,</div>
|
||||
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> <span class="keyword">const</span> std::vector<std::size_t> &lines,</div>
|
||||
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> <span class="keyword">const</span> std::string &filePath) {</div>
|
||||
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *selector = <span class="keyword">nullptr</span>;</div>
|
||||
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index < frame.signals.size(); ++index) {</div>
|
||||
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</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="l00479" name="l00479"></a><span class="lineno"> 479</span> <span class="keywordflow">if</span> (signal.multiplexing.role != MultiplexRole::Selector)</div>
|
||||
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <span class="keywordflow">continue</span>;</div>
|
||||
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> <span class="keywordflow">if</span> (selector != <span class="keyword">nullptr</span> || signal.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>)</div>
|
||||
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> <span class="keywordflow">throw</span> std::runtime_error(filePath + <span class="stringliteral">":"</span> + std::to_string(lines[index]) +</div>
|
||||
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> <span class="stringliteral">": Multiplexing requires one unsigned selector per frame."</span>);</div>
|
||||
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> selector = &signal;</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> <span class="keywordflow">return</span> selector;</div>
|
||||
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> }</div>
|
||||
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> </div>
|
||||
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</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="l00490" name="l00490"></a><span class="lineno"> 490</span> <span class="keyword">const</span> std::vector<std::uint64_t> firstBits = SignalBits(first);</div>
|
||||
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> <span class="keyword">const</span> std::vector<std::uint64_t> secondBits = SignalBits(second);</div>
|
||||
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::uint64_t firstBit : firstBits) {</div>
|
||||
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::uint64_t secondBit : secondBits) {</div>
|
||||
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="keywordflow">if</span> (firstBit == secondBit)</div>
|
||||
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> }</div>
|
||||
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> }</div>
|
||||
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> }</div>
|
||||
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span>}</div>
|
||||
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> </div>
|
||||
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span><span class="keywordtype">void</span> DbcParseContext::ValidateMultiplexing(<span class="keyword">const</span> std::string &filePath)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <span class="keywordflow">for</span> (std::size_t frameIndex = 0U; frameIndex < database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++frameIndex) {</div>
|
||||
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keyword">const</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> &frame = database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[frameIndex];</div>
|
||||
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *selector = FindSelector(frame, signalLines[frameIndex], filePath);</div>
|
||||
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index < frame.signals.size(); ++index) {</div>
|
||||
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</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="l00508" name="l00508"></a><span class="lineno"> 508</span> std::string error = ValidateBranch(signal, selector);</div>
|
||||
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> <span class="keywordflow">for</span> (std::size_t previous = 0U; previous < index && error.empty(); ++previous) {</div>
|
||||
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &other = frame.signals[previous];</div>
|
||||
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keywordflow">if</span> (!AreMutuallyExclusive(signal, other) && SignalsOverlap(signal, other))</div>
|
||||
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> error = <span class="stringliteral">"Signals overlap without mutually exclusive multiplexing conditions."</span>;</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> <span class="keywordflow">if</span> (!error.empty())</div>
|
||||
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> <span class="keywordflow">throw</span> std::runtime_error(filePath + <span class="stringliteral">":"</span> + std::to_string(signalLines[frameIndex][index]) + <span class="stringliteral">": "</span> + error);</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> }</div>
|
||||
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span>}</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#l00382">dbc_statement_handler.cpp:382</a></div></div>
|
||||
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> std::string ValidateBranch(<span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &signal, <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *selector) {</div>
|
||||
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> <span class="keywordflow">if</span> (signal.multiplexing.role != MultiplexRole::Branch)</div>
|
||||
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> <span class="keywordflow">return</span> {};</div>
|
||||
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> <span class="keywordflow">if</span> (selector == <span class="keyword">nullptr</span>)</div>
|
||||
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> <span class="keywordflow">return</span> <span class="stringliteral">"Multiplexed branch has no selector."</span>;</div>
|
||||
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="keywordflow">if</span> (selector-><a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a> < 64U && signal.multiplexing.value >= (std::uint64_t(1U) << selector-><a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>))</div>
|
||||
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> <span class="keywordflow">return</span> <span class="stringliteral">"Branch value exceeds selector raw range."</span>;</div>
|
||||
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <span class="keywordflow">return</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="l00483" name="l00483"></a><span class="lineno"> 483</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *FindSelector(<span class="keyword">const</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> &frame,</div>
|
||||
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> <span class="keyword">const</span> std::vector<std::size_t> &lines,</div>
|
||||
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> <span class="keyword">const</span> std::string &filePath) {</div>
|
||||
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *selector = <span class="keyword">nullptr</span>;</div>
|
||||
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index < frame.signals.size(); ++index) {</div>
|
||||
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</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="l00489" name="l00489"></a><span class="lineno"> 489</span> <span class="keywordflow">if</span> (signal.multiplexing.role != MultiplexRole::Selector)</div>
|
||||
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> <span class="keywordflow">continue</span>;</div>
|
||||
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> <span class="keywordflow">if</span> (selector != <span class="keyword">nullptr</span> || signal.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>)</div>
|
||||
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classDbcDiagnosticError.html">DbcDiagnosticError</a>(DbcDiagnosticCode::InvalidMultiplexing,</div>
|
||||
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> filePath, lines[index],</div>
|
||||
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="stringliteral">"Multiplexing requires one unsigned selector per frame."</span>);</div>
|
||||
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> selector = &signal;</div>
|
||||
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> }</div>
|
||||
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> <span class="keywordflow">return</span> selector;</div>
|
||||
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> }</div>
|
||||
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> </div>
|
||||
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</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="l00501" name="l00501"></a><span class="lineno"> 501</span> <span class="keyword">const</span> std::vector<std::uint64_t> firstBits = SignalBits(first);</div>
|
||||
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> <span class="keyword">const</span> std::vector<std::uint64_t> secondBits = SignalBits(second);</div>
|
||||
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::uint64_t firstBit : firstBits) {</div>
|
||||
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::uint64_t secondBit : secondBits) {</div>
|
||||
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <span class="keywordflow">if</span> (firstBit == secondBit)</div>
|
||||
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> }</div>
|
||||
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> }</div>
|
||||
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> }</div>
|
||||
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span>}</div>
|
||||
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> </div>
|
||||
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span><span class="keywordtype">void</span> DbcParseContext::ValidateMultiplexing(<span class="keyword">const</span> std::string &filePath)<span class="keyword"> const </span>{</div>
|
||||
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> <span class="keywordflow">for</span> (std::size_t frameIndex = 0U; frameIndex < database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++frameIndex) {</div>
|
||||
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> <span class="keyword">const</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> &frame = database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[frameIndex];</div>
|
||||
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> *selector = FindSelector(frame, signalLines[frameIndex], filePath);</div>
|
||||
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index < frame.signals.size(); ++index) {</div>
|
||||
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</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="l00519" name="l00519"></a><span class="lineno"> 519</span> std::string error = ValidateBranch(signal, selector);</div>
|
||||
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> <span class="keywordflow">for</span> (std::size_t previous = 0U; previous < index && error.empty(); ++previous) {</div>
|
||||
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &other = frame.signals[previous];</div>
|
||||
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> <span class="keywordflow">if</span> (!AreMutuallyExclusive(signal, other) && SignalsOverlap(signal, other))</div>
|
||||
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> error = <span class="stringliteral">"Signals overlap without mutually exclusive multiplexing conditions."</span>;</div>
|
||||
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> }</div>
|
||||
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <span class="keywordflow">if</span> (!error.empty())</div>
|
||||
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> <span class="keywordflow">throw</span> <a class="code hl_class" href="classDbcDiagnosticError.html">DbcDiagnosticError</a>(DbcDiagnosticCode::InvalidMultiplexing,</div>
|
||||
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> filePath, signalLines[frameIndex][index], error);</div>
|
||||
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> }</div>
|
||||
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> }</div>
|
||||
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span>}</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#l00021">dbc_statement_handler.h:21</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#l00391">dbc_statement_handler.cpp:391</a></div></div>
|
||||
<div class="ttc" id="adecode__database_8h_html_aaeb92d42f5a6e27b8ba19f18d69d142b"><div class="ttname"><a href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a></div><div class="ttdeci">ByteOrder</div><div class="ttdoc">Signal byte order used for runtime decoding.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00025">decode_database.h:25</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>
|
||||
<div class="ttc" id="astructDbcDatabase_html_a2cade5d0234ee816132127542f8c612b"><div class="ttname"><a href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">DbcDatabase::frames</a></div><div class="ttdeci">std::vector< FrameInfo > frames</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00023">dbc_database.h:23</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html"><div class="ttname"><a href="structDbcParseContext.html">DbcParseContext</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00019">dbc_statement_handler.h:19</a></div></div>
|
||||
<div class="ttc" id="astructDbcParseContext_html"><div class="ttname"><a href="structDbcParseContext.html">DbcParseContext</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="astructFrameInfo_html"><div class="ttname"><a href="structFrameInfo.html">FrameInfo</a></div><div class="ttdoc">Describes one CAN frame from a DBC file.</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00024">frame_info.h:24</a></div></div>
|
||||
<div class="ttc" id="astructFrameInfo_html_a34b726afaad2ac5c697fdb2ac070cdaf"><div class="ttname"><a href="structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf">FrameInfo::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00027">frame_info.h:27</a></div></div>
|
||||
<div class="ttc" id="astructFrameInfo_html_a4737a5420213ad4304724e39f3a4e55d"><div class="ttname"><a href="structFrameInfo.html#a4737a5420213ad4304724e39f3a4e55d">FrameInfo::hasPgn</a></div><div class="ttdeci">bool hasPgn</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00029">frame_info.h:29</a></div></div>
|
||||
@@ -633,7 +646,7 @@ $(document).ready(function(){initNavTree('dbc__statement__handler_8cpp_source.ht
|
||||
<div class="ttc" id="astructFrameInfo_html_aee518b33f1000bf0b7f6e4a87474c943"><div class="ttname"><a href="structFrameInfo.html#aee518b33f1000bf0b7f6e4a87474c943">FrameInfo::pgn</a></div><div class="ttdeci">std::uint32_t pgn</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00028">frame_info.h:28</a></div></div>
|
||||
<div class="ttc" id="astructFrameInfo_html_af470b0742c05bfbffc31c51a68f5c05e"><div class="ttname"><a href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">FrameInfo::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00026">frame_info.h:26</a></div></div>
|
||||
<div class="ttc" id="astructMultiplexing_html"><div class="ttname"><a href="structMultiplexing.html">Multiplexing</a></div><div class="ttdef"><b>Definition</b> <a href="multiplexing_8h_source.html#l00014">multiplexing.h:14</a></div></div>
|
||||
<div class="ttc" id="astructPendingValueDescriptions_html"><div class="ttname"><a href="structPendingValueDescriptions.html">PendingValueDescriptions</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00010">dbc_statement_handler.h:10</a></div></div>
|
||||
<div class="ttc" id="astructPendingValueDescriptions_html"><div class="ttname"><a href="structPendingValueDescriptions.html">PendingValueDescriptions</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00012">dbc_statement_handler.h:12</a></div></div>
|
||||
<div class="ttc" id="astructSignalInfo_html"><div class="ttname"><a href="structSignalInfo.html">SignalInfo</a></div><div class="ttdoc">Describes one signal inside a DBC frame.</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00024">signal_info.h:24</a></div></div>
|
||||
<div class="ttc" id="astructSignalInfo_html_a1008b5201f71848177217bd52fb84baa"><div class="ttname"><a href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">SignalInfo::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00028">signal_info.h:28</a></div></div>
|
||||
<div class="ttc" id="astructSignalInfo_html_a1f214f03e94ef5794de2d3367bfcbd01"><div class="ttname"><a href="structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01">SignalInfo::unit</a></div><div class="ttdeci">std::string unit</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00035">signal_info.h:35</a></div></div>
|
||||
|
||||
Reference in new issue
Block a user