@@ -68,7 +68,6 @@ bool MessageState::parse(uint64_t nanos, const std::vector<uint8_t> &dat) {
68
68
return false ;
69
69
}
70
70
71
- // Update values for each signal
72
71
for (int i = 0 ; i < parse_sigs.size (); ++i) {
73
72
// Retrieve the value entry for the current signal
74
73
auto &val = values[parse_sigs[i].name ];
@@ -176,58 +175,47 @@ CANParser::CANParser(int abus, const std::string& dbc_name, bool ignore_checksum
176
175
}
177
176
178
177
#ifndef DYNAMIC_CAPNP
179
- void CANParser::update_string (const std::string &data, bool sendcan) {
180
- // format for board, make copy due to alignment issues.
178
+ kj::ArrayPtr<capnp::word> CANParser::getAlignedData (const std::string &data) {
181
179
const size_t buf_size = (data.length () / sizeof (capnp::word)) + 1 ;
182
180
if (aligned_buf.size () < buf_size) {
183
181
aligned_buf = kj::heapArray<capnp::word>(buf_size);
184
182
}
185
183
memcpy (aligned_buf.begin (), data.data (), data.length ());
186
-
187
- // extract the messages
188
- capnp::FlatArrayMessageReader cmsg (aligned_buf.slice (0 , buf_size));
189
- cereal::Event::Reader event = cmsg.getRoot <cereal::Event>();
190
-
191
- if (first_nanos == 0 ) {
192
- first_nanos = event.getLogMonoTime ();
193
- }
194
- last_nanos = event.getLogMonoTime ();
195
-
196
- auto cans = sendcan ? event.getSendcan () : event.getCan ();
197
- UpdateCans (last_nanos, cans);
198
-
199
- UpdateValid (last_nanos);
184
+ return aligned_buf.slice (0 , buf_size);
200
185
}
201
186
202
- std::vector <uint32_t > CANParser::update_strings (const std::vector<std::string> &data, bool sendcan) {
187
+ std::set <uint32_t > CANParser::update_strings (const std::vector<std::string> &data, bool sendcan) {
203
188
// Clear all_values
204
189
for (auto &state : message_states) {
205
190
for (auto &value : state.second .values ) {
206
191
value.second .all_values .clear ();
207
192
}
208
193
}
209
194
210
- if (data.empty ()) {
211
- return {};
212
- }
213
-
214
- uint64_t current_nanos = 0 ;
195
+ std::set<uint32_t > updated_addresses;
215
196
for (const auto &d : data) {
216
- update_string (d, sendcan);
217
- if (current_nanos == 0 ) {
218
- current_nanos = last_nanos;
197
+ capnp::FlatArrayMessageReader cmsg (getAlignedData (d));
198
+ cereal::Event::Reader event = cmsg.getRoot <cereal::Event>();
199
+
200
+ if (first_nanos == 0 ) {
201
+ first_nanos = event.getLogMonoTime ();
219
202
}
203
+ last_nanos = event.getLogMonoTime ();
204
+
205
+ auto cans = sendcan ? event.getSendcan () : event.getCan ();
206
+ UpdateCans (last_nanos, cans, updated_addresses);
207
+ UpdateValid (last_nanos);
220
208
}
221
- return query_latest (current_nanos) ;
209
+ return updated_addresses ;
222
210
}
223
211
224
- void CANParser::UpdateCans (uint64_t nanos, const capnp::List<cereal::CanData>::Reader& cans) {
212
+ void CANParser::UpdateCans (uint64_t nanos, const capnp::List<cereal::CanData>::Reader& cans, std::set< uint32_t > updated_addresses ) {
225
213
// DEBUG("got %d messages\n", cans.size());
226
214
std::vector<uint8_t > data;
227
215
bool bus_empty = true ;
228
216
229
217
// parse the messages
230
- for (const auto & cmsg : cans) {
218
+ for (const auto cmsg : cans) {
231
219
if (cmsg.getSrc () != bus) {
232
220
// DEBUG("skip %d: wrong bus\n", cmsg.getAddress());
233
221
continue ;
@@ -252,7 +240,9 @@ void CANParser::UpdateCans(uint64_t nanos, const capnp::List<cereal::CanData>::R
252
240
// continue;
253
241
// }
254
242
data.assign (dat.begin (), dat.end ());
255
- state_it->second .parse (nanos, data);
243
+ if (state_it->second .parse (nanos, data)) {
244
+ updated_addresses.insert (state_it->first );
245
+ }
256
246
}
257
247
258
248
// update bus timeout
@@ -314,17 +304,6 @@ void CANParser::UpdateValid(uint64_t nanos) {
314
304
can_valid = (can_invalid_cnt < CAN_INVALID_CNT) && _counters_valid;
315
305
}
316
306
317
- std::vector<uint32_t > CANParser::query_latest (uint64_t last_ts) {
318
- std::vector<uint32_t > result;
319
- result.reserve (message_states.size ());
320
- for (const auto & [addr, state] : message_states) {
321
- if (state.last_seen_nanos >= last_ts) {
322
- result.push_back (addr);
323
- }
324
- }
325
- return result;
326
- }
327
-
328
307
SignalValue &CANParser::getValue (uint32_t address, std::string &name) {
329
308
return message_states.at (address).values .at (name);
330
309
}
0 commit comments