cabana: cleanup DBCFile (#28160)

pull/27807/merge
Dean Lee 2 years ago committed by GitHub
parent 1a3125bb8f
commit 720df4d150
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      tools/cabana/dbc/dbc.cc
  2. 4
      tools/cabana/dbc/dbc.h
  3. 80
      tools/cabana/dbc/dbcfile.cc
  4. 16
      tools/cabana/dbc/dbcfile.h

@ -14,11 +14,7 @@ std::vector<const cabana::Signal*> cabana::Msg::getSignals() const {
}
void cabana::Msg::updateMask() {
mask.clear();
for (int i = 0; i < size; i++) {
mask.push_back(0x00);
}
mask = QVector<uint8_t>(size, 0x00).toList();
for (auto &sig : sigs) {
int i = sig.msb / 8;
int bits = sig.size;
@ -117,5 +113,3 @@ std::pair<int, int> getSignalRange(const cabana::Signal *s) {
int to = from + s->size - 1;
return {from, to};
}
std::vector<std::string> allDBCNames() { return get_dbc_names(); }

@ -1,9 +1,7 @@
#pragma once
#include <map>
#include <QList>
#include <QMetaType>
#include <QObject>
#include <QString>
#include "opendbc/can/common_dbc.h"
@ -86,4 +84,4 @@ int bigEndianStartBitsIndex(int start_bit);
int bigEndianBitIndex(int index);
void updateSigSizeParamsFromRange(cabana::Signal &s, int start_bit, int size);
std::pair<int, int> getSignalRange(const cabana::Signal *s);
std::vector<std::string> allDBCNames();
inline std::vector<std::string> allDBCNames() { return get_dbc_names(); }

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

@ -2,17 +2,12 @@
#include <map>
#include <QList>
#include <QMetaType>
#include <QObject>
#include <QString>
#include <QSet>
#include <QDebug>
#include "tools/cabana/dbc/dbc.h"
const QString AUTO_SAVE_EXTENSION = ".tmp";
class DBCFile : public QObject {
Q_OBJECT
@ -43,16 +38,17 @@ public:
const QList<uint8_t>& mask(const MessageId &id) const;
std::map<uint32_t, cabana::Msg> getMessages();
const cabana::Msg *msg(const MessageId &id) const;
inline std::map<uint32_t, cabana::Msg> getMessages() const { return msgs; }
const cabana::Msg *msg(uint32_t address) const;
const cabana::Msg* msg(const QString &name);
inline const cabana::Msg *msg(const MessageId &id) const { return msg(id.address); };
QStringList signalNames() const;
int signalCount(const MessageId &id) const;
int signalCount() const;
int msgCount() const;
QString name() const;
bool isEmpty() const;
inline int msgCount() const { return msgs.size(); }
inline QString name() const { return name_.isEmpty() ? "untitled" : name_; }
inline bool isEmpty() const { return (signalCount() == 0) && name_.isEmpty(); }
QString filename;

Loading…
Cancel
Save