@@ -21,32 +21,32 @@ void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::stri
21
21
capnp::writeMessage (output_stream, msg);
22
22
}
23
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
-
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 ());
34
28
29
+ for (const auto &str : strings) {
35
30
// 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 ());
50
50
}
51
51
}
52
52
}
0 commit comments