selfdrive/car: reusable CanBus helper (#28489)

old-commit-hash: 28bf743693
beeps
Cameron Clough 2 years ago committed by GitHub
parent 727b79b66f
commit 5afe1c0ed0
  1. 19
      selfdrive/car/__init__.py
  2. 23
      selfdrive/car/hyundai/hyundaicanfd.py
  3. 2
      selfdrive/car/hyundai/interface.py

@ -1,10 +1,13 @@
# functions common among cars # functions common among cars
import capnp import math
from collections import namedtuple from collections import namedtuple
from typing import Dict, Optional
import capnp
from cereal import car from cereal import car
from common.numpy_fast import clip, interp from common.numpy_fast import clip, interp
from typing import Dict
# kg of standard extra cargo to count for drive, gas, etc... # kg of standard extra cargo to count for drive, gas, etc...
STD_CARGO_KG = 136. STD_CARGO_KG = 136.
@ -175,3 +178,15 @@ def get_safety_config(safety_model, safety_param = None):
if safety_param is not None: if safety_param is not None:
ret.safetyParam = safety_param ret.safetyParam = safety_param
return ret return ret
class CanBusBase:
offset: int
def __init__(self, CP, fingerprint: Optional[Dict[int, Dict[int, int]]]) -> None:
if CP is None:
assert fingerprint is not None
num = math.ceil(max([k for k, v in fingerprint.items() if len(v)], default=1) / 4)
else:
num = len(CP.safetyConfigs)
self.offset = 4 * (num - 1)

@ -1,17 +1,15 @@
import math
from common.numpy_fast import clip from common.numpy_fast import clip
from selfdrive.car import CanBusBase
from selfdrive.car.hyundai.values import HyundaiFlags from selfdrive.car.hyundai.values import HyundaiFlags
class CanBus: class CanBus(CanBusBase):
def __init__(self, CP, hda2=None, fingerprint=None): def __init__(self, CP, hda2=None, fingerprint=None) -> None:
if CP is None: super().__init__(CP, fingerprint)
assert None not in (hda2, fingerprint)
num = math.ceil(max([k for k, v in fingerprint.items() if len(v)], default=1) / 4) if hda2 is None:
else: assert CP is not None
hda2 = CP.flags & HyundaiFlags.CANFD_HDA2.value hda2 = CP.flags & HyundaiFlags.CANFD_HDA2.value
num = len(CP.safetyConfigs)
# On the CAN-FD platforms, the LKAS camera is on both A-CAN and E-CAN. HDA2 cars # On the CAN-FD platforms, the LKAS camera is on both A-CAN and E-CAN. HDA2 cars
# have a different harness than the HDA1 and non-HDA variants in order to split # have a different harness than the HDA1 and non-HDA variants in order to split
@ -20,10 +18,9 @@ class CanBus:
if hda2: if hda2:
self._a, self._e = 0, 1 self._a, self._e = 0, 1
offset = 4*(num - 1) self._a += self.offset
self._a += offset self._e += self.offset
self._e += offset self._cam = 2 + self.offset
self._cam = 2 + offset
@property @property
def ECAN(self): def ECAN(self):

@ -311,7 +311,7 @@ class CarInterface(CarInterfaceBase):
# for blinkers # for blinkers
if CP.flags & HyundaiFlags.ENABLE_BLINKERS: if CP.flags & HyundaiFlags.ENABLE_BLINKERS:
disable_ecu(logcan, sendcan, bus=CanBus(CP.ECAN), addr=0x7B1, com_cont_req=b'\x28\x83\x01') disable_ecu(logcan, sendcan, bus=CanBus(CP).ECAN, addr=0x7B1, com_cont_req=b'\x28\x83\x01')
def _update(self, c): def _update(self, c):
ret = self.CS.update(self.cp, self.cp_cam) ret = self.CS.update(self.cp, self.cp_cam)

Loading…
Cancel
Save