1+ #include < algorithm>
12#include < libdbc/message.hpp>
23
4+ #include < bitstream.h>
5+
36namespace libdbc {
47 Message::Message (uint32_t id, const std::string& name, uint8_t size, const std::string& node) :
58 id (id), name(name), size(size), node(node) {}
69
710 bool Message::operator ==(const Message& rhs) const {
811 return (this ->id == rhs.id ) && (this ->name == rhs.name ) &&
912 (this ->size == rhs.size ) && (this ->node == rhs.node );
10- }
13+ }
14+
15+ bool Message::parseSignals (const std::vector<uint8_t > data, std::vector<double >& values) const {
16+ if (!prepared)
17+ return false ;
18+
19+ bitstream_reader_t reader;
20+ bitstream_reader_init (&reader, data.data ());
21+
22+ double v;
23+ for (const auto & bs: bitstruct) {
24+ if (bs.padding ) {
25+ for (uint32_t i=0 ; i < bs.size ; i++)
26+ bitstream_reader_read_bit (&reader);
27+ } else {
28+ for (const auto & signal: signals) {
29+ if (bs.name .compare (signal.name ) != 0 ) {
30+ continue ;
31+ }
32+
33+ if (signal.is_bigendian ) {
34+
35+ switch (bs.size ) {
36+ case 1 : v = static_cast <double >(bitstream_reader_read_bit (&reader)); break ;
37+ case 8 : v = static_cast <double >(bitstream_reader_read_u8 (&reader)); break ;
38+ case 16 : {
39+ uint16_t tmp = bitstream_reader_read_u8 (&reader);
40+ tmp |= (uint16_t )bitstream_reader_read_u8 (&reader) << 8 ;
41+ if (signal.is_signed )
42+ v = static_cast <double >(static_cast <int16_t >(tmp));
43+ else
44+ v = static_cast <double >(tmp);
45+ break ;
46+ }
47+ case 32 : {
48+ uint32_t tmp = bitstream_reader_read_u8 (&reader);
49+ tmp |= (uint32_t )bitstream_reader_read_u8 (&reader) << 8 ;
50+ tmp |= (uint32_t )bitstream_reader_read_u8 (&reader) << 16 ;
51+ tmp |= (uint32_t )bitstream_reader_read_u8 (&reader) << 24 ;
52+ if (signal.is_signed )
53+ v = static_cast <double >(static_cast <int32_t >(tmp));
54+ else
55+ v = static_cast <double >(tmp);
56+ break ;
57+ }
58+ case 64 : {
59+ uint64_t tmp = bitstream_reader_read_u8 (&reader);
60+ tmp |= (uint64_t )bitstream_reader_read_u8 (&reader) << 8 ;
61+ tmp |= (uint64_t )bitstream_reader_read_u8 (&reader) << 16 ;
62+ tmp |= (uint64_t )bitstream_reader_read_u8 (&reader) << 24 ;
63+ tmp |= (uint64_t )bitstream_reader_read_u8 (&reader) << 32 ;
64+ tmp |= (uint64_t )bitstream_reader_read_u8 (&reader) << 40 ;
65+ tmp |= (uint64_t )bitstream_reader_read_u8 (&reader) << 48 ;
66+ tmp |= (uint64_t )bitstream_reader_read_u8 (&reader) << 56 ;
67+ if (signal.is_signed )
68+ v = static_cast <double >(static_cast <int64_t >(tmp));
69+ else
70+ v = static_cast <double >(tmp);
71+ break ;
72+ }
73+ default : {
74+ // TODO: implement sign?
75+ // TODO: implement big endian
76+ uint64_t value = 0 ;
77+ for (uint32_t i=0 ; i < bs.size ; i++) {
78+ value |= bitstream_reader_read_bit (&reader) << i;
79+ }
80+ v = static_cast <double >(value);
81+ break ;
82+ }
83+ }
84+ } else {
85+ // little endian
86+ switch (bs.size ) {
87+ case 1 :
88+ v = static_cast <double >(bitstream_reader_read_bit (&reader)); break ;
89+ case 8 :
90+ if (signal.is_signed )
91+ v = static_cast <double >(static_cast <int8_t >(bitstream_reader_read_u8 (&reader)));
92+ else
93+ v = static_cast <double >(bitstream_reader_read_u8 (&reader));
94+ break ;
95+ case 16 :
96+ if (signal.is_signed )
97+ v = static_cast <double >(static_cast <int16_t >(bitstream_reader_read_u16 (&reader)));
98+ else
99+ v = static_cast <double >(bitstream_reader_read_u16 (&reader));
100+ break ;
101+ case 32 :
102+ if (signal.is_signed )
103+ v = static_cast <double >(static_cast <int32_t >(bitstream_reader_read_u32 (&reader)));
104+ else
105+ v = static_cast <double >(bitstream_reader_read_u32 (&reader));
106+ break ;
107+ case 64 :
108+ if (signal.is_signed )
109+ v = static_cast <double >(static_cast <int64_t >(bitstream_reader_read_u64 (&reader)));
110+ else
111+ v = static_cast <double >(bitstream_reader_read_u64 (&reader));
112+ break ;
113+ default : {
114+ // TODO: implement sign?
115+ // TODO: implement big endian
116+ uint64_t value = 0 ;
117+ for (uint32_t i=0 ; i < bs.size ; i++) {
118+ value |= bitstream_reader_read_bit (&reader) << i;
119+ }
120+ v = static_cast <double >(value);
121+ break ;
122+ }
123+ }
124+ }
125+
126+ values.push_back (v * signal.factor + signal.offset );
127+ break ;
128+ }
129+ }
130+ }
131+ return true ;
132+ }
133+
134+ void Message::prepareMessage () {
135+ prepared = false ;
136+ std::sort (signals.begin (), signals.end ());
137+
138+ uint32_t curr_bit = 0 ;
139+ for (const auto & signal: signals) {
140+ if (signal.is_multiplexed /* || signal.is_bigendian*/ )
141+ break ; // Not supported yet
142+
143+ if (curr_bit < signal.start_bit ) {
144+ // padding needed
145+ bitstruct.push_back (BitStruct (" " , signal.start_bit - curr_bit, true ));
146+ }
147+ bitstruct.push_back (BitStruct (signal.name , signal.size , false ));
148+ curr_bit = signal.start_bit + signal.size ;
149+ }
150+ if (curr_bit > size * 8 )
151+ return ;
152+
153+ prepared = true ;
154+
155+ }
11156
12157 std::ostream& operator << (std::ostream &out, const Message& msg) {
13158 out << " Message: {id: " << msg.id << " , " ;
@@ -16,4 +161,4 @@ namespace libdbc {
16161 out << " node: " << msg.node << " }" ;
17162 return out;
18163 }
19- }
164+ }
0 commit comments