|
|
@ -1,26 +1,21 @@ |
|
|
|
#include "tools/cabana/dbc/dbcfile.h" |
|
|
|
#include "tools/cabana/dbc/dbcfile.h" |
|
|
|
|
|
|
|
|
|
|
|
#include <QDebug> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <QFile> |
|
|
|
#include <QFile> |
|
|
|
#include <QFileInfo> |
|
|
|
#include <QFileInfo> |
|
|
|
#include <QRegularExpression> |
|
|
|
#include <QRegularExpression> |
|
|
|
#include <QTextStream> |
|
|
|
#include <QTextStream> |
|
|
|
#include <QVector> |
|
|
|
|
|
|
|
#include <limits> |
|
|
|
#include <limits> |
|
|
|
|
|
|
|
#include <numeric> |
|
|
|
#include <sstream> |
|
|
|
#include <sstream> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DBCFile::DBCFile(const QString &dbc_file_name, QObject *parent) : QObject(parent) { |
|
|
|
DBCFile::DBCFile(const QString &dbc_file_name, QObject *parent) : QObject(parent) { |
|
|
|
QFile file(dbc_file_name); |
|
|
|
QFile file(dbc_file_name); |
|
|
|
if (file.open(QIODevice::ReadOnly)) { |
|
|
|
if (file.open(QIODevice::ReadOnly)) { |
|
|
|
name_ = QFileInfo(dbc_file_name).baseName(); |
|
|
|
name_ = QFileInfo(dbc_file_name).baseName(); |
|
|
|
|
|
|
|
filename = dbc_file_name; |
|
|
|
// Remove auto save file extension
|
|
|
|
// Remove auto save file extension
|
|
|
|
if (dbc_file_name.endsWith(AUTO_SAVE_EXTENSION)) { |
|
|
|
if (dbc_file_name.endsWith(AUTO_SAVE_EXTENSION)) { |
|
|
|
filename = dbc_file_name.left(dbc_file_name.length() - AUTO_SAVE_EXTENSION.length()); |
|
|
|
filename.chop(AUTO_SAVE_EXTENSION.length()); |
|
|
|
} else { |
|
|
|
|
|
|
|
filename = dbc_file_name; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
open(file.readAll()); |
|
|
|
open(file.readAll()); |
|
|
|
} else { |
|
|
|
} else { |
|
|
@ -68,9 +63,8 @@ bool DBCFile::save() { |
|
|
|
if (writeContents(filename)) { |
|
|
|
if (writeContents(filename)) { |
|
|
|
cleanupAutoSaveFile(); |
|
|
|
cleanupAutoSaveFile(); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} else { |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool DBCFile::saveAs(const QString &new_filename) { |
|
|
|
bool DBCFile::saveAs(const QString &new_filename) { |
|
|
@ -79,11 +73,7 @@ bool DBCFile::saveAs(const QString &new_filename) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool DBCFile::autoSave() { |
|
|
|
bool DBCFile::autoSave() { |
|
|
|
if (!filename.isEmpty()) { |
|
|
|
return !filename.isEmpty() && writeContents(filename + AUTO_SAVE_EXTENSION); |
|
|
|
return writeContents(filename + AUTO_SAVE_EXTENSION); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCFile::cleanupAutoSaveFile() { |
|
|
|
void DBCFile::cleanupAutoSaveFile() { |
|
|
@ -97,9 +87,8 @@ bool DBCFile::writeContents(const QString &fn) { |
|
|
|
if (file.open(QIODevice::WriteOnly)) { |
|
|
|
if (file.open(QIODevice::WriteOnly)) { |
|
|
|
file.write(generateDBC().toUtf8()); |
|
|
|
file.write(generateDBC().toUtf8()); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} else { |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
cabana::Signal *DBCFile::addSignal(const MessageId &id, const cabana::Signal &sig) { |
|
|
|
cabana::Signal *DBCFile::addSignal(const MessageId &id, const cabana::Signal &sig) { |
|
|
@ -108,7 +97,6 @@ cabana::Signal *DBCFile::addSignal(const MessageId &id, const cabana::Signal &si |
|
|
|
m->updateMask(); |
|
|
|
m->updateMask(); |
|
|
|
return &m->sigs.last(); |
|
|
|
return &m->sigs.last(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -120,19 +108,13 @@ cabana::Signal *DBCFile::addSignal(const MessageId &id, const cabana::Signal &si |
|
|
|
return s; |
|
|
|
return s; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
cabana::Signal *DBCFile::getSignal(const MessageId &id, const QString &sig_name) { |
|
|
|
cabana::Signal *DBCFile::getSignal(const MessageId &id, const QString &sig_name) { |
|
|
|
if (auto m = const_cast<cabana::Msg *>(msg(id))) { |
|
|
|
auto m = msg(id); |
|
|
|
auto it = std::find_if(m->sigs.begin(), m->sigs.end(), [&](auto &s) { return s.name == sig_name; }); |
|
|
|
return m ? (cabana::Signal *)m->sig(sig_name) : nullptr; |
|
|
|
if (it != m->sigs.end()) { |
|
|
|
} |
|
|
|
return &(*it); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return nullptr; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DBCFile::removeSignal(const MessageId &id, const QString &sig_name) { |
|
|
|
void DBCFile::removeSignal(const MessageId &id, const QString &sig_name) { |
|
|
|
if (auto m = const_cast<cabana::Msg *>(msg(id))) { |
|
|
|
if (auto m = const_cast<cabana::Msg *>(msg(id))) { |
|
|
@ -164,30 +146,16 @@ QString DBCFile::newSignalName(const MessageId &id) { |
|
|
|
assert(m != nullptr); |
|
|
|
assert(m != nullptr); |
|
|
|
|
|
|
|
|
|
|
|
QString name; |
|
|
|
QString name; |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 1; /**/; ++i) { |
|
|
|
for (int i = 1; /**/; ++i) { |
|
|
|
name = QString("NEW_SIGNAL_%1").arg(i); |
|
|
|
name = QString("NEW_SIGNAL_%1").arg(i); |
|
|
|
if (m->sig(name) == nullptr) break; |
|
|
|
if (m->sig(name) == nullptr) break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return name; |
|
|
|
return name; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const QList<uint8_t>& DBCFile::mask(const MessageId &id) const { |
|
|
|
const QList<uint8_t>& DBCFile::mask(const MessageId &id) const { |
|
|
|
const cabana::Msg *m = msg(id); |
|
|
|
auto m = msg(id); |
|
|
|
if (m != nullptr) { |
|
|
|
return m ? m->mask : empty_mask; |
|
|
|
return m->mask; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
return empty_mask; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::map<uint32_t, cabana::Msg> DBCFile::getMessages() { |
|
|
|
|
|
|
|
return msgs; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const cabana::Msg *DBCFile::msg(const MessageId &id) const { |
|
|
|
|
|
|
|
return msg(id.address); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const cabana::Msg *DBCFile::msg(uint32_t address) const { |
|
|
|
const cabana::Msg *DBCFile::msg(uint32_t address) const { |
|
|
@ -196,16 +164,10 @@ const cabana::Msg *DBCFile::msg(uint32_t address) const { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const cabana::Msg* DBCFile::msg(const QString &name) { |
|
|
|
const cabana::Msg* DBCFile::msg(const QString &name) { |
|
|
|
for (auto &[_, msg] : msgs) { |
|
|
|
auto it = std::find_if(msgs.cbegin(), msgs.cend(), [&name](auto &m) { return m.second.name == name; }); |
|
|
|
if (msg.name == name) { |
|
|
|
return it != msgs.cend() ? &(it->second) : nullptr; |
|
|
|
return &msg; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return nullptr; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QStringList DBCFile::signalNames() const { |
|
|
|
QStringList DBCFile::signalNames() const { |
|
|
|
// Used for autocompletion
|
|
|
|
// Used for autocompletion
|
|
|
|
QStringList ret; |
|
|
|
QStringList ret; |
|
|
@ -225,23 +187,7 @@ int DBCFile::signalCount(const MessageId &id) const { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int DBCFile::signalCount() const { |
|
|
|
int DBCFile::signalCount() const { |
|
|
|
int total = 0; |
|
|
|
return std::accumulate(msgs.cbegin(), msgs.cend(), 0, [](int &n, const auto &m) { return n + m.second.sigs.size(); }); |
|
|
|
for (auto const& [_, msg] : msgs) { |
|
|
|
|
|
|
|
total += msg.sigs.size(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return total; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int DBCFile::msgCount() const { |
|
|
|
|
|
|
|
return msgs.size(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QString DBCFile::name() const { |
|
|
|
|
|
|
|
return name_.isEmpty() ? "untitled" : name_; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool DBCFile::isEmpty() const { |
|
|
|
|
|
|
|
return (signalCount() == 0) && name_.isEmpty(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DBCFile::parseExtraInfo(const QString &content) { |
|
|
|
void DBCFile::parseExtraInfo(const QString &content) { |
|
|
|