Skip to content

Commit 1713aa1

Browse files
committed
use new opendbc api
1 parent 57f21ab commit 1713aa1

15 files changed

+87
-17
lines changed

selfdrive/car/chrysler/radar_interface.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from cereal import car
44
from openpilot.selfdrive.car.interfaces import RadarInterfaceBase
55
from openpilot.selfdrive.car.chrysler.values import DBC
6+
from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list
67

78
RADAR_MSGS_C = list(range(0x2c2, 0x2d4+2, 2)) # c_ messages 706,...,724
89
RADAR_MSGS_D = list(range(0x2a2, 0x2b4+2, 2)) # d_ messages
@@ -48,7 +49,7 @@ def update(self, can_strings):
4849
if self.rcp is None or self.CP.radarUnavailable:
4950
return super().update(None)
5051

51-
vls = self.rcp.update_strings(can_strings)
52+
vls = self.rcp.update_strings(can_capnp_to_list(can_strings))
5253
self.updated_messages.update(vls)
5354

5455
if self.trigger_msg not in self.updated_messages:

selfdrive/car/ford/radar_interface.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from openpilot.selfdrive.car.ford.fordcan import CanBus
66
from openpilot.selfdrive.car.ford.values import DBC, RADAR
77
from openpilot.selfdrive.car.interfaces import RadarInterfaceBase
8+
from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list
89

910
DELPHI_ESR_RADAR_MSGS = list(range(0x500, 0x540))
1011

@@ -52,7 +53,7 @@ def update(self, can_strings):
5253
if self.rcp is None:
5354
return super().update(None)
5455

55-
vls = self.rcp.update_strings(can_strings)
56+
vls = self.rcp.update_strings(can_capnp_to_list(can_strings))
5657
self.updated_messages.update(vls)
5758

5859
if self.trigger_msg not in self.updated_messages:

selfdrive/car/gm/radar_interface.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from opendbc.can.parser import CANParser
66
from openpilot.selfdrive.car.gm.values import DBC, CanBus
77
from openpilot.selfdrive.car.interfaces import RadarInterfaceBase
8+
from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list
89

910
RADAR_HEADER_MSG = 1120
1011
SLOT_1_MSG = RADAR_HEADER_MSG + 1
@@ -46,7 +47,7 @@ def update(self, can_strings):
4647
if self.rcp is None:
4748
return super().update(None)
4849

49-
vls = self.rcp.update_strings(can_strings)
50+
vls = self.rcp.update_strings(can_capnp_to_list(can_strings))
5051
self.updated_messages.update(vls)
5152

5253
if self.trigger_msg not in self.updated_messages:

selfdrive/car/honda/radar_interface.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from opendbc.can.parser import CANParser
44
from openpilot.selfdrive.car.interfaces import RadarInterfaceBase
55
from openpilot.selfdrive.car.honda.values import DBC
6+
from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list
67

78

89
def _create_nidec_can_parser(car_fingerprint):
@@ -36,7 +37,7 @@ def update(self, can_strings):
3637
if self.radar_off_can:
3738
return super().update(None)
3839

39-
vls = self.rcp.update_strings(can_strings)
40+
vls = self.rcp.update_strings(can_capnp_to_list(can_strings))
4041
self.updated_messages.update(vls)
4142

4243
if self.trigger_msg not in self.updated_messages:

selfdrive/car/hyundai/radar_interface.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from opendbc.can.parser import CANParser
55
from openpilot.selfdrive.car.interfaces import RadarInterfaceBase
66
from openpilot.selfdrive.car.hyundai.values import DBC
7+
from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list
78

89
RADAR_START_ADDR = 0x500
910
RADAR_MSG_COUNT = 32
@@ -32,7 +33,7 @@ def update(self, can_strings):
3233
if self.radar_off_can or (self.rcp is None):
3334
return super().update(None)
3435

35-
vls = self.rcp.update_strings(can_strings)
36+
vls = self.rcp.update_strings(can_capnp_to_list(can_strings))
3637
self.updated_messages.update(vls)
3738

3839
if self.trigger_msg not in self.updated_messages:

selfdrive/car/interfaces.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from openpilot.selfdrive.controls.lib.drive_helpers import V_CRUISE_MAX, get_friction
2020
from openpilot.selfdrive.controls.lib.events import Events
2121
from openpilot.selfdrive.controls.lib.vehicle_model import VehicleModel
22+
from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list
2223

