Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master' into opendbc_new_api
Browse files Browse the repository at this point in the history
  • Loading branch information
sshane committed Jul 31, 2024
2 parents 177ebaa + 42f2601 commit 1a3bc0f
Show file tree
Hide file tree
Showing 26 changed files with 47 additions and 52 deletions.
2 changes: 1 addition & 1 deletion cereal/log.capnp
Original file line number Diff line number Diff line change
Expand Up @@ -336,9 +336,9 @@ enum LaneChangeDirection {

struct CanData {
address @0 :UInt32;
busTime @1 :UInt16;
dat @2 :Data;
src @3 :UInt8;
busTimeDEPRECATED @1 :UInt16;
}

struct DeviceState @0xa4d8b5af2aa492eb {
Expand Down
2 changes: 1 addition & 1 deletion opendbc
13 changes: 12 additions & 1 deletion selfdrive/car/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import capnp

from cereal import car
from panda.python.uds import SERVICE_TYPE
from openpilot.common.numpy_fast import clip, interp
from openpilot.common.utils import Freezable
from openpilot.selfdrive.car.docs_definitions import CarDocs
Expand Down Expand Up @@ -188,7 +189,17 @@ def get_friction(lateral_accel_error: float, lateral_accel_deadzone: float, fric


def make_can_msg(addr, dat, bus):
return [addr, 0, dat, bus]
return [addr, dat, bus]


def make_tester_present_msg(addr, bus, subaddr=None, suppress_response=False):
dat = [0x02, SERVICE_TYPE.TESTER_PRESENT]
if subaddr is not None:
dat.insert(0, subaddr)
dat.append(0x80 if suppress_response else 0x0) # sub-function

dat.extend([0x0] * (8 - len(dat)))
return make_can_msg(addr, bytes(dat), bus)


def get_safety_config(safety_model, safety_param = None):
Expand Down
13 changes: 2 additions & 11 deletions selfdrive/car/ecu_addrs.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,12 @@

import cereal.messaging as messaging
from panda.python.uds import SERVICE_TYPE
from openpilot.selfdrive.car import make_can_msg
from openpilot.selfdrive.car import make_tester_present_msg
from openpilot.selfdrive.car.fw_query_definitions import EcuAddrBusType
from openpilot.selfdrive.pandad import can_list_to_can_capnp
from openpilot.common.swaglog import cloudlog


def _make_tester_present_msg(addr, bus, subaddr=None):
dat = [0x02, SERVICE_TYPE.TESTER_PRESENT, 0x0]
if subaddr is not None:
dat.insert(0, subaddr)

dat.extend([0x0] * (8 - len(dat)))
return make_can_msg(addr, bytes(dat), bus)


def _is_tester_present_response(msg: capnp.lib.capnp._DynamicStructReader, subaddr: int = None) -> bool:
# ISO-TP messages are always padded to 8 bytes
# tester present response is always a single frame
Expand All @@ -44,7 +35,7 @@ def get_ecu_addrs(logcan: messaging.SubSocket, sendcan: messaging.PubSocket, que
responses: set[EcuAddrBusType], timeout: float = 1, debug: bool = False) -> set[EcuAddrBusType]:
ecu_responses: set[EcuAddrBusType] = set() # set((addr, subaddr, bus),)
try:
msgs = [_make_tester_present_msg(addr, bus, subaddr) for addr, subaddr, bus in queries]
msgs = [make_tester_present_msg(addr, bus, subaddr) for addr, subaddr, bus in queries]

messaging.drain_sock_raw(logcan)
sendcan.send(can_list_to_can_capnp(msgs, msgtype='sendcan'))
Expand Down
2 changes: 1 addition & 1 deletion selfdrive/car/ford/fordcan.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def create_lat_ctl2_msg(packer, CAN: CanBus, mode: int, path_offset: float, path
}

# calculate checksum
dat = packer.make_can_msg("LateralMotionControl2", 0, values)[2]
dat = packer.make_can_msg("LateralMotionControl2", 0, values)[1]
values["LatCtlPath_No_Cs"] = calculate_lat_ctl2_checksum(mode, counter, dat)

return packer.make_can_msg("LateralMotionControl2", CAN.main, values)
Expand Down
2 changes: 1 addition & 1 deletion selfdrive/car/gm/gmcan.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def create_gas_regen_command(packer, bus, throttle, idx, enabled, at_full_stop):
"GasRegenAlwaysOne3": 1,
}

dat = packer.make_can_msg("ASCMGasRegenCmd", bus, values)[2]
dat = packer.make_can_msg("ASCMGasRegenCmd", bus, values)[1]
values["GasRegenChecksum"] = (((0xff - dat[1]) & 0xff) << 16) | \
(((0xff - dat[2]) & 0xff) << 8) | \
((0x100 - dat[3] - idx) & 0xff)
Expand Down
4 changes: 2 additions & 2 deletions selfdrive/car/honda/carcontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from cereal import car
from openpilot.common.numpy_fast import clip, interp
from opendbc.can.packer import CANPacker
from openpilot.selfdrive.car import DT_CTRL, rate_limit
from openpilot.selfdrive.car import DT_CTRL, rate_limit, make_tester_present_msg
from openpilot.selfdrive.car.honda import hondacan
from openpilot.selfdrive.car.honda.values import CruiseButtons, VISUAL_HUD, HONDA_BOSCH, HONDA_BOSCH_RADARLESS, HONDA_NIDEC_ALT_PCM_ACCEL, CarControllerParams
from openpilot.selfdrive.car.interfaces import CarControllerBase
Expand Down Expand Up @@ -164,7 +164,7 @@ def update(self, CC, CS, now_nanos):
# tester present - w/ no response (keeps radar disabled)
if self.CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) and self.CP.openpilotLongitudinalControl:
if self.frame % 10 == 0:
can_sends.append((0x18DAB0F1, 0, b"\x02\x3E\x80\x00\x00\x00\x00\x00", 1))
can_sends.append(make_tester_present_msg(0x18DAB0F1, 1, suppress_response=True))

# Send steering command.
can_sends.append(hondacan.create_steering_control(self.packer, self.CAN, apply_steer, CC.latActive, self.CP.carFingerprint,
Expand Down
6 changes: 3 additions & 3 deletions selfdrive/car/hyundai/carcontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from openpilot.common.conversions import Conversions as CV
from openpilot.common.numpy_fast import clip
from opendbc.can.packer import CANPacker
from openpilot.selfdrive.car import DT_CTRL, apply_driver_steer_torque_limits, common_fault_avoidance
from openpilot.selfdrive.car import DT_CTRL, apply_driver_steer_torque_limits, common_fault_avoidance, make_tester_present_msg
from openpilot.selfdrive.car.hyundai import hyundaicanfd, hyundaican
from openpilot.selfdrive.car.hyundai.hyundaicanfd import CanBus
from openpilot.selfdrive.car.hyundai.values import HyundaiFlags, Buttons, CarControllerParams, CANFD_CAR, CAR
Expand Down Expand Up @@ -96,11 +96,11 @@ def update(self, CC, CS, now_nanos):
addr, bus = 0x7d0, 0
if self.CP.flags & HyundaiFlags.CANFD_HDA2.value:
addr, bus = 0x730, self.CAN.ECAN
can_sends.append([addr, 0, b"\x02\x3E\x80\x00\x00\x00\x00\x00", bus])
can_sends.append(make_tester_present_msg(addr, bus, suppress_response=True))

# for blinkers
if self.CP.flags & HyundaiFlags.ENABLE_BLINKERS:
can_sends.append([0x7b1, 0, b"\x02\x3E\x80\x00\x00\x00\x00\x00", self.CAN.ECAN])
can_sends.append(make_tester_present_msg(0x7b1, self.CAN.ECAN, suppress_response=True))

# CAN-FD platforms
if self.CP.carFingerprint in CANFD_CAR:
Expand Down
6 changes: 3 additions & 3 deletions selfdrive/car/hyundai/hyundaican.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def create_lkas11(packer, frame, CP, apply_steer, steer_req,
# Genesis and Optima fault when forwarding while engaged
values["CF_Lkas_LdwsActivemode"] = 2

dat = packer.make_can_msg("LKAS11", 0, values)[2]
dat = packer.make_can_msg("LKAS11", 0, values)[1]

if CP.flags & HyundaiFlags.CHECKSUM_CRC8:
# CRC Checksum as seen on 2019 Hyundai Santa Fe
Expand Down Expand Up @@ -156,7 +156,7 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, hud_control, se
scc12_values["CF_VSM_ConfMode"] = 1
scc12_values["AEB_Status"] = 1 # AEB disabled

scc12_dat = packer.make_can_msg("SCC12", 0, scc12_values)[2]
scc12_dat = packer.make_can_msg("SCC12", 0, scc12_values)[1]
scc12_values["CR_VSM_ChkSum"] = 0x10 - sum(sum(divmod(i, 16)) for i in scc12_dat) % 0x10

commands.append(packer.make_can_msg("SCC12", 0, scc12_values))
Expand All @@ -181,7 +181,7 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, hud_control, se
"FCA_DrvSetStatus": 1,
"FCA_Status": 1, # AEB disabled
}
fca11_dat = packer.make_can_msg("FCA11", 0, fca11_values)[2]
fca11_dat = packer.make_can_msg("FCA11", 0, fca11_values)[1]
fca11_values["CR_FCA_ChkSum"] = hyundai_checksum(fca11_dat[:7])
commands.append(packer.make_can_msg("FCA11", 0, fca11_values))

Expand Down
8 changes: 4 additions & 4 deletions selfdrive/car/isotp_parallel_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def __init__(self, sendcan: messaging.PubSocket, logcan: messaging.SubSocket, bu
assert tx_addr not in FUNCTIONAL_ADDRS, f"Functional address should be defined in functional_addrs: {hex(tx_addr)}"

self.msg_addrs = {tx_addr: get_rx_addr_for_tx_addr(tx_addr[0], rx_offset=response_offset) for tx_addr in real_addrs}
self.msg_buffer: dict[int, list[tuple[int, int, bytes, int]]] = defaultdict(list)
self.msg_buffer: dict[int, list[tuple[int, bytes, int]]] = defaultdict(list)

def rx(self):
"""Drain can socket and sort messages into buffers based on address"""
Expand All @@ -36,11 +36,11 @@ def rx(self):
for packet in can_packets:
for msg in packet.can:
if msg.src == self.bus and msg.address in self.msg_addrs.values():
self.msg_buffer[msg.address].append((msg.address, msg.busTime, msg.dat, msg.src))
self.msg_buffer[msg.address].append((msg.address, msg.dat, msg.src))

def _can_tx(self, tx_addr, dat, bus):
"""Helper function to send single message"""
msg = [tx_addr, 0, dat, bus]
msg = [tx_addr, dat, bus]
self.sendcan.send(can_list_to_can_capnp([msg], msgtype='sendcan'))

def _can_rx(self, addr, sub_addr=None):
Expand All @@ -53,7 +53,7 @@ def _can_rx(self, addr, sub_addr=None):
# Filter based on subadress
msgs = []
for m in self.msg_buffer[addr]:
first_byte = m[2][0]
first_byte = m[1][0]
if first_byte == sub_addr:
msgs.append(m)
else:
Expand Down
2 changes: 1 addition & 1 deletion selfdrive/car/nissan/nissancan.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def create_steering_control(packer, apply_steer, frame, steer_on, lkas_max_torqu
"LKA_ACTIVE": steer_on,
}

dat = packer.make_can_msg("LKAS", 0, values)[2]
dat = packer.make_can_msg("LKAS", 0, values)[1]

values["CHECKSUM"] = nissan_checksum(dat[:7])
return packer.make_can_msg("LKAS", 0, values)
Expand Down
4 changes: 2 additions & 2 deletions selfdrive/car/subaru/carcontroller.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from openpilot.common.numpy_fast import clip, interp
from opendbc.can.packer import CANPacker
from openpilot.selfdrive.car import apply_driver_steer_torque_limits, common_fault_avoidance
from openpilot.selfdrive.car import apply_driver_steer_torque_limits, common_fault_avoidance, make_tester_present_msg
from openpilot.selfdrive.car.interfaces import CarControllerBase
from openpilot.selfdrive.car.subaru import subarucan
from openpilot.selfdrive.car.subaru.values import DBC, GLOBAL_ES_ADDR, CanBus, CarControllerParams, SubaruFlags
Expand Down Expand Up @@ -124,7 +124,7 @@ def update(self, CC, CS, now_nanos):
if self.CP.flags & SubaruFlags.DISABLE_EYESIGHT:
# Tester present (keeps eyesight disabled)
if self.frame % 100 == 0:
can_sends.append([GLOBAL_ES_ADDR, 0, b"\x02\x3E\x80\x00\x00\x00\x00\x00", CanBus.camera])
can_sends.append(make_tester_present_msg(GLOBAL_ES_ADDR, CanBus.camera, suppress_response=True))

# Create all of the other eyesight messages to keep the rest of the car happy when eyesight is disabled
if self.frame % 5 == 0:
Expand Down
2 changes: 1 addition & 1 deletion selfdrive/car/subaru/subarucan.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ def create_es_static_2(packer):
# *** Subaru Pre-global ***

def subaru_preglobal_checksum(packer, values, addr, checksum_byte=7):
dat = packer.make_can_msg(addr, 0, values)[2]
dat = packer.make_can_msg(addr, 0, values)[1]
return (sum(dat[:checksum_byte]) + sum(dat[checksum_byte+1:])) % 256


Expand Down
6 changes: 3 additions & 3 deletions selfdrive/car/tesla/teslacan.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def create_steering_control(self, angle, enabled, counter):
"DAS_steeringControlCounter": counter,
}

data = self.packer.make_can_msg("DAS_steeringControl", CANBUS.chassis, values)[2]
data = self.packer.make_can_msg("DAS_steeringControl", CANBUS.chassis, values)[1]
values["DAS_steeringControlChecksum"] = self.checksum(0x488, data[:3])
return self.packer.make_can_msg("DAS_steeringControl", CANBUS.chassis, values)

Expand Down Expand Up @@ -69,7 +69,7 @@ def create_action_request(self, msg_stw_actn_req, cancel, bus, counter):
values["SpdCtrlLvr_Stat"] = 1
values["MC_STW_ACTN_RQ"] = counter

data = self.packer.make_can_msg("STW_ACTN_RQ", bus, values)[2]
data = self.packer.make_can_msg("STW_ACTN_RQ", bus, values)[1]
values["CRC_STW_ACTN_RQ"] = self.crc(data[:7])
return self.packer.make_can_msg("STW_ACTN_RQ", bus, values)

Expand All @@ -88,7 +88,7 @@ def create_longitudinal_commands(self, acc_state, speed, min_accel, max_accel, c
}

for packer, bus in [(self.packer, CANBUS.chassis), (self.pt_packer, CANBUS.powertrain)]:
data = packer.make_can_msg("DAS_control", bus, values)[2]
data = packer.make_can_msg("DAS_control", bus, values)[1]
values["DAS_controlChecksum"] = self.checksum(0x2b9, data[:7])
messages.append(packer.make_can_msg("DAS_control", bus, values))
return messages
2 changes: 1 addition & 1 deletion selfdrive/car/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ def test_car_controller(car_control):

now_nanos += DT_CTRL * 1e9
msgs_sent += len(sendcan)
for addr, _, dat, bus in sendcan:
for addr, dat, bus in sendcan:
to_send = libpanda_py.make_CANPacket(addr, bus % 4, dat)
self.assertTrue(self.safety.safety_tx_hook(to_send), (addr, dat, bus))

Expand Down
4 changes: 2 additions & 2 deletions selfdrive/car/toyota/carcontroller.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from cereal import car
from openpilot.common.numpy_fast import clip
from openpilot.selfdrive.car import apply_meas_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance, make_can_msg
from openpilot.selfdrive.car import apply_meas_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance, make_can_msg, make_tester_present_msg
from openpilot.selfdrive.car.interfaces import CarControllerBase
from openpilot.selfdrive.car.toyota import toyotacan
from openpilot.selfdrive.car.toyota.values import CAR, STATIC_DSU_MSGS, NO_STOP_TIMER_CAR, TSS2_CAR, \
Expand Down Expand Up @@ -166,7 +166,7 @@ def update(self, CC, CS, now_nanos):

# keep radar disabled
if self.frame % 20 == 0 and self.CP.flags & ToyotaFlags.DISABLE_RADAR.value:
can_sends.append([0x750, 0, b"\x0F\x02\x3E\x00\x00\x00\x00\x00", 0])
can_sends.append(make_tester_present_msg(0x750, 0, 0xF))

new_actuators = actuators.as_builder()
new_actuators.steer = apply_steer / self.params.STEER_MAX
Expand Down
4 changes: 2 additions & 2 deletions selfdrive/controls/tests/test_startup.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def test_startup_alert(expected_event, car_model, fw_versions, brand):
managed_processes['card'].start()

assert pm.wait_for_readers_to_update('can', 5)
pm.send('can', can_list_to_can_capnp([[0, 0, b"", 0]]))
pm.send('can', can_list_to_can_capnp([[0, b"", 0]]))

assert pm.wait_for_readers_to_update('pandaStates', 5)
msg = messaging.new_message('pandaStates', 1)
Expand All @@ -103,7 +103,7 @@ def test_startup_alert(expected_event, car_model, fw_versions, brand):
else:
finger = _FINGERPRINTS[car_model][0]

msgs = [[addr, 0, b'\x00'*length, 0] for addr, length in finger.items()]
msgs = [[addr, b'\x00'*length, 0] for addr, length in finger.items()]
for _ in range(1000):
# card waits for pandad to echo back that it has changed the multiplexing mode
if not params.get_bool("ObdMultiplexingChanged"):
Expand Down
2 changes: 1 addition & 1 deletion selfdrive/pandad/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ def can_capnp_to_can_list(can, src_filter=None):
ret = []
for msg in can:
if src_filter is None or msg.src in src_filter:
ret.append((msg.address, msg.busTime, msg.dat, msg.src))
ret.append((msg.address, msg.dat, msg.src))
return ret
1 change: 0 additions & 1 deletion selfdrive/pandad/can_list_to_can_capnp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ void can_list_to_can_capnp_cpp(const std::vector<can_frame> &can_list, std::stri
for (auto it = can_list.begin(); it != can_list.end(); it++, j++) {
auto c = canData[j];
c.setAddress(it->address);
c.setBusTime(it->busTime);
c.setDat(kj::arrayPtr((uint8_t*)it->dat.data(), it->dat.size()));
c.setSrc(it->src);
}
Expand Down
1 change: 0 additions & 1 deletion selfdrive/pandad/panda.cc
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,6 @@ bool Panda::unpack_can_buffer(uint8_t *data, uint32_t &size, std::vector<can_fra
}

can_frame &canData = out_vec.emplace_back();
canData.busTime = 0;
canData.address = header.addr;
canData.src = header.bus + bus_offset;
if (header.rejected) {
Expand Down
1 change: 0 additions & 1 deletion selfdrive/pandad/panda.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ struct __attribute__((packed)) can_header {
struct can_frame {
long address;
std::string dat;
long busTime;
long src;
};

Expand Down
1 change: 0 additions & 1 deletion selfdrive/pandad/pandad.cc
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,6 @@ void can_recv_thread(std::vector<Panda *> pandas) {
auto canData = evt.initCan(raw_can_data.size());
for (uint i = 0; i<raw_can_data.size(); i++) {
canData[i].setAddress(raw_can_data[i].address);
canData[i].setBusTime(raw_can_data[i].busTime);
canData[i].setDat(kj::arrayPtr((uint8_t*)raw_can_data[i].dat.data(), raw_can_data[i].dat.size()));
canData[i].setSrc(raw_can_data[i].src);
}
Expand Down
6 changes: 2 additions & 4 deletions selfdrive/pandad/pandad_api_impl.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ cdef extern from "panda.h":
cdef struct can_frame:
long address
string dat
long busTime
long src

cdef extern from "opendbc/can/common.h":
Expand All @@ -35,9 +34,8 @@ def can_list_to_can_capnp(can_msgs, msgtype='can', valid=True):
for can_msg in can_msgs:
f = &(can_list.emplace_back())
f.address = can_msg[0]
f.busTime = can_msg[1]
f.dat = can_msg[2]
f.src = can_msg[3]
f.dat = can_msg[1]
f.src = can_msg[2]

cdef string out
can_list_to_can_capnp_cpp(can_list, out, msgtype == 'sendcan', valid)
Expand Down
2 changes: 1 addition & 1 deletion system/webrtc/tests/test_stream_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def mocked_update(t):
def test_incoming_proxy(self, mocker):
tested_msgs = [
{"type": "customReservedRawData0", "data": "test"}, # primitive
{"type": "can", "data": [{"address": 0, "busTime": 0, "dat": "", "src": 0}]}, # list
{"type": "can", "data": [{"address": 0, "dat": "", "src": 0}]}, # list
{"type": "testJoystick", "data": {"axes": [0, 0], "buttons": [False]}}, # dict
]

Expand Down
1 change: 0 additions & 1 deletion tools/cabana/streams/pandastream.cc
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ void PandaStream::streamThread() {
auto canData = evt.initCan(raw_can_data.size());
for (uint i = 0; i<raw_can_data.size(); i++) {
canData[i].setAddress(raw_can_data[i].address);
canData[i].setBusTime(raw_can_data[i].busTime);
canData[i].setDat(kj::arrayPtr((uint8_t*)raw_can_data[i].dat.data(), raw_can_data[i].dat.size()));
canData[i].setSrc(raw_can_data[i].src);
}
Expand Down

0 comments on commit 1a3bc0f

Please sign in to comment.