Skip to content

Commit 6d455a9

Browse files
committed
remove query_last
1 parent cf64482 commit 6d455a9

File tree

3 files changed

+25
-45
lines changed

3 files changed

+25
-45
lines changed

can/common.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <map>
4+
#include <set>
45
#include <string>
56
#include <utility>
67
#include <unordered_map>
@@ -82,12 +83,11 @@ class CANParser {
8283
SignalValue &getValue(uint32_t address, std::string &name);
8384
#ifndef DYNAMIC_CAPNP
8485
void update_string(const std::string &data, bool sendcan);
85-
std::vector<uint32_t> update_strings(const std::vector<std::string> &data, bool sendcan);
86-
void UpdateCans(uint64_t nanos, const capnp::List<cereal::CanData>::Reader& cans);
86+
std::set<uint32_t> update_strings(const std::vector<std::string> &data, bool sendcan);
87+
void UpdateCans(uint64_t nanos, const capnp::List<cereal::CanData>::Reader& cans, std::set<uint32_t> updated_addresses);
8788
#endif
8889
void UpdateCans(uint64_t nanos, const capnp::DynamicStruct::Reader& cans);
8990
void UpdateValid(uint64_t nanos);
90-
std::vector<uint32_t> query_latest(uint64_t last_ts = 0);
9191
};
9292

9393
class CANPacker {

can/common.pxd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t
55
from libcpp cimport bool
66
from libcpp.pair cimport pair
7+
from libcpp.set cimport set
78
from libcpp.string cimport string
89
from libcpp.vector cimport vector
910

@@ -67,7 +68,7 @@ cdef extern from "common.h":
6768
bool bus_timeout
6869
CANParser(int, string, vector[pair[uint32_t, int]]) except +
6970
SignalValue &getValue(uint32_t, string&)
70-
vector[uint32_t] update_strings(vector[string]&, bool) except +
71+
set[uint32_t] update_strings(vector[string]&, bool) except +
7172

7273
cdef cppclass CANPacker:
7374
CANPacker(string)

can/parser.cc

Lines changed: 20 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ bool MessageState::parse(uint64_t nanos, const std::vector<uint8_t> &dat) {
6868
return false;
6969
}
7070

71-
// Update values for each signal
7271
for (int i = 0; i < parse_sigs.size(); ++i) {
7372
// Retrieve the value entry for the current signal
7473
auto &val = values[parse_sigs[i].name];
@@ -176,58 +175,47 @@ CANParser::CANParser(int abus, const std::string& dbc_name, bool ignore_checksum
176175
}
177176

178177
#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) {
181179
const size_t buf_size = (data.length() / sizeof(capnp::word)) + 1;
182180
if (aligned_buf.size() < buf_size) {
183181
aligned_buf = kj::heapArray<capnp::word>(buf_size);
184182
}
185183
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);
200185
}
201186

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) {
203188
// Clear all_values
204189
for (auto &state : message_states) {
205190
for (auto &value : state.second.values) {
206191
value.second.all_values.clear();
207192
}
208193
}
209194

210-
if (data.empty()) {
211-
return {};
212-
}
213-
214-
uint64_t current_nanos = 0;
195+
std::set<uint32_t> updated_addresses;
215196
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();
219202
}
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);
220208
}
221-
return query_latest(current_nanos);
209+
return updated_addresses;
222210
}
223211

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) {
225213
//DEBUG("got %d messages\n", cans.size());
226214
std::vector<uint8_t> data;
227215
bool bus_empty = true;
228216

229217
// parse the messages
230-
for (const auto &cmsg : cans) {
218+
for (const auto cmsg : cans) {
231219
if (cmsg.getSrc() != bus) {
232220
// DEBUG("skip %d: wrong bus\n", cmsg.getAddress());
233221
continue;
@@ -252,7 +240,9 @@ void CANParser::UpdateCans(uint64_t nanos, const capnp::List<cereal::CanData>::R
252240
// continue;
253241
//}
254242
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+
}
256246
}
257247

258248
// update bus timeout
@@ -314,17 +304,6 @@ void CANParser::UpdateValid(uint64_t nanos) {
314304
can_valid = (can_invalid_cnt < CAN_INVALID_CNT) && _counters_valid;
315305
}
316306

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-
328307
SignalValue &CANParser::getValue(uint32_t address, std::string &name) {
329308
return message_states.at(address).values.at(name);
330309
}

0 commit comments

Comments
 (0)