|
|
@ -1,21 +1,16 @@ |
|
|
|
#include "tools/cabana/dbc/dbcmanager.h" |
|
|
|
#include "tools/cabana/dbc/dbcmanager.h" |
|
|
|
#include <algorithm> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool DBCManager::open(SourceSet s, const QString &dbc_file_name, QString *error) { |
|
|
|
|
|
|
|
for (int i = 0; i < dbc_files.size(); i++) { |
|
|
|
|
|
|
|
auto [ss, dbc_file] = dbc_files[i]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check if file is already open, and merge sources
|
|
|
|
|
|
|
|
if (dbc_file->filename == dbc_file_name) { |
|
|
|
|
|
|
|
dbc_files[i] = {ss | s, dbc_file}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
emit DBCFileChanged(); |
|
|
|
#include <algorithm> |
|
|
|
return true; |
|
|
|
#include <numeric> |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool DBCManager::open(const SourceSet &sources, const QString &dbc_file_name, QString *error) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
dbc_files.push_back({s, new DBCFile(dbc_file_name, this)}); |
|
|
|
auto it = std::find_if(dbc_files.begin(), dbc_files.end(), |
|
|
|
|
|
|
|
[&](auto &f) { return f.second && f.second->filename == dbc_file_name; }); |
|
|
|
|
|
|
|
auto file = (it != dbc_files.end()) ? it->second : std::make_shared<DBCFile>(dbc_file_name, this); |
|
|
|
|
|
|
|
for (auto s : sources) { |
|
|
|
|
|
|
|
dbc_files[s] = file; |
|
|
|
|
|
|
|
} |
|
|
|
} catch (std::exception &e) { |
|
|
|
} catch (std::exception &e) { |
|
|
|
if (error) *error = e.what(); |
|
|
|
if (error) *error = e.what(); |
|
|
|
return false; |
|
|
|
return false; |
|
|
@ -25,9 +20,12 @@ bool DBCManager::open(SourceSet s, const QString &dbc_file_name, QString *error) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool DBCManager::open(SourceSet s, const QString &name, const QString &content, QString *error) { |
|
|
|
bool DBCManager::open(const SourceSet &sources, const QString &name, const QString &content, QString *error) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
dbc_files.push_back({s, new DBCFile(name, content, this)}); |
|
|
|
auto file = std::make_shared<DBCFile>(name, content, this); |
|
|
|
|
|
|
|
for (auto s : sources) { |
|
|
|
|
|
|
|
dbc_files[s] = file; |
|
|
|
|
|
|
|
} |
|
|
|
} catch (std::exception &e) { |
|
|
|
} catch (std::exception &e) { |
|
|
|
if (error) *error = e.what(); |
|
|
|
if (error) *error = e.what(); |
|
|
|
return false; |
|
|
|
return false; |
|
|
@ -37,263 +35,154 @@ bool DBCManager::open(SourceSet s, const QString &name, const QString &content, |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::close(SourceSet s) { |
|
|
|
void DBCManager::close(const SourceSet &sources) { |
|
|
|
// Build new list of dbc files, removing the ones that match the sourceset
|
|
|
|
for (auto s : sources) { |
|
|
|
QList<std::pair<SourceSet, DBCFile*>> new_dbc_files; |
|
|
|
dbc_files[s] = nullptr; |
|
|
|
for (auto entry : dbc_files) { |
|
|
|
|
|
|
|
if (entry.first == s) { |
|
|
|
|
|
|
|
delete entry.second; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
new_dbc_files.push_back(entry); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
dbc_files = new_dbc_files; |
|
|
|
|
|
|
|
emit DBCFileChanged(); |
|
|
|
emit DBCFileChanged(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::close(DBCFile *dbc_file) { |
|
|
|
void DBCManager::close(DBCFile *dbc_file) { |
|
|
|
assert(dbc_file != nullptr); |
|
|
|
for (auto &[_, f] : dbc_files) { |
|
|
|
|
|
|
|
if (f.get() == dbc_file) f = nullptr; |
|
|
|
// Build new list of dbc files, removing the one that matches dbc_file*
|
|
|
|
|
|
|
|
QList<std::pair<SourceSet, DBCFile*>> new_dbc_files; |
|
|
|
|
|
|
|
for (auto entry : dbc_files) { |
|
|
|
|
|
|
|
if (entry.second == dbc_file) { |
|
|
|
|
|
|
|
delete entry.second; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
new_dbc_files.push_back(entry); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
dbc_files = new_dbc_files; |
|
|
|
|
|
|
|
emit DBCFileChanged(); |
|
|
|
emit DBCFileChanged(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::closeAll() { |
|
|
|
void DBCManager::closeAll() { |
|
|
|
if (dbc_files.isEmpty()) return; |
|
|
|
dbc_files.clear(); |
|
|
|
|
|
|
|
|
|
|
|
while (dbc_files.size()) { |
|
|
|
|
|
|
|
DBCFile *dbc_file = dbc_files.back().second; |
|
|
|
|
|
|
|
dbc_files.pop_back(); |
|
|
|
|
|
|
|
delete dbc_file; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
emit DBCFileChanged(); |
|
|
|
emit DBCFileChanged(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::removeSourcesFromFile(DBCFile *dbc_file, SourceSet s) { |
|
|
|
|
|
|
|
assert(dbc_file != nullptr); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Build new list of dbc files, for the given dbc_file* remove s from the current sources
|
|
|
|
|
|
|
|
QList<std::pair<SourceSet, DBCFile*>> new_dbc_files; |
|
|
|
|
|
|
|
for (auto entry : dbc_files) { |
|
|
|
|
|
|
|
if (entry.second == dbc_file) { |
|
|
|
|
|
|
|
SourceSet ss = (entry.first == SOURCE_ALL) ? sources : entry.first; |
|
|
|
|
|
|
|
ss -= s; |
|
|
|
|
|
|
|
if (ss.empty()) { // Close file if no more sources remain
|
|
|
|
|
|
|
|
delete dbc_file; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
new_dbc_files.push_back({ss, dbc_file}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
new_dbc_files.push_back(entry); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dbc_files = new_dbc_files; |
|
|
|
|
|
|
|
emit DBCFileChanged(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::addSignal(const MessageId &id, const cabana::Signal &sig) { |
|
|
|
void DBCManager::addSignal(const MessageId &id, const cabana::Signal &sig) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
if (auto m = msg(id)) { |
|
|
|
assert(sources_dbc_file); // Create new DBC?
|
|
|
|
if (auto s = m->addSignal(sig)) { |
|
|
|
auto [dbc_sources, dbc_file] = *sources_dbc_file; |
|
|
|
emit signalAdded(id, s); |
|
|
|
|
|
|
|
|
|
|
|
cabana::Signal *s = dbc_file->addSignal(id, sig); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (s != nullptr) { |
|
|
|
|
|
|
|
dbc_sources.insert(id.source); |
|
|
|
|
|
|
|
for (uint8_t source : dbc_sources) { |
|
|
|
|
|
|
|
emit signalAdded({.source = source, .address = id.address}, s); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::updateSignal(const MessageId &id, const QString &sig_name, const cabana::Signal &sig) { |
|
|
|
void DBCManager::updateSignal(const MessageId &id, const QString &sig_name, const cabana::Signal &sig) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
if (auto m = msg(id)) { |
|
|
|
assert(sources_dbc_file); // This should be impossible
|
|
|
|
if (auto s = m->updateSignal(sig_name, sig)) { |
|
|
|
auto [_, dbc_file] = *sources_dbc_file; |
|
|
|
emit signalUpdated(s); |
|
|
|
|
|
|
|
} |
|
|
|
cabana::Signal *s = dbc_file->updateSignal(id, sig_name, sig); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (s != nullptr) { |
|
|
|
|
|
|
|
emit signalUpdated(s); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::removeSignal(const MessageId &id, const QString &sig_name) { |
|
|
|
void DBCManager::removeSignal(const MessageId &id, const QString &sig_name) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
if (auto m = msg(id)) { |
|
|
|
assert(sources_dbc_file); // This should be impossible
|
|
|
|
if (auto s = m->sig(sig_name)) { |
|
|
|
auto [_, dbc_file] = *sources_dbc_file; |
|
|
|
emit signalRemoved(s); |
|
|
|
|
|
|
|
m->removeSignal(sig_name); |
|
|
|
cabana::Signal *s = dbc_file->getSignal(id, sig_name); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (s != nullptr) { |
|
|
|
|
|
|
|
emit signalRemoved(s); |
|
|
|
|
|
|
|
dbc_file->removeSignal(id, sig_name); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::updateMsg(const MessageId &id, const QString &name, uint32_t size, const QString &comment) { |
|
|
|
void DBCManager::updateMsg(const MessageId &id, const QString &name, uint32_t size, const QString &comment) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
auto dbc_file = findDBCFile(id); |
|
|
|
assert(sources_dbc_file); // This should be impossible
|
|
|
|
assert(dbc_file); // This should be impossible
|
|
|
|
auto [dbc_sources, dbc_file] = *sources_dbc_file; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dbc_file->updateMsg(id, name, size, comment); |
|
|
|
dbc_file->updateMsg(id, name, size, comment); |
|
|
|
|
|
|
|
emit msgUpdated(id); |
|
|
|
for (uint8_t source : dbc_sources) { |
|
|
|
|
|
|
|
emit msgUpdated({.source = source, .address = id.address}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::removeMsg(const MessageId &id) { |
|
|
|
void DBCManager::removeMsg(const MessageId &id) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
auto dbc_file = findDBCFile(id); |
|
|
|
assert(sources_dbc_file); // This should be impossible
|
|
|
|
assert(dbc_file); // This should be impossible
|
|
|
|
auto [dbc_sources, dbc_file] = *sources_dbc_file; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dbc_file->removeMsg(id); |
|
|
|
dbc_file->removeMsg(id); |
|
|
|
|
|
|
|
emit msgRemoved(id); |
|
|
|
for (uint8_t source : dbc_sources) { |
|
|
|
|
|
|
|
emit msgRemoved({.source = source, .address = id.address}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QString DBCManager::newMsgName(const MessageId &id) { |
|
|
|
QString DBCManager::newMsgName(const MessageId &id) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
return QString("NEW_MSG_") + QString::number(id.address, 16).toUpper(); |
|
|
|
assert(sources_dbc_file); // This should be impossible
|
|
|
|
|
|
|
|
auto [_, dbc_file] = *sources_dbc_file; |
|
|
|
|
|
|
|
return dbc_file->newMsgName(id); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QString DBCManager::newSignalName(const MessageId &id) { |
|
|
|
QString DBCManager::newSignalName(const MessageId &id) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
auto m = msg(id); |
|
|
|
assert(sources_dbc_file); // This should be impossible
|
|
|
|
return m ? m->newSignalName() : ""; |
|
|
|
auto [_, dbc_file] = *sources_dbc_file; |
|
|
|
|
|
|
|
return dbc_file->newSignalName(id); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const QList<uint8_t>& DBCManager::mask(const MessageId &id) const { |
|
|
|
const QList<uint8_t> &DBCManager::mask(const MessageId &id) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
static QList<uint8_t> empty_mask; |
|
|
|
if (!sources_dbc_file) { |
|
|
|
auto m = msg(id); |
|
|
|
return empty_mask; |
|
|
|
return m ? m->mask : empty_mask; |
|
|
|
} |
|
|
|
|
|
|
|
auto [_, dbc_file] = *sources_dbc_file; |
|
|
|
|
|
|
|
return dbc_file->mask(id); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::map<MessageId, cabana::Msg> DBCManager::getMessages(uint8_t source) { |
|
|
|
const std::map<uint32_t, cabana::Msg> &DBCManager::getMessages(uint8_t source) { |
|
|
|
std::map<MessageId, cabana::Msg> ret; |
|
|
|
static std::map<uint32_t, cabana::Msg> empty_msgs; |
|
|
|
|
|
|
|
auto dbc_file = findDBCFile(source); |
|
|
|
auto sources_dbc_file = findDBCFile({.source = source, .address = 0}); |
|
|
|
return dbc_file ? dbc_file->getMessages() : empty_msgs; |
|
|
|
if (!sources_dbc_file) { |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto [_, dbc_file] = *sources_dbc_file; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (auto &[address, msg] : dbc_file->getMessages()) { |
|
|
|
|
|
|
|
MessageId id = {.source = source, .address = address}; |
|
|
|
|
|
|
|
ret[id] = msg; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const cabana::Msg *DBCManager::msg(const MessageId &id) const { |
|
|
|
cabana::Msg *DBCManager::msg(const MessageId &id) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
auto dbc_file = findDBCFile(id); |
|
|
|
if (!sources_dbc_file) { |
|
|
|
return dbc_file ? dbc_file->msg(id) : nullptr; |
|
|
|
return nullptr; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
auto [_, dbc_file] = *sources_dbc_file; |
|
|
|
|
|
|
|
return dbc_file->msg(id); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const cabana::Msg* DBCManager::msg(uint8_t source, const QString &name) { |
|
|
|
cabana::Msg *DBCManager::msg(uint8_t source, const QString &name) { |
|
|
|
auto sources_dbc_file = findDBCFile({.source = source, .address = 0}); |
|
|
|
auto dbc_file = findDBCFile(source); |
|
|
|
if (!sources_dbc_file) { |
|
|
|
return dbc_file ? dbc_file->msg(name) : nullptr; |
|
|
|
return nullptr; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
auto [_, dbc_file] = *sources_dbc_file; |
|
|
|
|
|
|
|
return dbc_file->msg(name); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QStringList DBCManager::signalNames() const { |
|
|
|
QStringList DBCManager::signalNames() { |
|
|
|
|
|
|
|
// Used for autocompletion
|
|
|
|
QStringList ret; |
|
|
|
QStringList ret; |
|
|
|
|
|
|
|
for (auto &f : allDBCFiles()) { |
|
|
|
for (auto &[_, dbc_file] : dbc_files) { |
|
|
|
for (auto &[_, m] : f->getMessages()) { |
|
|
|
ret << dbc_file->signalNames(); |
|
|
|
for (auto sig : m.getSignals()) { |
|
|
|
|
|
|
|
ret << sig->name; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ret.sort(); |
|
|
|
ret.sort(); |
|
|
|
ret.removeDuplicates(); |
|
|
|
ret.removeDuplicates(); |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int DBCManager::signalCount(const MessageId &id) const { |
|
|
|
int DBCManager::signalCount(const MessageId &id) { |
|
|
|
auto sources_dbc_file = findDBCFile(id); |
|
|
|
auto m = msg(id); |
|
|
|
if (!sources_dbc_file) { |
|
|
|
return m ? m->sigs.size() : 0; |
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto [_, dbc_file] = *sources_dbc_file; |
|
|
|
|
|
|
|
return dbc_file->signalCount(id); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int DBCManager::signalCount() const { |
|
|
|
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (auto &[_, dbc_file] : dbc_files) { |
|
|
|
|
|
|
|
ret += dbc_file->signalCount(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int DBCManager::msgCount() const { |
|
|
|
int DBCManager::signalCount() { |
|
|
|
int ret = 0; |
|
|
|
auto files = allDBCFiles(); |
|
|
|
|
|
|
|
return std::accumulate(files.cbegin(), files.cend(), 0, [](int &n, auto &f) { return n + f->signalCount(); }); |
|
|
|
for (auto &[_, dbc_file] : dbc_files) { |
|
|
|
|
|
|
|
ret += dbc_file->msgCount(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int DBCManager::dbcCount() const { |
|
|
|
int DBCManager::msgCount() { |
|
|
|
return dbc_files.size(); |
|
|
|
auto files = allDBCFiles(); |
|
|
|
|
|
|
|
return std::accumulate(files.cbegin(), files.cend(), 0, [](int &n, auto &f) { return n + f->msgCount(); }); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int DBCManager::nonEmptyDBCCount() const { |
|
|
|
int DBCManager::dbcCount() { |
|
|
|
return std::count_if(dbc_files.cbegin(), dbc_files.cend(), [](auto &f) { return !f.second->isEmpty(); }); |
|
|
|
return allDBCFiles().size(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCManager::updateSources(const SourceSet &s) { |
|
|
|
int DBCManager::nonEmptyDBCCount() { |
|
|
|
sources = s; |
|
|
|
auto files = allDBCFiles(); |
|
|
|
|
|
|
|
return std::count_if(files.cbegin(), files.cend(), [](auto &f) { return !f->isEmpty(); }); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::optional<std::pair<SourceSet, DBCFile*>> DBCManager::findDBCFile(const uint8_t source) const { |
|
|
|
DBCFile *DBCManager::findDBCFile(const uint8_t source) { |
|
|
|
// Find DBC file that matches id.source, fall back to SOURCE_ALL if no specific DBC is found
|
|
|
|
// Find DBC file that matches id.source, fall back to SOURCE_ALL if no specific DBC is found
|
|
|
|
|
|
|
|
auto it = dbc_files.count(source) ? dbc_files.find(source) : dbc_files.find(-1); |
|
|
|
|
|
|
|
return it != dbc_files.end() ? it->second.get() : nullptr; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (auto &[source_set, dbc_file] : dbc_files) { |
|
|
|
std::set<DBCFile *> DBCManager::allDBCFiles() { |
|
|
|
if (source_set.contains(source)) return {{source_set, dbc_file}}; |
|
|
|
std::set<DBCFile *> files; |
|
|
|
|
|
|
|
for (const auto &[_, f] : dbc_files) { |
|
|
|
|
|
|
|
if (f) files.insert(f.get()); |
|
|
|
} |
|
|
|
} |
|
|
|
for (auto &[source_set, dbc_file] : dbc_files) { |
|
|
|
return files; |
|
|
|
if (source_set == SOURCE_ALL) return {{sources, dbc_file}}; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return {}; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::optional<std::pair<SourceSet, DBCFile*>> DBCManager::findDBCFile(const MessageId &id) const { |
|
|
|
const SourceSet DBCManager::sources(const DBCFile *dbc_file) const { |
|
|
|
return findDBCFile(id.source); |
|
|
|
SourceSet sources; |
|
|
|
|
|
|
|
for (auto &[s, f] : dbc_files) { |
|
|
|
|
|
|
|
if (f.get() == dbc_file) sources.insert(s); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return sources; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
DBCManager *dbc() { |
|
|
|
DBCManager *dbc() { |
|
|
|