From fbd4e5c6fa3a81486245fc24db199a5454879544 Mon Sep 17 00:00:00 2001 From: deanlee Date: Tue, 11 Jun 2024 14:51:49 +0800 Subject: [PATCH] improve func --- selfdrive/pandad/can_list_to_can_capnp.cc | 48 +++++++++++------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/selfdrive/pandad/can_list_to_can_capnp.cc b/selfdrive/pandad/can_list_to_can_capnp.cc index d8517b71fa8503..232287bec98223 100644 --- a/selfdrive/pandad/can_list_to_can_capnp.cc +++ b/selfdrive/pandad/can_list_to_can_capnp.cc @@ -21,32 +21,32 @@ void can_list_to_can_capnp_cpp(const std::vector &can_list, std::stri capnp::writeMessage(output_stream, msg); } -void can_capnp_to_can_list_cpp(const std::vector &strings, std::vector &can_data, bool sendcan) { - kj::Array aligned_buf; - can_data.reserve(strings.size()); - - for (const auto &s : strings) { - const size_t buf_size = (s.length() / sizeof(capnp::word)) + 1; - if (aligned_buf.size() < buf_size) { - aligned_buf = kj::heapArray(buf_size); - } - memcpy(aligned_buf.begin(), s.data(), s.length()); +// Converts a vector of Cap'n Proto serialized can strings into a vector of CanData structures. +void can_capnp_to_can_list_cpp(const std::vector &strings, std::vector &can_list, bool sendcan) { + AlignedBuffer aligned_buf; + can_list.reserve(strings.size()); + for (const auto &str : strings) { // extract the messages - capnp::FlatArrayMessageReader cmsg(aligned_buf.slice(0, buf_size)); - cereal::Event::Reader event = cmsg.getRoot(); - - auto &can = can_data.emplace_back(); - can.nanos = event.getLogMonoTime(); - - auto cans = sendcan ? event.getSendcan() : event.getCan(); - can.frames.reserve(cans.size()); - for (const auto &c : cans) { - auto &frame = can.frames.emplace_back(); - frame.src = c.getSrc(); - frame.address = c.getAddress(); - auto dat = c.getDat(); - frame.dat.assign(dat.begin(), dat.end()); + capnp::FlatArrayMessageReader reader(aligned_buf.align(str.data(), str.size())); + cereal::Event::Reader event = reader.getRoot(); + + auto frames = sendcan ? event.getSendcan() : event.getCan(); + + // Add new CanData entry + CanData &can_data = can_list.emplace_back(); + can_data.nanos = event.getLogMonoTime(); + can_data.frames.reserve(frames.size()); + + // Populate CAN frames + for (const auto &frame : frames) { + CanFrame &can_frame = can_data.frames.emplace_back(); + can_frame.src = frame.getSrc(); + can_frame.address = frame.getAddress(); + + // Copy CAN data + auto dat = frame.getDat(); + can_frame.dat.assign(dat.begin(), dat.end()); } } }