From 07bc45c81c12d19f6cb0d48c7ecfc2fe2cef67f8 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 9 Aug 2024 22:36:33 -0700 Subject: [PATCH] remove some more cereal from toyota + convert CarState to capnp --- selfdrive/car/card.py | 30 +++++++++++++++++------------- selfdrive/car/interfaces.py | 8 +++++--- selfdrive/car/toyota/carstate.py | 3 +-- selfdrive/car/toyota/interface.py | 2 +- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 6c209b8063..dbe16dd849 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import capnp import dataclasses import os import time @@ -15,7 +16,7 @@ from openpilot.common.swaglog import cloudlog, ForwardingHandler from openpilot.selfdrive.pandad import can_capnp_to_list, can_list_to_can_capnp from openpilot.selfdrive.car import DT_CTRL, carlog -from openpilot.selfdrive.car.structs import CarParams +from openpilot.selfdrive.car.structs import CarParams, CarState from openpilot.selfdrive.car.can_definitions import CanData, CanRecvCallable, CanSendCallable from openpilot.selfdrive.car.fw_versions import ObdCallback from openpilot.selfdrive.car.car_helpers import get_car @@ -59,19 +60,22 @@ def can_comm_callbacks(logcan: messaging.SubSocket, sendcan: messaging.PubSocket return can_recv, can_send -def convert_to_capnp(CP: CarParams) -> car.CarParams: - # TODO: better name or support CarState, CarControl, etc. - CP_dict = dataclasses.asdict(CP) - del CP_dict['lateralTuning'] - CP_capnp = car.CarParams.new_message(**CP_dict) +def convert_to_capnp(struct: CarParams | CarState) -> capnp.lib.capnp._DynamicStructBuilder: + struct_dict = dataclasses.asdict(struct) - # this is the only union, special handling - which = CP.lateralTuning.which() - CP_capnp.lateralTuning.init(which) - lateralTuning_dict = dataclasses.asdict(getattr(CP.lateralTuning, which)) - setattr(CP_capnp.lateralTuning, which, lateralTuning_dict) + if isinstance(struct, CarParams): + del struct_dict['lateralTuning'] + struct_capnp = car.CarParams.new_message(**struct_dict) - return CP_capnp + # this is the only union, special handling + which = struct.lateralTuning.which() + struct_capnp.lateralTuning.init(which) + lateralTuning_dict = dataclasses.asdict(getattr(struct.lateralTuning, which)) + setattr(struct_capnp.lateralTuning, which, lateralTuning_dict) + else: + struct_capnp = car.CarState.new_message(**struct_dict) + + return struct_capnp class Car: @@ -161,7 +165,7 @@ class Car: # Update carState from CAN can_strs = messaging.drain_sock_raw(self.can_sock, wait_for_one=True) - CS = self.CI.update(self.CC_prev, can_capnp_to_list(can_strs)) + CS = convert_to_capnp(self.CI.update(self.CC_prev, can_capnp_to_list(can_strs))) self.sm.update(0) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index fb10edd979..2827d44958 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -1,3 +1,4 @@ +import copy import json import os import numpy as np @@ -124,7 +125,8 @@ class CarInterfaceBase(ABC): return cls.get_params(candidate, gen_empty_fingerprint(), list(), False, False) @classmethod - def get_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], experimental_long: bool, docs: bool) -> structs.CarParams: + def get_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], + experimental_long: bool, docs: bool) -> structs.CarParams: ret = CarInterfaceBase.get_std_params(candidate) platform = PLATFORMS[candidate] @@ -257,7 +259,7 @@ class CarInterfaceBase(ABC): # copy back for next iteration if self.CS is not None: - self.CS.out = ret.as_reader() + self.CS.out = copy.deepcopy(ret) return ret @@ -362,7 +364,7 @@ class CarStateBase(ABC): def __init__(self, CP: structs.CarParams): self.CP = CP self.car_fingerprint = CP.carFingerprint - self.out = car.CarState.new_message() + self.out = structs.CarState() self.cruise_buttons = 0 self.left_blinker_cnt = 0 diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 80123bfebd..b6f16e96be 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -1,6 +1,5 @@ import copy -from cereal import car from opendbc.can.can_define import CANDefine from opendbc.can.parser import CANParser from openpilot.selfdrive.car import DT_CTRL @@ -51,7 +50,7 @@ class CarState(CarStateBase): self.lkas_hud = {} def update(self, cp, cp_cam) -> structs.CarState: - ret = car.CarState.new_message() + ret = structs.CarState() ret.doorOpen = any([cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_FL"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_FR"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_RL"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_RR"]]) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 71ee3e8d6d..c7c6fe0da1 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -8,7 +8,7 @@ from openpilot.selfdrive.car import structs from openpilot.selfdrive.car.disable_ecu import disable_ecu from openpilot.selfdrive.car.interfaces import CarInterfaceBase -ButtonType = car.CarState.ButtonEvent.Type +ButtonType = structs.CarState.ButtonEvent.Type EventName = car.CarEvent.EventName SteerControlType = structs.CarParams.SteerControlType