|
|
@ -1,12 +1,11 @@ |
|
|
|
#include "cereal/messaging/messaging.h" |
|
|
|
#include "cereal/messaging/messaging.h" |
|
|
|
#include "selfdrive/pandad/panda.h" |
|
|
|
#include "selfdrive/pandad/panda.h" |
|
|
|
#include "opendbc/can/common.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::string &out, bool sendcan, bool valid) { |
|
|
|
void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::string &out, bool sendCan, bool valid) { |
|
|
|
MessageBuilder msg; |
|
|
|
MessageBuilder msg; |
|
|
|
auto event = msg.initEvent(valid); |
|
|
|
auto event = msg.initEvent(valid); |
|
|
|
|
|
|
|
|
|
|
|
auto canData = sendcan ? event.initSendcan(can_list.size()) : event.initCan(can_list.size()); |
|
|
|
auto canData = sendCan ? event.initSendcan(can_list.size()) : event.initCan(can_list.size()); |
|
|
|
int j = 0; |
|
|
|
int j = 0; |
|
|
|
for (auto it = can_list.begin(); it != can_list.end(); it++, j++) { |
|
|
|
for (auto it = can_list.begin(); it != can_list.end(); it++, j++) { |
|
|
|
auto c = canData[j]; |
|
|
|
auto c = canData[j]; |
|
|
@ -19,33 +18,3 @@ void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::stri |
|
|
|
kj::ArrayOutputStream output_stream(kj::ArrayPtr<capnp::byte>((unsigned char *)out.data(), msg_size)); |
|
|
|
kj::ArrayOutputStream output_stream(kj::ArrayPtr<capnp::byte>((unsigned char *)out.data(), msg_size)); |
|
|
|
capnp::writeMessage(output_stream, msg); |
|
|
|
capnp::writeMessage(output_stream, msg); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 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<std::string> &strings, std::vector<CanData> &can_list, bool sendcan) { |
|
|
|
|
|
|
|
AlignedBuffer aligned_buf; |
|
|
|
|
|
|
|
can_list.reserve(strings.size()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (const auto &str : strings) { |
|
|
|
|
|
|
|
// extract the messages
|
|
|
|
|
|
|
|
capnp::FlatArrayMessageReader reader(aligned_buf.align(str.data(), str.size())); |
|
|
|
|
|
|
|
cereal::Event::Reader event = reader.getRoot<cereal::Event>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|