1
1
#include " cereal/messaging/messaging.h"
2
2
#include " selfdrive/pandad/panda.h"
3
+ #include " opendbc/can/common.h"
3
4
4
- void can_list_to_can_capnp_cpp (const std::vector<can_frame> &can_list, std::string &out, bool sendCan , bool valid) {
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;
6
7
auto event = msg.initEvent (valid);
7
8
8
- auto canData = sendCan ? event.initSendcan (can_list.size ()) : event.initCan (can_list.size ());
9
+ auto canData = sendcan ? event.initSendcan (can_list.size ()) : event.initCan (can_list.size ());
9
10
int j = 0 ;
10
11
for (auto it = can_list.begin (); it != can_list.end (); it++, j++) {
11
12
auto c = canData[j];
@@ -18,3 +19,33 @@ void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::stri
18
19
kj::ArrayOutputStream output_stream (kj::ArrayPtr<capnp::byte>((unsigned char *)out.data (), msg_size));
19
20
capnp::writeMessage (output_stream, msg);
20
21
}
22
+
23
+ // Converts a vector of Cap'n Proto serialized can strings into a vector of CanData structures.
24
+ void can_capnp_to_can_list_cpp (const std::vector<std::string> &strings, std::vector<CanData> &can_list, bool sendcan) {
25
+ AlignedBuffer aligned_buf;
26
+ can_list.reserve (strings.size ());
27
+
28
+ for (const auto &str : strings) {
29
+ // extract the messages
30
+ capnp::FlatArrayMessageReader reader (aligned_buf.align (str.data (), str.size ()));
31
+ cereal::Event::Reader event = reader.getRoot <cereal::Event>();
32
+
33
+ auto frames = sendcan ? event.getSendcan () : event.getCan ();
34
+
35
+ // Add new CanData entry
36
+ CanData &can_data = can_list.emplace_back ();
37
+ can_data.nanos = event.getLogMonoTime ();
38
+ can_data.frames .reserve (frames.size ());
39
+
40
+ // Populate CAN frames
41
+ for (const auto &frame : frames) {
42
+ CanFrame &can_frame = can_data.frames .emplace_back ();
43
+ can_frame.src = frame.getSrc ();
44
+ can_frame.address = frame.getAddress ();
45
+
46
+ // Copy CAN data
47
+ auto dat = frame.getDat ();
48
+ can_frame.dat .assign (dat.begin (), dat.end ());
49
+ }
50
+ }
51
+ }
0 commit comments