Skip to content

Commit 621ab6f

Browse files
committed
improve func
1 parent a775869 commit 621ab6f

File tree

1 file changed

+24
-24
lines changed

1 file changed

+24
-24
lines changed

selfdrive/pandad/can_list_to_can_capnp.cc

+24-24
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,32 @@ void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::stri
2121
capnp::writeMessage(output_stream, msg);
2222
}
2323

24-
void can_capnp_to_can_list_cpp(const std::vector<std::string> &strings, std::vector<CanData> &can_data, bool sendcan) {
25-
kj::Array<capnp::word> aligned_buf;
26-
can_data.reserve(strings.size());
27-
28-
for (const auto &s : strings) {
29-
const size_t buf_size = (s.length() / sizeof(capnp::word)) + 1;
30-
if (aligned_buf.size() < buf_size) {
31-
aligned_buf = kj::heapArray<capnp::word>(buf_size);
32-
}
33-
memcpy(aligned_buf.begin(), s.data(), s.length());
24+
// Converts a vector of Cap'n Proto serialized can strings into a vector of CanData structures.
25+
void can_capnp_to_can_list_cpp(const std::vector<std::string> &strings, std::vector<CanData> &can_list, bool sendcan) {
26+
AlignedBuffer aligned_buf;
27+
can_list.reserve(strings.size());
3428

29+
for (const auto &str : strings) {
3530
// extract the messages
36-
capnp::FlatArrayMessageReader cmsg(aligned_buf.slice(0, buf_size));
37-
cereal::Event::Reader event = cmsg.getRoot<cereal::Event>();
38-
39-
auto &can = can_data.emplace_back();
40-
can.nanos = event.getLogMonoTime();
41-
42-
auto cans = sendcan ? event.getSendcan() : event.getCan();
43-
can.frames.reserve(cans.size());
44-
for (const auto &c : cans) {
45-
auto &frame = can.frames.emplace_back();
46-
frame.src = c.getSrc();
47-
frame.address = c.getAddress();
48-
auto dat = c.getDat();
49-
frame.dat.assign(dat.begin(), dat.end());
31+
capnp::FlatArrayMessageReader reader(aligned_buf.align(str.data(), str.size()));
32+
cereal::Event::Reader event = reader.getRoot<cereal::Event>();
33+
34+
auto frames = sendcan ? event.getSendcan() : event.getCan();
35+
36+
// Add new CanData entry
37+
CanData &can_data = can_list.emplace_back();
38+
can_data.nanos = event.getLogMonoTime();
39+
can_data.frames.reserve(frames.size());
40+
41+
// Populate CAN frames
42+
for (const auto &frame : frames) {
43+
CanFrame &can_frame = can_data.frames.emplace_back();
44+
can_frame.src = frame.getSrc();
45+
can_frame.address = frame.getAddress();
46+
47+
// Copy CAN data
48+
auto dat = frame.getDat();
49+
can_frame.dat.assign(dat.begin(), dat.end());
5050
}
5151
}
5252
}

0 commit comments

Comments
 (0)