2324
ButtonType = car.CarState.ButtonEvent.Type
2425
GearShifter = car.CarState.GearShifter
@@ -235,9 +236,10 @@ def _update(self, c: car.CarControl) -> car.CarState:
235236

236237
def update(self, c: car.CarControl, can_strings: list[bytes]) -> car.CarState:
237238
# parse can
239+
can_list = can_capnp_to_list(can_strings)
238240
for cp in self.can_parsers:
239241
if cp is not None:
240-
cp.update_strings(can_strings)
242+
cp.update_strings(can_list)
241243

242244
# get CarState
243245
ret = self._update(c)

selfdrive/car/tesla/radar_interface.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from opendbc.can.parser import CANParser
44
from openpilot.selfdrive.car.tesla.values import CAR, DBC, CANBUS
55
from openpilot.selfdrive.car.interfaces import RadarInterfaceBase
6+
from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list
67

78

89
class RadarInterface(RadarInterfaceBase):
@@ -33,7 +34,7 @@ def update(self, can_strings):
3334
if self.rcp is None:
3435
return super().update(None)
3536

36-
values = self.rcp.update_strings(can_strings)
37+
values = self.rcp.update_strings(can_capnp_to_list(can_strings))
3738
self.updated_messages.update(values)
3839

3940
if self.trigger_msg not in self.updated_messages:

selfdrive/car/toyota/radar_interface.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from cereal import car
44
from openpilot.selfdrive.car.toyota.values import DBC, TSS2_CAR
55
from openpilot.selfdrive.car.interfaces import RadarInterfaceBase
6+
from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list
67

78

89
def _create_radar_can_parser(car_fingerprint):
@@ -42,7 +43,7 @@ def update(self, can_strings):
4243
if self.rcp is None:
4344
return super().update(None)
4445

45-
vls = self.rcp.update_strings(can_strings)
46+
vls = self.rcp.update_strings(can_capnp_to_list(can_strings))
4647
self.updated_messages.update(vls)
4748

4849
if self.trigger_msg not in self.updated_messages:

selfdrive/debug/check_can_parser_performance.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
from cereal import car
77
from openpilot.selfdrive.car.tests.routes import CarTestRoute
88
from openpilot.selfdrive.car.tests.test_models import TestCarModelBase
9+
from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list
910
from openpilot.tools.plotjuggler.juggle import DEMO_ROUTE
1011

12+
1113
N_RUNS = 10
1214

1315

@@ -25,7 +27,7 @@ class CarModelTestCase(TestCarModelBase):
2527
CC = car.CarControl.new_message()
2628
ets = []
2729
for _ in tqdm(range(N_RUNS)):
28-
msgs = [(m.as_builder().to_bytes(),) for m in tm.can_msgs]
30+
msgs = can_capnp_to_list([m.as_builder().to_bytes() for m in tm.can_msgs])
2931
start_t = time.process_time_ns()
3032
for msg in msgs:
3133
for cp in tm.CI.can_parsers:

selfdrive/pandad/__init__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Cython, now uses scons to build
2-
from openpilot.selfdrive.pandad.pandad_api_impl import can_list_to_can_capnp
2+
from openpilot.selfdrive.pandad.pandad_api_impl import can_list_to_can_capnp, can_capnp_to_list
33
assert can_list_to_can_capnp
4+
assert can_capnp_to_list
45

56
def can_capnp_to_can_list(can, src_filter=None):
67
ret = []

selfdrive/pandad/can_list_to_can_capnp.cc

+31
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "cereal/messaging/messaging.h"
22
#include "selfdrive/pandad/panda.h"
3+
#include "opendbc/can/common.h"
34

45
void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::string &out, bool sendCan, bool valid) {
56
MessageBuilder msg;
@@ -19,3 +20,33 @@ void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::stri
1920
kj::ArrayOutputStream output_stream(kj::ArrayPtr<capnp::byte>((unsigned char *)out.data(), msg_size));
2021
capnp::writeMessage(output_stream, msg);
2122
}
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+
}

selfdrive/pandad/pandad_api_impl.pyx

