1- #include < algorithm>
21#include < cstdint>
32#include < libdbc/message.hpp>
43
54namespace libdbc {
6- Message::Message (uint32_t id, const std::string& name, uint8_t size, const std::string& node)
7- : m_id(id)
5+
6+ constexpr unsigned ONE_BYTE = 8 ;
7+ constexpr unsigned TWO_BYTES = 16 ;
8+ constexpr unsigned FOUR_BYTES = 32 ;
9+ constexpr unsigned EIGHT_BYTES = 64 ;
10+
11+ constexpr unsigned SEVEN_BITS = 7 ;
12+
13+ Message::Message (uint32_t message_id, const std::string& name, uint8_t size, const std::string& node)
14+ : m_id(message_id)
815 , m_name(name)
916 , m_size(size)
1017 , m_node(node) {
@@ -16,61 +23,61 @@ bool Message::operator==(const Message& rhs) const {
1623
1724Message::ParseSignalsStatus Message::parseSignals (const std::vector<uint8_t >& data, std::vector<double >& values) const {
1825 auto size = data.size ();
19- if (size > 8 ) {
26+ if (size > ONE_BYTE ) {
2027 return ParseSignalsStatus::ErrorMessageToLong; // not supported yet
2128 }
2229
2330 uint64_t data_little_endian = 0 ;
2431 uint64_t data_big_endian = 0 ;
2532 for (size_t i = 0 ; i < size; i++) {
26- data_little_endian |= ((uint64_t )data[i]) << i * 8 ;
27- data_big_endian = (data_big_endian << 8 ) | (uint64_t )data[i];
33+ data_little_endian |= ((uint64_t )data[i]) << i * ONE_BYTE ;
34+ data_big_endian = (data_big_endian << ONE_BYTE ) | (uint64_t )data[i];
2835 }
2936
3037 // TODO: does this also work on a big endian machine?
3138
3239 const auto len = size * 8 ;
33- uint64_t v = 0 ;
40+ uint64_t value = 0 ;
3441 for (const auto & signal : m_signals) {
3542 if (signal.is_bigendian ) {
36- uint32_t start_bit = 8 * (signal.start_bit / 8 ) + (7 - (signal.start_bit % 8 )); // Calculation taken from python CAN
37- v = data_big_endian << start_bit;
38- v = v >> (len - signal.size );
43+ uint32_t start_bit = ONE_BYTE * (signal.start_bit / ONE_BYTE ) + (SEVEN_BITS - (signal.start_bit % ONE_BYTE )); // Calculation taken from python CAN
44+ value = data_big_endian << start_bit;
45+ value = value >> (len - signal.size );
3946 } else {
40- v = data_little_endian >> signal.start_bit ;
47+ value = data_little_endian >> signal.start_bit ;
4148 }
4249
4350 if (signal.is_signed && signal.size > 1 ) {
4451 switch (signal.size ) {
45- case 8 :
46- values.push_back (static_cast <int8_t >(v ) * signal.factor + signal.offset );
52+ case ONE_BYTE :
53+ values.push_back (static_cast <int8_t >(value ) * signal.factor + signal.offset );
4754 break ;
48- case 16 :
49- values.push_back (static_cast <int16_t >(v ) * signal.factor + signal.offset );
55+ case TWO_BYTES :
56+ values.push_back (static_cast <int16_t >(value ) * signal.factor + signal.offset );
5057 break ;
51- case 32 :
52- values.push_back (static_cast <int32_t >(v ) * signal.factor + signal.offset );
58+ case FOUR_BYTES :
59+ values.push_back (static_cast <int32_t >(value ) * signal.factor + signal.offset );
5360 break ;
54- case 64 :
55- values.push_back (static_cast <double >(v ) * signal.factor + signal.offset );
61+ case EIGHT_BYTES :
62+ values.push_back (static_cast <double >(value ) * signal.factor + signal.offset );
5663 break ;
5764 default : {
5865 // 2 complement -> decimal
59- const int negative = (v & (1ull << (signal.size - 1 ))) != 0 ;
60- int64_t nativeInt;
61- if (negative ) {
62- nativeInt = static_cast <int64_t >(v | ~((1ull << signal.size ) - 1 )); // invert all bits above signal.size
66+ const bool is_negative = (value & (1ULL << (signal.size - 1 ))) != 0 ;
67+ int64_t nativeInt = 0 ;
68+ if (is_negative ) {
69+ nativeInt = static_cast <int64_t >(value | ~((1ULL << signal.size ) - 1 )); // invert all bits above signal.size
6370 } else {
64- nativeInt = static_cast <int64_t >(v & ((1ull << signal.size ) - 1 )); // masking
71+ nativeInt = static_cast <int64_t >(value & ((1ULL << signal.size ) - 1 )); // masking
6572 }
6673 values.push_back (static_cast <double >(nativeInt) * signal.factor + signal.offset );
6774 break ;
6875 }
6976 }
7077 } else {
7178 // use only the relevant bits
72- v = v & ((1 << signal.size ) - 1 ); // masking
73- values.push_back (static_cast <double >(v ) * signal.factor + signal.offset );
79+ value = value & ((1 << signal.size ) - 1 ); // masking
80+ values.push_back (static_cast <double >(value ) * signal.factor + signal.offset );
7481 }
7582 }
7683 return ParseSignalsStatus::Success;
@@ -80,7 +87,7 @@ void Message::appendSignal(const Signal& signal) {
8087 m_signals.push_back (signal);
8188}
8289
83- const std::vector<Signal> Message::getSignals () const {
90+ std::vector<Signal> Message::getSignals () const {
8491 return m_signals;
8592}
8693
@@ -96,10 +103,10 @@ const std::string& Message::name() const {
96103 return m_name;
97104}
98105
99- void Message::addValueDescription (const std::string& signal_name, const std::vector<Signal::SignalValueDescriptions>& vd ) {
100- for (auto & s : m_signals) {
101- if (s .name . compare (signal_name) == 0 ) {
102- s .svDescriptions = vd ;
106+ void Message::addValueDescription (const std::string& signal_name, const std::vector<Signal::SignalValueDescriptions>& value_descriptor ) {
107+ for (auto & signal : m_signals) {
108+ if (signal .name == signal_name ) {
109+ signal .svDescriptions = value_descriptor ;
103110 return ;
104111 }
105112 }
0 commit comments