parent
faf6e27f46
commit
f0d648d8c6
23 changed files with 295 additions and 301 deletions
@ -0,0 +1,77 @@ |
||||
#include "tools/cabana/dbc.h" |
||||
|
||||
uint qHash(const MessageId &item) { |
||||
return qHash(item.source) ^ qHash(item.address); |
||||
} |
||||
|
||||
std::vector<const cabana::Signal*> cabana::Msg::getSignals() const { |
||||
std::vector<const Signal*> ret; |
||||
ret.reserve(sigs.size()); |
||||
for (auto &sig : sigs) ret.push_back(&sig); |
||||
std::sort(ret.begin(), ret.end(), [](auto l, auto r) { return l->start_bit < r->start_bit; }); |
||||
return ret; |
||||
} |
||||
|
||||
// helper functions
|
||||
|
||||
static QVector<int> BIG_ENDIAN_START_BITS = []() { |
||||
QVector<int> ret; |
||||
for (int i = 0; i < 64; i++) |
||||
for (int j = 7; j >= 0; j--) |
||||
ret.push_back(j + i * 8); |
||||
return ret; |
||||
}(); |
||||
|
||||
double get_raw_value(uint8_t *data, size_t data_size, const cabana::Signal &sig) { |
||||
int64_t val = 0; |
||||
|
||||
int i = sig.msb / 8; |
||||
int bits = sig.size; |
||||
while (i >= 0 && i < data_size && bits > 0) { |
||||
int lsb = (int)(sig.lsb / 8) == i ? sig.lsb : i * 8; |
||||
int msb = (int)(sig.msb / 8) == i ? sig.msb : (i + 1) * 8 - 1; |
||||
int size = msb - lsb + 1; |
||||
|
||||
uint64_t d = (data[i] >> (lsb - (i * 8))) & ((1ULL << size) - 1); |
||||
val |= d << (bits - size); |
||||
|
||||
bits -= size; |
||||
i = sig.is_little_endian ? i - 1 : i + 1; |
||||
} |
||||
if (sig.is_signed) { |
||||
val -= ((val >> (sig.size - 1)) & 0x1) ? (1ULL << sig.size) : 0; |
||||
} |
||||
return val * sig.factor + sig.offset; |
||||
} |
||||
|
||||
bool cabana::operator==(const cabana::Signal &l, const cabana::Signal &r) { |
||||
return l.name == r.name && l.size == r.size && |
||||
l.start_bit == r.start_bit && |
||||
l.msb == r.msb && l.lsb == r.lsb && |
||||
l.is_signed == r.is_signed && l.is_little_endian == r.is_little_endian && |
||||
l.factor == r.factor && l.offset == r.offset && |
||||
l.min == r.min && l.max == r.max && l.comment == r.comment && l.unit == r.unit && l.val_desc == r.val_desc; |
||||
} |
||||
|
||||
int bigEndianStartBitsIndex(int start_bit) { return BIG_ENDIAN_START_BITS[start_bit]; } |
||||
int bigEndianBitIndex(int index) { return BIG_ENDIAN_START_BITS.indexOf(index); } |
||||
|
||||
void updateSigSizeParamsFromRange(cabana::Signal &s, int start_bit, int size) { |
||||
s.start_bit = s.is_little_endian ? start_bit : bigEndianBitIndex(start_bit); |
||||
s.size = size; |
||||
if (s.is_little_endian) { |
||||
s.lsb = s.start_bit; |
||||
s.msb = s.start_bit + s.size - 1; |
||||
} else { |
||||
s.lsb = bigEndianStartBitsIndex(bigEndianBitIndex(s.start_bit) + s.size - 1); |
||||
s.msb = s.start_bit; |
||||
} |
||||
} |
||||
|
||||
std::pair<int, int> getSignalRange(const cabana::Signal *s) { |
||||
int from = s->is_little_endian ? s->start_bit : bigEndianBitIndex(s->start_bit); |
||||
int to = from + s->size - 1; |
||||
return {from, to}; |
||||
} |
||||
|
||||
std::vector<std::string> allDBCNames() { return get_dbc_names(); } |
@ -0,0 +1,78 @@ |
||||
#pragma once |
||||
|
||||
#include <map> |
||||
#include <QList> |
||||
#include <QMetaType> |
||||
#include <QObject> |
||||
#include <QString> |
||||
|
||||
#include "opendbc/can/common_dbc.h" |
||||
|
||||
const QString UNTITLED = "untitled"; |
||||
|
||||
struct MessageId { |
||||
uint8_t source; |
||||
uint32_t address; |
||||
|
||||
QString toString() const { |
||||
return QString("%1:%2").arg(source).arg(address, 1, 16); |
||||
} |
||||
|
||||
bool operator==(const MessageId &other) const { |
||||
return source == other.source && address == other.address; |
||||
} |
||||
|
||||
bool operator!=(const MessageId &other) const { |
||||
return !(*this == other); |
||||
} |
||||
|
||||
bool operator<(const MessageId &other) const { |
||||
return std::pair{source, address} < std::pair{other.source, other.address}; |
||||
} |
||||
|
||||
bool operator>(const MessageId &other) const { |
||||
return std::pair{source, address} > std::pair{other.source, other.address}; |
||||
} |
||||
}; |
||||
|
||||
uint qHash(const MessageId &item); |
||||
Q_DECLARE_METATYPE(MessageId); |
||||
|
||||
|
||||
typedef QList<std::pair<QString, QString>> ValueDescription; |
||||
|
||||
namespace cabana { |
||||
struct Signal { |
||||
QString name; |
||||
int start_bit, msb, lsb, size; |
||||
bool is_signed; |
||||
double factor, offset; |
||||
bool is_little_endian; |
||||
QString min, max, unit; |
||||
QString comment; |
||||
ValueDescription val_desc; |
||||
}; |
||||
|
||||
struct Msg { |
||||
QString name; |
||||
uint32_t size; |
||||
QList<cabana::Signal> sigs; |
||||
|
||||
std::vector<const cabana::Signal*> getSignals() const; |
||||
const cabana::Signal *sig(const QString &sig_name) const { |
||||
auto it = std::find_if(sigs.begin(), sigs.end(), [&](auto &s) { return s.name == sig_name; }); |
||||
return it != sigs.end() ? &(*it) : nullptr; |
||||
} |
||||
}; |
||||
|
||||
bool operator==(const cabana::Signal &l, const cabana::Signal &r); |
||||
inline bool operator!=(const cabana::Signal &l, const cabana::Signal &r) { return !(l == r); } |
||||
} |
||||
|
||||
// Helper functions
|
||||
double get_raw_value(uint8_t *data, size_t data_size, const cabana::Signal &sig); |
||||
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(); |
Loading…
Reference in new issue