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