1
1
#include " cereal/messaging/messaging.h"
2
2
#include " selfdrive/pandad/panda.h"
3
+ #include " opendbc/can/common.h"
3
4
4
5
void can_list_to_can_capnp_cpp (const std::vector<can_frame> &can_list, std::string &out, bool sendCan, bool valid) {
5
6
MessageBuilder msg;
@@ -19,3 +20,33 @@ void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::stri
19
20
kj::ArrayOutputStream output_stream (kj::ArrayPtr<capnp::byte>((unsigned char *)out.data (), msg_size));
20
21
capnp::writeMessage (output_stream, msg);
21
22
}
23
+
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
+ for (const auto &s : strings) {
28
+ const size_t buf_size = (s.length () / sizeof (capnp::word)) + 1 ;
29
+ if (aligned_buf.size () < buf_size) {
30
+ aligned_buf = kj::heapArray<capnp::word>(buf_size);
31
+ }
32
+ memcpy (aligned_buf.begin (), s.data (), s.length ());
33
+
34
+ // extract the messages
35
+ capnp::FlatArrayMessageReader cmsg (aligned_buf.slice (0 , buf_size));
36
+ cereal::Event::Reader event = cmsg.getRoot <cereal::Event>();
37
+
38
+ auto &can = can_data.emplace_back ();
39
+ can.nanos = event.getLogMonoTime ();
40
+
41
+ auto cans = sendcan ? event.getSendcan () : event.getCan ();
42
+ can.frames .reserve (cans.size ());
43
+ for (const auto &c : cans) {
44
+ auto &frame = can.frames .emplace_back ();
45
+ frame.src = c.getSrc ();
46
+ frame.address = c.getAddress ();
47
+ auto dat = c.getDat ();
48
+ frame.dat .resize (dat.size ());
49
+ memcpy (frame.dat .data (), dat.begin (), dat.size ());
50
+ }
51
+ }
52
+ }
0 commit comments