+29-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# distutils: language = c++
22
# cython: language_level=3
3+
from cython.operator cimport dereference as deref, preincrement as preinc
34
from libcpp.vector cimport vector
45
from libcpp.string cimport string
56
from libcpp cimport bool
7+
from libc.stdint cimport uint8_t, uint32_t, uint64_t
68

79
cdef extern from "panda.h":
810
cdef struct can_frame:
@@ -11,21 +13,44 @@ cdef extern from "panda.h":
1113
long busTime
1214
long src
1315

16+
cdef extern from "opendbc/can/common.h":
17+
cdef struct CanFrame:
18+
long src
19+
uint32_t address
20+
vector[uint8_t] dat
21+
22+
cdef struct CanData:
23+
uint64_t nanos
24+
vector[CanFrame] frames
25+
1426
cdef extern from "can_list_to_can_capnp.cc":
1527
void can_list_to_can_capnp_cpp(const vector[can_frame] &can_list, string &out, bool sendCan, bool valid)
28+
void can_capnp_to_can_list_cpp(const vector[string] &strings, vector[CanData] &can_data, bool sendcan)
1629

1730
def can_list_to_can_capnp(can_msgs, msgtype='can', valid=True):
18-
cdef can_frame *f
1931
cdef vector[can_frame] can_list
20-
2132
can_list.reserve(len(can_msgs))
33+
34+
cdef can_frame f
2235
for can_msg in can_msgs:
23-
f = &(can_list.emplace_back())
2436
f.address = can_msg[0]
2537
f.busTime = can_msg[1]
2638
f.dat = can_msg[2]
2739
f.src = can_msg[3]
28-
40+
can_list.push_back(f)
2941
cdef string out
3042
can_list_to_can_capnp_cpp(can_list, out, msgtype == 'sendcan', valid)
3143
return out
44+
45+
def can_capnp_to_list(strings, sendcan=False):
46+
cdef vector[CanData] data
47+
can_capnp_to_can_list_cpp(strings, data, sendcan)
48+
result = []
49+
cdef vector[CanData].iterator it = data.begin()
50+
cdef CanData *d
51+
while it != data.end():
52+
d = &deref(it)
53+
frames = [[f.address, 0, (<char *>&f.dat[0])[:f.dat.size()], f.src] for f in d.frames]
54+
result.append([d.nanos, frames])
55+
preinc(it)
56+
return result

tools/car_porting/examples/subaru_long_accel.ipynb

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"from opendbc.can.parser import CANParser\n",
2525
"\n",
2626
"from openpilot.selfdrive.car.subaru.values import DBC\n",
27+
"from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list\n",
2728
"from openpilot.tools.lib.logreader import LogReader\n",
2829
"\n",
2930
"\"\"\"\n",
@@ -50,7 +51,7 @@
5051
"\n",
5152
" for msg in lr:\n",
5253
" if msg.which() == \"can\":\n",
53-
" cp.update_strings([msg.as_builder().to_bytes()])\n",
54+
" cp.update_strings(can_capnp_to_list([msg.as_builder().to_bytes()]))\n",
5455
" es_distance_history.append(copy.copy(cp.vl[\"ES_Distance\"]))\n",
5556
" es_brake_history.append(copy.copy(cp.vl[\"ES_Brake\"]))\n",
5657
" es_status_history.append(copy.copy(cp.vl[\"ES_Status\"]))\n",

tools/car_porting/examples/subaru_steer_temp_fault.ipynb

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"from opendbc.can.parser import CANParser\n",
2828
"\n",
2929
"from openpilot.selfdrive.car.subaru.values import CanBus, DBC\n",
30+
"from openpilot.selfdrive.pandad.pandad_api_impl import can_capnp_to_list\n",
3031
"from openpilot.tools.lib.logreader import LogReader\n",
3132
"\n",
3233
"\"\"\"\n",
@@ -50,7 +51,7 @@
5051
" examples = []\n",
5152
"\n",
5253
" for msg in can_msgs:\n",
53-
" cp.update_strings([msg.as_builder().to_bytes()])\n",
54+
" cp.update_strings(can_capnp_to_list([msg.as_builder().to_bytes()]))\n",
5455
" steering_torque_history.append(copy.copy(cp.vl[\"Steering_Torque\"]))\n",
5556
"\n",
5657
" steer_warning_last = False\n",

0 commit comments

Comments
 (0)