From 6a7a99805839a7e2012b55c2282d545ee21bdff4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 10 Mar 2024 16:44:21 -0700 Subject: [PATCH 001/384] disable that one for now --- release/build_release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/build_release.sh b/release/build_release.sh index fc15cf6cdf..08f8a5a185 100755 --- a/release/build_release.sh +++ b/release/build_release.sh @@ -94,7 +94,7 @@ cp -pR -n --parents $TEST_FILES $BUILD_DIR/ cd $BUILD_DIR RELEASE=1 selfdrive/test/test_onroad.py #selfdrive/manager/test/test_manager.py -selfdrive/car/tests/test_car_interfaces.py +#selfdrive/car/tests/test_car_interfaces.py rm -rf $TEST_FILES if [ ! -z "$RELEASE_BRANCH" ]; then From e3589e4b5cc783001c95b52cce066647b4ae0c6c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 10 Mar 2024 16:56:50 -0700 Subject: [PATCH 002/384] refactor camera transformations (#31818) * refactor camera transormations * update users * more stuff * more fix * swap * tici * lil shorter --- common/transformations/camera.py | 100 +++++++++---------- common/transformations/model.py | 21 +--- selfdrive/modeld/modeld.py | 6 +- selfdrive/modeld/tests/test_modeld.py | 11 +- selfdrive/monitoring/driver_monitor.py | 6 +- selfdrive/test/process_replay/migration.py | 16 +++ selfdrive/test/process_replay/regen.py | 4 +- selfdrive/test/process_replay/vision_meta.py | 10 +- selfdrive/ui/tests/test_ui/run.py | 11 +- system/loggerd/tests/test_loggerd.py | 9 +- tools/replay/lib/ui_helpers.py | 43 +------- tools/replay/ui.py | 26 +++-- 12 files changed, 121 insertions(+), 142 deletions(-) diff --git a/common/transformations/camera.py b/common/transformations/camera.py index c643cb5702..7a8495a9b2 100644 --- a/common/transformations/camera.py +++ b/common/transformations/camera.py @@ -1,55 +1,55 @@ +import itertools import numpy as np +from dataclasses import dataclass import openpilot.common.transformations.orientation as orient ## -- hardcoded hardware params -- -eon_f_focal_length = 910.0 -eon_d_focal_length = 650.0 -tici_f_focal_length = 2648.0 -tici_e_focal_length = tici_d_focal_length = 567.0 # probably wrong? magnification is not consistent across frame - -eon_f_frame_size = (1164, 874) -eon_d_frame_size = (816, 612) -tici_f_frame_size = tici_e_frame_size = tici_d_frame_size = (1928, 1208) - -# aka 'K' aka camera_frame_from_view_frame -eon_fcam_intrinsics = np.array([ - [eon_f_focal_length, 0.0, float(eon_f_frame_size[0])/2], - [0.0, eon_f_focal_length, float(eon_f_frame_size[1])/2], - [0.0, 0.0, 1.0]]) -eon_intrinsics = eon_fcam_intrinsics # xx - -eon_dcam_intrinsics = np.array([ - [eon_d_focal_length, 0.0, float(eon_d_frame_size[0])/2], - [0.0, eon_d_focal_length, float(eon_d_frame_size[1])/2], - [0.0, 0.0, 1.0]]) - -tici_fcam_intrinsics = np.array([ - [tici_f_focal_length, 0.0, float(tici_f_frame_size[0])/2], - [0.0, tici_f_focal_length, float(tici_f_frame_size[1])/2], - [0.0, 0.0, 1.0]]) - -tici_dcam_intrinsics = np.array([ - [tici_d_focal_length, 0.0, float(tici_d_frame_size[0])/2], - [0.0, tici_d_focal_length, float(tici_d_frame_size[1])/2], - [0.0, 0.0, 1.0]]) - -tici_ecam_intrinsics = tici_dcam_intrinsics - -# aka 'K_inv' aka view_frame_from_camera_frame -eon_fcam_intrinsics_inv = np.linalg.inv(eon_fcam_intrinsics) -eon_intrinsics_inv = eon_fcam_intrinsics_inv # xx - -tici_fcam_intrinsics_inv = np.linalg.inv(tici_fcam_intrinsics) -tici_ecam_intrinsics_inv = np.linalg.inv(tici_ecam_intrinsics) - - -FULL_FRAME_SIZE = tici_f_frame_size -FOCAL = tici_f_focal_length -fcam_intrinsics = tici_fcam_intrinsics - -W, H = FULL_FRAME_SIZE[0], FULL_FRAME_SIZE[1] - +@dataclass(frozen=True) +class CameraConfig: + width: int + height: int + focal_length: float + + @property + def intrinsics(self): + # aka 'K' aka camera_frame_from_view_frame + return np.array([ + [self.focal_length, 0.0, float(self.width)/2], + [0.0, self.focal_length, float(self.height)/2], + [0.0, 0.0, 1.0] + ]) + + @property + def intrinsics_inv(self): + # aka 'K_inv' aka view_frame_from_camera_frame + return np.linalg.inv(self.intrinsics) + +@dataclass(frozen=True) +class DeviceCameraConfig: + fcam: CameraConfig + dcam: CameraConfig + ecam: CameraConfig + +ar_ox_fisheye = CameraConfig(1928, 1208, 567.0) # focal length probably wrong? magnification is not consistent across frame +ar_ox_config = DeviceCameraConfig(CameraConfig(1928, 1208, 2648.0), ar_ox_fisheye, ar_ox_fisheye) +os_fisheye = CameraConfig(2688, 1520, 567.0 / 2 * 3) +os_config = DeviceCameraConfig(CameraConfig(2688, 1520, 2648.0 * 2 / 3), os_fisheye, os_fisheye) + +DEVICE_CAMERAS = { + # A "device camera" is defined by a device type and sensor + + # sensor type was never set on eon/neo/two + ("neo", "unknown"): DeviceCameraConfig(CameraConfig(1164, 874, 910.0), CameraConfig(816, 612, 650.0), CameraConfig(0, 0, 0.)), + # unknown here is AR0231, field was added with OX03C10 support + ("tici", "unknown"): ar_ox_config, + + # before deviceState.deviceType was set, assume tici AR config + ("unknown", "ar0231"): ar_ox_config, + ("unknown", "ox03c10"): ar_ox_config, +} +prods = itertools.product(('tici', 'tizi', 'mici'), (('ar0231', ar_ox_config), ('ox03c10', ar_ox_config), ('os04c10', os_config))) +DEVICE_CAMERAS.update({(d, c[0]): c[1] for d, c in prods}) # device/mesh : x->forward, y-> right, z->down # view : x->right, y->down, z->forward @@ -93,7 +93,7 @@ def roll_from_ke(m): -(m[0, 0] - m[0, 1] * m[2, 0] / m[2, 1])) -def normalize(img_pts, intrinsics=fcam_intrinsics): +def normalize(img_pts, intrinsics): # normalizes image coordinates # accepts single pt or array of pts intrinsics_inv = np.linalg.inv(intrinsics) @@ -106,7 +106,7 @@ def normalize(img_pts, intrinsics=fcam_intrinsics): return img_pts_normalized[:, :2].reshape(input_shape) -def denormalize(img_pts, intrinsics=fcam_intrinsics, width=np.inf, height=np.inf): +def denormalize(img_pts, intrinsics, width=np.inf, height=np.inf): # denormalizes image coordinates # accepts single pt or array of pts img_pts = np.array(img_pts) @@ -123,7 +123,7 @@ def denormalize(img_pts, intrinsics=fcam_intrinsics, width=np.inf, height=np.inf return img_pts_denormalized[:, :2].reshape(input_shape) -def get_calib_from_vp(vp, intrinsics=fcam_intrinsics): +def get_calib_from_vp(vp, intrinsics): vp_norm = normalize(vp, intrinsics) yaw_calib = np.arctan(vp_norm[0]) pitch_calib = -np.arctan(vp_norm[1]*np.cos(yaw_calib)) diff --git a/common/transformations/model.py b/common/transformations/model.py index 7e40767f63..aaa12d776a 100644 --- a/common/transformations/model.py +++ b/common/transformations/model.py @@ -1,19 +1,11 @@ import numpy as np from openpilot.common.transformations.orientation import rot_from_euler -from openpilot.common.transformations.camera import ( - FULL_FRAME_SIZE, get_view_frame_from_calib_frame, view_frame_from_device_frame, - eon_fcam_intrinsics, tici_ecam_intrinsics, tici_fcam_intrinsics) +from openpilot.common.transformations.camera import get_view_frame_from_calib_frame, view_frame_from_device_frame # segnet SEGNET_SIZE = (512, 384) -def get_segnet_frame_from_camera_frame(segnet_size=SEGNET_SIZE, full_frame_size=FULL_FRAME_SIZE): - return np.array([[float(segnet_size[0]) / full_frame_size[0], 0.0], - [0.0, float(segnet_size[1]) / full_frame_size[1]]]) -segnet_frame_from_camera_frame = get_segnet_frame_from_camera_frame() # xx - - # MED model MEDMODEL_INPUT_SIZE = (512, 256) MEDMODEL_YUV_SIZE = (MEDMODEL_INPUT_SIZE[0], MEDMODEL_INPUT_SIZE[1] * 3 // 2) @@ -63,16 +55,9 @@ calib_from_medmodel = np.linalg.inv(medmodel_frame_from_calib_frame[:, :3]) calib_from_sbigmodel = np.linalg.inv(sbigmodel_frame_from_calib_frame[:, :3]) # This function is verified to give similar results to xx.uncommon.utils.transform_img -def get_warp_matrix(device_from_calib_euler: np.ndarray, wide_camera: bool = False, bigmodel_frame: bool = False, tici: bool = True) -> np.ndarray: - if tici and wide_camera: - cam_intrinsics = tici_ecam_intrinsics - elif tici: - cam_intrinsics = tici_fcam_intrinsics - else: - cam_intrinsics = eon_fcam_intrinsics - +def get_warp_matrix(device_from_calib_euler: np.ndarray, intrinsics: np.ndarray, bigmodel_frame: bool = False) -> np.ndarray: calib_from_model = calib_from_sbigmodel if bigmodel_frame else calib_from_medmodel device_from_calib = rot_from_euler(device_from_calib_euler) - camera_from_calib = cam_intrinsics @ view_frame_from_device_frame @ device_from_calib + camera_from_calib = intrinsics @ view_frame_from_device_frame @ device_from_calib warp_matrix: np.ndarray = camera_from_calib @ calib_from_model return warp_matrix diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index fe523dbd35..c3b3918903 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -13,6 +13,7 @@ from openpilot.common.swaglog import cloudlog from openpilot.common.params import Params from openpilot.common.filter_simple import FirstOrderFilter from openpilot.common.realtime import config_realtime_process +from openpilot.common.transformations.camera import DEVICE_CAMERAS from openpilot.common.transformations.model import get_warp_matrix from openpilot.selfdrive import sentry from openpilot.selfdrive.car.car_helpers import get_demo_car_params @@ -227,8 +228,9 @@ def main(demo=False): lateral_control_params = np.array([sm["carState"].vEgo, steer_delay], dtype=np.float32) if sm.updated["liveCalibration"] and sm.seen['roadCameraState'] and sm.seen['deviceState']: device_from_calib_euler = np.array(sm["liveCalibration"].rpyCalib, dtype=np.float32) - model_transform_main = get_warp_matrix(device_from_calib_euler, main_wide_camera, False).astype(np.float32) - model_transform_extra = get_warp_matrix(device_from_calib_euler, True, True).astype(np.float32) + dc = DEVICE_CAMERAS[(str(sm['deviceState'].deviceType), str(sm['roadCameraState'].sensor))] + model_transform_main = get_warp_matrix(device_from_calib_euler, dc.ecam.intrinsics if main_wide_camera else dc.fcam.intrinsics, False).astype(np.float32) + model_transform_extra = get_warp_matrix(device_from_calib_euler, dc.ecam.intrinsics, True).astype(np.float32) live_calib_seen = True traffic_convention = np.zeros(2) diff --git a/selfdrive/modeld/tests/test_modeld.py b/selfdrive/modeld/tests/test_modeld.py index 257a9bc878..67c6f71038 100755 --- a/selfdrive/modeld/tests/test_modeld.py +++ b/selfdrive/modeld/tests/test_modeld.py @@ -5,13 +5,14 @@ import random import cereal.messaging as messaging from cereal.visionipc import VisionIpcServer, VisionStreamType -from openpilot.common.transformations.camera import tici_f_frame_size +from openpilot.common.transformations.camera import DEVICE_CAMERAS from openpilot.common.realtime import DT_MDL from openpilot.selfdrive.car.car_helpers import write_car_param from openpilot.selfdrive.manager.process_config import managed_processes from openpilot.selfdrive.test.process_replay.vision_meta import meta_from_camera_state -IMG = np.zeros(int(tici_f_frame_size[0]*tici_f_frame_size[1]*(3/2)), dtype=np.uint8) +CAM = DEVICE_CAMERAS[("tici", "ar0231")].fcam +IMG = np.zeros(int(CAM.width*CAM.height*(3/2)), dtype=np.uint8) IMG_BYTES = IMG.flatten().tobytes() @@ -19,9 +20,9 @@ class TestModeld(unittest.TestCase): def setUp(self): self.vipc_server = VisionIpcServer("camerad") - self.vipc_server.create_buffers(VisionStreamType.VISION_STREAM_ROAD, 40, False, *tici_f_frame_size) - self.vipc_server.create_buffers(VisionStreamType.VISION_STREAM_DRIVER, 40, False, *tici_f_frame_size) - self.vipc_server.create_buffers(VisionStreamType.VISION_STREAM_WIDE_ROAD, 40, False, *tici_f_frame_size) + self.vipc_server.create_buffers(VisionStreamType.VISION_STREAM_ROAD, 40, False, CAM.width, CAM.height) + self.vipc_server.create_buffers(VisionStreamType.VISION_STREAM_DRIVER, 40, False, CAM.width, CAM.height) + self.vipc_server.create_buffers(VisionStreamType.VISION_STREAM_WIDE_ROAD, 40, False, CAM.width, CAM.height) self.vipc_server.start_listener() write_car_param() diff --git a/selfdrive/monitoring/driver_monitor.py b/selfdrive/monitoring/driver_monitor.py index 2279002f35..7c1c297fff 100644 --- a/selfdrive/monitoring/driver_monitor.py +++ b/selfdrive/monitoring/driver_monitor.py @@ -5,7 +5,7 @@ from openpilot.common.numpy_fast import interp from openpilot.common.realtime import DT_DMON from openpilot.common.filter_simple import FirstOrderFilter from openpilot.common.stat_live import RunningStatFilter -from openpilot.common.transformations.camera import tici_d_frame_size +from openpilot.common.transformations.camera import DEVICE_CAMERAS EventName = car.CarEvent.EventName @@ -71,9 +71,11 @@ class DRIVER_MONITOR_SETTINGS(): self._MAX_TERMINAL_DURATION = int(30 / self._DT_DMON) # not allowed to engage after 30s of terminal alerts +# TODO: get these live # model output refers to center of undistorted+leveled image EFL = 598.0 # focal length in K -W, H = tici_d_frame_size # corrected image has same size as raw +cam = DEVICE_CAMERAS[("tici", "ar0231")] # corrected image has same size as raw +W, H = (cam.dcam.width, cam.dcam.height) # corrected image has same size as raw class DistractedType: NOT_DISTRACTED = 0 diff --git a/selfdrive/test/process_replay/migration.py b/selfdrive/test/process_replay/migration.py index d480309169..afcf705ff9 100644 --- a/selfdrive/test/process_replay/migration.py +++ b/selfdrive/test/process_replay/migration.py @@ -12,6 +12,7 @@ def migrate_all(lr, old_logtime=False, manager_states=False, panda_states=False, msgs = migrate_sensorEvents(lr, old_logtime) msgs = migrate_carParams(msgs, old_logtime) msgs = migrate_gpsLocation(msgs) + msgs = migrate_deviceState(msgs) if manager_states: msgs = migrate_managerState(msgs) if panda_states: @@ -52,6 +53,21 @@ def migrate_gpsLocation(lr): return all_msgs +def migrate_deviceState(lr): + all_msgs = [] + dt = None + for msg in lr: + if msg.which() == 'initData': + dt = msg.initData.deviceType + if msg.which() == 'deviceState': + n = msg.as_builder() + n.deviceState.deviceType = dt + all_msgs.append(n.as_reader()) + else: + all_msgs.append(msg) + return all_msgs + + def migrate_pandaStates(lr): all_msgs = [] # TODO: safety param migration should be handled automatically diff --git a/selfdrive/test/process_replay/regen.py b/selfdrive/test/process_replay/regen.py index 8e882207b5..ec3023c5dc 100755 --- a/selfdrive/test/process_replay/regen.py +++ b/selfdrive/test/process_replay/regen.py @@ -10,7 +10,7 @@ from collections.abc import Iterable from openpilot.selfdrive.test.process_replay.process_replay import CONFIGS, FAKEDATA, ProcessConfig, replay_process, get_process_config, \ check_openpilot_enabled, get_custom_params_from_lr -from openpilot.selfdrive.test.process_replay.vision_meta import DRIVER_FRAME_SIZES +from openpilot.selfdrive.test.process_replay.vision_meta import DRIVER_CAMERA_FRAME_SIZES from openpilot.selfdrive.test.update_ci_routes import upload_route from openpilot.tools.lib.route import Route from openpilot.tools.lib.framereader import FrameReader, BaseFrameReader, FrameType @@ -37,7 +37,7 @@ class DummyFrameReader(BaseFrameReader): @staticmethod def zero_dcamera(): - return DummyFrameReader(*DRIVER_FRAME_SIZES["tici"], 1200, 0) + return DummyFrameReader(*DRIVER_CAMERA_FRAME_SIZES[("tici", "ar0231")], 1200, 0) def regen_segment( diff --git a/selfdrive/test/process_replay/vision_meta.py b/selfdrive/test/process_replay/vision_meta.py index b3c3dc0c9c..9bfe214c1e 100644 --- a/selfdrive/test/process_replay/vision_meta.py +++ b/selfdrive/test/process_replay/vision_meta.py @@ -1,17 +1,17 @@ from collections import namedtuple from cereal.visionipc import VisionStreamType from openpilot.common.realtime import DT_MDL, DT_DMON -from openpilot.common.transformations.camera import tici_f_frame_size, tici_d_frame_size, tici_e_frame_size, eon_f_frame_size, eon_d_frame_size +from openpilot.common.transformations.camera import DEVICE_CAMERAS VideoStreamMeta = namedtuple("VideoStreamMeta", ["camera_state", "encode_index", "stream", "dt", "frame_sizes"]) -ROAD_CAMERA_FRAME_SIZES = {"tici": tici_f_frame_size, "tizi": tici_f_frame_size, "neo": eon_f_frame_size} -WIDE_ROAD_CAMERA_FRAME_SIZES = {"tici": tici_e_frame_size, "tizi": tici_e_frame_size} -DRIVER_FRAME_SIZES = {"tici": tici_d_frame_size, "tizi": tici_d_frame_size, "neo": eon_d_frame_size} +ROAD_CAMERA_FRAME_SIZES = {k: (v.dcam.width, v.dcam.height) for k, v in DEVICE_CAMERAS.items()} +WIDE_ROAD_CAMERA_FRAME_SIZES = {k: (v.ecam.width, v.ecam.height) for k, v in DEVICE_CAMERAS.items() if v.ecam is not None} +DRIVER_CAMERA_FRAME_SIZES = {k: (v.dcam.width, v.dcam.height) for k, v in DEVICE_CAMERAS.items()} VIPC_STREAM_METADATA = [ # metadata: (state_msg_type, encode_msg_type, stream_type, dt, frame_sizes) ("roadCameraState", "roadEncodeIdx", VisionStreamType.VISION_STREAM_ROAD, DT_MDL, ROAD_CAMERA_FRAME_SIZES), ("wideRoadCameraState", "wideRoadEncodeIdx", VisionStreamType.VISION_STREAM_WIDE_ROAD, DT_MDL, WIDE_ROAD_CAMERA_FRAME_SIZES), - ("driverCameraState", "driverEncodeIdx", VisionStreamType.VISION_STREAM_DRIVER, DT_DMON, DRIVER_FRAME_SIZES), + ("driverCameraState", "driverEncodeIdx", VisionStreamType.VISION_STREAM_DRIVER, DT_DMON, DRIVER_CAMERA_FRAME_SIZES), ] diff --git a/selfdrive/ui/tests/test_ui/run.py b/selfdrive/ui/tests/test_ui/run.py index 7a2ac9a110..c834107780 100644 --- a/selfdrive/ui/tests/test_ui/run.py +++ b/selfdrive/ui/tests/test_ui/run.py @@ -18,7 +18,7 @@ from cereal.messaging import SubMaster, PubMaster from openpilot.common.mock import mock_messages from openpilot.common.params import Params from openpilot.common.realtime import DT_MDL -from openpilot.common.transformations.camera import tici_f_frame_size +from openpilot.common.transformations.camera import DEVICE_CAMERAS from openpilot.selfdrive.test.helpers import with_processes from openpilot.selfdrive.test.process_replay.vision_meta import meta_from_camera_state from openpilot.tools.webcam.camera import Camera @@ -69,15 +69,16 @@ def setup_onroad(click, pm: PubMaster): pm.send("pandaStates", dat) + d = DEVICE_CAMERAS[("tici", "ar0231")] server = VisionIpcServer("camerad") - server.create_buffers(VisionStreamType.VISION_STREAM_ROAD, 40, False, *tici_f_frame_size) - server.create_buffers(VisionStreamType.VISION_STREAM_DRIVER, 40, False, *tici_f_frame_size) - server.create_buffers(VisionStreamType.VISION_STREAM_WIDE_ROAD, 40, False, *tici_f_frame_size) + server.create_buffers(VisionStreamType.VISION_STREAM_ROAD, 40, False, d.fcam.width, d.fcam.height) + server.create_buffers(VisionStreamType.VISION_STREAM_DRIVER, 40, False, d.dcam.width, d.dcam.height) + server.create_buffers(VisionStreamType.VISION_STREAM_WIDE_ROAD, 40, False, d.fcam.width, d.fcam.height) server.start_listener() time.sleep(0.5) # give time for vipc server to start - IMG = Camera.bgr2nv12(np.random.randint(0, 255, (*tici_f_frame_size,3), dtype=np.uint8)) + IMG = Camera.bgr2nv12(np.random.randint(0, 255, (d.fcam.width, d.fcam.height, 3), dtype=np.uint8)) IMG_BYTES = IMG.flatten().tobytes() cams = ('roadCameraState', 'wideRoadCameraState') diff --git a/system/loggerd/tests/test_loggerd.py b/system/loggerd/tests/test_loggerd.py index c80dc19fce..fdea60a282 100755 --- a/system/loggerd/tests/test_loggerd.py +++ b/system/loggerd/tests/test_loggerd.py @@ -24,7 +24,7 @@ from openpilot.system.version import get_version from openpilot.tools.lib.helpers import RE from openpilot.tools.lib.logreader import LogReader from cereal.visionipc import VisionIpcServer, VisionStreamType -from openpilot.common.transformations.camera import tici_f_frame_size, tici_d_frame_size, tici_e_frame_size +from openpilot.common.transformations.camera import DEVICE_CAMERAS SentinelType = log.Sentinel.SentinelType @@ -142,10 +142,11 @@ class TestLoggerd: os.environ["LOGGERD_TEST"] = "1" Params().put("RecordFront", "1") + d = DEVICE_CAMERAS[("tici", "ar0231")] expected_files = {"rlog", "qlog", "qcamera.ts", "fcamera.hevc", "dcamera.hevc", "ecamera.hevc"} - streams = [(VisionStreamType.VISION_STREAM_ROAD, (*tici_f_frame_size, 2048*2346, 2048, 2048*1216), "roadCameraState"), - (VisionStreamType.VISION_STREAM_DRIVER, (*tici_d_frame_size, 2048*2346, 2048, 2048*1216), "driverCameraState"), - (VisionStreamType.VISION_STREAM_WIDE_ROAD, (*tici_e_frame_size, 2048*2346, 2048, 2048*1216), "wideRoadCameraState")] + streams = [(VisionStreamType.VISION_STREAM_ROAD, (d.fcam.width, d.fcam.height, 2048*2346, 2048, 2048*1216), "roadCameraState"), + (VisionStreamType.VISION_STREAM_DRIVER, (d.dcam.width, d.dcam.height, 2048*2346, 2048, 2048*1216), "driverCameraState"), + (VisionStreamType.VISION_STREAM_WIDE_ROAD, (d.ecam.width, d.ecam.height, 2048*2346, 2048, 2048*1216), "wideRoadCameraState")] pm = messaging.PubMaster(["roadCameraState", "driverCameraState", "wideRoadCameraState"]) vipc_server = VisionIpcServer("camerad") diff --git a/tools/replay/lib/ui_helpers.py b/tools/replay/lib/ui_helpers.py index 23f3563084..11b5182a6b 100644 --- a/tools/replay/lib/ui_helpers.py +++ b/tools/replay/lib/ui_helpers.py @@ -7,9 +7,7 @@ import pygame from matplotlib.backends.backend_agg import FigureCanvasAgg -from openpilot.common.transformations.camera import (eon_f_frame_size, eon_f_focal_length, - tici_f_frame_size, tici_f_focal_length, - get_view_frame_from_calib_frame) +from openpilot.common.transformations.camera import get_view_frame_from_calib_frame from openpilot.selfdrive.controls.radard import RADAR_TO_CAMERA @@ -20,9 +18,6 @@ YELLOW = (255, 255, 0) BLACK = (0, 0, 0) WHITE = (255, 255, 255) -_FULL_FRAME_SIZE = { -} - class UIParams: lidar_x, lidar_y, lidar_zoom = 384, 960, 6 lidar_car_x, lidar_car_y = lidar_x / 2., lidar_y / 1.1 @@ -32,45 +27,13 @@ class UIParams: car_color = 110 UP = UIParams -_BB_TO_FULL_FRAME = {} -_CALIB_BB_TO_FULL = {} -_FULL_FRAME_TO_BB = {} -_INTRINSICS = {} - -eon_f_qcam_frame_size = (480, 360) -tici_f_qcam_frame_size = (528, 330) - -cams = [(eon_f_frame_size, eon_f_focal_length, eon_f_frame_size), - (tici_f_frame_size, tici_f_focal_length, tici_f_frame_size), - (eon_f_qcam_frame_size, eon_f_focal_length, eon_f_frame_size), - (tici_f_qcam_frame_size, tici_f_focal_length, tici_f_frame_size)] -for size, focal, full_size in cams: - sz = size[0] * size[1] - _BB_SCALE = size[0] / 640. - _BB_TO_FULL_FRAME[sz] = np.asarray([ - [_BB_SCALE, 0., 0.], - [0., _BB_SCALE, 0.], - [0., 0., 1.]]) - calib_scale = full_size[0] / 640. - _CALIB_BB_TO_FULL[sz] = np.asarray([ - [calib_scale, 0., 0.], - [0., calib_scale, 0.], - [0., 0., 1.]]) - _FULL_FRAME_TO_BB[sz] = np.linalg.inv(_BB_TO_FULL_FRAME[sz]) - _FULL_FRAME_SIZE[sz] = (size[0], size[1]) - _INTRINSICS[sz] = np.array([ - [focal, 0., full_size[0] / 2.], - [0., focal, full_size[1] / 2.], - [0., 0., 1.]]) - - METER_WIDTH = 20 class Calibration: - def __init__(self, num_px, rpy, intrinsic): + def __init__(self, num_px, rpy, intrinsic, calib_scale): self.intrinsic = intrinsic self.extrinsics_matrix = get_view_frame_from_calib_frame(rpy[0], rpy[1], rpy[2], 0.0)[:,:3] - self.zoom = _CALIB_BB_TO_FULL[num_px][0, 0] + self.zoom = calib_scale def car_space_to_ff(self, x, y, z): car_space_projective = np.column_stack((x, y, z)).T diff --git a/tools/replay/ui.py b/tools/replay/ui.py index be80166e76..126340afc8 100755 --- a/tools/replay/ui.py +++ b/tools/replay/ui.py @@ -10,8 +10,9 @@ import pygame import cereal.messaging as messaging from openpilot.common.numpy_fast import clip from openpilot.common.basedir import BASEDIR -from openpilot.tools.replay.lib.ui_helpers import (_BB_TO_FULL_FRAME, UP, - _INTRINSICS, BLACK, GREEN, +from openpilot.common.transformations.camera import DEVICE_CAMERAS +from openpilot.tools.replay.lib.ui_helpers import (UP, + BLACK, GREEN, YELLOW, Calibration, get_blank_lid_overlay, init_plots, maybe_update_radar_points, plot_lead, @@ -55,7 +56,7 @@ def ui_thread(addr): top_down_surface = pygame.surface.Surface((UP.lidar_x, UP.lidar_y), 0, 8) sm = messaging.SubMaster(['carState', 'longitudinalPlan', 'carControl', 'radarState', 'liveCalibration', 'controlsState', - 'liveTracks', 'modelV2', 'liveParameters'], addr=addr) + 'liveTracks', 'modelV2', 'liveParameters', 'roadCameraState'], addr=addr) img = np.zeros((480, 640, 3), dtype='uint8') imgff = None @@ -112,20 +113,27 @@ def ui_thread(addr): vipc_client.connect(True) yuv_img_raw = vipc_client.recv() - if yuv_img_raw is None or not yuv_img_raw.data.any(): continue + sm.update(0) + + camera = DEVICE_CAMERAS[("three", str(sm['roadCameraState'].sensor))] + imgff = np.frombuffer(yuv_img_raw.data, dtype=np.uint8).reshape((len(yuv_img_raw.data) // vipc_client.stride, vipc_client.stride)) num_px = vipc_client.width * vipc_client.height rgb = cv2.cvtColor(imgff[:vipc_client.height * 3 // 2, :vipc_client.width], cv2.COLOR_YUV2RGB_NV12) - zoom_matrix = _BB_TO_FULL_FRAME[num_px] + qcam = "QCAM" in os.environ + bb_scale = (528 if qcam else camera.fcam.width) / 640. + calib_scale = camera.fcam.width / 640. + zoom_matrix = np.asarray([ + [bb_scale, 0., 0.], + [0., bb_scale, 0.], + [0., 0., 1.]]) cv2.warpAffine(rgb, zoom_matrix[:2], (img.shape[1], img.shape[0]), dst=img, flags=cv2.WARP_INVERSE_MAP) - intrinsic_matrix = _INTRINSICS[num_px] - - sm.update(0) + intrinsic_matrix = camera.fcam.intrinsics w = sm['controlsState'].lateralControlState.which() if w == 'lqrStateDEPRECATED': @@ -165,7 +173,7 @@ def ui_thread(addr): if sm.updated['liveCalibration'] and num_px: rpyCalib = np.asarray(sm['liveCalibration'].rpyCalib) - calibration = Calibration(num_px, rpyCalib, intrinsic_matrix) + calibration = Calibration(num_px, rpyCalib, intrinsic_matrix, calib_scale) # *** blits *** pygame.surfarray.blit_array(camera_surface, img.swapaxes(0, 1)) From 8a038845003d1a68896c71ea2c2c35455b27b6a0 Mon Sep 17 00:00:00 2001 From: Michel Le Bihan Date: Mon, 11 Mar 2024 18:27:32 +0100 Subject: [PATCH 003/384] simulator: Correctly handle arrival at destination (#31807) --- tools/sim/bridge/metadrive/metadrive_bridge.py | 1 + tools/sim/bridge/metadrive/metadrive_process.py | 8 +++++--- tools/sim/scenarios/metadrive/stay_in_lane.py | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/sim/bridge/metadrive/metadrive_bridge.py b/tools/sim/bridge/metadrive/metadrive_bridge.py index c2ea92798a..5c91238c55 100644 --- a/tools/sim/bridge/metadrive/metadrive_bridge.py +++ b/tools/sim/bridge/metadrive/metadrive_bridge.py @@ -75,6 +75,7 @@ class MetaDriveBridge(SimulatorBridge): on_continuous_line_done=False, crash_vehicle_done=False, crash_object_done=False, + arrive_dest_done=False, traffic_density=0.0, # traffic is incredibly expensive map_config=create_map(), decision_repeat=1, diff --git a/tools/sim/bridge/metadrive/metadrive_process.py b/tools/sim/bridge/metadrive/metadrive_process.py index 0e659c7a2d..79eefcd545 100644 --- a/tools/sim/bridge/metadrive/metadrive_process.py +++ b/tools/sim/bridge/metadrive/metadrive_process.py @@ -22,7 +22,7 @@ C3_HPR = Vec3(0, 0,0) metadrive_simulation_state = namedtuple("metadrive_simulation_state", ["running", "done", "done_info"]) metadrive_vehicle_state = namedtuple("metadrive_vehicle_state", ["velocity", "position", "bearing", "steering_angle"]) -def apply_metadrive_patches(): +def apply_metadrive_patches(arrive_dest_done=True): # By default, metadrive won't try to use cuda images unless it's used as a sensor for vehicles, so patch that in def add_image_sensor_patched(self, name: str, cls, args): if self.global_config["image_on_cuda"]:# and name == self.global_config["vehicle_config"]["image_source"]: @@ -44,12 +44,14 @@ def apply_metadrive_patches(): def arrive_destination_patch(self, *args, **kwargs): return False - MetaDriveEnv._is_arrive_destination = arrive_destination_patch + if not arrive_dest_done: + MetaDriveEnv._is_arrive_destination = arrive_destination_patch def metadrive_process(dual_camera: bool, config: dict, camera_array, wide_camera_array, image_lock, controls_recv: Connection, simulation_state_send: Connection, vehicle_state_send: Connection, exit_event): - apply_metadrive_patches() + arrive_dest_done = config.pop("arrive_dest_done", True) + apply_metadrive_patches(arrive_dest_done) road_image = np.frombuffer(camera_array.get_obj(), dtype=np.uint8).reshape((H, W, 3)) if dual_camera: diff --git a/tools/sim/scenarios/metadrive/stay_in_lane.py b/tools/sim/scenarios/metadrive/stay_in_lane.py index 17d3d28a2d..683ce55162 100755 --- a/tools/sim/scenarios/metadrive/stay_in_lane.py +++ b/tools/sim/scenarios/metadrive/stay_in_lane.py @@ -65,6 +65,7 @@ class MetaDriveBridge(SimulatorBridge): on_continuous_line_done=True, crash_vehicle_done=True, crash_object_done=True, + arrive_dest_done=True, traffic_density=0.0, map_config=create_map(), map_region_size=2048, From 7779f6875fd14dcd26edea4c9f521feb6414ac7e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 11 Mar 2024 13:40:42 -0400 Subject: [PATCH 004/384] test_updated: ensure symlinks are copied properly (#31825) test symlink --- selfdrive/updated/tests/test_base.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/selfdrive/updated/tests/test_base.py b/selfdrive/updated/tests/test_base.py index 9065899eb8..3060db1bdd 100644 --- a/selfdrive/updated/tests/test_base.py +++ b/selfdrive/updated/tests/test_base.py @@ -32,6 +32,10 @@ def update_release(directory, name, version, agnos_version, release_notes): with open(directory / "launch_env.sh", "w") as f: f.write(f'export AGNOS_VERSION="{agnos_version}"') + test_symlink = directory / "test_symlink" + if not os.path.exists(str(test_symlink)): + os.symlink("common/version.h", test_symlink) + @pytest.mark.slow # TODO: can we test overlayfs in GHA? class BaseUpdateTest(unittest.TestCase): @@ -111,6 +115,9 @@ class BaseUpdateTest(unittest.TestCase): self.assertEqual(get_version(str(self.staging_root / "finalized")), version) self.assertEqual(get_consistent_flag(), True) + with open(self.staging_root / "finalized" / "test_symlink") as f: + self.assertIn(version, f.read()) + def wait_for_condition(self, condition, timeout=12): start = time.monotonic() while True: From 72cab4342f447b96ab006b40fd7b4d41b48050e2 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 11 Mar 2024 10:56:38 -0700 Subject: [PATCH 005/384] [bot] Update Python packages and pre-commit hooks (#31824) Update Python packages and pre-commit hooks Co-authored-by: jnewb1 --- .pre-commit-config.yaml | 2 +- poetry.lock | 445 ++++++++++++++++++++-------------------- 2 files changed, 224 insertions(+), 223 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6db68e55bc..55e6b1e282 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: - -L bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints - --builtins clear,rare,informal,usage,code,names,en-GB_to_en-US - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.2 + rev: v0.3.2 hooks: - id: ruff exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' diff --git a/poetry.lock b/poetry.lock index 588186d138..e8ea5e80fe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -255,13 +255,13 @@ files = [ [[package]] name = "azure-core" -version = "1.30.0" +version = "1.30.1" description = "Microsoft Azure Core Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-core-1.30.0.tar.gz", hash = "sha256:6f3a7883ef184722f6bd997262eddaf80cfe7e5b3e0caaaf8db1695695893d35"}, - {file = "azure_core-1.30.0-py3-none-any.whl", hash = "sha256:3dae7962aad109610e68c9a7abb31d79720e1d982ddf61363038d175a5025e89"}, + {file = "azure-core-1.30.1.tar.gz", hash = "sha256:26273a254131f84269e8ea4464f3560c731f29c0c1f69ac99010845f239c1a8f"}, + {file = "azure_core-1.30.1-py3-none-any.whl", hash = "sha256:7c5ee397e48f281ec4dd773d67a0a47a0962ed6fa833036057f9ea067f688e74"}, ] [package.dependencies] @@ -291,13 +291,13 @@ msal-extensions = ">=0.3.0,<2.0.0" [[package]] name = "azure-storage-blob" -version = "12.19.0" +version = "12.19.1" description = "Microsoft Azure Blob Storage Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-storage-blob-12.19.0.tar.gz", hash = "sha256:26c0a4320a34a3c2a1b74528ba6812ebcb632a04cd67b1c7377232c4b01a5897"}, - {file = "azure_storage_blob-12.19.0-py3-none-any.whl", hash = "sha256:7bbc2c9c16678f7a420367fef6b172ba8730a7e66df7f4d7a55d5b3c8216615b"}, + {file = "azure-storage-blob-12.19.1.tar.gz", hash = "sha256:13e16ba42fc54ac2c7e8f976062173a5c82b9ec0594728e134aac372965a11b0"}, + {file = "azure_storage_blob-12.19.1-py3-none-any.whl", hash = "sha256:c5530dc51c21c9564e4eb706cd499befca8819b10dd89716d3fc90d747556243"}, ] [package.dependencies] @@ -894,69 +894,69 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "cython" -version = "3.0.8" +version = "3.0.9" description = "The Cython compiler for writing C extensions in the Python language." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "Cython-3.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a846e0a38e2b24e9a5c5dc74b0e54c6e29420d88d1dafabc99e0fc0f3e338636"}, - {file = "Cython-3.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45523fdc2b78d79b32834cc1cc12dc2ca8967af87e22a3ee1bff20e77c7f5520"}, - {file = "Cython-3.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa0b7f3f841fe087410cab66778e2d3fb20ae2d2078a2be3dffe66c6574be39"}, - {file = "Cython-3.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e87294e33e40c289c77a135f491cd721bd089f193f956f7b8ed5aa2d0b8c558f"}, - {file = "Cython-3.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a1df7a129344b1215c20096d33c00193437df1a8fcca25b71f17c23b1a44f782"}, - {file = "Cython-3.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:13c2a5e57a0358da467d97667297bf820b62a1a87ae47c5f87938b9bb593acbd"}, - {file = "Cython-3.0.8-cp310-cp310-win32.whl", hash = "sha256:96b028f044f5880e3cb18ecdcfc6c8d3ce9d0af28418d5ab464509f26d8adf12"}, - {file = "Cython-3.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:8140597a8b5cc4f119a1190f5a2228a84f5ca6d8d9ec386cfce24663f48b2539"}, - {file = "Cython-3.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aae26f9663e50caf9657148403d9874eea41770ecdd6caf381d177c2b1bb82ba"}, - {file = "Cython-3.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:547eb3cdb2f8c6f48e6865d5a741d9dd051c25b3ce076fbca571727977b28ac3"}, - {file = "Cython-3.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a567d4b9ba70b26db89d75b243529de9e649a2f56384287533cf91512705bee"}, - {file = "Cython-3.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d1426263b0e82fb22bda8ea60dc77a428581cc19e97741011b938445d383f1"}, - {file = "Cython-3.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c26daaeccda072459b48d211415fd1e5507c06bcd976fa0d5b8b9f1063467d7b"}, - {file = "Cython-3.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:289ce7838208211cd166e975865fd73b0649bf118170b6cebaedfbdaf4a37795"}, - {file = "Cython-3.0.8-cp311-cp311-win32.whl", hash = "sha256:c8aa05f5e17f8042a3be052c24f2edc013fb8af874b0bf76907d16c51b4e7871"}, - {file = "Cython-3.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:000dc9e135d0eec6ecb2b40a5b02d0868a2f8d2e027a41b0fe16a908a9e6de02"}, - {file = "Cython-3.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90d3fe31db55685d8cb97d43b0ec39ef614fcf660f83c77ed06aa670cb0e164f"}, - {file = "Cython-3.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e24791ddae2324e88e3c902a765595c738f19ae34ee66bfb1a6dac54b1833419"}, - {file = "Cython-3.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f020fa1c0552052e0660790b8153b79e3fc9a15dbd8f1d0b841fe5d204a6ae6"}, - {file = "Cython-3.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18bfa387d7a7f77d7b2526af69a65dbd0b731b8d941aaff5becff8e21f6d7717"}, - {file = "Cython-3.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fe81b339cffd87c0069c6049b4d33e28bdd1874625ee515785bf42c9fdff3658"}, - {file = "Cython-3.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:80fd94c076e1e1b1ee40a309be03080b75f413e8997cddcf401a118879863388"}, - {file = "Cython-3.0.8-cp312-cp312-win32.whl", hash = "sha256:85077915a93e359a9b920280d214dc0cf8a62773e1f3d7d30fab8ea4daed670c"}, - {file = "Cython-3.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:0cb2dcc565c7851f75d496f724a384a790fab12d1b82461b663e66605bec429a"}, - {file = "Cython-3.0.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:870d2a0a7e3cbd5efa65aecdb38d715ea337a904ea7bb22324036e78fb7068e7"}, - {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e8f2454128974905258d86534f4fd4f91d2f1343605657ecab779d80c9d6d5e"}, - {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1949d6aa7bc792554bee2b67a9fe41008acbfe22f4f8df7b6ec7b799613a4b3"}, - {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9f2c6e1b8f3bcd6cb230bac1843f85114780bb8be8614855b1628b36bb510e0"}, - {file = "Cython-3.0.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:05d7eddc668ae7993643f32c7661f25544e791edb745758672ea5b1a82ecffa6"}, - {file = "Cython-3.0.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bfabe115deef4ada5d23c87bddb11289123336dcc14347011832c07db616dd93"}, - {file = "Cython-3.0.8-cp36-cp36m-win32.whl", hash = "sha256:0c38c9f0bcce2df0c3347285863621be904ac6b64c5792d871130569d893efd7"}, - {file = "Cython-3.0.8-cp36-cp36m-win_amd64.whl", hash = "sha256:6c46939c3983217d140999de7c238c3141f56b1ea349e47ca49cae899969aa2c"}, - {file = "Cython-3.0.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:115f0a50f752da6c99941b103b5cb090da63eb206abbc7c2ad33856ffc73f064"}, - {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c0f29246734561c90f36e70ed0506b61aa3d044e4cc4cba559065a2a741fae"}, - {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ab75242869ff71e5665fe5c96f3378e79e792fa3c11762641b6c5afbbbbe026"}, - {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6717c06e9cfc6c1df18543cd31a21f5d8e378a40f70c851fa2d34f0597037abc"}, - {file = "Cython-3.0.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9d3f74388db378a3c6fd06e79a809ed98df3f56484d317b81ee762dbf3c263e0"}, - {file = "Cython-3.0.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae7ac561fd8253a9ae96311e91d12af5f701383564edc11d6338a7b60b285a6f"}, - {file = "Cython-3.0.8-cp37-cp37m-win32.whl", hash = "sha256:97b2a45845b993304f1799664fa88da676ee19442b15fdcaa31f9da7e1acc434"}, - {file = "Cython-3.0.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9e2be2b340fea46fb849d378f9b80d3c08ff2e81e2bfbcdb656e2e3cd8c6b2dc"}, - {file = "Cython-3.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2cde23c555470db3f149ede78b518e8274853745289c956a0e06ad8d982e4db9"}, - {file = "Cython-3.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7990ca127e1f1beedaf8fc8bf66541d066ef4723ad7d8d47a7cbf842e0f47580"}, - {file = "Cython-3.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b983c8e6803f016146c26854d9150ddad5662960c804ea7f0c752c9266752f0"}, - {file = "Cython-3.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a973268d7ca1a2bdf78575e459a94a78e1a0a9bb62a7db0c50041949a73b02ff"}, - {file = "Cython-3.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:61a237bc9dd23c7faef0fcfce88c11c65d0c9bb73c74ccfa408b3a012073c20e"}, - {file = "Cython-3.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3a3d67f079598af49e90ff9655bf85bd358f093d727eb21ca2708f467c489cae"}, - {file = "Cython-3.0.8-cp38-cp38-win32.whl", hash = "sha256:17a642bb01a693e34c914106566f59844b4461665066613913463a719e0dd15d"}, - {file = "Cython-3.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:2cdfc32252f3b6dc7c94032ab744dcedb45286733443c294d8f909a4854e7f83"}, - {file = "Cython-3.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa97893d99385386925d00074654aeae3a98867f298d1e12ceaf38a9054a9bae"}, - {file = "Cython-3.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05c0bf9d085c031df8f583f0d506aa3be1692023de18c45d0aaf78685bbb944"}, - {file = "Cython-3.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de892422582f5758bd8de187e98ac829330ec1007bc42c661f687792999988a7"}, - {file = "Cython-3.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:314f2355a1f1d06e3c431eaad4708cf10037b5e91e4b231d89c913989d0bdafd"}, - {file = "Cython-3.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:78825a3774211e7d5089730f00cdf7f473042acc9ceb8b9eeebe13ed3a5541de"}, - {file = "Cython-3.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df8093deabc55f37028190cf5e575c26aad23fc673f34b85d5f45076bc37ce39"}, - {file = "Cython-3.0.8-cp39-cp39-win32.whl", hash = "sha256:1aca1b97e0095b3a9a6c33eada3f661a4ed0d499067d121239b193e5ba3bb4f0"}, - {file = "Cython-3.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:16873d78be63bd38ffb759da7ab82814b36f56c769ee02b1d5859560e4c3ac3c"}, - {file = "Cython-3.0.8-py2.py3-none-any.whl", hash = "sha256:171b27051253d3f9108e9759e504ba59ff06e7f7ba944457f94deaf9c21bf0b6"}, - {file = "Cython-3.0.8.tar.gz", hash = "sha256:8333423d8fd5765e7cceea3a9985dd1e0a5dfeb2734629e1a2ed2d6233d39de6"}, + {file = "Cython-3.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:296bd30d4445ac61b66c9d766567f6e81a6e262835d261e903c60c891a6729d3"}, + {file = "Cython-3.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f496b52845cb45568a69d6359a2c335135233003e708ea02155c10ce3548aa89"}, + {file = "Cython-3.0.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:858c3766b9aa3ab8a413392c72bbab1c144a9766b7c7bfdef64e2e414363fa0c"}, + {file = "Cython-3.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0eb1e6ef036028a52525fd9a012a556f6dd4788a0e8755fe864ba0e70cde2ff"}, + {file = "Cython-3.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c8191941073ea5896321de3c8c958fd66e5f304b0cd1f22c59edd0b86c4dd90d"}, + {file = "Cython-3.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e32b016030bc72a8a22a1f21f470a2f57573761a4f00fbfe8347263f4fbdb9f1"}, + {file = "Cython-3.0.9-cp310-cp310-win32.whl", hash = "sha256:d6f3ff1cd6123973fe03e0fb8ee936622f976c0c41138969975824d08886572b"}, + {file = "Cython-3.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:56f3b643dbe14449248bbeb9a63fe3878a24256664bc8c8ef6efd45d102596d8"}, + {file = "Cython-3.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:35e6665a20d6b8a152d72b7fd87dbb2af6bb6b18a235b71add68122d594dbd41"}, + {file = "Cython-3.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92f4960c40ad027bd8c364c50db11104eadc59ffeb9e5b7f605ca2f05946e20"}, + {file = "Cython-3.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38df37d0e732fbd9a2fef898788492e82b770c33d1e4ed12444bbc8a3b3f89c0"}, + {file = "Cython-3.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad7fd88ebaeaf2e76fd729a8919fae80dab3d6ac0005e28494261d52ff347a8f"}, + {file = "Cython-3.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1365d5f76bf4d19df3d19ce932584c9bb76e9fb096185168918ef9b36e06bfa4"}, + {file = "Cython-3.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c232e7f279388ac9625c3e5a5a9f0078a9334959c5d6458052c65bbbba895e1e"}, + {file = "Cython-3.0.9-cp311-cp311-win32.whl", hash = "sha256:357e2fad46a25030b0c0496487e01a9dc0fdd0c09df0897f554d8ba3c1bc4872"}, + {file = "Cython-3.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:1315aee506506e8d69cf6631d8769e6b10131fdcc0eb66df2698f2a3ddaeeff2"}, + {file = "Cython-3.0.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:157973807c2796addbed5fbc4d9c882ab34bbc60dc297ca729504901479d5df7"}, + {file = "Cython-3.0.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00b105b5d050645dd59e6767bc0f18b48a4aa11c85f42ec7dd8181606f4059e3"}, + {file = "Cython-3.0.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac5536d09bef240cae0416d5a703d298b74c7bbc397da803ac9d344e732d4369"}, + {file = "Cython-3.0.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09c44501d476d16aaa4cbc29c87f8c0f54fc20e69b650d59cbfa4863426fc70c"}, + {file = "Cython-3.0.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cc9c3b9f20d8e298618e5ccd32083ca386e785b08f9893fbec4c50b6b85be772"}, + {file = "Cython-3.0.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a30d96938c633e3ec37000ac3796525da71254ef109e66bdfd78f29891af6454"}, + {file = "Cython-3.0.9-cp312-cp312-win32.whl", hash = "sha256:757ca93bdd80702546df4d610d2494ef2e74249cac4d5ba9464589fb464bd8a3"}, + {file = "Cython-3.0.9-cp312-cp312-win_amd64.whl", hash = "sha256:1dc320a9905ab95414013f6de805efbff9e17bb5fb3b90bbac533f017bec8136"}, + {file = "Cython-3.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4ae349960ebe0da0d33724eaa7f1eb866688fe5434cc67ce4dbc06d6a719fbfc"}, + {file = "Cython-3.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63d2537bf688247f76ded6dee28ebd26274f019309aef1eb4f2f9c5c482fde2d"}, + {file = "Cython-3.0.9-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36f5a2dfc724bea1f710b649f02d802d80fc18320c8e6396684ba4a48412445a"}, + {file = "Cython-3.0.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deaf4197d4b0bcd5714a497158ea96a2bd6d0f9636095437448f7e06453cc83d"}, + {file = "Cython-3.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:000af6deb7412eb7ac0c635ff5e637fb8725dd0a7b88cc58dfc2b3de14e701c4"}, + {file = "Cython-3.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:15c7f5c2d35bed9aa5f2a51eaac0df23ae72f2dbacf62fc672dd6bfaa75d2d6f"}, + {file = "Cython-3.0.9-cp36-cp36m-win32.whl", hash = "sha256:f49aa4970cd3bec66ac22e701def16dca2a49c59cceba519898dd7526e0be2c0"}, + {file = "Cython-3.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:4558814fa025b193058d42eeee498a53d6b04b2980d01339fc2444b23fd98e58"}, + {file = "Cython-3.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:539cd1d74fd61f6cfc310fa6bbbad5adc144627f2b7486a07075d4e002fd6aad"}, + {file = "Cython-3.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3232926cd406ee02eabb732206f6e882c3aed9d58f0fea764013d9240405bcf"}, + {file = "Cython-3.0.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33b6ac376538a7fc8c567b85d3c71504308a9318702ec0485dd66c059f3165cb"}, + {file = "Cython-3.0.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2cc92504b5d22ac66031ffb827bd3a967fc75a5f0f76ab48bce62df19be6fdfd"}, + {file = "Cython-3.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:22b8fae756c5c0d8968691bed520876de452f216c28ec896a00739a12dba3bd9"}, + {file = "Cython-3.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9cda0d92a09f3520f29bd91009f1194ba9600777c02c30c6d2d4ac65fb63e40d"}, + {file = "Cython-3.0.9-cp37-cp37m-win32.whl", hash = "sha256:ec612418490941ed16c50c8d3784c7bdc4c4b2a10c361259871790b02ec8c1db"}, + {file = "Cython-3.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:976c8d2bedc91ff6493fc973d38b2dc01020324039e2af0e049704a8e1b22936"}, + {file = "Cython-3.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5055988b007c92256b6e9896441c3055556038c3497fcbf8c921a6c1fce90719"}, + {file = "Cython-3.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9360606d964c2d0492a866464efcf9d0a92715644eede3f6a2aa696de54a137"}, + {file = "Cython-3.0.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c6e809f060bed073dc7cba1648077fe3b68208863d517c8b39f3920eecf9dd"}, + {file = "Cython-3.0.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95ed792c966f969cea7489c32ff90150b415c1f3567db8d5a9d489c7c1602dac"}, + {file = "Cython-3.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8edd59d22950b400b03ca78d27dc694d2836a92ef0cac4f64cb4b2ff902f7e25"}, + {file = "Cython-3.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4cf0ed273bf60e97922fcbbdd380c39693922a597760160b4b4355e6078ca188"}, + {file = "Cython-3.0.9-cp38-cp38-win32.whl", hash = "sha256:5eb9bd4ae12ebb2bc79a193d95aacf090fbd8d7013e11ed5412711650cb34934"}, + {file = "Cython-3.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:44457279da56e0f829bb1fc5a5dc0836e5d498dbcf9b2324f32f7cc9d2ec6569"}, + {file = "Cython-3.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4b419a1adc2af43f4660e2f6eaf1e4fac2dbac59490771eb8ac3d6063f22356"}, + {file = "Cython-3.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f836192140f033b2319a0128936367c295c2b32e23df05b03b672a6015757ea"}, + {file = "Cython-3.0.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fd198c1a7f8e9382904d622cc0efa3c184605881fd5262c64cbb7168c4c1ec5"}, + {file = "Cython-3.0.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a274fe9ca5c53fafbcf5c8f262f8ad6896206a466f0eeb40aaf36a7951e957c0"}, + {file = "Cython-3.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:158c38360bbc5063341b1e78d3737f1251050f89f58a3df0d10fb171c44262be"}, + {file = "Cython-3.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8bf30b045f7deda0014b042c1b41c1d272facc762ab657529e3b05505888e878"}, + {file = "Cython-3.0.9-cp39-cp39-win32.whl", hash = "sha256:9a001fd95c140c94d934078544ff60a3c46aca2dc86e75a76e4121d3cd1f4b33"}, + {file = "Cython-3.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:530c01c4aebba709c0ec9c7ecefe07177d0b9fd7ffee29450a118d92192ccbdf"}, + {file = "Cython-3.0.9-py2.py3-none-any.whl", hash = "sha256:bf96417714353c5454c2e3238fca9338599330cf51625cdc1ca698684465646f"}, + {file = "Cython-3.0.9.tar.gz", hash = "sha256:a2d354f059d1f055d34cfaa62c5b68bc78ac2ceab6407148d47fb508cf3ba4f3"}, ] [[package]] @@ -1061,35 +1061,35 @@ typing = ["typing-extensions (>=4.8)"] [[package]] name = "fiona" -version = "1.9.5" +version = "1.9.6" description = "Fiona reads and writes spatial data files" optional = false python-versions = ">=3.7" files = [ - {file = "fiona-1.9.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:5f40a40529ecfca5294260316cf987a0420c77a2f0cf0849f529d1afbccd093e"}, - {file = "fiona-1.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:374efe749143ecb5cfdd79b585d83917d2bf8ecfbfc6953c819586b336ce9c63"}, - {file = "fiona-1.9.5-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:35dae4b0308eb44617cdc4461ceb91f891d944fdebbcba5479efe524ec5db8de"}, - {file = "fiona-1.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:5b4c6a3df53bee8f85bb46685562b21b43346be1fe96419f18f70fa1ab8c561c"}, - {file = "fiona-1.9.5-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:6ad04c1877b9fd742871b11965606c6a52f40706f56a48d66a87cc3073943828"}, - {file = "fiona-1.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9fb9a24a8046c724787719e20557141b33049466145fc3e665764ac7caf5748c"}, - {file = "fiona-1.9.5-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:d722d7f01a66f4ab6cd08d156df3fdb92f0669cf5f8708ddcb209352f416f241"}, - {file = "fiona-1.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:7ede8ddc798f3d447536080c6db9a5fb73733ad8bdb190cb65eed4e289dd4c50"}, - {file = "fiona-1.9.5-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:8b098054a27c12afac4f819f98cb4d4bf2db9853f70b0c588d7d97d26e128c39"}, - {file = "fiona-1.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d9f29e9bcbb33232ff7fa98b4a3c2234db910c1dc6c4147fc36c0b8b930f2e0"}, - {file = "fiona-1.9.5-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:f1af08da4ecea5036cb81c9131946be4404245d1b434b5b24fd3871a1d4030d9"}, - {file = "fiona-1.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:c521e1135c78dec0d7774303e5a1b4c62e0efb0e602bb8f167550ef95e0a2691"}, - {file = "fiona-1.9.5-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:fce4b1dd98810cabccdaa1828430c7402d283295c2ae31bea4f34188ea9e88d7"}, - {file = "fiona-1.9.5-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3ea04ec2d8c57b5f81a31200fb352cb3242aa106fc3e328963f30ffbdf0ff7c8"}, - {file = "fiona-1.9.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4877cc745d9e82b12b3eafce3719db75759c27bd8a695521202135b36b58c2e7"}, - {file = "fiona-1.9.5-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ac2c250f509ec19fad7959d75b531984776517ef3c1222d1cc5b4f962825880b"}, - {file = "fiona-1.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4df21906235928faad856c288cfea0298e9647f09c9a69a230535cbc8eadfa21"}, - {file = "fiona-1.9.5-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:81d502369493687746cb8d3cd77e5ada4447fb71d513721c9a1826e4fb32b23a"}, - {file = "fiona-1.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:ce3b29230ef70947ead4e701f3f82be81082b7f37fd4899009b1445cc8fc276a"}, - {file = "fiona-1.9.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:8b53ce8de773fcd5e2e102e833c8c58479edd8796a522f3d83ef9e08b62bfeea"}, - {file = "fiona-1.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bd2355e859a1cd24a3e485c6dc5003129f27a2051629def70036535ffa7e16a4"}, - {file = "fiona-1.9.5-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:9a2da52f865db1aff0eaf41cdd4c87a7c079b3996514e8e7a1ca38457309e825"}, - {file = "fiona-1.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:cfef6db5b779d463298b1113b50daa6c5b55f26f834dc9e37752116fa17277c1"}, - {file = "fiona-1.9.5.tar.gz", hash = "sha256:99e2604332caa7692855c2ae6ed91e1fffdf9b59449aa8032dd18e070e59a2f7"}, + {file = "fiona-1.9.6-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:63e528b5ea3d8b1038d788e7c65117835c787ba7fdc94b1b42f09c2cbc0aaff2"}, + {file = "fiona-1.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:918bd27d8625416672e834593970f96dff63215108f81efb876fe5c0bc58a3b4"}, + {file = "fiona-1.9.6-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:e313210b30d09ed8f829bf625599e248dadd78622728030221f6526580ff26c5"}, + {file = "fiona-1.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:89095c2d542325ee45894b8837e8048cdbb2f22274934e1be3b673ca628010d7"}, + {file = "fiona-1.9.6-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:98cea6f435843b2119731c6b0470e5b7386aa16b6aa7edabbf1ed93aefe029c3"}, + {file = "fiona-1.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f4230eccbd896a79d1ebfa551d84bf90f512f7bcbe1ca61e3f82231321f1a532"}, + {file = "fiona-1.9.6-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:48b6218224e96de5e36b5eb259f37160092260e5de0dcd82ca200b1887aa9884"}, + {file = "fiona-1.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:c1dd5fbc29b7303bb87eb683455e8451e1a53bb8faf20ef97fdcd843c9e4a7f6"}, + {file = "fiona-1.9.6-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:42d8a0e5570948d3821c493b6141866d9a4d7a64edad2be4ecbb89f81904baac"}, + {file = "fiona-1.9.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39819fb8f5ec6d9971cb01b912b4431615a3d3f50c83798565d8ce41917930db"}, + {file = "fiona-1.9.6-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:9b53034efdf93ada9295b081e6a8280af7c75496a20df82d4c2ca46d65b85905"}, + {file = "fiona-1.9.6-cp312-cp312-win_amd64.whl", hash = "sha256:1dcd6eca7524535baf2a39d7981b4a46d33ae28c313934a7c3eae62eecf9dfa5"}, + {file = "fiona-1.9.6-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e5404ed08c711489abcb3a50a184816825b8af06eb73ad2a99e18b8e7b47c96a"}, + {file = "fiona-1.9.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:53bedd2989e255df1bf3378ae9c06d6d241ec273c280c544bb44ffffebb97fb0"}, + {file = "fiona-1.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:77653a08564a44e634c44cd74a068d2f55d1d4029edd16d1c8aadcc4d8cc1d2c"}, + {file = "fiona-1.9.6-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:e7617563b36d2be99f048f0d0054b4d765f4aae454398f88f19de9c2c324b7f8"}, + {file = "fiona-1.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:50037c3b7a5f6f434b562b5b1a5b664f1caa7a4383b00af23cdb59bfc6ba852c"}, + {file = "fiona-1.9.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:bf51846ad602757bf27876f458c5c9f14b09421fac612f64273cc4e3fcabc441"}, + {file = "fiona-1.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:11af1afc1255642a7787fe112c29d01f968f1053e4d4700fc6f3bb879c1622e0"}, + {file = "fiona-1.9.6-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:52e8fec650b72fc5253d8f86b63859acc687182281c29bfacd3930496cf982d1"}, + {file = "fiona-1.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9b92aa1badb2773e7cac19bef3064d73e9d80c67c42f0928db2520a04be6f2f"}, + {file = "fiona-1.9.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:0eaffbf3bfae9960484c0c08ea461b0c40e111497f04e9475ebf15ac7a22d9dc"}, + {file = "fiona-1.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:f1b49d51a744874608b689f029766aa1e078dd72e94b44cf8eeef6d7bd2e9051"}, + {file = "fiona-1.9.6.tar.gz", hash = "sha256:791b3494f8b218c06ea56f892bd6ba893dfa23525347761d066fb7738acda3b1"}, ] [package.dependencies] @@ -1098,35 +1098,34 @@ certifi = "*" click = ">=8.0,<9.0" click-plugins = ">=1.0" cligj = ">=0.5" -setuptools = "*" six = "*" [package.extras] -all = ["Fiona[calc,s3,test]"] +all = ["fiona[calc,s3,test]"] calc = ["shapely"] s3 = ["boto3 (>=1.3.1)"] -test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] +test = ["fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] [[package]] name = "flaky" -version = "3.7.0" -description = "Plugin for nose or pytest that automatically reruns flaky tests." +version = "3.8.0" +description = "Plugin for pytest that automatically reruns flaky tests." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5" files = [ - {file = "flaky-3.7.0-py2.py3-none-any.whl", hash = "sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c"}, - {file = "flaky-3.7.0.tar.gz", hash = "sha256:3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d"}, + {file = "flaky-3.8.0-py2.py3-none-any.whl", hash = "sha256:06152dc0582c18e2cc3d241feece008c074b17e1292658cb39ff8464ae19bd89"}, + {file = "flaky-3.8.0.tar.gz", hash = "sha256:3b4b9f5c15829c919c8e05b15582fa1c9c7f20a303581dd5d0bc56a66441389c"}, ] [[package]] name = "flatbuffers" -version = "23.5.26" +version = "24.3.7" description = "The FlatBuffers serialization format for Python" optional = false python-versions = "*" files = [ - {file = "flatbuffers-23.5.26-py2.py3-none-any.whl", hash = "sha256:c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1"}, - {file = "flatbuffers-23.5.26.tar.gz", hash = "sha256:9ea1144cac05ce5d86e2859f431c6cd5e66cd9c78c558317c7955fb8d4c78d89"}, + {file = "flatbuffers-24.3.7-py2.py3-none-any.whl", hash = "sha256:80c4f5dcad0ee76b7e349671a0d657f2fbba927a0244f88dd3f5ed6a3694e1fc"}, + {file = "flatbuffers-24.3.7.tar.gz", hash = "sha256:0895c22b9a6019ff2f4de2e5e2f7cd15914043e6e7033a94c0c6369422690f22"}, ] [[package]] @@ -1469,49 +1468,51 @@ toy-text = ["pygame (==2.1.3)", "pygame (==2.1.3)"] [[package]] name = "h3" -version = "3.7.6" +version = "3.7.7" description = "Hierarchical hexagonal geospatial indexing system" optional = false python-versions = "*" files = [ - {file = "h3-3.7.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:cd4a5103a86a7d98cffa3be77eb82080aa2e9d676bbd1661f3db9ecad7a4ef2b"}, - {file = "h3-3.7.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:231959dceb4cc4ae86fe4fe2c385b176ed81712549e787b889dfa66f583676df"}, - {file = "h3-3.7.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:b9de9da755c90bbc90d6c041396a20c91816cd86a0bafa3b8899681cfdc2c4c6"}, - {file = "h3-3.7.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cda9a427b0de0d4069115ec765118888f180d0db915b5bc0dba52f5ae957b789"}, - {file = "h3-3.7.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bf1e080b9a47774754834e7f10155f3d2e3542bf895488a0519b2ae7d5b15db"}, - {file = "h3-3.7.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d3b93e3f38eb6c8fc5051d1b289b74614fb5f2415d272fea18085dea260d6b0"}, - {file = "h3-3.7.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783b2ca4448360c5a184fd43b84fc5554e3a8fd02738ff31349506189c5b4b49"}, - {file = "h3-3.7.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3bae8b95f21f20f04141a35f15c8caa74f2046eb01ef49e35fc45e6a8edfc8df"}, - {file = "h3-3.7.6-cp310-cp310-win_amd64.whl", hash = "sha256:6ca9dd410e250d37f24a87c4ecb0615bb6d44a3f90eb5dbbf1b5e3d4489b8703"}, - {file = "h3-3.7.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:991ee991f2ae41f629feb1cd32fa677b8512c72696eb0ad94fcf359d61184b2e"}, - {file = "h3-3.7.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcbfff87d223279f8e38bbee3ebf52b1b96ae280e9e7de24674d3c284373d946"}, - {file = "h3-3.7.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eddf10d1d2139b3ea3ad1618c2074e1c47d3d36bddb5359e4955f5fd0b089d93"}, - {file = "h3-3.7.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76abc02f14a8df42fb5d80e6045023fb756c49d3cb08d69a8ceb9362b95d4bec"}, - {file = "h3-3.7.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc8030968586a7810aa192397ad9a4f7d7a963f57c9b3e210fc38de0aa5c2533"}, - {file = "h3-3.7.6-cp311-cp311-win_amd64.whl", hash = "sha256:1bdc790d91138e781973dcaade5231db7fe8a876330939e0903f602acc4fb64c"}, - {file = "h3-3.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:198718ab20a06ebe52f0aaafc02469e4a51964e5ba7990c3cc1d2fc32e7a54d9"}, - {file = "h3-3.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02faa911f2d8425c641a1f7c08f3dc9c10a5a3d81408832afa40748534b999c8"}, - {file = "h3-3.7.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4db92ceaeb9a51cc875c302cdc5e1aa27eed776d95943ee55c941bc2f219a3"}, - {file = "h3-3.7.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4810ddb3d91411a6cbf87a28108fe31712f618ef223c349e1f6675602af2c473"}, - {file = "h3-3.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:211ef3317dcf7863e2d01a97ab6da319b8451d78cd1633dd28faaf69e66bc321"}, - {file = "h3-3.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:99b81620608378fc9910a5c630b0f17eb939156fa13e1adc55229d31f8c3f5ca"}, - {file = "h3-3.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f3175bd3ea3ee528dbf49308e7215a58351ce425e1c3a9838ae22526663311"}, - {file = "h3-3.7.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d7b69015f5bab2525914fad370b96dc386437e19a14cfed3eb13868589263db"}, - {file = "h3-3.7.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d0c2890fa10fa8695c020569c8d55da79e2c552a39533de4ae6991c7acb122e1"}, - {file = "h3-3.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:1cd4f07c49721023c5fef401a4de03c47000705dfd116579dc6b61cad821305d"}, - {file = "h3-3.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f8d1db3dcd8f6ce7f54e061e6c9fbecbb5c3978b9e54e44af05a53787c4f99b3"}, - {file = "h3-3.7.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:495e37b1dee0ec46ccd88b278e571234b0d0d30648f161799d65a8d7f390b3f2"}, - {file = "h3-3.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e2c4808b7691b176c89ebf23c173b3b23dd4ce42f8f494b32c6e31ceee49af"}, - {file = "h3-3.7.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58b1298bf1068704c6d9426749c8ae6021b53d982d5153cc4161c7042ecd810"}, - {file = "h3-3.7.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a2872f695168c4700c73edd6eab9c6181387d7ea177de13b130ae61e613ff7de"}, - {file = "h3-3.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:98c3951c3b67ca3de06ef70aa74a9752640a3eca9b4d68e0d5d8e4fc6fa72337"}, - {file = "h3-3.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0724d4645c1da59e02b3305050c52b93ce1d8971d1d139433d464fcc103249a6"}, - {file = "h3-3.7.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e1f6ec0f2246381ce3a7f72da1ce825a5474eb7c8fb25a2ea1f16c6606ce34a7"}, - {file = "h3-3.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1471ff4d3875b25b521eeec5c2b72abe27b8e6af10ab99b7da5c0de545b0e832"}, - {file = "h3-3.7.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb96f2caae519d0ed17acde625af528476dca121b0336d3eb776429d40284ef6"}, - {file = "h3-3.7.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b1b1bce0dee05175f8d422e50ffa1afacb9a7e78ae0963059aebfbef50e10175"}, - {file = "h3-3.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:36ea935833c37fdfd7ffbfc000d7cd20addcdf67f30b26a6b9bccb9210b03704"}, - {file = "h3-3.7.6.tar.gz", hash = "sha256:9bbd3dbac99532fa521d7d2e288ff55877bea3223b070f659ed7b5f8f1f213eb"}, + {file = "h3-3.7.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:951ecc9da0bcd5091670b13636928747bc98bc76891da0fa725524ec017cd9de"}, + {file = "h3-3.7.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:26b9dd605541223ef927cc913deccb236cee024b16032f4a3e4387e2791479f2"}, + {file = "h3-3.7.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:996ebb32dc26dd607af7493149f94ce316117be6f42971f7b33bbd326ec695d2"}, + {file = "h3-3.7.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa2a4aa888cd9476788b874b4e11e178293f5b86e8461c36596bf183c242d417"}, + {file = "h3-3.7.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0256e42687470c6f0044ca78fe375fe32a654be8b5a8313b4a68f52f513389c6"}, + {file = "h3-3.7.7-cp310-cp310-win_amd64.whl", hash = "sha256:a3e2bc125490f900e0513c30480722f129bab1415f23040b6cd3a3f8d5a39336"}, + {file = "h3-3.7.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d59018a50cd3b6d0ff0b18a54fdfcbaf2f79c13c831842f54fd2780c4b561ea"}, + {file = "h3-3.7.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e74526d941c1656fe162cc63b459b61aa83a15e257e9477b1570f26c544b51a"}, + {file = "h3-3.7.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7398dbab685fcf3fe92f7c4c5901ab258bc66f7fa05fd1da8693375a10a549"}, + {file = "h3-3.7.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d22ea488ab5fe01c94070e9a6b3222916905a4d3f7a9d33cb2298c93fa0ffd3"}, + {file = "h3-3.7.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c94836155e8169be393980fc059f06481a14dd1913bd9cba609f6f1e8864c171"}, + {file = "h3-3.7.7-cp311-cp311-win_amd64.whl", hash = "sha256:836e74313ff55324485cd7e07783bc67df3191ec08a318035d7cd8ee0b0badab"}, + {file = "h3-3.7.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51c2f63ef5a57e4b18ebc9c0eb56656433e280ec45ab487a514127bb6e7d6a1f"}, + {file = "h3-3.7.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d6e38dea47c220d9802af8e8bebc806f9f39358aee07b736191ff21e2c9921d"}, + {file = "h3-3.7.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e408342e94f558802a97bfcbe1baae2af8b1fd926ad9041d970ff9dbd0502099"}, + {file = "h3-3.7.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:644c3c84585aa4df62e81bc54fd305c4d6686324731de230b0ddbd7036ed172c"}, + {file = "h3-3.7.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bb4a3d5e82d0c89512dc71b4eac17976a29be29da250ba76bc94bc5b9e824f0e"}, + {file = "h3-3.7.7-cp312-cp312-win_amd64.whl", hash = "sha256:2ccff5f02589e80202597ed0b9f61ebd114e262e7dd0fe88059298602898192f"}, + {file = "h3-3.7.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ef2e71b619f984e71c4bd9d128152e2c7e3e788e2d2ec571b32cef1d295ddf38"}, + {file = "h3-3.7.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cb13f0213ed6da80e739355e5b62cfc81b7b1469af997be3384a6cbc3a1a750"}, + {file = "h3-3.7.7-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:701f72f703d892fb17e66b9fd7b6b2ad125e135b091eb7dd0ec11858b84d84d2"}, + {file = "h3-3.7.7-cp36-cp36m-win_amd64.whl", hash = "sha256:796622be7cb052690404c0ac03768183e51ae22505ce4a424b4537b2b7609fba"}, + {file = "h3-3.7.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bcd88a72d6aa97d0f3b3b87b7bfd9725a8909501e6cb9d0057d5b690b6bb37b0"}, + {file = "h3-3.7.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7358ba3f91193a2551c4a8d7ad7fd348e567b3a3581c9c161630029dfb23e07"}, + {file = "h3-3.7.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f34b204edc2e8f7d99a6db4ed1b5d202b7ea3ec6817d373ec432dee14efe04"}, + {file = "h3-3.7.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aa0f8ce89b5e694815ee7a5172a782d58f2652267329de7008354b110b53955"}, + {file = "h3-3.7.7-cp37-cp37m-win_amd64.whl", hash = "sha256:4c851baa1c2d4f29b01157ce2a4cdb1f3879fff5c36ff7861dad1526963a17a7"}, + {file = "h3-3.7.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6f3a9da5472820b0a4add342f96fe52f65fbb8f46984383885738517b38af69e"}, + {file = "h3-3.7.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1c57da776a3c1a01e2986b1f6a31d497ee0be8fcdbaaf9b23bb90f5a90eb8f0b"}, + {file = "h3-3.7.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a5c0c0ddd9c57694ecc3b9ba99cbef2842882f8943d6edc676a365e139dbc6d"}, + {file = "h3-3.7.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c1b5a0a652719b645387231bf6d7d4dd85150e4440a4ce72a804a10e86592ae"}, + {file = "h3-3.7.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:64f76dc827fef94e9f43f95a1daea2e11f2ad2e8c55deac072f3d59bd62412d4"}, + {file = "h3-3.7.7-cp38-cp38-win_amd64.whl", hash = "sha256:c993a36120d7f5607f24ba9e39caf715eaf9cd9d44f5d5660fd85e3f4e0c6bf7"}, + {file = "h3-3.7.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eb154d2af699870b888e10476e327c895078009d2d2a6ef2d053d7dcf0e2c270"}, + {file = "h3-3.7.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c96ad74e246bb7638d413efa8199dd4c58ee929424a4dcaadb16365195f77f87"}, + {file = "h3-3.7.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52901f14f8b6e2c82075fd52c0e70176b868f621d47b5dc93f468c510e963722"}, + {file = "h3-3.7.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9d82a0fcc647e7bab36ab2e7a7392d141edc95d113ccf972e0fb7b0ddf80a0"}, + {file = "h3-3.7.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f4417d09acb36f0452346052f576923d6e4334bff3459f217d6278d40397424"}, + {file = "h3-3.7.7-cp39-cp39-win_amd64.whl", hash = "sha256:7ae774cd43b057f68dc10c99e4522fa40ed6b32ab90b2df0025595ffa15e77a0"}, + {file = "h3-3.7.7.tar.gz", hash = "sha256:33d141c3cef0725a881771fd8cb80c06a0db84a6e4ca5c647ce095ae07c61e94"}, ] [package.extras] @@ -1610,22 +1611,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.1" +version = "7.0.2" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, + {file = "importlib_metadata-7.0.2-py3-none-any.whl", hash = "sha256:f4bc4c0c070c490abf4ce96d715f68e95923320370efb66143df00199bb6c100"}, + {file = "importlib_metadata-7.0.2.tar.gz", hash = "sha256:198f568f3230878cb1b44fbd7975f87906c22336dba2e4a7f05278c281fbd792"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -2418,38 +2419,38 @@ files = [ [[package]] name = "mypy" -version = "1.8.0" +version = "1.9.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, - {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, - {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, - {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, - {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, - {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, - {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, - {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, - {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, - {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, - {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, - {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, - {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, - {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, - {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, - {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, - {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, - {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, - {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, + {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, + {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, + {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, + {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, + {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, + {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, + {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, + {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, + {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, + {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, + {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, + {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, + {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, + {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, + {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, + {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, + {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, ] [package.dependencies] @@ -2715,13 +2716,13 @@ numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -6294,13 +6295,13 @@ test = ["Mako", "pytest (>=7.0.0)"] [[package]] name = "pyopenssl" -version = "24.0.0" +version = "24.1.0" description = "Python wrapper module around the OpenSSL library" optional = false python-versions = ">=3.7" files = [ - {file = "pyOpenSSL-24.0.0-py3-none-any.whl", hash = "sha256:ba07553fb6fd6a7a2259adb9b84e12302a9a8a75c44046e8bb5d3e5ee887e3c3"}, - {file = "pyOpenSSL-24.0.0.tar.gz", hash = "sha256:6aa33039a93fffa4563e655b61d11364d01264be8ccb49906101e02a334530bf"}, + {file = "pyOpenSSL-24.1.0-py3-none-any.whl", hash = "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad"}, + {file = "pyOpenSSL-24.1.0.tar.gz", hash = "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f"}, ] [package.dependencies] @@ -6308,17 +6309,17 @@ cryptography = ">=41.0.5,<43" [package.extras] docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] -test = ["flaky", "pretend", "pytest (>=3.0.1)"] +test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -6469,23 +6470,23 @@ cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "8.0.2" +version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"}, - {file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"}, + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.3.0,<2.0" +pluggy = ">=1.4,<2.0" [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" @@ -6536,13 +6537,13 @@ pytest = "*" [[package]] name = "pytest-subtests" -version = "0.11.0" +version = "0.12.1" description = "unittest subTest() support and subtests fixture" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-subtests-0.11.0.tar.gz", hash = "sha256:51865c88457545f51fb72011942f0a3c6901ee9e24cbfb6d1b9dc1348bafbe37"}, - {file = "pytest_subtests-0.11.0-py3-none-any.whl", hash = "sha256:453389984952eec85ab0ce0c4f026337153df79587048271c7fd0f49119c07e4"}, + {file = "pytest-subtests-0.12.1.tar.gz", hash = "sha256:d6605dcb88647e0b7c1889d027f8ef1c17d7a2c60927ebfdc09c7b0d8120476d"}, + {file = "pytest_subtests-0.12.1-py3-none-any.whl", hash = "sha256:100d9f7eb966fc98efba7026c802812ae327e8b5b37181fb260a2ea93226495c"}, ] [package.dependencies] @@ -6551,17 +6552,17 @@ pytest = ">=7.0" [[package]] name = "pytest-timeout" -version = "2.2.0" +version = "2.3.1" description = "pytest plugin to abort hanging tests" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-timeout-2.2.0.tar.gz", hash = "sha256:3b0b95dabf3cb50bac9ef5ca912fa0cfc286526af17afc806824df20c2f72c90"}, - {file = "pytest_timeout-2.2.0-py3-none-any.whl", hash = "sha256:bde531e096466f49398a59f2dde76fa78429a09a12411466f88a07213e220de2"}, + {file = "pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9"}, + {file = "pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e"}, ] [package.dependencies] -pytest = ">=5.0.0" +pytest = ">=7.0.0" [[package]] name = "pytest-xdist" @@ -6585,13 +6586,13 @@ testing = ["filelock"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -6925,28 +6926,28 @@ docs = ["furo (==2023.9.10)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx [[package]] name = "ruff" -version = "0.2.2" +version = "0.3.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6"}, - {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3"}, - {file = "ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726"}, - {file = "ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e"}, - {file = "ruff-0.2.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e"}, - {file = "ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9"}, - {file = "ruff-0.2.2-py3-none-win32.whl", hash = "sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325"}, - {file = "ruff-0.2.2-py3-none-win_amd64.whl", hash = "sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d"}, - {file = "ruff-0.2.2-py3-none-win_arm64.whl", hash = "sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd"}, - {file = "ruff-0.2.2.tar.gz", hash = "sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d"}, + {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77f2612752e25f730da7421ca5e3147b213dca4f9a0f7e0b534e9562c5441f01"}, + {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9966b964b2dd1107797be9ca7195002b874424d1d5472097701ae8f43eadef5d"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b83d17ff166aa0659d1e1deaf9f2f14cbe387293a906de09bc4860717eb2e2da"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb875c6cc87b3703aeda85f01c9aebdce3d217aeaca3c2e52e38077383f7268a"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be75e468a6a86426430373d81c041b7605137a28f7014a72d2fc749e47f572aa"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:967978ac2d4506255e2f52afe70dda023fc602b283e97685c8447d036863a302"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1231eacd4510f73222940727ac927bc5d07667a86b0cbe822024dd00343e77e9"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6d613b19e9a8021be2ee1d0e27710208d1603b56f47203d0abbde906929a9b"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8439338a6303585d27b66b4626cbde89bb3e50fa3cae86ce52c1db7449330a7"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:de8b480d8379620cbb5ea466a9e53bb467d2fb07c7eca54a4aa8576483c35d36"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b74c3de9103bd35df2bb05d8b2899bf2dbe4efda6474ea9681280648ec4d237d"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f380be9fc15a99765c9cf316b40b9da1f6ad2ab9639e551703e581a5e6da6745"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0ac06a3759c3ab9ef86bbeca665d31ad3aa9a4b1c17684aadb7e61c10baa0df4"}, + {file = "ruff-0.3.2-py3-none-win32.whl", hash = "sha256:9bd640a8f7dd07a0b6901fcebccedadeb1a705a50350fb86b4003b805c81385a"}, + {file = "ruff-0.3.2-py3-none-win_amd64.whl", hash = "sha256:0c1bdd9920cab5707c26c8b3bf33a064a4ca7842d91a99ec0634fec68f9f4037"}, + {file = "ruff-0.3.2-py3-none-win_arm64.whl", hash = "sha256:5f65103b1d76e0d600cabd577b04179ff592064eaa451a70a81085930e907d0b"}, + {file = "ruff-0.3.2.tar.gz", hash = "sha256:fa78ec9418eb1ca3db392811df3376b46471ae93792a81af2d1cbb0e5dcb5142"}, ] [[package]] @@ -7028,13 +7029,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.40.5" +version = "1.41.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.40.5.tar.gz", hash = "sha256:d2dca2392cc5c9a2cc9bb874dd7978ebb759682fe4fe889ee7e970ee8dd1c61e"}, - {file = "sentry_sdk-1.40.5-py2.py3-none-any.whl", hash = "sha256:d188b407c9bacbe2a50a824e1f8fb99ee1aeb309133310488c570cb6d7056643"}, + {file = "sentry-sdk-1.41.0.tar.gz", hash = "sha256:4f2d6c43c07925d8cd10dfbd0970ea7cb784f70e79523cca9dbcd72df38e5a46"}, + {file = "sentry_sdk-1.41.0-py2.py3-none-any.whl", hash = "sha256:be4f8f4b29a80b6a3b71f0f31487beb9e296391da20af8504498a328befed53f"}, ] [package.dependencies] @@ -7595,13 +7596,13 @@ telegram = ["requests"] [[package]] name = "types-requests" -version = "2.31.0.20240218" +version = "2.31.0.20240311" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.31.0.20240218.tar.gz", hash = "sha256:f1721dba8385958f504a5386240b92de4734e047a08a40751c1654d1ac3349c5"}, - {file = "types_requests-2.31.0.20240218-py3-none-any.whl", hash = "sha256:a82807ec6ddce8f00fe0e949da6d6bc1fbf1715420218a9640d695f70a9e5a9b"}, + {file = "types-requests-2.31.0.20240311.tar.gz", hash = "sha256:b1c1b66abfb7fa79aae09097a811c4aa97130eb8831c60e47aee4ca344731ca5"}, + {file = "types_requests-2.31.0.20240311-py3-none-any.whl", hash = "sha256:47872893d65a38e282ee9f277a4ee50d1b28bd592040df7d1fdaffdf3779937d"}, ] [package.dependencies] From 6768f13f6a9e5df40c438aae7f81b7fefeac8208 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 11 Mar 2024 11:36:45 -0700 Subject: [PATCH 006/384] [bot] Bump submodules (#31823) bump submodules Co-authored-by: jnewb1 --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 41e9610ff8..4b6f6ac162 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 41e9610ff841e4cf62051c6df09c1870f5d12477 +Subproject commit 4b6f6ac1629d001ced6e86f43579d399230af614 From 1db30eae3a9ea929e295d1f340476431f400d6fa Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 11 Mar 2024 14:58:24 -0400 Subject: [PATCH 007/384] fix simulator device config (#31827) fix sim --- common/transformations/camera.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/transformations/camera.py b/common/transformations/camera.py index 7a8495a9b2..1a7b9c3f80 100644 --- a/common/transformations/camera.py +++ b/common/transformations/camera.py @@ -47,6 +47,9 @@ DEVICE_CAMERAS = { # before deviceState.deviceType was set, assume tici AR config ("unknown", "ar0231"): ar_ox_config, ("unknown", "ox03c10"): ar_ox_config, + + # simulator (emulates a tici) + ("pc", "unknown"): ar_ox_config, } prods = itertools.product(('tici', 'tizi', 'mici'), (('ar0231', ar_ox_config), ('ox03c10', ar_ox_config), ('os04c10', os_config))) DEVICE_CAMERAS.update({(d, c[0]): c[1] for d, c in prods}) From 3d7595dfe3c234e68412526e4aebc27fb90b296b Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 11 Mar 2024 16:31:01 -0400 Subject: [PATCH 008/384] GM Longitudinal: Display personality in instrument cluster (#31801) * GM Longitudinal: Display personality in instrument cluster * Correct value Co-authored-by: Shane Smiskol * update refs --------- Co-authored-by: Shane Smiskol --- selfdrive/car/gm/carcontroller.py | 2 +- selfdrive/car/gm/gmcan.py | 6 +++--- selfdrive/test/process_replay/ref_commit | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/gm/carcontroller.py b/selfdrive/car/gm/carcontroller.py index e010c56536..f8d747029b 100644 --- a/selfdrive/car/gm/carcontroller.py +++ b/selfdrive/car/gm/carcontroller.py @@ -118,7 +118,7 @@ class CarController(CarControllerBase): # Send dashboard UI commands (ACC status) send_fcw = hud_alert == VisualAlert.fcw can_sends.append(gmcan.create_acc_dashboard_command(self.packer_pt, CanBus.POWERTRAIN, CC.enabled, - hud_v_cruise * CV.MS_TO_KPH, hud_control.leadVisible, send_fcw)) + hud_v_cruise * CV.MS_TO_KPH, hud_control, send_fcw)) # Radar needs to know current speed and yaw rate (50hz), # and that ADAS is alive (10hz) diff --git a/selfdrive/car/gm/gmcan.py b/selfdrive/car/gm/gmcan.py index bd1e29ce3b..cea77985fb 100644 --- a/selfdrive/car/gm/gmcan.py +++ b/selfdrive/car/gm/gmcan.py @@ -102,17 +102,17 @@ def create_friction_brake_command(packer, bus, apply_brake, idx, enabled, near_s return packer.make_can_msg("EBCMFrictionBrakeCmd", bus, values) -def create_acc_dashboard_command(packer, bus, enabled, target_speed_kph, lead_car_in_sight, fcw): +def create_acc_dashboard_command(packer, bus, enabled, target_speed_kph, hud_control, fcw): target_speed = min(target_speed_kph, 255) values = { "ACCAlwaysOne": 1, "ACCResumeButton": 0, "ACCSpeedSetpoint": target_speed, - "ACCGapLevel": 3 * enabled, # 3 "far", 0 "inactive" + "ACCGapLevel": hud_control.leadDistanceBars * enabled, # 3 "far", 0 "inactive" "ACCCmdActive": enabled, "ACCAlwaysOne2": 1, - "ACCLeadCar": lead_car_in_sight, + "ACCLeadCar": hud_control.leadVisible, "FCWAlert": 0x3 if fcw else 0 } diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index fe7d954a80..0eedc6257b 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -653f68e6be4689dc9dce1a93cb726d37b9c588d3 +fba62008efd13fb578de325f0cdb0a87fe5e28f0 \ No newline at end of file From fb9f31efb703ac525a5f26e3d09c6246fd66cb15 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 11 Mar 2024 13:32:00 -0700 Subject: [PATCH 009/384] [bot] Fingerprints: add missing FW versions from new users (#31815) * Export fingerprints * Update selfdrive/car/toyota/fingerprints.py --- selfdrive/car/chrysler/fingerprints.py | 2 ++ selfdrive/car/toyota/fingerprints.py | 1 + 2 files changed, 3 insertions(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 3444b4cc5b..c021facba5 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -404,6 +404,7 @@ FW_VERSIONS = { b'68527383AD', b'68527387AE', b'68527403AC', + b'68527403AD', b'68546047AF', b'68631938AA', b'68631942AA', @@ -477,6 +478,7 @@ FW_VERSIONS = { ], (Ecu.engine, 0x7e0, None): [ b'05035699AG ', + b'05035841AC ', b'05036026AB ', b'05036065AE ', b'05036066AE ', diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 64ad53a880..a0d1ef20b2 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1547,6 +1547,7 @@ FW_VERSIONS = { b'\x018966348W5100\x00\x00\x00\x00', b'\x018966348W9000\x00\x00\x00\x00', b'\x018966348X0000\x00\x00\x00\x00', + b'\x01896634D11000\x00\x00\x00\x00', b'\x01896634D12000\x00\x00\x00\x00', b'\x01896634D12100\x00\x00\x00\x00', b'\x01896634D43000\x00\x00\x00\x00', From 0e92097f7e80b32ba36e7a9eacbdbad9a6d577ef Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 11 Mar 2024 16:47:41 -0400 Subject: [PATCH 010/384] Params: remove unused key (#31826) --- common/params.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/common/params.cc b/common/params.cc index f68e1e4c6b..38d96a30b0 100644 --- a/common/params.cc +++ b/common/params.cc @@ -207,7 +207,6 @@ std::unordered_map keys = { {"UpdaterTargetBranch", CLEAR_ON_MANAGER_START}, {"UpdaterLastFetchTime", PERSISTENT}, {"Version", PERSISTENT}, - {"VisionRadarToggle", PERSISTENT}, }; } // namespace From 78d72d7dc390984496dd6633fd588bfd06ae1939 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 11 Mar 2024 18:23:10 -0700 Subject: [PATCH 011/384] remove RTC time pull (#31829) * remove RTC time pull * and syncing * bump panda * bump panda --- panda | 2 +- release/files_common | 1 - selfdrive/boardd/boardd.cc | 42 ------------------------------------ selfdrive/boardd/panda.cc | 39 --------------------------------- selfdrive/boardd/panda.h | 3 --- selfdrive/boardd/pandad.py | 5 ----- selfdrive/boardd/set_time.py | 38 -------------------------------- 7 files changed, 1 insertion(+), 129 deletions(-) delete mode 100755 selfdrive/boardd/set_time.py diff --git a/panda b/panda index 4b6f6ac162..895a7001c9 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 4b6f6ac1629d001ced6e86f43579d399230af614 +Subproject commit 895a7001c9d21ac7c4ace65debe70dfaee017443 diff --git a/release/files_common b/release/files_common index 4286c46c90..e483620052 100644 --- a/release/files_common +++ b/release/files_common @@ -82,7 +82,6 @@ selfdrive/boardd/panda.h selfdrive/boardd/spi.cc selfdrive/boardd/panda_comms.h selfdrive/boardd/panda_comms.cc -selfdrive/boardd/set_time.py selfdrive/boardd/pandad.py selfdrive/boardd/tests/test_boardd_loopback.py diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index b2b59d3752..c4db1eab40 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -49,12 +49,6 @@ std::atomic ignition(false); ExitHandler do_exit; -static std::string get_time_str(const struct tm &time) { - char s[30] = {'\0'}; - std::strftime(s, std::size(s), "%Y-%m-%d %H:%M:%S", &time); - return s; -} - bool check_all_connected(const std::vector &pandas) { for (const auto& panda : pandas) { if (!panda->connected()) { @@ -65,36 +59,6 @@ bool check_all_connected(const std::vector &pandas) { return true; } -enum class SyncTimeDir { TO_PANDA, FROM_PANDA }; - -void sync_time(Panda *panda, SyncTimeDir dir) { - if (!panda->has_rtc) return; - - setenv("TZ", "UTC", 1); - struct tm sys_time = util::get_time(); - struct tm rtc_time = panda->get_rtc(); - - if (dir == SyncTimeDir::TO_PANDA) { - if (util::time_valid(sys_time)) { - // Write time to RTC if it looks reasonable - double seconds = difftime(mktime(&rtc_time), mktime(&sys_time)); - if (std::abs(seconds) > 1.1) { - panda->set_rtc(sys_time); - LOGW("Updating panda RTC. dt = %.2f System: %s RTC: %s", - seconds, get_time_str(sys_time).c_str(), get_time_str(rtc_time).c_str()); - } - } - } else if (dir == SyncTimeDir::FROM_PANDA) { - LOGW("System time: %s, RTC time: %s", get_time_str(sys_time).c_str(), get_time_str(rtc_time).c_str()); - - if (!util::time_valid(sys_time) && util::time_valid(rtc_time)) { - const struct timeval tv = {mktime(&rtc_time), 0}; - settimeofday(&tv, 0); - LOGE("System time wrong, setting from RTC."); - } - } -} - bool safety_setter_thread(std::vector pandas) { LOGD("Starting safety setter thread"); @@ -195,7 +159,6 @@ Panda *connect(std::string serial="", uint32_t index=0) { throw std::runtime_error("Panda firmware out of date. Run pandad.py to update."); } - sync_time(panda.get(), SyncTimeDir::FROM_PANDA); return panda.release(); } @@ -581,11 +544,6 @@ void peripheral_control_thread(Panda *panda, bool no_fan_control) { panda->set_ir_pwr(ir_pwr); prev_ir_pwr = ir_pwr; } - - // Write to rtc once per minute when no ignition present - if (!ignition && (sm.frame % 120 == 1)) { - sync_time(panda, SyncTimeDir::TO_PANDA); - } } } diff --git a/selfdrive/boardd/panda.cc b/selfdrive/boardd/panda.cc index d738231c7b..95cfe04efd 100644 --- a/selfdrive/boardd/panda.cc +++ b/selfdrive/boardd/panda.cc @@ -25,10 +25,6 @@ Panda::Panda(std::string serial, uint32_t bus_offset) : bus_offset(bus_offset) { } hw_type = get_hw_type(); - has_rtc = (hw_type == cereal::PandaState::PandaType::UNO) || - (hw_type == cereal::PandaState::PandaType::DOS) || - (hw_type == cereal::PandaState::PandaType::TRES); - can_reset_communications(); return; @@ -77,41 +73,6 @@ cereal::PandaState::PandaType Panda::get_hw_type() { return (cereal::PandaState::PandaType)(hw_query[0]); } -void Panda::set_rtc(struct tm sys_time) { - // tm struct has year defined as years since 1900 - handle->control_write(0xa1, (uint16_t)(1900 + sys_time.tm_year), 0); - handle->control_write(0xa2, (uint16_t)(1 + sys_time.tm_mon), 0); - handle->control_write(0xa3, (uint16_t)sys_time.tm_mday, 0); - // handle->control_write(0xa4, (uint16_t)(1 + sys_time.tm_wday), 0); - handle->control_write(0xa5, (uint16_t)sys_time.tm_hour, 0); - handle->control_write(0xa6, (uint16_t)sys_time.tm_min, 0); - handle->control_write(0xa7, (uint16_t)sys_time.tm_sec, 0); -} - -struct tm Panda::get_rtc() { - struct __attribute__((packed)) timestamp_t { - uint16_t year; // Starts at 0 - uint8_t month; - uint8_t day; - uint8_t weekday; - uint8_t hour; - uint8_t minute; - uint8_t second; - } rtc_time = {0}; - - handle->control_read(0xa0, 0, 0, (unsigned char*)&rtc_time, sizeof(rtc_time)); - - struct tm new_time = { 0 }; - new_time.tm_year = rtc_time.year - 1900; // tm struct has year defined as years since 1900 - new_time.tm_mon = rtc_time.month - 1; - new_time.tm_mday = rtc_time.day; - new_time.tm_hour = rtc_time.hour; - new_time.tm_min = rtc_time.minute; - new_time.tm_sec = rtc_time.second; - - return new_time; -} - void Panda::set_fan_speed(uint16_t fan_speed) { handle->control_write(0xb1, fan_speed, 0); } diff --git a/selfdrive/boardd/panda.h b/selfdrive/boardd/panda.h index 9d4b1b2092..f46150dd95 100644 --- a/selfdrive/boardd/panda.h +++ b/selfdrive/boardd/panda.h @@ -50,7 +50,6 @@ public: Panda(std::string serial="", uint32_t bus_offset=0); cereal::PandaState::PandaType hw_type = cereal::PandaState::PandaType::UNKNOWN; - bool has_rtc = false; const uint32_t bus_offset; bool connected(); @@ -64,8 +63,6 @@ public: cereal::PandaState::PandaType get_hw_type(); void set_safety_model(cereal::CarParams::SafetyModel safety_model, uint16_t safety_param=0U); void set_alternative_experience(uint16_t alternative_experience); - void set_rtc(struct tm sys_time); - struct tm get_rtc(); void set_fan_speed(uint16_t fan_speed); uint16_t get_fan_speed(); void set_ir_pwr(uint16_t ir_pwr); diff --git a/selfdrive/boardd/pandad.py b/selfdrive/boardd/pandad.py index 988d1a2409..cf9938ec1d 100755 --- a/selfdrive/boardd/pandad.py +++ b/selfdrive/boardd/pandad.py @@ -10,7 +10,6 @@ from functools import cmp_to_key from panda import Panda, PandaDFU, PandaProtocolMismatch, FW_PATH from openpilot.common.basedir import BASEDIR from openpilot.common.params import Params -from openpilot.selfdrive.boardd.set_time import set_time from openpilot.system.hardware import HARDWARE from openpilot.common.swaglog import cloudlog @@ -154,10 +153,6 @@ def main() -> NoReturn: cloudlog.event("panda.som_reset_triggered", health=health, serial=panda.get_usb_serial()) if first_run: - if panda.is_internal(): - # update time from RTC - set_time(cloudlog) - # reset panda to ensure we're in a good state cloudlog.info(f"Resetting panda {panda.get_usb_serial()}") if panda.is_internal(): diff --git a/selfdrive/boardd/set_time.py b/selfdrive/boardd/set_time.py deleted file mode 100755 index fe17f64e82..0000000000 --- a/selfdrive/boardd/set_time.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -import os -import datetime -from panda import Panda - -from openpilot.common.time import MIN_DATE - -def set_time(logger): - sys_time = datetime.datetime.today() - if sys_time > MIN_DATE: - logger.info("System time valid") - return - - try: - ps = Panda.list() - if len(ps) == 0: - logger.error("Failed to set time, no pandas found") - return - - for s in ps: - with Panda(serial=s) as p: - if not p.is_internal(): - continue - - # Set system time from panda RTC time - panda_time = p.get_datetime() - if panda_time > MIN_DATE: - logger.info(f"adjusting time from '{sys_time}' to '{panda_time}'") - os.system(f"TZ=UTC date -s '{panda_time}'") - break - except Exception: - logger.exception("Failed to fetch time from panda") - -if __name__ == "__main__": - import logging - logging.basicConfig(level=logging.DEBUG) - - set_time(logging) From 011eed0daf167a780165ac8d2d2a7768a86a62e7 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Tue, 12 Mar 2024 03:30:09 +0000 Subject: [PATCH 012/384] Ford: show longitudinal personality in IPC (#31796) * Ford: show longitudinal personality in IPC Adjust the time gap to 2, 3 or 4 bars for openpilot long. TODO: set AccTGap_D_Dsply when value changes so that the popup appears with the new time gap Depends on #31760. * ACC UI: show time gap popup when distance changes * Revert "ACC UI: show time gap popup when distance changes" This reverts commit c4e8e10970078a534d5714ddced92d540e9e3c0c. * ACC UI: send on distance bars change * don't need this check - just send on first frame --- selfdrive/car/ford/carcontroller.py | 9 +++++++-- selfdrive/car/ford/fordcan.py | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/ford/carcontroller.py b/selfdrive/car/ford/carcontroller.py index 7ce2ded6e3..47082fb56f 100644 --- a/selfdrive/car/ford/carcontroller.py +++ b/selfdrive/car/ford/carcontroller.py @@ -35,6 +35,7 @@ class CarController(CarControllerBase): self.main_on_last = False self.lkas_enabled_last = False self.steer_alert_last = False + self.lead_distance_bars_last = None def update(self, CC, CS, now_nanos): can_sends = [] @@ -98,15 +99,19 @@ class CarController(CarControllerBase): # send lkas ui msg at 1Hz or if ui state changes if (self.frame % CarControllerParams.LKAS_UI_STEP) == 0 or send_ui: can_sends.append(fordcan.create_lkas_ui_msg(self.packer, self.CAN, main_on, CC.latActive, steer_alert, hud_control, CS.lkas_status_stock_values)) + # send acc ui msg at 5Hz or if ui state changes + if hud_control.leadDistanceBars != self.lead_distance_bars_last: + send_ui = True if (self.frame % CarControllerParams.ACC_UI_STEP) == 0 or send_ui: can_sends.append(fordcan.create_acc_ui_msg(self.packer, self.CAN, self.CP, main_on, CC.latActive, - fcw_alert, CS.out.cruiseState.standstill, hud_control, - CS.acc_tja_status_stock_values)) + fcw_alert, CS.out.cruiseState.standstill, hud_control, + CS.acc_tja_status_stock_values)) self.main_on_last = main_on self.lkas_enabled_last = CC.latActive self.steer_alert_last = steer_alert + self.lead_distance_bars_last = hud_control.leadDistanceBars new_actuators = actuators.copy() new_actuators.curvature = self.apply_curvature_last diff --git a/selfdrive/car/ford/fordcan.py b/selfdrive/car/ford/fordcan.py index c5ef0900f3..939084c4a0 100644 --- a/selfdrive/car/ford/fordcan.py +++ b/selfdrive/car/ford/fordcan.py @@ -212,7 +212,7 @@ def create_acc_ui_msg(packer, CAN: CanBus, CP, main_on: bool, enabled: bool, fcw "AccFllwMde_B_Dsply": 1 if hud_control.leadVisible else 0, # Lead indicator "AccStopMde_B_Dsply": 1 if standstill else 0, "AccWarn_D_Dsply": 0, # ACC warning - "AccTGap_D_Dsply": 4, # Fixed time gap in UI + "AccTGap_D_Dsply": hud_control.leadDistanceBars + 1, # Time gap }) # Forwards FCW alert from IPMA From adc15d69a2b8e8fa7a5ce5c71d4d4f78e87fca68 Mon Sep 17 00:00:00 2001 From: GRIFFIT807 <96277491+GRIFFIT807@users.noreply.github.com> Date: Mon, 11 Mar 2024 23:31:53 -0500 Subject: [PATCH 013/384] Add support for 2024 Ford Maverick (#31828) * Update fingerprints.py * Update values.py * 24 * Update CARS.md * hybrid should match up --------- Co-authored-by: Justin Newberry Co-authored-by: Shane Smiskol --- docs/CARS.md | 4 ++-- selfdrive/car/ford/fingerprints.py | 1 + selfdrive/car/ford/values.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 8854a801ab..6ed1ba7e62 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -47,9 +47,9 @@ A supported vehicle is one that just works when you install a comma device. All |Ford|Kuga Hybrid 2020-22|Adaptive Cruise Control with Lane Centering|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Kuga Plug-in Hybrid 2020-22|Adaptive Cruise Control with Lane Centering|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Maverick 2022|LARIAT Luxury|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Ford|Maverick 2023|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Maverick 2023-24|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Maverick Hybrid 2022|LARIAT Luxury|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Ford|Maverick Hybrid 2023|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Maverick Hybrid 2023-24|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G70 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G70 2020|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index 504d27e681..c32a982d78 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -136,6 +136,7 @@ FW_VERSIONS = { b'NZ6C-2D053-AG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PZ6C-2D053-ED\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PZ6C-2D053-EE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PZ6C-2D053-EF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ b'NZ6T-14D049-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 15c0d3bdb7..7b46e82abb 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -137,8 +137,8 @@ class CAR(Platforms): [ FordCarInfo("Ford Maverick 2022", "LARIAT Luxury"), FordCarInfo("Ford Maverick Hybrid 2022", "LARIAT Luxury"), - FordCarInfo("Ford Maverick 2023", "Co-Pilot360 Assist"), - FordCarInfo("Ford Maverick Hybrid 2023", "Co-Pilot360 Assist"), + FordCarInfo("Ford Maverick 2023-24", "Co-Pilot360 Assist"), + FordCarInfo("Ford Maverick Hybrid 2023-24", "Co-Pilot360 Assist"), ], CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), ) From 87cb00203abb4a9ded660cb2e321d3bc79dcf96f Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 00:45:52 -0400 Subject: [PATCH 014/384] Hyundai Longitudinal: Display personality in instrument cluster (#31798) * Hyundai Longitudinal: Display personality in instrument cluster * Support CAN-FD * Apply suggestions from code review --------- Co-authored-by: Shane Smiskol --- selfdrive/car/hyundai/carcontroller.py | 4 ++-- selfdrive/car/hyundai/hyundaican.py | 6 +++--- selfdrive/car/hyundai/hyundaicanfd.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/selfdrive/car/hyundai/carcontroller.py b/selfdrive/car/hyundai/carcontroller.py index ee7f441227..7829d764b0 100644 --- a/selfdrive/car/hyundai/carcontroller.py +++ b/selfdrive/car/hyundai/carcontroller.py @@ -129,7 +129,7 @@ class CarController(CarControllerBase): can_sends.extend(hyundaicanfd.create_adrv_messages(self.packer, self.CAN, self.frame)) if self.frame % 2 == 0: can_sends.append(hyundaicanfd.create_acc_control(self.packer, self.CAN, CC.enabled, self.accel_last, accel, stopping, CC.cruiseControl.override, - set_speed_in_units)) + set_speed_in_units, hud_control)) self.accel_last = accel else: # button presses @@ -148,7 +148,7 @@ class CarController(CarControllerBase): jerk = 3.0 if actuators.longControlState == LongCtrlState.pid else 1.0 use_fca = self.CP.flags & HyundaiFlags.USE_FCA.value can_sends.extend(hyundaican.create_acc_commands(self.packer, CC.enabled, accel, jerk, int(self.frame / 2), - hud_control.leadVisible, set_speed_in_units, stopping, + hud_control, set_speed_in_units, stopping, CC.cruiseControl.override, use_fca)) # 20 Hz LFA MFA message diff --git a/selfdrive/car/hyundai/hyundaican.py b/selfdrive/car/hyundai/hyundaican.py index 0bf29664e8..7cbeed0afb 100644 --- a/selfdrive/car/hyundai/hyundaican.py +++ b/selfdrive/car/hyundai/hyundaican.py @@ -126,12 +126,12 @@ def create_lfahda_mfc(packer, enabled, hda_set_speed=0): } return packer.make_can_msg("LFAHDA_MFC", 0, values) -def create_acc_commands(packer, enabled, accel, upper_jerk, idx, lead_visible, set_speed, stopping, long_override, use_fca): +def create_acc_commands(packer, enabled, accel, upper_jerk, idx, hud_control, set_speed, stopping, long_override, use_fca): commands = [] scc11_values = { "MainMode_ACC": 1, - "TauGapSet": 4, + "TauGapSet": hud_control.leadDistanceBars + 1, "VSetDis": set_speed if enabled else 0, "AliveCounterACC": idx % 0x10, "ObjValid": 1, # close lead makes controls tighter @@ -167,7 +167,7 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, lead_visible, s "JerkUpperLimit": upper_jerk, # stock usually is 1.0 but sometimes uses higher values "JerkLowerLimit": 5.0, # stock usually is 0.5 but sometimes uses higher values "ACCMode": 2 if enabled and long_override else 1 if enabled else 4, # stock will always be 4 instead of 0 after first disengage - "ObjGap": 2 if lead_visible else 0, # 5: >30, m, 4: 25-30 m, 3: 20-25 m, 2: < 20 m, 0: no lead + "ObjGap": 2 if hud_control.leadVisible else 0, # 5: >30, m, 4: 25-30 m, 3: 20-25 m, 2: < 20 m, 0: no lead } commands.append(packer.make_can_msg("SCC14", 0, scc14_values)) diff --git a/selfdrive/car/hyundai/hyundaicanfd.py b/selfdrive/car/hyundai/hyundaicanfd.py index a35fcb7779..17ec9dcdd2 100644 --- a/selfdrive/car/hyundai/hyundaicanfd.py +++ b/selfdrive/car/hyundai/hyundaicanfd.py @@ -121,7 +121,7 @@ def create_lfahda_cluster(packer, CAN, enabled): return packer.make_can_msg("LFAHDA_CLUSTER", CAN.ECAN, values) -def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_override, set_speed): +def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_override, set_speed, hud_control): jerk = 5 jn = jerk / 50 if not enabled or gas_override: @@ -146,7 +146,7 @@ def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_ov "SET_ME_2": 0x4, "SET_ME_3": 0x3, "SET_ME_TMP_64": 0x64, - "DISTANCE_SETTING": 4, + "DISTANCE_SETTING": hud_control.leadDistanceBars + 1, } return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values) From 32c0bcec3aee54cae552d500b783c80930f1e204 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 00:49:07 -0400 Subject: [PATCH 015/384] Honda: Parse distance button from steering wheel (#31763) --- selfdrive/car/honda/interface.py | 7 ++++--- selfdrive/car/honda/values.py | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index f791d4b639..d316626a94 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -4,8 +4,8 @@ from panda import Panda from openpilot.common.conversions import Conversions as CV from openpilot.common.numpy_fast import interp from openpilot.selfdrive.car.honda.hondacan import CanBus -from openpilot.selfdrive.car.honda.values import CarControllerParams, CruiseButtons, HondaFlags, CAR, HONDA_BOSCH, HONDA_NIDEC_ALT_SCM_MESSAGES, \ - HONDA_BOSCH_RADARLESS +from openpilot.selfdrive.car.honda.values import CarControllerParams, CruiseButtons, CruiseSettings, HondaFlags, CAR, HONDA_BOSCH, \ + HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_RADARLESS from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.disable_ecu import disable_ecu @@ -16,6 +16,7 @@ EventName = car.CarEvent.EventName TransmissionType = car.CarParams.TransmissionType BUTTONS_DICT = {CruiseButtons.RES_ACCEL: ButtonType.accelCruise, CruiseButtons.DECEL_SET: ButtonType.decelCruise, CruiseButtons.MAIN: ButtonType.altButton3, CruiseButtons.CANCEL: ButtonType.cancel} +SETTINGS_BUTTONS_DICT = {CruiseSettings.DISTANCE: ButtonType.gapAdjustCruise, CruiseSettings.LKAS: ButtonType.altButton1} class CarInterface(CarInterfaceBase): @@ -236,7 +237,7 @@ class CarInterface(CarInterfaceBase): ret.buttonEvents = [ *create_button_events(self.CS.cruise_buttons, self.CS.prev_cruise_buttons, BUTTONS_DICT), - *create_button_events(self.CS.cruise_setting, self.CS.prev_cruise_setting, {1: ButtonType.altButton1}), + *create_button_events(self.CS.cruise_setting, self.CS.prev_cruise_setting, SETTINGS_BUTTONS_DICT), ] # events diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 4960380bbc..eed76c42ab 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -68,6 +68,11 @@ class CruiseButtons: MAIN = 1 +class CruiseSettings: + DISTANCE = 3 + LKAS = 1 + + # See dbc files for info on values VISUAL_HUD = { VisualAlert.none: 0, From ab5c0f90b5c7790db2edece444d29f64a3bd8a8e Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 00:53:19 -0400 Subject: [PATCH 016/384] Mazda: Parse distance button from steering wheel (#31765) * Mazda: Parse distance button from steering wheel * Update selfdrive/car/mazda/interface.py --------- Co-authored-by: Shane Smiskol --- selfdrive/car/mazda/carstate.py | 7 +++++++ selfdrive/car/mazda/interface.py | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/mazda/carstate.py b/selfdrive/car/mazda/carstate.py index 37a67ecd93..83b238fb68 100644 --- a/selfdrive/car/mazda/carstate.py +++ b/selfdrive/car/mazda/carstate.py @@ -18,9 +18,16 @@ class CarState(CarStateBase): self.lkas_allowed_speed = False self.lkas_disabled = False + self.prev_distance_button = 0 + self.distance_button = 0 + def update(self, cp, cp_cam): ret = car.CarState.new_message() + + self.prev_distance_button = self.distance_button + self.distance_button = cp.vl["CRZ_BTNS"]["DISTANCE_LESS"] + ret.wheelSpeeds = self.get_wheel_speeds( cp.vl["WHEEL_SPEEDS"]["FL"], cp.vl["WHEEL_SPEEDS"]["FR"], diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index 85be0166ce..12d156fee8 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -2,7 +2,7 @@ from cereal import car from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car.mazda.values import CAR, LKAS_LIMITS -from openpilot.selfdrive.car import get_safety_config +from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.interfaces import CarInterfaceBase ButtonType = car.CarState.ButtonEvent.Type @@ -34,6 +34,9 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) + # TODO: add button types for inc and dec + ret.buttonEvents = create_button_events(self.CS.distance_button, self.CS.prev_distance_button, {1: ButtonType.gapAdjustCruise}) + # events events = self.create_common_events(ret) From 82fa0d762c11e2d42ea30fe108c1f0b60a5995f3 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 00:58:55 -0400 Subject: [PATCH 017/384] Nissan: Parse distance button from steering wheel (#31766) --- selfdrive/car/nissan/carstate.py | 6 ++++++ selfdrive/car/nissan/interface.py | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/nissan/carstate.py b/selfdrive/car/nissan/carstate.py index b2ba9ce290..694d6c3bb0 100644 --- a/selfdrive/car/nissan/carstate.py +++ b/selfdrive/car/nissan/carstate.py @@ -20,9 +20,15 @@ class CarState(CarStateBase): self.steeringTorqueSamples = deque(TORQUE_SAMPLES*[0], TORQUE_SAMPLES) self.shifter_values = can_define.dv["GEARBOX"]["GEAR_SHIFTER"] + self.prev_distance_button = 0 + self.distance_button = 0 + def update(self, cp, cp_adas, cp_cam): ret = car.CarState.new_message() + self.prev_distance_button = self.distance_button + self.distance_button = cp.vl["CRUISE_THROTTLE"]["FOLLOW_DISTANCE_BUTTON"] + if self.CP.carFingerprint in (CAR.ROGUE, CAR.XTRAIL, CAR.ALTIMA): ret.gas = cp.vl["GAS_PEDAL"]["GAS_PEDAL"] elif self.CP.carFingerprint in (CAR.LEAF, CAR.LEAF_IC): diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index 60cc3a0090..3e82b5192e 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -1,9 +1,11 @@ from cereal import car from panda import Panda -from openpilot.selfdrive.car import get_safety_config +from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.nissan.values import CAR +ButtonType = car.CarState.ButtonEvent.Type + class CarInterface(CarInterfaceBase): @@ -30,6 +32,8 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_adas, self.cp_cam) + ret.buttonEvents = create_button_events(self.CS.distance_button, self.CS.prev_distance_button, {1: ButtonType.gapAdjustCruise}) + events = self.create_common_events(ret, extra_gears=[car.CarState.GearShifter.brake]) if self.CS.lkas_enabled: From 7ca07f8be9360da788f65a988089fd23c3329b97 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 01:01:48 -0400 Subject: [PATCH 018/384] Volkswagen Longitudinal: Display personality in instrument cluster (#31800) --- selfdrive/car/volkswagen/carcontroller.py | 2 +- selfdrive/car/volkswagen/mqbcan.py | 4 ++-- selfdrive/car/volkswagen/pqcan.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 1b1858703d..cfba43b4da 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -102,7 +102,7 @@ class CarController(CarControllerBase): # FIXME: follow the recent displayed-speed updates, also use mph_kmh toggle to fix display rounding problem? set_speed = hud_control.setSpeed * CV.MS_TO_KPH can_sends.append(self.CCS.create_acc_hud_control(self.packer_pt, CANBUS.pt, acc_hud_status, set_speed, - lead_distance)) + lead_distance, hud_control.leadDistanceBars)) # **** Stock ACC Button Controls **************************************** # diff --git a/selfdrive/car/volkswagen/mqbcan.py b/selfdrive/car/volkswagen/mqbcan.py index 787c7de530..6043533acf 100644 --- a/selfdrive/car/volkswagen/mqbcan.py +++ b/selfdrive/car/volkswagen/mqbcan.py @@ -125,11 +125,11 @@ def create_acc_accel_control(packer, bus, acc_type, acc_enabled, accel, acc_cont return commands -def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance): +def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance, distance): values = { "ACC_Status_Anzeige": acc_hud_status, "ACC_Wunschgeschw_02": set_speed if set_speed < 250 else 327.36, - "ACC_Gesetzte_Zeitluecke": 3, + "ACC_Gesetzte_Zeitluecke": distance + 2, "ACC_Display_Prio": 3, "ACC_Abstandsindex": lead_distance, } diff --git a/selfdrive/car/volkswagen/pqcan.py b/selfdrive/car/volkswagen/pqcan.py index f42c3cf781..b77f33511f 100644 --- a/selfdrive/car/volkswagen/pqcan.py +++ b/selfdrive/car/volkswagen/pqcan.py @@ -91,7 +91,7 @@ def create_acc_accel_control(packer, bus, acc_type, acc_enabled, accel, acc_cont return commands -def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance): +def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance, distance): values = { "ACA_StaACC": acc_hud_status, "ACA_Zeitluecke": 2, From 5f39a6f8be016c8a96ff377ead24a60029a9f0fb Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 01:05:27 -0400 Subject: [PATCH 019/384] Honda Longitudinal: Display personality in instrument cluster (#31799) * Honda Longitudinal: Display personality in instrument cluster * Simpler Co-authored-by: Shane Smiskol * cleanup * Update selfdrive/car/honda/hondacan.py --------- Co-authored-by: Shane Smiskol --- selfdrive/car/honda/carcontroller.py | 4 ++-- selfdrive/car/honda/hondacan.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/honda/carcontroller.py b/selfdrive/car/honda/carcontroller.py index 547abcd9b9..00cc54dcb3 100644 --- a/selfdrive/car/honda/carcontroller.py +++ b/selfdrive/car/honda/carcontroller.py @@ -96,7 +96,7 @@ def process_hud_alert(hud_alert): HUDData = namedtuple("HUDData", ["pcm_accel", "v_cruise", "lead_visible", - "lanes_visible", "fcw", "acc_alert", "steer_required"]) + "lanes_visible", "fcw", "acc_alert", "steer_required", "lead_distance_bars"]) def rate_limit_steer(new_steer, last_steer): @@ -251,7 +251,7 @@ class CarController(CarControllerBase): # Send dashboard UI commands. if self.frame % 10 == 0: hud = HUDData(int(pcm_accel), int(round(hud_v_cruise)), hud_control.leadVisible, - hud_control.lanesVisible, fcw_display, acc_alert, steer_required) + hud_control.lanesVisible, fcw_display, acc_alert, steer_required, hud_control.leadDistanceBars) can_sends.extend(hondacan.create_ui_commands(self.packer, self.CAN, self.CP, CC.enabled, pcm_speed, hud, CS.is_metric, CS.acc_hud, CS.lkas_hud)) if self.CP.openpilotLongitudinalControl and self.CP.carFingerprint not in HONDA_BOSCH: diff --git a/selfdrive/car/honda/hondacan.py b/selfdrive/car/honda/hondacan.py index d10d5576d9..efa5ba1f1e 100644 --- a/selfdrive/car/honda/hondacan.py +++ b/selfdrive/car/honda/hondacan.py @@ -143,7 +143,7 @@ def create_ui_commands(packer, CAN, CP, enabled, pcm_speed, hud, is_metric, acc_ acc_hud_values = { 'CRUISE_SPEED': hud.v_cruise, 'ENABLE_MINI_CAR': 1 if enabled else 0, - 'HUD_DISTANCE': 0, # max distance setting on display + 'HUD_DISTANCE': (hud.lead_distance_bars + 1) % 4, # wraps to 0 at 4 bars 'IMPERIAL_UNIT': int(not is_metric), 'HUD_LEAD': 2 if enabled and hud.lead_visible else 1 if enabled else 0, 'SET_ME_X01_2': 1, From 7a47fad5e3c2118d1b4807f24c07f114a6c7df9b Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 01:06:49 -0400 Subject: [PATCH 020/384] Volkswagen PQ Longitudinal: Display personality in instrument cluster (#31837) --- selfdrive/car/volkswagen/pqcan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/pqcan.py b/selfdrive/car/volkswagen/pqcan.py index b77f33511f..307aaaa2a7 100644 --- a/selfdrive/car/volkswagen/pqcan.py +++ b/selfdrive/car/volkswagen/pqcan.py @@ -94,7 +94,7 @@ def create_acc_accel_control(packer, bus, acc_type, acc_enabled, accel, acc_cont def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance, distance): values = { "ACA_StaACC": acc_hud_status, - "ACA_Zeitluecke": 2, + "ACA_Zeitluecke": distance + 2, "ACA_V_Wunsch": set_speed, "ACA_gemZeitl": lead_distance, "ACA_PrioDisp": 3, From 9ab735494e2effa67ef88fc1993ce46cf7894921 Mon Sep 17 00:00:00 2001 From: Erich Moraga <33645296+ErichMoraga@users.noreply.github.com> Date: Tue, 12 Mar 2024 00:13:34 -0500 Subject: [PATCH 021/384] Volkswagen: add engine/transmission/srs ECU versions for PASSAT_MK8 (#31777) `black_guru` 2021 VW Passat DongleID/route 9d09cc205c254c4b/00000000--03b770c463 --- selfdrive/car/volkswagen/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index f6b3c49982..416cbb6ad0 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -381,6 +381,7 @@ FW_VERSIONS = { b'\xf1\x8704L906026FP\xf1\x892012', b'\xf1\x8704L906026GA\xf1\x892013', b'\xf1\x8704L906026KD\xf1\x894798', + b'\xf1\x8705L906022A \xf1\x890827', b'\xf1\x873G0906259 \xf1\x890004', b'\xf1\x873G0906259B \xf1\x890002', b'\xf1\x873G0906264 \xf1\x890004', @@ -400,6 +401,7 @@ FW_VERSIONS = { b'\xf1\x870DL300011H \xf1\x895201', b'\xf1\x870GC300042H \xf1\x891404', b'\xf1\x870GC300043 \xf1\x892301', + b'\xf1\x870GC300046P \xf1\x892805', ], (Ecu.srs, 0x715, None): [ b'\xf1\x873Q0959655AE\xf1\x890195\xf1\x82\r56140056130012416612124111', @@ -415,6 +417,7 @@ FW_VERSIONS = { b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e5915005914001354701311542900', b'\xf1\x873Q0959655CN\xf1\x890720\xf1\x82\x0e5915005914001305701311052900', b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011111200631145171716121691132111', + b'\xf1\x875QF959655S \xf1\x890639\xf1\x82\x13131100131300111111000120----2211114A48', ], (Ecu.eps, 0x712, None): [ b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566B00611A1', From fedb2a93601fe07566118dcf3dfadd6600ce31af Mon Sep 17 00:00:00 2001 From: RandomHB Date: Tue, 12 Mar 2024 01:17:10 -0400 Subject: [PATCH 022/384] Update fingerprints.py 2022 Ford F-150 PowerBoost (fwdCamera) (#31462) * Update fingerprints.py 2022 Ford F-150 PowerBoost (fwdCamera) * update MY * also likely works for hybrid * fix that --------- Co-authored-by: Shane Smiskol --- selfdrive/car/ford/fingerprints.py | 1 + selfdrive/car/ford/values.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index c32a982d78..8b643f8997 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -86,6 +86,7 @@ FW_VERSIONS = { ], (Ecu.fwdCamera, 0x706, None): [ b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'ML3T-14H102-ABR\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, CAR.F_150_LIGHTNING_MK1: { diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 7b46e82abb..09c02d53a6 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -114,8 +114,8 @@ class CAR(Platforms): F_150_MK14 = FordCANFDPlatformConfig( "FORD F-150 14TH GEN", [ - FordCarInfo("Ford F-150 2023", "Co-Pilot360 Active 2.0"), - FordCarInfo("Ford F-150 Hybrid 2023", "Co-Pilot360 Active 2.0"), + FordCarInfo("Ford F-150 2022-23", "Co-Pilot360 Active 2.0"), + FordCarInfo("Ford F-150 Hybrid 2022-23", "Co-Pilot360 Active 2.0"), ], CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), ) From 398eaf5b5549a6ba8ba270402260bcd4faf09848 Mon Sep 17 00:00:00 2001 From: Joshua Mack Date: Tue, 12 Mar 2024 01:35:42 -0400 Subject: [PATCH 023/384] Mazda CX-5 2024 Fingerprint (#30882) 2024 Mazda CX-5 FP Added "aaaa_51443"'s 2024 Mazda CX-5's FPs --- selfdrive/car/mazda/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/mazda/fingerprints.py b/selfdrive/car/mazda/fingerprints.py index 292f407935..8143ad71af 100644 --- a/selfdrive/car/mazda/fingerprints.py +++ b/selfdrive/car/mazda/fingerprints.py @@ -10,6 +10,7 @@ FW_VERSIONS = { ], (Ecu.engine, 0x7e0, None): [ b'PEW5-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PW67-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2G-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2H-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2H-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -31,6 +32,7 @@ FW_VERSIONS = { ], (Ecu.transmission, 0x7e1, None): [ b'PG69-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PW66-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PXDL-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PXFG-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PXFG-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', From 639d8dd75598474a0a2246ee399f4ebf24032eb1 Mon Sep 17 00:00:00 2001 From: pg3141 Date: Tue, 12 Mar 2024 07:42:11 +0200 Subject: [PATCH 024/384] Skoda Kodiaq Sportline 2023 fingerprints (#30845) * Update fingerprints.py for new skoda kodiaq * Update fingerprints.py to add 2 more ecu's found in the carFw array that had hyundai as brand * Update fingerprints.py --- selfdrive/car/volkswagen/fingerprints.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 416cbb6ad0..d0b5dc81ab 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -993,6 +993,7 @@ FW_VERSIONS = { b'\xf1\x8704L906026HT\xf1\x893617', b'\xf1\x8705E906018DJ\xf1\x890915', b'\xf1\x8705E906018DJ\xf1\x891903', + b'\xf1\x8705L906022GM\xf1\x893411', b'\xf1\x875NA906259E \xf1\x890003', b'\xf1\x875NA907115E \xf1\x890003', b'\xf1\x875NA907115E \xf1\x890005', @@ -1006,6 +1007,7 @@ FW_VERSIONS = { b'\xf1\x870DL300012N \xf1\x892110', b'\xf1\x870DL300013G \xf1\x892119', b'\xf1\x870GC300014N \xf1\x892801', + b'\xf1\x870GC300018S \xf1\x892803', b'\xf1\x870GC300019H \xf1\x892806', b'\xf1\x870GC300046Q \xf1\x892802', ], @@ -1018,6 +1020,7 @@ FW_VERSIONS = { b'\xf1\x873Q0959655CQ\xf1\x890720\xf1\x82\x0e1213111211001205212112052111', b'\xf1\x873Q0959655DJ\xf1\x890731\xf1\x82\x0e1513001511001205232113052J00', b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100010200--1121240749', + b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100010200--1121246149', ], (Ecu.eps, 0x712, None): [ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6050405', @@ -1025,6 +1028,7 @@ FW_VERSIONS = { b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6070405', b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T600G500', b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T600G600', + b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x0025T6BA25OM', b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x002LT61A2LOM', ], (Ecu.fwdRadar, 0x757, None): [ From b648db6efe03101280465b4410acb2bb9a092f35 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 01:50:16 -0400 Subject: [PATCH 025/384] HKG: Add FW versions for Genesis G70 2023 (#30759) * HKG: Add FW versions for Genesis G70 2021 * bump model year --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 2 +- selfdrive/car/hyundai/fingerprints.py | 5 +++++ selfdrive/car/hyundai/values.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 6ed1ba7e62..13381ec202 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -51,7 +51,7 @@ A supported vehicle is one that just works when you install a comma device. All |Ford|Maverick Hybrid 2022|LARIAT Luxury|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Maverick Hybrid 2023-24|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G70 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G70 2020|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G70 2020-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G90 2017-18|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 6349318fbf..63b66c2684 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -836,10 +836,12 @@ FW_VERSIONS = { b'\xf1\x00IK MDPS R 1.00 1.07 57700-G9420 4I4VL107', b'\xf1\x00IK MDPS R 1.00 1.08 57700-G9200 4I2CL108', b'\xf1\x00IK MDPS R 1.00 1.08 57700-G9420 4I4VL108', + b'\xf1\x00IK MDPS R 1.00 5.09 57700-G9520 4I4VL509', ], (Ecu.transmission, 0x7e1, None): [ b'\x00\x00\x00\x00\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T33NB4\xecE\xefL', b'\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T20KB3Wuvz', + b'\xf1\x00bcsh8p54 E31\x00\x00\x00\x00\x00\x00\x00SIK0T33NH0\x0f\xa3Y*', b'\xf1\x87VCJLP18407832DN3\x88vXfvUVT\x97eFU\x87d7v\x88eVeveFU\x89\x98\x7f\xff\xb2\xb0\xf1\x81E25\x00\x00\x00', b'\xf1\x87VDJLC18480772DK9\x88eHfwfff\x87eFUeDEU\x98eFe\x86T5DVyo\xff\x87s\xf1\x81E25\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T33KB5\x9f\xa5&\x81', b'\xf1\x87VDKLT18912362DN4wfVfwefeveVUwfvw\x88vWfvUFU\x89\xa9\x8f\xff\x87w\xf1\x81E25\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T33NB4\xecE\xefL', @@ -847,16 +849,19 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 ', b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 \xf1\xa01.02', + b'\xf1\x00IK__ SCC FHCUP 1.00 1.00 99110-G9300 ', b'\xf1\x00IK__ SCC FHCUP 1.00 1.02 96400-G9000 ', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00IK MFC AT KOR LHD 1.00 1.01 95740-G9000 170920', b'\xf1\x00IK MFC AT USA LHD 1.00 1.01 95740-G9000 170920', + b'\xf1\x00IK MFC AT USA LHD 1.00 1.04 99211-G9000 220401', ], (Ecu.engine, 0x7e0, None): [ b'\xf1\x81606G2051\x00\x00\x00\x00\x00\x00\x00\x00', b'\xf1\x81640H0051\x00\x00\x00\x00\x00\x00\x00\x00', b'\xf1\x81640J0051\x00\x00\x00\x00\x00\x00\x00\x00', + b'\xf1\x81640N2051\x00\x00\x00\x00\x00\x00\x00\x00', ], }, CAR.GENESIS_G80: { diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index e79da0f473..79cec1f787 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -569,7 +569,7 @@ class CAR(Platforms): ) GENESIS_G70_2020 = HyundaiPlatformConfig( "GENESIS G70 2020", - HyundaiCarInfo("Genesis G70 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + HyundaiCarInfo("Genesis G70 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9), flags=HyundaiFlags.MANDO_RADAR, ) From 4f02bcfbf45697c5e6ba0a032797f6b2f37e16d3 Mon Sep 17 00:00:00 2001 From: Saber <81108166+Saber422@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:54:05 +0800 Subject: [PATCH 026/384] VW MQB: Add FW for 2017 Touran (#30863) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit route name:0bbe367c98fa1538|2023-12-28--15-59-10--0 --- selfdrive/car/volkswagen/fingerprints.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index d0b5dc81ab..c05451b8ed 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -636,14 +636,17 @@ FW_VERSIONS = { }, CAR.TOURAN_MK2: { (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906027HQ\xf1\x893746', b'\xf1\x8704L906026HM\xf1\x893017', b'\xf1\x8705E906018CQ\xf1\x890808', ], (Ecu.transmission, 0x7e1, None): [ b'\xf1\x870CW300041E \xf1\x891005', + b'\xf1\x870CW300041Q \xf1\x891606', b'\xf1\x870CW300051M \xf1\x891926', ], (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x1336350021353335314132014730479333313100', b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x13363500213533353141324C4732479333313100', b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1336350021353336314740025250529333613100', ], @@ -653,6 +656,7 @@ FW_VERSIONS = { ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x875Q0907572R \xf1\x890771', b'\xf1\x873Q0907572C \xf1\x890195', ], }, From 1e86269ab745a7e12d949f5470c342dff7c1c851 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 11 Mar 2024 23:04:32 -0700 Subject: [PATCH 027/384] Update ref_commit --- selfdrive/test/process_replay/ref_commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 0eedc6257b..91e32036b5 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -fba62008efd13fb578de325f0cdb0a87fe5e28f0 \ No newline at end of file +4f02bcfbf45697c5e6ba0a032797f6b2f37e16d3 From e657afbf340d159e8c52929fa41572bca3848ff9 Mon Sep 17 00:00:00 2001 From: Saber <81108166+Saber422@users.noreply.github.com> Date: Tue, 12 Mar 2024 14:21:45 +0800 Subject: [PATCH 028/384] VW MQB: Add FW for 2017 Kodiaq (#31368) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit route name:0bbe367c98fa1538|2024-02-08--11-02-38--0 --- selfdrive/car/volkswagen/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index c05451b8ed..858f2dff82 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -999,6 +999,7 @@ FW_VERSIONS = { b'\xf1\x8705E906018DJ\xf1\x891903', b'\xf1\x8705L906022GM\xf1\x893411', b'\xf1\x875NA906259E \xf1\x890003', + b'\xf1\x875NA907115D \xf1\x890003', b'\xf1\x875NA907115E \xf1\x890003', b'\xf1\x875NA907115E \xf1\x890005', b'\xf1\x8783A907115E \xf1\x890001', @@ -1007,6 +1008,7 @@ FW_VERSIONS = { b'\xf1\x870D9300014S \xf1\x895201', b'\xf1\x870D9300043 \xf1\x895202', b'\xf1\x870DL300011N \xf1\x892014', + b'\xf1\x870DL300012G \xf1\x892006', b'\xf1\x870DL300012M \xf1\x892107', b'\xf1\x870DL300012N \xf1\x892110', b'\xf1\x870DL300013G \xf1\x892119', @@ -1016,6 +1018,7 @@ FW_VERSIONS = { b'\xf1\x870GC300046Q \xf1\x892802', ], (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655AN\xf1\x890306\xf1\x82\r11110011110011031111310311', b'\xf1\x873Q0959655AP\xf1\x890306\xf1\x82\r11110011110011421111314211', b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1213001211001205212111052100', b'\xf1\x873Q0959655BJ\xf1\x890703\xf1\x82\x0e1213001211001205212111052100', From af177f3d10d03222aab403b625da5d5c315ec9fb Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 11 Mar 2024 23:43:25 -0700 Subject: [PATCH 029/384] [bot] Fingerprints: add missing FW versions from new users (#31839) Export fingerprints --- selfdrive/car/ford/fingerprints.py | 2 +- selfdrive/car/hyundai/fingerprints.py | 8 ++++++++ selfdrive/car/volkswagen/fingerprints.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index 8b643f8997..fae529aa00 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -85,8 +85,8 @@ FW_VERSIONS = { b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdCamera, 0x706, None): [ - b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'ML3T-14H102-ABR\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, CAR.F_150_LIGHTNING_MK1: { diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 63b66c2684..12303f806a 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -535,25 +535,31 @@ FW_VERSIONS = { CAR.SANTA_FE_HEV_2022: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00TMhe SCC FHCUP 1.00 1.00 99110-CL500 ', + b'\xf1\x00TMhe SCC FHCUP 1.00 1.01 99110-CL500 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102', b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102', b'\xf1\x00TM MDPS C 1.00 1.02 56310-GA000 4TSHA100', b'\xf1\x00TM MDPS R 1.00 1.05 57700-CL000 4TSHP105', + b'\xf1\x00TM MDPS R 1.00 1.06 57700-CL000 4TSHP106', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00TMA MFC AT USA LHD 1.00 1.03 99211-S2500 220414', b'\xf1\x00TMH MFC AT EUR LHD 1.00 1.06 99211-S1500 220727', + b'\xf1\x00TMH MFC AT KOR LHD 1.00 1.06 99211-S1500 220727', b'\xf1\x00TMH MFC AT USA LHD 1.00 1.03 99211-S1500 210224', + b'\xf1\x00TMH MFC AT USA LHD 1.00 1.05 99211-S1500 220126', b'\xf1\x00TMH MFC AT USA LHD 1.00 1.06 99211-S1500 220727', ], (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2H16KA1\xc6\x15Q\x1e', b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2H16SA3\xa3\x1b\xe14', b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2H16UA3I\x94\xac\x8f', b'\xf1\x87959102T250\x00\x00\x00\x00\x00\xf1\x81E14\x00\x00\x00\x00\x00\x00\x00\xf1\x00PSBG2333 E14\x00\x00\x00\x00\x00\x00\x00TTM2H16SA2\x80\xd7l\xb2', ], (Ecu.engine, 0x7e0, None): [ + b'\xf1\x87391312MTA0', b'\xf1\x87391312MTC1', b'\xf1\x87391312MTE0', b'\xf1\x87391312MTL0', @@ -561,6 +567,7 @@ FW_VERSIONS = { }, CAR.SANTA_FE_PHEV_2022: { (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00TMhe SCC F-CUP 1.00 1.00 99110-CL500 ', b'\xf1\x00TMhe SCC FHCUP 1.00 1.01 99110-CL500 ', b'\xf1\x8799110CL500\xf1\x00TMhe SCC FHCUP 1.00 1.00 99110-CL500 ', ], @@ -574,6 +581,7 @@ FW_VERSIONS = { b'\xf1\x00TMP MFC AT USA LHD 1.00 1.06 99211-S1500 220727', ], (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2P16SA0o\x88^\xbe', b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2P16SA1\x0b\xc5\x0f\xea', b'\xf1\x8795441-3D121\x00\xf1\x81E16\x00\x00\x00\x00\x00\x00\x00\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2P16SA0o\x88^\xbe', b'\xf1\x8795441-3D121\x00\xf1\x81E16\x00\x00\x00\x00\x00\x00\x00\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2P16SA1\x0b\xc5\x0f\xea', diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 858f2dff82..c530288027 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -656,8 +656,8 @@ FW_VERSIONS = { ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x872Q0907572AA\xf1\x890396', - b'\xf1\x875Q0907572R \xf1\x890771', b'\xf1\x873Q0907572C \xf1\x890195', + b'\xf1\x875Q0907572R \xf1\x890771', ], }, CAR.TRANSPORTER_T61: { From de7f14dbd7f0f127f5903f10ed610da829eb67e6 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 12 Mar 2024 11:50:26 -0700 Subject: [PATCH 030/384] Fingerprints migration dictionary (#31838) move migration to op! --- selfdrive/car/fingerprints.py | 74 ++++++++++++++++++++++ selfdrive/debug/test_fw_query_on_routes.py | 6 +- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/fingerprints.py b/selfdrive/car/fingerprints.py index 6a7c3c75be..eaf9002dcd 100644 --- a/selfdrive/car/fingerprints.py +++ b/selfdrive/car/fingerprints.py @@ -1,4 +1,8 @@ from openpilot.selfdrive.car.interfaces import get_interface_attr +from openpilot.selfdrive.car.honda.values import CAR as HONDA +from openpilot.selfdrive.car.hyundai.values import CAR as HYUNDAI +from openpilot.selfdrive.car.toyota.values import CAR as TOYOTA +from openpilot.selfdrive.car.volkswagen.values import CAR as VW FW_VERSIONS = get_interface_attr('FW_VERSIONS', combine_brands=True, ignore_none=True) _FINGERPRINTS = get_interface_attr('FINGERPRINTS', combine_brands=True, ignore_none=True) @@ -44,3 +48,73 @@ def all_known_cars(): def all_legacy_fingerprint_cars(): """Returns a list of all known car strings, FPv1 only.""" return list(_FINGERPRINTS.keys()) + + +# A dict that maps old platform strings to their latest representations +MIGRATION = { + "ACURA ILX 2016 ACURAWATCH PLUS": HONDA.ACURA_ILX, + "ACURA RDX 2018 ACURAWATCH PLUS": HONDA.ACURA_RDX, + "ACURA RDX 2020 TECH": HONDA.ACURA_RDX_3G, + "AUDI A3": VW.AUDI_A3_MK3, + "HONDA ACCORD 2018 HYBRID TOURING": HONDA.ACCORD, + "HONDA ACCORD 1.5T 2018": HONDA.ACCORD, + "HONDA ACCORD 2018 LX 1.5T": HONDA.ACCORD, + "HONDA ACCORD 2018 SPORT 2T": HONDA.ACCORD, + "HONDA ACCORD 2T 2018": HONDA.ACCORD, + "HONDA ACCORD HYBRID 2018": HONDA.ACCORD, + "HONDA CIVIC 2016 TOURING": HONDA.CIVIC, + "HONDA CIVIC HATCHBACK 2017 SEDAN/COUPE 2019": HONDA.CIVIC_BOSCH, + "HONDA CIVIC SEDAN 1.6 DIESEL": HONDA.CIVIC_BOSCH_DIESEL, + "HONDA CR-V 2016 EXECUTIVE": HONDA.CRV_EU, + "HONDA CR-V 2016 TOURING": HONDA.CRV, + "HONDA CR-V 2017 EX": HONDA.CRV_5G, + "HONDA CR-V 2019 HYBRID": HONDA.CRV_HYBRID, + "HONDA FIT 2018 EX": HONDA.FIT, + "HONDA HRV 2019 TOURING": HONDA.HRV, + "HONDA INSIGHT 2019 TOURING": HONDA.INSIGHT, + "HONDA ODYSSEY 2018 EX-L": HONDA.ODYSSEY, + "HONDA ODYSSEY 2019 EXCLUSIVE CHN": HONDA.ODYSSEY_CHN, + "HONDA PILOT 2017 TOURING": HONDA.PILOT, + "HONDA PILOT 2019 ELITE": HONDA.PILOT, + "HONDA PILOT 2019": HONDA.PILOT, + "HONDA PASSPORT 2021": HONDA.PILOT, + "HONDA RIDGELINE 2017 BLACK EDITION": HONDA.RIDGELINE, + "HYUNDAI ELANTRA LIMITED ULTIMATE 2017": HYUNDAI.ELANTRA, + "HYUNDAI SANTA FE LIMITED 2019": HYUNDAI.SANTA_FE, + "HYUNDAI TUCSON DIESEL 2019": HYUNDAI.TUCSON, + "KIA OPTIMA 2016": HYUNDAI.KIA_OPTIMA_G4, + "KIA OPTIMA 2019": HYUNDAI.KIA_OPTIMA_G4_FL, + "KIA OPTIMA SX 2019 & 2016": HYUNDAI.KIA_OPTIMA_G4_FL, + "LEXUS CT 200H 2018": TOYOTA.LEXUS_CTH, + "LEXUS ES 300H 2018": TOYOTA.LEXUS_ES, + "LEXUS ES 300H 2019": TOYOTA.LEXUS_ES_TSS2, + "LEXUS IS300 2018": TOYOTA.LEXUS_IS, + "LEXUS NX300 2018": TOYOTA.LEXUS_NX, + "LEXUS NX300H 2018": TOYOTA.LEXUS_NX, + "LEXUS RX 350 2016": TOYOTA.LEXUS_RX, + "LEXUS RX350 2020": TOYOTA.LEXUS_RX_TSS2, + "LEXUS RX450 HYBRID 2020": TOYOTA.LEXUS_RX_TSS2, + "TOYOTA SIENNA XLE 2018": TOYOTA.SIENNA, + "TOYOTA C-HR HYBRID 2018": TOYOTA.CHR, + "TOYOTA COROLLA HYBRID TSS2 2019": TOYOTA.COROLLA_TSS2, + "TOYOTA RAV4 HYBRID 2019": TOYOTA.RAV4_TSS2, + "LEXUS ES HYBRID 2019": TOYOTA.LEXUS_ES_TSS2, + "LEXUS NX HYBRID 2018": TOYOTA.LEXUS_NX, + "LEXUS NX HYBRID 2020": TOYOTA.LEXUS_NX_TSS2, + "LEXUS RX HYBRID 2020": TOYOTA.LEXUS_RX_TSS2, + "TOYOTA ALPHARD HYBRID 2021": TOYOTA.ALPHARD_TSS2, + "TOYOTA AVALON HYBRID 2019": TOYOTA.AVALON_2019, + "TOYOTA AVALON HYBRID 2022": TOYOTA.AVALON_TSS2, + "TOYOTA CAMRY HYBRID 2018": TOYOTA.CAMRY, + "TOYOTA CAMRY HYBRID 2021": TOYOTA.CAMRY_TSS2, + "TOYOTA C-HR HYBRID 2022": TOYOTA.CHR_TSS2, + "TOYOTA HIGHLANDER HYBRID 2020": TOYOTA.HIGHLANDER_TSS2, + "TOYOTA RAV4 HYBRID 2022": TOYOTA.RAV4_TSS2_2022, + "TOYOTA RAV4 HYBRID 2023": TOYOTA.RAV4_TSS2_2023, + "TOYOTA HIGHLANDER HYBRID 2018": TOYOTA.HIGHLANDER, + "LEXUS ES HYBRID 2018": TOYOTA.LEXUS_ES, + "LEXUS RX HYBRID 2017": TOYOTA.LEXUS_RX, + "HYUNDAI TUCSON HYBRID 4TH GEN": HYUNDAI.TUCSON_4TH_GEN, + "KIA SPORTAGE HYBRID 5TH GEN": HYUNDAI.KIA_SPORTAGE_5TH_GEN, + "KIA SORENTO PLUG-IN HYBRID 4TH GEN": HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, +} diff --git a/selfdrive/debug/test_fw_query_on_routes.py b/selfdrive/debug/test_fw_query_on_routes.py index cc6fc2ae17..3c5733520e 100755 --- a/selfdrive/debug/test_fw_query_on_routes.py +++ b/selfdrive/debug/test_fw_query_on_routes.py @@ -9,6 +9,7 @@ from tqdm import tqdm from openpilot.tools.lib.logreader import LogReader, ReadMode from openpilot.tools.lib.route import SegmentRange from openpilot.selfdrive.car.car_helpers import interface_names +from openpilot.selfdrive.car.fingerprints import MIGRATION from openpilot.selfdrive.car.fw_versions import VERSIONS, match_fw_to_car @@ -17,11 +18,6 @@ SUPPORTED_BRANDS = VERSIONS.keys() SUPPORTED_CARS = [brand for brand in SUPPORTED_BRANDS for brand in interface_names[brand]] UNKNOWN_BRAND = "unknown" -try: - from xx.pipeline.lib.fingerprint import MIGRATION -except ImportError: - MIGRATION = {} - if __name__ == "__main__": parser = argparse.ArgumentParser(description='Run FW fingerprint on Qlog of route or list of routes') parser.add_argument('route', help='Route or file with list of routes') From c155749b29cacdd86d2fad90506dc2e276f99e04 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 12 Mar 2024 14:27:12 -0700 Subject: [PATCH 031/384] Reapply "ui: brighten cameraview (#29744)" (#31846) This reverts commit 023792c431828baa67e63012db55db77f9e8e02b. --- selfdrive/ui/qt/widgets/cameraview.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/ui/qt/widgets/cameraview.cc b/selfdrive/ui/qt/widgets/cameraview.cc index 7b1f2f1d24..7818da8669 100644 --- a/selfdrive/ui/qt/widgets/cameraview.cc +++ b/selfdrive/ui/qt/widgets/cameraview.cc @@ -41,6 +41,8 @@ const char frame_fragment_shader[] = "out vec4 colorOut;\n" "void main() {\n" " colorOut = texture(uTexture, vTexCoord);\n" + // gamma to improve worst case visibility when dark + " colorOut.rgb = pow(colorOut.rgb, vec3(1.0/1.28));\n" "}\n"; #else #ifdef __APPLE__ From 4c76d1b9a0d790d2fcea36707adba0d3ba49a496 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 18:03:14 -0400 Subject: [PATCH 032/384] Chrysler: Parse distance button from steering wheel (#31764) --- selfdrive/car/chrysler/carstate.py | 6 ++++++ selfdrive/car/chrysler/interface.py | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/chrysler/carstate.py b/selfdrive/car/chrysler/carstate.py index eb1cf7e7d5..91b922c596 100644 --- a/selfdrive/car/chrysler/carstate.py +++ b/selfdrive/car/chrysler/carstate.py @@ -21,10 +21,16 @@ class CarState(CarStateBase): else: self.shifter_values = can_define.dv["GEAR"]["PRNDL"] + self.prev_distance_button = 0 + self.distance_button = 0 + def update(self, cp, cp_cam): ret = car.CarState.new_message() + self.prev_distance_button = self.distance_button + self.distance_button = cp.vl["CRUISE_BUTTONS"]["ACC_Distance_Dec"] + # lock info ret.doorOpen = any([cp.vl["BCM_1"]["DOOR_OPEN_FL"], cp.vl["BCM_1"]["DOOR_OPEN_FR"], diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index eb40bc6f6e..198bf63b10 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -1,10 +1,12 @@ #!/usr/bin/env python3 from cereal import car from panda import Panda -from openpilot.selfdrive.car import get_safety_config +from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.chrysler.values import CAR, RAM_HD, RAM_DT, RAM_CARS, ChryslerFlags from openpilot.selfdrive.car.interfaces import CarInterfaceBase +ButtonType = car.CarState.ButtonEvent.Type + class CarInterface(CarInterfaceBase): @staticmethod @@ -76,6 +78,8 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) + ret.buttonEvents = create_button_events(self.CS.distance_button, self.CS.prev_distance_button, {1: ButtonType.gapAdjustCruise}) + # events events = self.create_common_events(ret, extra_gears=[car.CarState.GearShifter.low]) From 30ce6af49057a4e416c9924ad1283e9ae09e7df6 Mon Sep 17 00:00:00 2001 From: YassineYousfi Date: Tue, 12 Mar 2024 15:29:49 -0700 Subject: [PATCH 033/384] camera: add all_cams iterator, allow None camera, add camera size property (#31835) * camera: add neo_config for easy access * camera: add all_cams iterator and cam size * can be none * use FakeCameraConfig * rename to None --- common/transformations/camera.py | 36 +++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/common/transformations/camera.py b/common/transformations/camera.py index 1a7b9c3f80..dc3ca5f388 100644 --- a/common/transformations/camera.py +++ b/common/transformations/camera.py @@ -11,6 +11,10 @@ class CameraConfig: height: int focal_length: float + @property + def size(self): + return (self.width, self.height) + @property def intrinsics(self): # aka 'K' aka camera_frame_from_view_frame @@ -25,33 +29,45 @@ class CameraConfig: # aka 'K_inv' aka view_frame_from_camera_frame return np.linalg.inv(self.intrinsics) +@dataclass(frozen=True) +class _NoneCameraConfig(CameraConfig): + width: int = 0 + height: int = 0 + focal_length: float = 0 + @dataclass(frozen=True) class DeviceCameraConfig: fcam: CameraConfig dcam: CameraConfig ecam: CameraConfig -ar_ox_fisheye = CameraConfig(1928, 1208, 567.0) # focal length probably wrong? magnification is not consistent across frame -ar_ox_config = DeviceCameraConfig(CameraConfig(1928, 1208, 2648.0), ar_ox_fisheye, ar_ox_fisheye) -os_fisheye = CameraConfig(2688, 1520, 567.0 / 2 * 3) -os_config = DeviceCameraConfig(CameraConfig(2688, 1520, 2648.0 * 2 / 3), os_fisheye, os_fisheye) + def all_cams(self): + for cam in ['fcam', 'dcam', 'ecam']: + if not isinstance(getattr(self, cam), _NoneCameraConfig): + yield cam, getattr(self, cam) + +_ar_ox_fisheye = CameraConfig(1928, 1208, 567.0) # focal length probably wrong? magnification is not consistent across frame +_os_fisheye = CameraConfig(2688, 1520, 567.0 / 2 * 3) +_ar_ox_config = DeviceCameraConfig(CameraConfig(1928, 1208, 2648.0), _ar_ox_fisheye, _ar_ox_fisheye) +_os_config = DeviceCameraConfig(CameraConfig(2688, 1520, 2648.0 * 2 / 3), _os_fisheye, _os_fisheye) +_neo_config = DeviceCameraConfig(CameraConfig(1164, 874, 910.0), CameraConfig(816, 612, 650.0), _NoneCameraConfig()) DEVICE_CAMERAS = { # A "device camera" is defined by a device type and sensor # sensor type was never set on eon/neo/two - ("neo", "unknown"): DeviceCameraConfig(CameraConfig(1164, 874, 910.0), CameraConfig(816, 612, 650.0), CameraConfig(0, 0, 0.)), + ("neo", "unknown"): _neo_config, # unknown here is AR0231, field was added with OX03C10 support - ("tici", "unknown"): ar_ox_config, + ("tici", "unknown"): _ar_ox_config, # before deviceState.deviceType was set, assume tici AR config - ("unknown", "ar0231"): ar_ox_config, - ("unknown", "ox03c10"): ar_ox_config, + ("unknown", "ar0231"): _ar_ox_config, + ("unknown", "ox03c10"): _ar_ox_config, # simulator (emulates a tici) - ("pc", "unknown"): ar_ox_config, + ("pc", "unknown"): _ar_ox_config, } -prods = itertools.product(('tici', 'tizi', 'mici'), (('ar0231', ar_ox_config), ('ox03c10', ar_ox_config), ('os04c10', os_config))) +prods = itertools.product(('tici', 'tizi', 'mici'), (('ar0231', _ar_ox_config), ('ox03c10', _ar_ox_config), ('os04c10', _os_config))) DEVICE_CAMERAS.update({(d, c[0]): c[1] for d, c in prods}) # device/mesh : x->forward, y-> right, z->down From 147ccc7a582518e565755262e36799b540b5ddf7 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 12 Mar 2024 17:13:13 -0700 Subject: [PATCH 034/384] move pigeond to system/ubloxd/ (#31848) * move pigeond to system/ubloxd/ * update release * more * mv test --- Jenkinsfile | 2 +- release/files_common | 2 +- selfdrive/manager/process_config.py | 2 +- selfdrive/test/test_onroad.py | 2 +- system/{sensord => ubloxd}/pigeond.py | 0 system/{sensord => ubloxd}/tests/test_pigeond.py | 0 6 files changed, 4 insertions(+), 4 deletions(-) rename system/{sensord => ubloxd}/pigeond.py (100%) rename system/{sensord => ubloxd}/tests/test_pigeond.py (100%) diff --git a/Jenkinsfile b/Jenkinsfile index d716510bfe..4afb3964f7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -194,7 +194,7 @@ node { ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], ["test power draw", "pytest -s system/hardware/tici/tests/test_power_draw.py"], ["test encoder", "LD_LIBRARY_PATH=/usr/local/lib pytest system/loggerd/tests/test_encoder.py"], - ["test pigeond", "pytest system/sensord/tests/test_pigeond.py"], + ["test pigeond", "pytest system/ubloxd/tests/test_pigeond.py"], ["test manager", "pytest selfdrive/manager/test/test_manager.py"], ]) }, diff --git a/release/files_common b/release/files_common index e483620052..94af70eff2 100644 --- a/release/files_common +++ b/release/files_common @@ -182,6 +182,7 @@ system/hardware/pc/hardware.py system/ubloxd/.gitignore system/ubloxd/SConscript +system/ubloxd/pigeond.py system/ubloxd/generated/* system/ubloxd/*.h system/ubloxd/*.cc @@ -241,7 +242,6 @@ system/sensord/SConscript system/sensord/sensors_qcom2.cc system/sensord/sensors/*.cc system/sensord/sensors/*.h -system/sensord/pigeond.py system/webrtc/__init__.py system/webrtc/webrtcd.py diff --git a/selfdrive/manager/process_config.py b/selfdrive/manager/process_config.py index 4f292917fd..5c8dffb2be 100644 --- a/selfdrive/manager/process_config.py +++ b/selfdrive/manager/process_config.py @@ -73,7 +73,7 @@ procs = [ PythonProcess("pandad", "selfdrive.boardd.pandad", always_run), PythonProcess("paramsd", "selfdrive.locationd.paramsd", only_onroad), NativeProcess("ubloxd", "system/ubloxd", ["./ubloxd"], ublox, enabled=TICI), - PythonProcess("pigeond", "system.sensord.pigeond", ublox, enabled=TICI), + PythonProcess("pigeond", "system.ubloxd.pigeond", ublox, enabled=TICI), PythonProcess("plannerd", "selfdrive.controls.plannerd", only_onroad), PythonProcess("radard", "selfdrive.controls.radard", only_onroad), PythonProcess("thermald", "selfdrive.thermald.thermald", always_run), diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 4be9b8a430..250534bf86 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -65,7 +65,7 @@ PROCS.update({ "tici": { "./boardd": 4.0, "./ubloxd": 0.02, - "system.sensord.pigeond": 6.0, + "system.ubloxd.pigeond": 6.0, }, "tizi": { "./boardd": 19.0, diff --git a/system/sensord/pigeond.py b/system/ubloxd/pigeond.py similarity index 100% rename from system/sensord/pigeond.py rename to system/ubloxd/pigeond.py diff --git a/system/sensord/tests/test_pigeond.py b/system/ubloxd/tests/test_pigeond.py similarity index 100% rename from system/sensord/tests/test_pigeond.py rename to system/ubloxd/tests/test_pigeond.py From a8192920737216fe07bd2f273efdee67669b8483 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 12 Mar 2024 23:04:17 -0400 Subject: [PATCH 035/384] logreader: fix auto source + interactive modes (#31847) * interactive modes * these exceptions don't matter --- tools/lib/logreader.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 7a1e972e19..669c1520db 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -89,7 +89,7 @@ def default_valid_file(fn: LogPath) -> bool: def auto_strategy(rlog_paths: LogPaths, qlog_paths: LogPaths, interactive: bool, valid_file: ValidFileCallable) -> LogPaths: # auto select logs based on availability - if any(rlog is None or not valid_file(rlog) for rlog in rlog_paths): + if any(rlog is None or not valid_file(rlog) for rlog in rlog_paths) and all(qlog is not None and valid_file(qlog) for qlog in qlog_paths): if interactive: if input("Some rlogs were not found, would you like to fallback to qlogs for those segments? (y/n) ").lower() != "y": return rlog_paths @@ -172,6 +172,15 @@ def auto_source(sr: SegmentRange, mode=ReadMode.RLOG) -> LogPaths: SOURCES: list[Source] = [internal_source, openpilotci_source, comma_api_source, comma_car_segments_source,] exceptions = [] + + # for automatic fallback modes, auto_source needs to first check if rlogs exist for any source + if mode in [ReadMode.AUTO, ReadMode.AUTO_INTERACTIVE]: + for source in SOURCES: + try: + return check_source(source, sr, ReadMode.RLOG) + except Exception: + pass + # Automatically determine viable source for source in SOURCES: try: From 4af932b74b95c99abc9d49c31dc0a023702a77d0 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 12 Mar 2024 22:33:45 -0700 Subject: [PATCH 036/384] unicore gps (#31852) * ugpsd * oops * cleanup * disable * more docs --------- Co-authored-by: Comma Device --- selfdrive/manager/process_config.py | 1 + system/qcomgpsd/cgpsd.py | 122 -------------------- system/ugpsd.py | 165 ++++++++++++++++++++++++++++ 3 files changed, 166 insertions(+), 122 deletions(-) delete mode 100755 system/qcomgpsd/cgpsd.py create mode 100755 system/ugpsd.py diff --git a/selfdrive/manager/process_config.py b/selfdrive/manager/process_config.py index 5c8dffb2be..8b616b7874 100644 --- a/selfdrive/manager/process_config.py +++ b/selfdrive/manager/process_config.py @@ -69,6 +69,7 @@ procs = [ PythonProcess("deleter", "system.loggerd.deleter", always_run), PythonProcess("dmonitoringd", "selfdrive.monitoring.dmonitoringd", driverview, enabled=(not PC or WEBCAM)), PythonProcess("qcomgpsd", "system.qcomgpsd.qcomgpsd", qcomgps, enabled=TICI), + #PythonProcess("ugpsd", "system.ugpsd", only_onroad, enabled=TICI), PythonProcess("navd", "selfdrive.navd.navd", only_onroad), PythonProcess("pandad", "selfdrive.boardd.pandad", always_run), PythonProcess("paramsd", "selfdrive.locationd.paramsd", only_onroad), diff --git a/system/qcomgpsd/cgpsd.py b/system/qcomgpsd/cgpsd.py deleted file mode 100755 index 54d3c623f3..0000000000 --- a/system/qcomgpsd/cgpsd.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python3 -import time -import datetime -from collections import defaultdict - -from cereal import log -import cereal.messaging as messaging -from openpilot.common.swaglog import cloudlog -from openpilot.system.qcomgpsd.qcomgpsd import at_cmd, wait_for_modem - -# https://campar.in.tum.de/twiki/pub/Chair/NaviGpsDemon/nmea.html#RMC -""" -AT+CGPSGPOS=1 -response: '$GNGGA,220212.00,3245.09188,N,11711.76362,W,1,06,24.54,0.0,M,,M,,*77' - -AT+CGPSGPOS=2 -response: '$GNGSA,A,3,06,17,19,22,,,,,,,,,14.11,8.95,10.91,1*01 -$GNGSA,A,3,29,26,,,,,,,,,,,14.11,8.95,10.91,4*03' - -AT+CGPSGPOS=3 -response: '$GPGSV,3,1,11,06,55,047,22,19,29,053,20,22,19,115,14,05,01,177,,0*68 -$GPGSV,3,2,11,11,77,156,23,12,47,322,17,17,08,066,10,20,25,151,,0*6D -$GPGSV,3,3,11,24,44,232,,25,16,312,,29,02,260,,0*5D' - -AT+CGPSGPOS=4 -response: '$GBGSV,1,1,03,26,75,242,20,29,19,049,16,35,,,24,0*7D' - -AT+CGPSGPOS=5 -response: '$GNRMC,220216.00,A,3245.09531,N,11711.76043,W,,,070324,,,A,V*20' -""" - - -def sfloat(n: str): - return float(n) if len(n) > 0 else 0 - -def checksum(s: str): - ret = 0 - for c in s[1:-3]: - ret ^= ord(c) - return format(ret, '02X') - -def main(): - wait_for_modem("AT+CGPS?") - - cmds = [ - "AT+GPSPORT=1", - "AT+CGPS=1", - ] - for c in cmds: - at_cmd(c) - - nmea = defaultdict(list) - pm = messaging.PubMaster(['gpsLocation']) - while True: - time.sleep(1) - try: - # TODO: read from streaming AT port instead of polling - out = at_cmd("AT+CGPS?") - - if '+CGPS: 1' not in out: - for c in cmds: - at_cmd(c) - - sentences = out.split("'")[1].splitlines() - new = {l.split(',')[0]: l.split(',') for l in sentences if l.startswith('$G')} - nmea.update(new) - if '$GNRMC' not in new: - print(f"no GNRMC:\n{out}\n") - continue - - # validate checksums - for s in nmea.values(): - sent = ','.join(s) - if checksum(sent) != s[-1].split('*')[1]: - cloudlog.error(f"invalid checksum: {repr(sent)}") - continue - - gnrmc = nmea['$GNRMC'] - #print(gnrmc) - - msg = messaging.new_message('gpsLocation', valid=True) - gps = msg.gpsLocation - gps.latitude = (sfloat(gnrmc[3][:2]) + (sfloat(gnrmc[3][2:]) / 60)) * (1 if gnrmc[4] == "N" else -2) - gps.longitude = (sfloat(gnrmc[5][:3]) + (sfloat(gnrmc[5][3:]) / 60)) * (1 if gnrmc[6] == "E" else -1) - - date = gnrmc[9][:6] - dt = datetime.datetime.strptime(f"{date} {gnrmc[1]}", '%d%m%y %H%M%S.%f') - gps.unixTimestampMillis = dt.timestamp()*1e3 - - gps.hasFix = gnrmc[1] == 'A' - - gps.source = log.GpsLocationData.SensorSource.unicore - - gps.speed = sfloat(gnrmc[7]) - gps.bearingDeg = sfloat(gnrmc[8]) - - if len(nmea['$GNGGA']): - gngga = nmea['$GNGGA'] - if gngga[10] == 'M': - gps.altitude = sfloat(gngga[9]) - - if len(nmea['$GNGSA']): - # TODO: this is only for GPS sats - gngsa = nmea['$GNGSA'] - gps.horizontalAccuracy = sfloat(gngsa[4]) - gps.verticalAccuracy = sfloat(gngsa[5]) - - # TODO: set these from the module - gps.bearingAccuracyDeg = 5. - gps.speedAccuracy = 3. - - # TODO: can we get this from the NMEA sentences? - #gps.vNED = vNED - - pm.send('gpsLocation', msg) - - except Exception: - cloudlog.exception("gps.issue") - - -if __name__ == "__main__": - main() diff --git a/system/ugpsd.py b/system/ugpsd.py new file mode 100755 index 0000000000..34b20b01c8 --- /dev/null +++ b/system/ugpsd.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +import os +import time +import traceback +import serial +import datetime +import numpy as np +from collections import defaultdict + +from cereal import log +import cereal.messaging as messaging +from openpilot.common.retry import retry +from openpilot.common.swaglog import cloudlog +from openpilot.system.qcomgpsd.qcomgpsd import at_cmd, wait_for_modem + + +def sfloat(n: str): + return float(n) if len(n) > 0 else 0 + +def checksum(s: str): + ret = 0 + for c in s[1:-3]: + ret ^= ord(c) + return format(ret, '02X') + +class Unicore: + def __init__(self): + self.s = serial.Serial('/dev/ttyHS0', 115200) + self.s.timeout = 1 + self.s.writeTimeout = 1 + self.s.newline = b'\r\n' + + self.s.flush() + self.s.reset_input_buffer() + self.s.reset_output_buffer() + self.s.read(2048) + + def send(self, cmd): + self.s.write(cmd.encode('utf8') + b'\r') + resp = self.s.read(2048) + print(len(resp), cmd, "\n", resp) + assert b"OK" in resp + + def recv(self): + return self.s.readline() + +def build_msg(state): + """ + NMEA sentences: + https://campar.in.tum.de/twiki/pub/Chair/NaviGpsDemon/nmea.html#RMC + NAV messages: + https://www.unicorecomm.com/assets/upload/file/UFirebird_Standard_Positioning_Products_Protocol_Specification_CH.pdf + """ + + msg = messaging.new_message('gpsLocation', valid=True) + gps = msg.gpsLocation + + gnrmc = state['$GNRMC'] + gps.hasFix = gnrmc[1] == 'A' + gps.source = log.GpsLocationData.SensorSource.unicore + gps.latitude = (sfloat(gnrmc[3][:2]) + (sfloat(gnrmc[3][2:]) / 60)) * (1 if gnrmc[4] == "N" else -1) + gps.longitude = (sfloat(gnrmc[5][:3]) + (sfloat(gnrmc[5][3:]) / 60)) * (1 if gnrmc[6] == "E" else -1) + + try: + date = gnrmc[9][:6] + dt = datetime.datetime.strptime(f"{date} {gnrmc[1]}", '%d%m%y %H%M%S.%f') + gps.unixTimestampMillis = dt.timestamp()*1e3 + except Exception: + pass + + gps.bearingDeg = sfloat(gnrmc[8]) + + if len(state['$GNGGA']): + gngga = state['$GNGGA'] + if gngga[10] == 'M': + gps.altitude = sfloat(gngga[9]) + + if len(state['$GNGSA']): + gngsa = state['$GNGSA'] + gps.horizontalAccuracy = sfloat(gngsa[4]) + gps.verticalAccuracy = sfloat(gngsa[5]) + + #if len(state['$NAVACC']): + # # $NAVVEL,264415000,5,3,0.375,0.141,-0.735,-65.450*2A + # navacc = state['$NAVACC'] + # gps.horizontalAccuracy = sfloat(navacc[3]) + # gps.speedAccuracy = sfloat(navacc[4]) + # gps.bearingAccuracyDeg = sfloat(navacc[5]) + + if len(state['$NAVVEL']): + # $NAVVEL,264415000,5,3,0.375,0.141,-0.735,-65.450*2A + navvel = state['$NAVVEL'] + vECEF = [ + sfloat(navvel[4]), + sfloat(navvel[5]), + sfloat(navvel[6]), + ] + + lat = np.radians(gps.latitude) + lon = np.radians(gps.longitude) + R = np.array([ + [-np.sin(lat) * np.cos(lon), -np.sin(lon), -np.cos(lat) * np.cos(lon)], + [-np.sin(lat) * np.sin(lon), np.cos(lon), -np.cos(lat) * np.sin(lon)], + [np.cos(lat), 0, -np.sin(lat)] + ]) + + vNED = [float(x) for x in R.dot(vECEF)] + gps.vNED = vNED + gps.speed = np.linalg.norm(vNED) + + # TODO: set these from the module + gps.bearingAccuracyDeg = 5. + gps.speedAccuracy = 3. + + return msg + + +@retry(attempts=10, delay=0.1) +def setup(u): + at_cmd('AT+CGPS=0') + at_cmd('AT+CGPS=1') + time.sleep(1.0) + + # setup NAVXXX outputs + for i in range(4): + u.send(f"$CFGMSG,1,{i},1") + for i in (1, 3): + u.send(f"$CFGMSG,3,{i},1") + + # 10Hz NAV outputs + u.send("$CFGNAV,100,100,1000") + + +def main(): + wait_for_modem("AT+CGPS?") + + u = Unicore() + setup(u) + + state = defaultdict(list) + pm = messaging.PubMaster(['gpsLocation']) + while True: + try: + msg = u.recv().decode('utf8').strip() + if "DEBUG" in os.environ: + print(repr(msg)) + + if len(msg) > 0: + if checksum(msg) != msg.split('*')[1]: + cloudlog.error(f"invalid checksum: {repr(msg)}") + continue + + k = msg.split(',')[0] + state[k] = msg.split(',') + if '$GNRMC' not in msg: + continue + + pm.send('gpsLocation', build_msg(state)) + except Exception: + traceback.print_exc() + cloudlog.exception("gps.issue") + + +if __name__ == "__main__": + main() From e34432160a8f583c757d867a4d09bf213b5da71d Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 12 Mar 2024 23:42:34 -0700 Subject: [PATCH 037/384] Honda Bosch Radarless: check nonAdaptive at all times (#31853) * doesn't work * Revert "doesn't work" This reverts commit 7a3587b60b65ed0525a9d658e676465ca8ecbef9. * always add to can parser * not sure if this is clean * minimal diff version, but more lines! --- selfdrive/car/honda/carstate.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py index 7784581e1c..d429da33fb 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -204,6 +204,10 @@ class CarState(CarStateBase): ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD.get(self.CP.carFingerprint, 1200) if self.CP.carFingerprint in HONDA_BOSCH: + # The PCM always manages its own cruise control state, but doesn't publish it + if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS: + ret.cruiseState.nonAdaptive = cp_cam.vl["ACC_HUD"]["CRUISE_CONTROL_LABEL"] != 0 + if not self.CP.openpilotLongitudinalControl: # ACC_HUD is on camera bus on radarless cars acc_hud = cp_cam.vl["ACC_HUD"] if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS else cp.vl["ACC_HUD"] @@ -276,9 +280,10 @@ class CarState(CarStateBase): ] if CP.carFingerprint in HONDA_BOSCH_RADARLESS: - messages.append(("LKAS_HUD", 10)) - if not CP.openpilotLongitudinalControl: - messages.append(("ACC_HUD", 10)) + messages += [ + ("ACC_HUD", 10), + ("LKAS_HUD", 10), + ] elif CP.carFingerprint not in HONDA_BOSCH: messages += [ From 29e55f99a54d95215aa79ecf94a22363f82913a6 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 13 Mar 2024 00:57:57 -0700 Subject: [PATCH 038/384] Move personality to controlsState (#31855) * start at param * start by sending personality * change to personality * POC: button changes personality * what's wrong with this? * fix * not really possible but fuzzy test catches this * there's always a typo * dang, we're dropping messages * clean up * no comment * bump * rename * not all cars yet * works but at what cost * clean up * inside settings * write param so we save the distance button changes * setChecked activates buttonToggled and already writes param! * don't need this, we update from longitudinalPlan on changes * some clean up * more * ui * allow some time for ui to receive and write param * plannerd: only track changes in case no ui * Revert "plannerd: only track changes in case no ui" This reverts commit 2b081aa6ceb92c67a621b74592b2292756d29871. * write in plannerd as well, I assume this is atomic? * don't write when setting checked (only user clicks) * better nane * more * Update selfdrive/controls/lib/longitudinal_planner.py Co-authored-by: Cameron Clough * doesn't write param now * ParamWatcher is nice * no debug * Update translations * fix * odd drain sock proc replay behavior * vanish * Revert "odd drain sock proc replay behavior" This reverts commit 29b70b39413e1852bb512155af6b6a94a5bd9454. * add GM * only if OP long * move personality to controlsState, since eventually it won't be exclusive to long planner more bump * diff without translations * fix * put nonblocking * CS should start at up to date personality always (no ui flicker) * update toggle on cereal message change * fix * fix that * ubmp * mypy doesn't know this is an int :( * update translations * fix the tests * revert ui * not here * migrate controlsState * Revert "migrate controlsState" - i see no reason we need to test with any specific personality This reverts commit 6063508f2df1a5623f113cda34dcd59a1f4b2ac9. * Update ref_commit --------- Co-authored-by: Cameron Clough --- cereal | 2 +- selfdrive/controls/controlsd.py | 11 +++++++++- .../controls/lib/longitudinal_planner.py | 20 ++----------------- selfdrive/controls/tests/test_cruise_speed.py | 8 +++----- .../controls/tests/test_following_distance.py | 8 +++----- .../test/longitudinal_maneuvers/maneuver.py | 2 ++ .../test/longitudinal_maneuvers/plant.py | 4 +++- selfdrive/test/process_replay/ref_commit | 2 +- 8 files changed, 25 insertions(+), 32 deletions(-) diff --git a/cereal b/cereal index 724d1d22ac..430535068a 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 724d1d22ac877ff75058f0d62860cf51c27f3546 +Subproject commit 430535068ac3bb94d3e117a3cfbc348ef37eb72d diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 29358cb7b6..33336676f2 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -146,6 +146,7 @@ class Controls: self.steer_limited = False self.desired_curvature = 0.0 self.experimental_mode = False + self.personality = self.read_personality_param() self.v_cruise_helper = VCruiseHelper(self.CP) self.recalibrating_seen = False @@ -680,7 +681,7 @@ class Controls: hudControl.speedVisible = self.enabled hudControl.lanesVisible = self.enabled hudControl.leadVisible = self.sm['longitudinalPlan'].hasLead - hudControl.leadDistanceBars = self.sm['longitudinalPlan'].personality.raw + 1 + hudControl.leadDistanceBars = self.personality + 1 hudControl.rightLaneVisible = True hudControl.leftLaneVisible = True @@ -769,6 +770,7 @@ class Controls: controlsState.forceDecel = bool(force_decel) controlsState.canErrorCounter = self.card.can_rcv_cum_timeout_counter controlsState.experimentalMode = self.experimental_mode + controlsState.personality = self.personality lat_tuning = self.CP.lateralTuning.which() if self.joystick_mode: @@ -821,10 +823,17 @@ class Controls: self.CS_prev = CS + def read_personality_param(self): + try: + return int(self.params.get('LongitudinalPersonality')) + except (ValueError, TypeError): + return log.LongitudinalPersonality.standard + def params_thread(self, evt): while not evt.is_set(): self.is_metric = self.params.get_bool("IsMetric") self.experimental_mode = self.params.get_bool("ExperimentalMode") and self.CP.openpilotLongitudinalControl + self.personality = self.read_personality_param() if self.CP.notCar: self.joystick_mode = self.params.get_bool("JoystickDebugMode") time.sleep(0.1) diff --git a/selfdrive/controls/lib/longitudinal_planner.py b/selfdrive/controls/lib/longitudinal_planner.py index 2b1fd01112..6cc6e80d3d 100755 --- a/selfdrive/controls/lib/longitudinal_planner.py +++ b/selfdrive/controls/lib/longitudinal_planner.py @@ -2,8 +2,6 @@ import math import numpy as np from openpilot.common.numpy_fast import clip, interp -from openpilot.common.params import Params -from cereal import log import cereal.messaging as messaging from openpilot.common.conversions import Conversions as CV @@ -61,16 +59,6 @@ class LongitudinalPlanner: self.a_desired_trajectory = np.zeros(CONTROL_N) self.j_desired_trajectory = np.zeros(CONTROL_N) self.solverExecutionTime = 0.0 - self.params = Params() - self.param_read_counter = 0 - self.personality = log.LongitudinalPersonality.standard - self.read_param() - - def read_param(self): - try: - self.personality = int(self.params.get('LongitudinalPersonality')) - except (ValueError, TypeError): - self.personality = log.LongitudinalPersonality.standard @staticmethod def parse_model(model_msg, model_error): @@ -89,9 +77,6 @@ class LongitudinalPlanner: return x, v, a, j def update(self, sm): - if self.param_read_counter % 50 == 0: - self.read_param() - self.param_read_counter += 1 self.mpc.mode = 'blended' if sm['controlsState'].experimentalMode else 'acc' v_ego = sm['carState'].vEgo @@ -130,11 +115,11 @@ class LongitudinalPlanner: accel_limits_turns[0] = min(accel_limits_turns[0], self.a_desired + 0.05) accel_limits_turns[1] = max(accel_limits_turns[1], self.a_desired - 0.05) - self.mpc.set_weights(prev_accel_constraint, personality=self.personality) + self.mpc.set_weights(prev_accel_constraint, personality=sm['controlsState'].personality) self.mpc.set_accel_limits(accel_limits_turns[0], accel_limits_turns[1]) self.mpc.set_cur_state(self.v_desired_filter.x, self.a_desired) x, v, a, j = self.parse_model(sm['modelV2'], self.v_model_error) - self.mpc.update(sm['radarState'], v_cruise, x, v, a, j, personality=self.personality) + self.mpc.update(sm['radarState'], v_cruise, x, v, a, j, personality=sm['controlsState'].personality) self.v_desired_trajectory_full = np.interp(ModelConstants.T_IDXS, T_IDXS_MPC, self.mpc.v_solution) self.a_desired_trajectory_full = np.interp(ModelConstants.T_IDXS, T_IDXS_MPC, self.mpc.a_solution) @@ -170,6 +155,5 @@ class LongitudinalPlanner: longitudinalPlan.fcw = self.fcw longitudinalPlan.solverExecutionTime = self.mpc.solve_time - longitudinalPlan.personality = self.personality pm.send('longitudinalPlan', plan_send) diff --git a/selfdrive/controls/tests/test_cruise_speed.py b/selfdrive/controls/tests/test_cruise_speed.py index 76a2222e85..c46d03ad1e 100755 --- a/selfdrive/controls/tests/test_cruise_speed.py +++ b/selfdrive/controls/tests/test_cruise_speed.py @@ -5,7 +5,6 @@ import unittest from parameterized import parameterized_class from cereal import log -from openpilot.common.params import Params from openpilot.selfdrive.controls.lib.drive_helpers import VCruiseHelper, V_CRUISE_MIN, V_CRUISE_MAX, V_CRUISE_INITIAL, IMPERIAL_INCREMENT from cereal import car from openpilot.common.conversions import Conversions as CV @@ -15,7 +14,7 @@ ButtonEvent = car.CarState.ButtonEvent ButtonType = car.CarState.ButtonEvent.Type -def run_cruise_simulation(cruise, e2e, t_end=20.): +def run_cruise_simulation(cruise, e2e, personality, t_end=20.): man = Maneuver( '', duration=t_end, @@ -26,6 +25,7 @@ def run_cruise_simulation(cruise, e2e, t_end=20.): prob_lead_values=[0.0], breakpoints=[0.], e2e=e2e, + personality=personality, ) valid, output = man.evaluate() assert valid @@ -38,12 +38,10 @@ def run_cruise_simulation(cruise, e2e, t_end=20.): [5,35])) # speed class TestCruiseSpeed(unittest.TestCase): def test_cruise_speed(self): - params = Params() - params.put("LongitudinalPersonality", str(self.personality)) print(f'Testing {self.speed} m/s') cruise_speed = float(self.speed) - simulation_steady_state = run_cruise_simulation(cruise_speed, self.e2e) + simulation_steady_state = run_cruise_simulation(cruise_speed, self.e2e, self.personality) self.assertAlmostEqual(simulation_steady_state, cruise_speed, delta=.01, msg=f'Did not reach {self.speed} m/s') diff --git a/selfdrive/controls/tests/test_following_distance.py b/selfdrive/controls/tests/test_following_distance.py index 3b31632721..f58e6383c4 100755 --- a/selfdrive/controls/tests/test_following_distance.py +++ b/selfdrive/controls/tests/test_following_distance.py @@ -3,14 +3,13 @@ import unittest import itertools from parameterized import parameterized_class -from openpilot.common.params import Params from cereal import log from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import desired_follow_distance, get_T_FOLLOW from openpilot.selfdrive.test.longitudinal_maneuvers.maneuver import Maneuver -def run_following_distance_simulation(v_lead, t_end=100.0, e2e=False): +def run_following_distance_simulation(v_lead, t_end=100.0, e2e=False, personality=0): man = Maneuver( '', duration=t_end, @@ -20,6 +19,7 @@ def run_following_distance_simulation(v_lead, t_end=100.0, e2e=False): speed_lead_values=[v_lead], breakpoints=[0.], e2e=e2e, + personality=personality, ) valid, output = man.evaluate() assert valid @@ -34,10 +34,8 @@ def run_following_distance_simulation(v_lead, t_end=100.0, e2e=False): [0,10,35])) # speed class TestFollowingDistance(unittest.TestCase): def test_following_distance(self): - params = Params() - params.put("LongitudinalPersonality", str(self.personality)) v_lead = float(self.speed) - simulation_steady_state = run_following_distance_simulation(v_lead, e2e=self.e2e) + simulation_steady_state = run_following_distance_simulation(v_lead, e2e=self.e2e, personality=self.personality) correct_steady_state = desired_follow_distance(v_lead, v_lead, get_T_FOLLOW(self.personality)) err_ratio = 0.2 if self.e2e else 0.1 self.assertAlmostEqual(simulation_steady_state, correct_steady_state, delta=(err_ratio * correct_steady_state + .5)) diff --git a/selfdrive/test/longitudinal_maneuvers/maneuver.py b/selfdrive/test/longitudinal_maneuvers/maneuver.py index 000225ab77..6c8495cc3b 100644 --- a/selfdrive/test/longitudinal_maneuvers/maneuver.py +++ b/selfdrive/test/longitudinal_maneuvers/maneuver.py @@ -19,6 +19,7 @@ class Maneuver: self.ensure_start = kwargs.get("ensure_start", False) self.enabled = kwargs.get("enabled", True) self.e2e = kwargs.get("e2e", False) + self.personality = kwargs.get("personality", 0) self.force_decel = kwargs.get("force_decel", False) self.duration = duration @@ -33,6 +34,7 @@ class Maneuver: only_lead2=self.only_lead2, only_radar=self.only_radar, e2e=self.e2e, + personality=self.personality, force_decel=self.force_decel, ) diff --git a/selfdrive/test/longitudinal_maneuvers/plant.py b/selfdrive/test/longitudinal_maneuvers/plant.py index bb935fdc8e..3fb8b6bab0 100755 --- a/selfdrive/test/longitudinal_maneuvers/plant.py +++ b/selfdrive/test/longitudinal_maneuvers/plant.py @@ -15,7 +15,7 @@ class Plant: messaging_initialized = False def __init__(self, lead_relevancy=False, speed=0.0, distance_lead=2.0, - enabled=True, only_lead2=False, only_radar=False, e2e=False, force_decel=False): + enabled=True, only_lead2=False, only_radar=False, e2e=False, personality=0, force_decel=False): self.rate = 1. / DT_MDL if not Plant.messaging_initialized: @@ -39,6 +39,7 @@ class Plant: self.only_lead2 = only_lead2 self.only_radar = only_radar self.e2e = e2e + self.personality = personality self.force_decel = force_decel self.rk = Ratekeeper(self.rate, print_delay_threshold=100.0) @@ -112,6 +113,7 @@ class Plant: control.controlsState.longControlState = LongCtrlState.pid if self.enabled else LongCtrlState.off control.controlsState.vCruise = float(v_cruise * 3.6) control.controlsState.experimentalMode = self.e2e + control.controlsState.personality = self.personality control.controlsState.forceDecel = self.force_decel car_state.carState.vEgo = float(self.speed) car_state.carState.standstill = self.speed < 0.01 diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 91e32036b5..2c6096e756 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -4f02bcfbf45697c5e6ba0a032797f6b2f37e16d3 +5eedd32ba97f9109c64059afc8e0fb827567f2ed From 3d63c7093afec7ba24f447a44f02f7bea1f7282b Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 13 Mar 2024 01:05:02 -0700 Subject: [PATCH 039/384] longitudinal personality: change via steering wheel distance button (#31792) * start at param * start by sending personality * change to personality * POC: button changes personality * what's wrong with this? * fix * not really possible but fuzzy test catches this * there's always a typo * dang, we're dropping messages * clean up * no comment * bump * rename * not all cars yet * works but at what cost * clean up * inside settings * write param so we save the distance button changes * setChecked activates buttonToggled and already writes param! * don't need this, we update from longitudinalPlan on changes * some clean up * more * ui * allow some time for ui to receive and write param * plannerd: only track changes in case no ui * Revert "plannerd: only track changes in case no ui" This reverts commit 2b081aa6ceb92c67a621b74592b2292756d29871. * write in plannerd as well, I assume this is atomic? * don't write when setting checked (only user clicks) * better nane * more * Update selfdrive/controls/lib/longitudinal_planner.py Co-authored-by: Cameron Clough * doesn't write param now * ParamWatcher is nice * no debug * Update translations * fix * odd drain sock proc replay behavior * vanish * Revert "odd drain sock proc replay behavior" This reverts commit 29b70b39413e1852bb512155af6b6a94a5bd9454. * add GM * only if OP long * move personality to controlsState, since eventually it won't be exclusive to long planner more bump * diff without translations * fix * put nonblocking * CS should start at up to date personality always (no ui flicker) * update toggle on cereal message change * fix * fix that * ubmp * mypy doesn't know this is an int :( * update translations * fix the tests --------- Co-authored-by: Cameron Clough --- selfdrive/controls/controlsd.py | 6 ++++++ selfdrive/ui/qt/offroad/settings.cc | 19 ++++++++++++++++++- selfdrive/ui/qt/offroad/settings.h | 4 ++++ selfdrive/ui/qt/widgets/controls.h | 13 +++++++++++++ selfdrive/ui/translations/main_ar.ts | 8 ++++---- selfdrive/ui/translations/main_de.ts | 8 ++++---- selfdrive/ui/translations/main_fr.ts | 8 ++++---- selfdrive/ui/translations/main_ja.ts | 8 ++++---- selfdrive/ui/translations/main_ko.ts | 8 ++++---- selfdrive/ui/translations/main_pt-BR.ts | 8 ++++---- selfdrive/ui/translations/main_th.ts | 8 ++++---- selfdrive/ui/translations/main_tr.ts | 8 ++++---- selfdrive/ui/translations/main_zh-CHS.ts | 8 ++++---- selfdrive/ui/translations/main_zh-CHT.ts | 8 ++++---- selfdrive/ui/ui.h | 1 + 15 files changed, 82 insertions(+), 41 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 33336676f2..4190e84fb8 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -651,6 +651,12 @@ class Controls: cloudlog.error(f"actuators.{p} not finite {actuators.to_dict()}") setattr(actuators, p, 0.0) + # decrement personality on distance button press + if self.CP.openpilotLongitudinalControl: + if any(not be.pressed and be.type == ButtonType.gapAdjustCruise for be in CS.buttonEvents): + self.personality = (self.personality - 1) % 3 + self.params.put_nonblocking('LongitudinalPersonality', str(self.personality)) + return CC, lac_log def publish_logs(self, CS, start_time, CC, lac_log): diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 85393cabc0..bc7989b773 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -91,9 +91,14 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { std::vector longi_button_texts{tr("Aggressive"), tr("Standard"), tr("Relaxed")}; long_personality_setting = new ButtonParamControl("LongitudinalPersonality", tr("Driving Personality"), tr("Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. " - "In relaxed mode openpilot will stay further away from lead cars."), + "In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with " + "your steering wheel distance button."), "../assets/offroad/icon_speed_limit.png", longi_button_texts); + + // set up uiState update for personality setting + QObject::connect(uiState(), &UIState::uiUpdate, this, &TogglesPanel::updateState); + for (auto &[param, title, desc, icon] : toggle_defs) { auto toggle = new ParamControl(param, title, desc, icon, this); @@ -119,6 +124,18 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { }); } +void TogglesPanel::updateState(const UIState &s) { + const SubMaster &sm = *(s.sm); + + if (sm.updated("controlsState")) { + auto personality = sm["controlsState"].getControlsState().getPersonality(); + if (personality != s.scene.personality && s.scene.started && isVisible()) { + long_personality_setting->setCheckedButton(static_cast(personality)); + } + uiState()->scene.personality = personality; + } +} + void TogglesPanel::expandToggleDescription(const QString ¶m) { toggles[param.toStdString()]->showDescription(); } diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index a5dd25b14f..581fc098f4 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -11,6 +11,7 @@ #include +#include "selfdrive/ui/ui.h" #include "selfdrive/ui/qt/util.h" #include "selfdrive/ui/qt/widgets/controls.h" @@ -64,6 +65,9 @@ public: public slots: void expandToggleDescription(const QString ¶m); +private slots: + void updateState(const UIState &s); + private: Params params; std::map toggles; diff --git a/selfdrive/ui/qt/widgets/controls.h b/selfdrive/ui/qt/widgets/controls.h index f6e099ce50..aa304e0df6 100644 --- a/selfdrive/ui/qt/widgets/controls.h +++ b/selfdrive/ui/qt/widgets/controls.h @@ -234,6 +234,19 @@ public: } } + void setCheckedButton(int id) { + button_group->button(id)->setChecked(true); + } + + void refresh() { + int value = atoi(params.get(key).c_str()); + button_group->button(value)->setChecked(true); + } + + void showEvent(QShowEvent *event) override { + refresh(); + } + private: std::string key; Params params; diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 7a431b8bf8..10c87d87bd 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -1103,10 +1103,6 @@ This may take up to a minute. Driving Personality شخصية القيادة - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - يوصى بالوضع القياسي. في الوضع الهجومي، سيتبع openpilot السيارات الرائدة بشكل أقرب، ويصبح أكثر هجومية في دواسات الوقود والمكابح. في وضعية الراحة يبقى openplot بعيداً لمسافة جيدة عن السيارة الرائدة. - openpilot defaults to driving in <b>chill mode</b>. Experimental mode enables <b>alpha-level features</b> that aren't ready for chill mode. Experimental features are listed below: يتم وضع openpilot بشكل قياسي في <b>وضعية الراحة</b>. يمكن الوضع التجريبي <b>ميزات المستوى ألفا</b> التي لا تكون جاهزة في وضع الراحة: @@ -1151,6 +1147,10 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. تمكين التحكم الطولي من openpilot (ألفا) للسماح بالوضع التجريبي. + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index ae2bdf33cb..cdcea24778 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -1105,10 +1105,6 @@ This may take up to a minute. On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - - End-to-End Longitudinal Control @@ -1137,6 +1133,10 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index ba496c1b89..b1c39db18e 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -1087,10 +1087,6 @@ Cela peut prendre jusqu'à une minute. Driving Personality Personnalité de conduite - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - Le mode standard est recommandé. En mode agressif, openpilot suivra de plus près les voitures de tête et sera plus agressif avec l'accélérateur et le frein. En mode détendu, openpilot restera plus éloigné des voitures de tête. - openpilot defaults to driving in <b>chill mode</b>. Experimental mode enables <b>alpha-level features</b> that aren't ready for chill mode. Experimental features are listed below: Par défaut, openpilot conduit en <b>mode détente</b>. Le mode expérimental permet d'activer des <b>fonctionnalités alpha</b> qui ne sont pas prêtes pour le mode détente. Les fonctionnalités expérimentales sont listées ci-dessous : @@ -1135,6 +1131,10 @@ Cela peut prendre jusqu'à une minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. Activer le contrôle longitudinal d'openpilot (en alpha) pour autoriser le mode expérimental. + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 54ff0fa4ae..5360c352d1 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -1097,10 +1097,6 @@ This may take up to a minute. On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - - End-to-End Longitudinal Control @@ -1129,6 +1125,10 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 3f98db2f9c..d1a1e55997 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -1103,10 +1103,6 @@ This may take up to a minute. Driving Personality 주행 모드 - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - 표준 모드를 권장합니다. 공격적 모드에서 openpilot은 앞 차량을 더 가까이 따라가며 적극적으로 가감속합니다. 편안한 모드에서 openpilot은 앞 차량을 더 멀리서 따라갑니다. - An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. openpilot 가감속 제어 알파 버전은 비 릴리즈 브랜치에서 실험 모드와 함께 테스트할 수 있습니다. @@ -1131,6 +1127,10 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. 주행 시각화는 저속으로 주행 시 도로를 향한 광각 카메라로 자동 전환되어 일부 곡선 경로를 더 잘 보여줍니다. 실험 모드 로고는 우측 상단에 표시됩니다. 내비게이션 목적지가 설정되고 주행 모델에 입력되면 지도의 주행 경로가 녹색으로 바뀝니다. + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index c4789ed42e..910466ba56 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -1107,10 +1107,6 @@ Isso pode levar até um minuto. Driving Personality Temperamento de Direção - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - Neutro é o recomendado. No modo disputa o openpilot seguirá o carro da frente mais de perto e será mais agressivo com a aceleração e frenagem. No modo calmo o openpilot se manterá mais longe do carro da frente. - An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. Uma versão embrionária do controle longitudinal openpilot pode ser testada em conjunto com o modo Experimental, em branches que não sejam de produção. @@ -1135,6 +1131,10 @@ Isso pode levar até um minuto. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. A visualização de condução fará a transição para a câmera grande angular voltada para a estrada em baixas velocidades para mostrar melhor algumas curvas. O logotipo do modo Experimental também será mostrado no canto superior direito. Quando um destino de navegação é definido e o modelo de condução o utiliza como entrada o caminho de condução no mapa fica verde. + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index c1f0039a3c..25a8aaeebd 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -1103,10 +1103,6 @@ This may take up to a minute. Driving Personality บุคลิกการขับขี่ - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - แนะนำให้ใช้แบบมาตรฐาน ในโหมดดุดัน openpilot จะตามรถคันหน้าใกล้ขึ้นและเร่งและเบรคแบบดุดันมากขึ้น ในโหมดผ่อนคลาย openpilot จะอยู่ห่างจากรถคันหน้ามากขึ้น - An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. ระบบควบคุมการเร่ง/เบรคโดย openpilot เวอร์ชัน alpha สามารถทดสอบได้พร้อมกับโหมดการทดลอง บน branch ที่กำลังพัฒนา @@ -1131,6 +1127,10 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. เปิดระบบควบคุมการเร่ง/เบรคโดย openpilot (alpha) เพื่อเปิดใช้งานโหมดทดลอง + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index d19c9ff036..dfe4b3670b 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -1081,10 +1081,6 @@ This may take up to a minute. On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - - openpilot defaults to driving in <b>chill mode</b>. Experimental mode enables <b>alpha-level features</b> that aren't ready for chill mode. Experimental features are listed below: @@ -1129,6 +1125,10 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 59d6874035..d985945f02 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -1103,10 +1103,6 @@ This may take up to a minute. Driving Personality 驾驶风格 - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - 推荐使用标准模式。在积极模式中,openpilot 会更靠近前车并在加速和刹车方面更积极。在舒适模式中,openpilot 会与前车保持较远的距离。 - An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. 在正式(release)版本以外的分支上,可以测试 openpilot 纵向控制的 Alpha 版本以及实验模式。 @@ -1131,6 +1127,10 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. 行驶画面将在低速时切换到道路朝向的广角摄像头,以更好地显示一些转弯。实验模式标志也将显示在右上角。当设置了导航目的地并且驾驶模型正在使用它作为输入时,地图上的驾驶路径将变为绿色。 + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 0079b47f7f..e64134f253 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -1103,10 +1103,6 @@ This may take up to a minute. Driving Personality 駕駛風格 - - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. - 推薦使用標準模式。在積極模式中,openpilot 會更靠近前車並在加速和剎車方面更積極。在舒適模式中,openpilot 會與前車保持較遠的距離。 - An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. 在正式 (release) 版以外的分支上可以測試 openpilot 縱向控制的 Alpha 版本以及實驗模式。 @@ -1131,6 +1127,10 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. 行駛畫面將在低速時切換至道路朝向的廣角鏡頭,以更好地顯示一些轉彎。實驗模式圖示也將顯示在右上角。當設定了導航目的地並且行駛模型正在將其作為輸入時,地圖上的行駛路徑將變為綠色。 + + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + Updater diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 86cd70f028..6efb72af9a 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -155,6 +155,7 @@ typedef struct UIScene { vec3 face_kpts_draw[std::size(default_face_kpts_3d)]; bool navigate_on_openpilot = false; + cereal::LongitudinalPersonality personality; float light_sensor; bool started, ignition, is_metric, map_on_left, longitudinal_control; From 7d0f234398be7cf2dee88a83cc4c12a9f4a06364 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 13 Mar 2024 01:53:15 -0700 Subject: [PATCH 040/384] Honda Nidec: show distance bars (#31854) * show lines nidec * lead * Update ref_commit --- selfdrive/car/honda/hondacan.py | 3 +++ selfdrive/test/process_replay/ref_commit | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/honda/hondacan.py b/selfdrive/car/honda/hondacan.py index efa5ba1f1e..e8a0c1bad3 100644 --- a/selfdrive/car/honda/hondacan.py +++ b/selfdrive/car/honda/hondacan.py @@ -143,6 +143,7 @@ def create_ui_commands(packer, CAN, CP, enabled, pcm_speed, hud, is_metric, acc_ acc_hud_values = { 'CRUISE_SPEED': hud.v_cruise, 'ENABLE_MINI_CAR': 1 if enabled else 0, + # only moves the lead car without ACC_ON 'HUD_DISTANCE': (hud.lead_distance_bars + 1) % 4, # wraps to 0 at 4 bars 'IMPERIAL_UNIT': int(not is_metric), 'HUD_LEAD': 2 if enabled and hud.lead_visible else 1 if enabled else 0, @@ -154,6 +155,8 @@ def create_ui_commands(packer, CAN, CP, enabled, pcm_speed, hud, is_metric, acc_ acc_hud_values['FCM_OFF'] = 1 acc_hud_values['FCM_OFF_2'] = 1 else: + # Shows the distance bars, TODO: stock camera shows updates temporarily while disabled + acc_hud_values['ACC_ON'] = int(enabled) acc_hud_values['PCM_SPEED'] = pcm_speed * CV.MS_TO_KPH acc_hud_values['PCM_GAS'] = hud.pcm_accel acc_hud_values['SET_ME_X01'] = 1 diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 2c6096e756..cb904630df 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -5eedd32ba97f9109c64059afc8e0fb827567f2ed +d544804a4fb54c0f160682b8f14af316a8383cd8 \ No newline at end of file From 98918b6afef5964b6e149ee0c46c785b2518891d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 13 Mar 2024 14:23:16 -0400 Subject: [PATCH 041/384] add third party to exclude (#31858) third_party as well --- .vscode/settings.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.vscode/settings.json b/.vscode/settings.json index 811306f399..f0731c362d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -21,6 +21,7 @@ "common/**", "selfdrive/**", "system/**", + "third_party/**", "tools/**", ] } From 0efb62c11caeeccbbc366a0798975e525368a631 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 13 Mar 2024 14:40:26 -0400 Subject: [PATCH 042/384] devcontainer: add gh and azure cli (#31859) * add ghcli * nosudo * nl * fix * remove * link to the install page * it's already a feature :) * fix + add azure * no diff * Update Dockerfile --- .devcontainer/devcontainer.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f1cfc82159..0f1c4baf99 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -28,7 +28,9 @@ "installOhMyZsh": false, "upgradePackages": false, "username": "batman" - } + }, + "ghcr.io/devcontainers-contrib/features/gh-cli:1": {}, + "ghcr.io/devcontainers/features/azure-cli:1": {} }, "containerUser": "batman", "remoteUser": "batman", From d09dd75884edf0df96c912554a35cdcd38cf8e27 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 13 Mar 2024 17:01:56 -0400 Subject: [PATCH 043/384] Revert "updated: prep for new updater (#31695)" (#31860) * Revert "updated: prep for new updater (#31695)" This reverts commit b93f6ce4f6fd34d33f990e86bde22b5cec49f2da. * fix the test --- selfdrive/updated/common.py | 115 ---------- selfdrive/updated/git.py | 236 --------------------- selfdrive/updated/tests/test_base.py | 13 +- selfdrive/updated/updated.py | 300 +++++++++++++++++++++++---- 4 files changed, 274 insertions(+), 390 deletions(-) delete mode 100644 selfdrive/updated/common.py delete mode 100644 selfdrive/updated/git.py diff --git a/selfdrive/updated/common.py b/selfdrive/updated/common.py deleted file mode 100644 index 6847147995..0000000000 --- a/selfdrive/updated/common.py +++ /dev/null @@ -1,115 +0,0 @@ -import abc -import os - -from pathlib import Path -import subprocess -from typing import List - -from markdown_it import MarkdownIt -from openpilot.common.params import Params -from openpilot.common.swaglog import cloudlog - - -LOCK_FILE = os.getenv("UPDATER_LOCK_FILE", "/tmp/safe_staging_overlay.lock") -STAGING_ROOT = os.getenv("UPDATER_STAGING_ROOT", "/data/safe_staging") -FINALIZED = os.path.join(STAGING_ROOT, "finalized") - - -def run(cmd: list[str], cwd: str = None) -> str: - return subprocess.check_output(cmd, cwd=cwd, stderr=subprocess.STDOUT, encoding='utf8') - - -class UpdateStrategy(abc.ABC): - def __init__(self): - self.params = Params() - - @abc.abstractmethod - def init(self) -> None: - pass - - @abc.abstractmethod - def cleanup(self) -> None: - pass - - @abc.abstractmethod - def get_available_channels(self) -> List[str]: - """List of available channels to install, (branches, releases, etc)""" - - @abc.abstractmethod - def current_channel(self) -> str: - """Current channel installed""" - - @abc.abstractmethod - def fetched_path(self) -> str: - """Path to the fetched update""" - - @property - def target_channel(self) -> str: - """Target Channel""" - b: str | None = self.params.get("UpdaterTargetBranch", encoding='utf-8') - if b is None: - b = self.current_channel() - return b - - @abc.abstractmethod - def update_ready(self) -> bool: - """Check if an update is ready to be installed""" - - @abc.abstractmethod - def update_available(self) -> bool: - """Check if an update is available for the current channel""" - - @abc.abstractmethod - def describe_current_channel(self) -> tuple[str, str]: - """Describe the current channel installed, (description, release_notes)""" - - @abc.abstractmethod - def describe_ready_channel(self) -> tuple[str, str]: - """Describe the channel that is ready to be installed, (description, release_notes)""" - - @abc.abstractmethod - def fetch_update(self) -> None: - pass - - @abc.abstractmethod - def finalize_update(self) -> None: - pass - - -def set_consistent_flag(consistent: bool) -> None: - os.sync() - consistent_file = Path(os.path.join(FINALIZED, ".overlay_consistent")) - if consistent: - consistent_file.touch() - elif not consistent: - consistent_file.unlink(missing_ok=True) - os.sync() - - -def get_consistent_flag() -> bool: - consistent_file = Path(os.path.join(FINALIZED, ".overlay_consistent")) - return consistent_file.is_file() - - -def parse_release_notes(releases_md: str) -> str: - try: - r = releases_md.split('\n\n', 1)[0] # Slice latest release notes - try: - return str(MarkdownIt().render(r)) - except Exception: - return r + "\n" - except FileNotFoundError: - pass - except Exception: - cloudlog.exception("failed to parse release notes") - return "" - - -def get_version(path) -> str: - with open(os.path.join(path, "common", "version.h")) as f: - return f.read().split('"')[1] - - -def get_release_notes(path) -> str: - with open(os.path.join(path, "RELEASES.md"), "r") as f: - return parse_release_notes(f.read()) diff --git a/selfdrive/updated/git.py b/selfdrive/updated/git.py deleted file mode 100644 index 921b32ede2..0000000000 --- a/selfdrive/updated/git.py +++ /dev/null @@ -1,236 +0,0 @@ -import datetime -import os -import re -import shutil -import subprocess -import time - -from collections import defaultdict -from pathlib import Path -from typing import List - -from openpilot.common.basedir import BASEDIR -from openpilot.common.params import Params -from openpilot.common.swaglog import cloudlog -from openpilot.selfdrive.updated.common import FINALIZED, STAGING_ROOT, UpdateStrategy, \ - get_consistent_flag, get_release_notes, get_version, set_consistent_flag, run - - -OVERLAY_UPPER = os.path.join(STAGING_ROOT, "upper") -OVERLAY_METADATA = os.path.join(STAGING_ROOT, "metadata") -OVERLAY_MERGED = os.path.join(STAGING_ROOT, "merged") -OVERLAY_INIT = Path(os.path.join(BASEDIR, ".overlay_init")) - - -def setup_git_options(cwd: str) -> None: - # We sync FS object atimes (which NEOS doesn't use) and mtimes, but ctimes - # are outside user control. Make sure Git is set up to ignore system ctimes, - # because they change when we make hard links during finalize. Otherwise, - # there is a lot of unnecessary churn. This appears to be a common need on - # OSX as well: https://www.git-tower.com/blog/make-git-rebase-safe-on-osx/ - - # We are using copytree to copy the directory, which also changes - # inode numbers. Ignore those changes too. - - # Set protocol to the new version (default after git 2.26) to reduce data - # usage on git fetch --dry-run from about 400KB to 18KB. - git_cfg = [ - ("core.trustctime", "false"), - ("core.checkStat", "minimal"), - ("protocol.version", "2"), - ("gc.auto", "0"), - ("gc.autoDetach", "false"), - ] - for option, value in git_cfg: - run(["git", "config", option, value], cwd) - - -def dismount_overlay() -> None: - if os.path.ismount(OVERLAY_MERGED): - cloudlog.info("unmounting existing overlay") - run(["sudo", "umount", "-l", OVERLAY_MERGED]) - - -def init_overlay() -> None: - - # Re-create the overlay if BASEDIR/.git has changed since we created the overlay - if OVERLAY_INIT.is_file() and os.path.ismount(OVERLAY_MERGED): - git_dir_path = os.path.join(BASEDIR, ".git") - new_files = run(["find", git_dir_path, "-newer", str(OVERLAY_INIT)]) - if not len(new_files.splitlines()): - # A valid overlay already exists - return - else: - cloudlog.info(".git directory changed, recreating overlay") - - cloudlog.info("preparing new safe staging area") - - params = Params() - params.put_bool("UpdateAvailable", False) - set_consistent_flag(False) - dismount_overlay() - run(["sudo", "rm", "-rf", STAGING_ROOT]) - if os.path.isdir(STAGING_ROOT): - shutil.rmtree(STAGING_ROOT) - - for dirname in [STAGING_ROOT, OVERLAY_UPPER, OVERLAY_METADATA, OVERLAY_MERGED]: - os.mkdir(dirname, 0o755) - - if os.lstat(BASEDIR).st_dev != os.lstat(OVERLAY_MERGED).st_dev: - raise RuntimeError("base and overlay merge directories are on different filesystems; not valid for overlay FS!") - - # Leave a timestamped canary in BASEDIR to check at startup. The device clock - # should be correct by the time we get here. If the init file disappears, or - # critical mtimes in BASEDIR are newer than .overlay_init, continue.sh can - # assume that BASEDIR has used for local development or otherwise modified, - # and skips the update activation attempt. - consistent_file = Path(os.path.join(BASEDIR, ".overlay_consistent")) - if consistent_file.is_file(): - consistent_file.unlink() - OVERLAY_INIT.touch() - - os.sync() - overlay_opts = f"lowerdir={BASEDIR},upperdir={OVERLAY_UPPER},workdir={OVERLAY_METADATA}" - - mount_cmd = ["mount", "-t", "overlay", "-o", overlay_opts, "none", OVERLAY_MERGED] - run(["sudo"] + mount_cmd) - run(["sudo", "chmod", "755", os.path.join(OVERLAY_METADATA, "work")]) - - git_diff = run(["git", "diff"], OVERLAY_MERGED) - params.put("GitDiff", git_diff) - cloudlog.info(f"git diff output:\n{git_diff}") - - -class GitUpdateStrategy(UpdateStrategy): - - def init(self) -> None: - init_overlay() - - def cleanup(self) -> None: - OVERLAY_INIT.unlink(missing_ok=True) - - def sync_branches(self): - excluded_branches = ('release2', 'release2-staging') - - output = run(["git", "ls-remote", "--heads"], OVERLAY_MERGED) - - self.branches = defaultdict(lambda: None) - for line in output.split('\n'): - ls_remotes_re = r'(?P\b[0-9a-f]{5,40}\b)(\s+)(refs\/heads\/)(?P.*$)' - x = re.fullmatch(ls_remotes_re, line.strip()) - if x is not None and x.group('branch_name') not in excluded_branches: - self.branches[x.group('branch_name')] = x.group('commit_sha') - - return self.branches - - def get_available_channels(self) -> List[str]: - self.sync_branches() - return list(self.branches.keys()) - - def update_ready(self) -> bool: - if get_consistent_flag(): - hash_mismatch = self.get_commit_hash(BASEDIR) != self.branches[self.target_channel] - branch_mismatch = self.get_branch(BASEDIR) != self.target_channel - on_target_channel = self.get_branch(FINALIZED) == self.target_channel - return ((hash_mismatch or branch_mismatch) and on_target_channel) - return False - - def update_available(self) -> bool: - if os.path.isdir(OVERLAY_MERGED) and len(self.get_available_channels()) > 0: - hash_mismatch = self.get_commit_hash(OVERLAY_MERGED) != self.branches[self.target_channel] - branch_mismatch = self.get_branch(OVERLAY_MERGED) != self.target_channel - return hash_mismatch or branch_mismatch - return False - - def get_branch(self, path: str) -> str: - return run(["git", "rev-parse", "--abbrev-ref", "HEAD"], path).rstrip() - - def get_commit_hash(self, path) -> str: - return run(["git", "rev-parse", "HEAD"], path).rstrip() - - def get_current_channel(self) -> str: - return self.get_branch(BASEDIR) - - def current_channel(self) -> str: - return self.get_branch(BASEDIR) - - def describe_branch(self, basedir) -> str: - if not os.path.exists(basedir): - return "" - - version = "" - branch = "" - commit = "" - commit_date = "" - try: - branch = self.get_branch(basedir) - commit = self.get_commit_hash(basedir)[:7] - version = get_version(basedir) - - commit_unix_ts = run(["git", "show", "-s", "--format=%ct", "HEAD"], basedir).rstrip() - dt = datetime.datetime.fromtimestamp(int(commit_unix_ts)) - commit_date = dt.strftime("%b %d") - except Exception: - cloudlog.exception("updater.get_description") - return f"{version} / {branch} / {commit} / {commit_date}" - - def describe_current_channel(self) -> tuple[str, str]: - return self.describe_branch(BASEDIR), get_release_notes(BASEDIR) - - def describe_ready_channel(self) -> tuple[str, str]: - if self.update_ready(): - return self.describe_branch(FINALIZED), get_release_notes(FINALIZED) - - return "", "" - - def fetch_update(self): - cloudlog.info("attempting git fetch inside staging overlay") - - setup_git_options(OVERLAY_MERGED) - - branch = self.target_channel - git_fetch_output = run(["git", "fetch", "origin", branch], OVERLAY_MERGED) - cloudlog.info("git fetch success: %s", git_fetch_output) - - cloudlog.info("git reset in progress") - cmds = [ - ["git", "checkout", "--force", "--no-recurse-submodules", "-B", branch, "FETCH_HEAD"], - ["git", "reset", "--hard"], - ["git", "clean", "-xdff"], - ["git", "submodule", "sync"], - ["git", "submodule", "update", "--init", "--recursive"], - ["git", "submodule", "foreach", "--recursive", "git", "reset", "--hard"], - ] - r = [run(cmd, OVERLAY_MERGED) for cmd in cmds] - cloudlog.info("git reset success: %s", '\n'.join(r)) - - def fetched_path(self): - return str(OVERLAY_MERGED) - - def finalize_update(self) -> None: - """Take the current OverlayFS merged view and finalize a copy outside of - OverlayFS, ready to be swapped-in at BASEDIR. Copy using shutil.copytree""" - - # Remove the update ready flag and any old updates - cloudlog.info("creating finalized version of the overlay") - set_consistent_flag(False) - - # Copy the merged overlay view and set the update ready flag - if os.path.exists(FINALIZED): - shutil.rmtree(FINALIZED) - shutil.copytree(OVERLAY_MERGED, FINALIZED, symlinks=True) - - run(["git", "reset", "--hard"], FINALIZED) - run(["git", "submodule", "foreach", "--recursive", "git", "reset", "--hard"], FINALIZED) - - cloudlog.info("Starting git cleanup in finalized update") - t = time.monotonic() - try: - run(["git", "gc"], FINALIZED) - run(["git", "lfs", "prune"], FINALIZED) - cloudlog.event("Done git cleanup", duration=time.monotonic() - t) - except subprocess.CalledProcessError: - cloudlog.exception(f"Failed git cleanup, took {time.monotonic() - t:.3f} s") - - set_consistent_flag(True) - cloudlog.info("done finalizing overlay") diff --git a/selfdrive/updated/tests/test_base.py b/selfdrive/updated/tests/test_base.py index 3060db1bdd..b79785277a 100644 --- a/selfdrive/updated/tests/test_base.py +++ b/selfdrive/updated/tests/test_base.py @@ -37,6 +37,16 @@ def update_release(directory, name, version, agnos_version, release_notes): os.symlink("common/version.h", test_symlink) +def get_version(path: str) -> str: + with open(os.path.join(path, "common", "version.h")) as f: + return f.read().split('"')[1] + + +def get_consistent_flag(path: str) -> bool: + consistent_file = pathlib.Path(os.path.join(path, ".overlay_consistent")) + return consistent_file.is_file() + + @pytest.mark.slow # TODO: can we test overlayfs in GHA? class BaseUpdateTest(unittest.TestCase): @classmethod @@ -109,11 +119,10 @@ class BaseUpdateTest(unittest.TestCase): self.assertEqual(self.params.get_bool("UpdateAvailable"), update_available) def _test_finalized_update(self, branch, version, agnos_version, release_notes): - from openpilot.selfdrive.updated.common import get_version, get_consistent_flag # this needs to be inline because common uses environment variables self.assertTrue(self.params.get("UpdaterNewDescription", encoding="utf-8").startswith(f"{version} / {branch}")) self.assertEqual(self.params.get("UpdaterNewReleaseNotes", encoding="utf-8"), f"

{release_notes}

\n") self.assertEqual(get_version(str(self.staging_root / "finalized")), version) - self.assertEqual(get_consistent_flag(), True) + self.assertEqual(get_consistent_flag(str(self.staging_root / "finalized")), True) with open(self.staging_root / "finalized" / "test_symlink") as f: self.assertIn(version, f.read()) diff --git a/selfdrive/updated/updated.py b/selfdrive/updated/updated.py index 92034cc806..b6b395f254 100755 --- a/selfdrive/updated/updated.py +++ b/selfdrive/updated/updated.py @@ -1,21 +1,35 @@ #!/usr/bin/env python3 import os -from pathlib import Path +import re import datetime import subprocess import psutil +import shutil import signal import fcntl +import time import threading +from collections import defaultdict +from pathlib import Path +from markdown_it import MarkdownIt +from openpilot.common.basedir import BASEDIR from openpilot.common.params import Params from openpilot.common.time import system_time_valid -from openpilot.selfdrive.updated.common import LOCK_FILE, STAGING_ROOT, UpdateStrategy, run, set_consistent_flag from openpilot.system.hardware import AGNOS, HARDWARE from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.controls.lib.alertmanager import set_offroad_alert from openpilot.system.version import is_tested_branch -from openpilot.selfdrive.updated.git import GitUpdateStrategy + +LOCK_FILE = os.getenv("UPDATER_LOCK_FILE", "/tmp/safe_staging_overlay.lock") +STAGING_ROOT = os.getenv("UPDATER_STAGING_ROOT", "/data/safe_staging") + +OVERLAY_UPPER = os.path.join(STAGING_ROOT, "upper") +OVERLAY_METADATA = os.path.join(STAGING_ROOT, "metadata") +OVERLAY_MERGED = os.path.join(STAGING_ROOT, "merged") +FINALIZED = os.path.join(STAGING_ROOT, "finalized") + +OVERLAY_INIT = Path(os.path.join(BASEDIR, ".overlay_init")) DAYS_NO_CONNECTIVITY_MAX = 14 # do not allow to engage after this many days DAYS_NO_CONNECTIVITY_PROMPT = 10 # send an offroad prompt after this many days @@ -57,13 +71,147 @@ def read_time_from_param(params, param) -> datetime.datetime | None: pass return None +def run(cmd: list[str], cwd: str = None) -> str: + return subprocess.check_output(cmd, cwd=cwd, stderr=subprocess.STDOUT, encoding='utf8') + + +def set_consistent_flag(consistent: bool) -> None: + os.sync() + consistent_file = Path(os.path.join(FINALIZED, ".overlay_consistent")) + if consistent: + consistent_file.touch() + elif not consistent: + consistent_file.unlink(missing_ok=True) + os.sync() + +def parse_release_notes(basedir: str) -> bytes: + try: + with open(os.path.join(basedir, "RELEASES.md"), "rb") as f: + r = f.read().split(b'\n\n', 1)[0] # Slice latest release notes + try: + return bytes(MarkdownIt().render(r.decode("utf-8")), encoding="utf-8") + except Exception: + return r + b"\n" + except FileNotFoundError: + pass + except Exception: + cloudlog.exception("failed to parse release notes") + return b"" + +def setup_git_options(cwd: str) -> None: + # We sync FS object atimes (which NEOS doesn't use) and mtimes, but ctimes + # are outside user control. Make sure Git is set up to ignore system ctimes, + # because they change when we make hard links during finalize. Otherwise, + # there is a lot of unnecessary churn. This appears to be a common need on + # OSX as well: https://www.git-tower.com/blog/make-git-rebase-safe-on-osx/ + + # We are using copytree to copy the directory, which also changes + # inode numbers. Ignore those changes too. + + # Set protocol to the new version (default after git 2.26) to reduce data + # usage on git fetch --dry-run from about 400KB to 18KB. + git_cfg = [ + ("core.trustctime", "false"), + ("core.checkStat", "minimal"), + ("protocol.version", "2"), + ("gc.auto", "0"), + ("gc.autoDetach", "false"), + ] + for option, value in git_cfg: + run(["git", "config", option, value], cwd) + + +def dismount_overlay() -> None: + if os.path.ismount(OVERLAY_MERGED): + cloudlog.info("unmounting existing overlay") + run(["sudo", "umount", "-l", OVERLAY_MERGED]) + + +def init_overlay() -> None: + + # Re-create the overlay if BASEDIR/.git has changed since we created the overlay + if OVERLAY_INIT.is_file() and os.path.ismount(OVERLAY_MERGED): + git_dir_path = os.path.join(BASEDIR, ".git") + new_files = run(["find", git_dir_path, "-newer", str(OVERLAY_INIT)]) + if not len(new_files.splitlines()): + # A valid overlay already exists + return + else: + cloudlog.info(".git directory changed, recreating overlay") + + cloudlog.info("preparing new safe staging area") + + params = Params() + params.put_bool("UpdateAvailable", False) + set_consistent_flag(False) + dismount_overlay() + run(["sudo", "rm", "-rf", STAGING_ROOT]) + if os.path.isdir(STAGING_ROOT): + shutil.rmtree(STAGING_ROOT) + + for dirname in [STAGING_ROOT, OVERLAY_UPPER, OVERLAY_METADATA, OVERLAY_MERGED]: + os.mkdir(dirname, 0o755) + + if os.lstat(BASEDIR).st_dev != os.lstat(OVERLAY_MERGED).st_dev: + raise RuntimeError("base and overlay merge directories are on different filesystems; not valid for overlay FS!") + + # Leave a timestamped canary in BASEDIR to check at startup. The device clock + # should be correct by the time we get here. If the init file disappears, or + # critical mtimes in BASEDIR are newer than .overlay_init, continue.sh can + # assume that BASEDIR has used for local development or otherwise modified, + # and skips the update activation attempt. + consistent_file = Path(os.path.join(BASEDIR, ".overlay_consistent")) + if consistent_file.is_file(): + consistent_file.unlink() + OVERLAY_INIT.touch() + + os.sync() + overlay_opts = f"lowerdir={BASEDIR},upperdir={OVERLAY_UPPER},workdir={OVERLAY_METADATA}" + + mount_cmd = ["mount", "-t", "overlay", "-o", overlay_opts, "none", OVERLAY_MERGED] + run(["sudo"] + mount_cmd) + run(["sudo", "chmod", "755", os.path.join(OVERLAY_METADATA, "work")]) + + git_diff = run(["git", "diff"], OVERLAY_MERGED) + params.put("GitDiff", git_diff) + cloudlog.info(f"git diff output:\n{git_diff}") + + +def finalize_update() -> None: + """Take the current OverlayFS merged view and finalize a copy outside of + OverlayFS, ready to be swapped-in at BASEDIR. Copy using shutil.copytree""" + + # Remove the update ready flag and any old updates + cloudlog.info("creating finalized version of the overlay") + set_consistent_flag(False) + + # Copy the merged overlay view and set the update ready flag + if os.path.exists(FINALIZED): + shutil.rmtree(FINALIZED) + shutil.copytree(OVERLAY_MERGED, FINALIZED, symlinks=True) + + run(["git", "reset", "--hard"], FINALIZED) + run(["git", "submodule", "foreach", "--recursive", "git", "reset", "--hard"], FINALIZED) + + cloudlog.info("Starting git cleanup in finalized update") + t = time.monotonic() + try: + run(["git", "gc"], FINALIZED) + run(["git", "lfs", "prune"], FINALIZED) + cloudlog.event("Done git cleanup", duration=time.monotonic() - t) + except subprocess.CalledProcessError: + cloudlog.exception(f"Failed git cleanup, took {time.monotonic() - t:.3f} s") + + set_consistent_flag(True) + cloudlog.info("done finalizing overlay") + -def handle_agnos_update(fetched_path) -> None: +def handle_agnos_update() -> None: from openpilot.system.hardware.tici.agnos import flash_agnos_update, get_target_slot_number cur_version = HARDWARE.get_os_version() updated_version = run(["bash", "-c", r"unset AGNOS_VERSION && source launch_env.sh && \ - echo -n $AGNOS_VERSION"], fetched_path).strip() + echo -n $AGNOS_VERSION"], OVERLAY_MERGED).strip() cloudlog.info(f"AGNOS version check: {cur_version} vs {updated_version}") if cur_version == updated_version: @@ -75,44 +223,61 @@ def handle_agnos_update(fetched_path) -> None: cloudlog.info(f"Beginning background installation for AGNOS {updated_version}") set_offroad_alert("Offroad_NeosUpdate", True) - manifest_path = os.path.join(fetched_path, "system/hardware/tici/agnos.json") + manifest_path = os.path.join(OVERLAY_MERGED, "system/hardware/tici/agnos.json") target_slot_number = get_target_slot_number() flash_agnos_update(manifest_path, target_slot_number, cloudlog) set_offroad_alert("Offroad_NeosUpdate", False) -STRATEGY = { - "git": GitUpdateStrategy, -} - class Updater: def __init__(self): self.params = Params() + self.branches = defaultdict(str) self._has_internet: bool = False - self.strategy: UpdateStrategy = STRATEGY[os.environ.get("UPDATER_STRATEGY", "git")]() - @property def has_internet(self) -> bool: return self._has_internet - def init(self): - self.strategy.init() + @property + def target_branch(self) -> str: + b: str | None = self.params.get("UpdaterTargetBranch", encoding='utf-8') + if b is None: + b = self.get_branch(BASEDIR) + return b - def cleanup(self): - self.strategy.cleanup() + @property + def update_ready(self) -> bool: + consistent_file = Path(os.path.join(FINALIZED, ".overlay_consistent")) + if consistent_file.is_file(): + hash_mismatch = self.get_commit_hash(BASEDIR) != self.branches[self.target_branch] + branch_mismatch = self.get_branch(BASEDIR) != self.target_branch + on_target_branch = self.get_branch(FINALIZED) == self.target_branch + return ((hash_mismatch or branch_mismatch) and on_target_branch) + return False - def set_params(self, update_success: bool, failed_count: int, exception: str | None) -> None: - self.params.put("UpdateFailedCount", str(failed_count)) + @property + def update_available(self) -> bool: + if os.path.isdir(OVERLAY_MERGED) and len(self.branches) > 0: + hash_mismatch = self.get_commit_hash(OVERLAY_MERGED) != self.branches[self.target_branch] + branch_mismatch = self.get_branch(OVERLAY_MERGED) != self.target_branch + return hash_mismatch or branch_mismatch + return False + + def get_branch(self, path: str) -> str: + return run(["git", "rev-parse", "--abbrev-ref", "HEAD"], path).rstrip() - if self.params.get("UpdaterTargetBranch") is None: - self.params.put("UpdaterTargetBranch", self.strategy.current_channel()) + def get_commit_hash(self, path: str = OVERLAY_MERGED) -> str: + return run(["git", "rev-parse", "HEAD"], path).rstrip() - self.params.put_bool("UpdaterFetchAvailable", self.strategy.update_available()) + def set_params(self, update_success: bool, failed_count: int, exception: str | None) -> None: + self.params.put("UpdateFailedCount", str(failed_count)) + self.params.put("UpdaterTargetBranch", self.target_branch) - available_channels = self.strategy.get_available_channels() - self.params.put("UpdaterAvailableBranches", ','.join(available_channels)) + self.params.put_bool("UpdaterFetchAvailable", self.update_available) + if len(self.branches): + self.params.put("UpdaterAvailableBranches", ','.join(self.branches.keys())) last_update = datetime.datetime.utcnow() if update_success: @@ -127,14 +292,32 @@ class Updater: else: self.params.put("LastUpdateException", exception) - description_current, release_notes_current = self.strategy.describe_current_channel() - description_ready, release_notes_ready = self.strategy.describe_ready_channel() + # Write out current and new version info + def get_description(basedir: str) -> str: + if not os.path.exists(basedir): + return "" - self.params.put("UpdaterCurrentDescription", description_current) - self.params.put("UpdaterCurrentReleaseNotes", release_notes_current) - self.params.put("UpdaterNewDescription", description_ready) - self.params.put("UpdaterNewReleaseNotes", release_notes_ready) - self.params.put_bool("UpdateAvailable", self.strategy.update_ready()) + version = "" + branch = "" + commit = "" + commit_date = "" + try: + branch = self.get_branch(basedir) + commit = self.get_commit_hash(basedir)[:7] + with open(os.path.join(basedir, "common", "version.h")) as f: + version = f.read().split('"')[1] + + commit_unix_ts = run(["git", "show", "-s", "--format=%ct", "HEAD"], basedir).rstrip() + dt = datetime.datetime.fromtimestamp(int(commit_unix_ts)) + commit_date = dt.strftime("%b %d") + except Exception: + cloudlog.exception("updater.get_description") + return f"{version} / {branch} / {commit} / {commit_date}" + self.params.put("UpdaterCurrentDescription", get_description(BASEDIR)) + self.params.put("UpdaterCurrentReleaseNotes", parse_release_notes(BASEDIR)) + self.params.put("UpdaterNewDescription", get_description(FINALIZED)) + self.params.put("UpdaterNewReleaseNotes", parse_release_notes(FINALIZED)) + self.params.put_bool("UpdateAvailable", self.update_ready) # Handle user prompt for alert in ("Offroad_UpdateFailed", "Offroad_ConnectivityNeeded", "Offroad_ConnectivityNeededPrompt"): @@ -158,24 +341,67 @@ class Updater: def check_for_update(self) -> None: cloudlog.info("checking for updates") - self.strategy.update_available() + excluded_branches = ('release2', 'release2-staging') + + try: + run(["git", "ls-remote", "origin", "HEAD"], OVERLAY_MERGED) + self._has_internet = True + except subprocess.CalledProcessError: + self._has_internet = False + + setup_git_options(OVERLAY_MERGED) + output = run(["git", "ls-remote", "--heads"], OVERLAY_MERGED) + + self.branches = defaultdict(lambda: None) + for line in output.split('\n'): + ls_remotes_re = r'(?P\b[0-9a-f]{5,40}\b)(\s+)(refs\/heads\/)(?P.*$)' + x = re.fullmatch(ls_remotes_re, line.strip()) + if x is not None and x.group('branch_name') not in excluded_branches: + self.branches[x.group('branch_name')] = x.group('commit_sha') + + cur_branch = self.get_branch(OVERLAY_MERGED) + cur_commit = self.get_commit_hash(OVERLAY_MERGED) + new_branch = self.target_branch + new_commit = self.branches[new_branch] + if (cur_branch, cur_commit) != (new_branch, new_commit): + cloudlog.info(f"update available, {cur_branch} ({str(cur_commit)[:7]}) -> {new_branch} ({str(new_commit)[:7]})") + else: + cloudlog.info(f"up to date on {cur_branch} ({str(cur_commit)[:7]})") def fetch_update(self) -> None: + cloudlog.info("attempting git fetch inside staging overlay") + self.params.put("UpdaterState", "downloading...") # TODO: cleanly interrupt this and invalidate old update set_consistent_flag(False) self.params.put_bool("UpdateAvailable", False) - self.strategy.fetch_update() + setup_git_options(OVERLAY_MERGED) + + branch = self.target_branch + git_fetch_output = run(["git", "fetch", "origin", branch], OVERLAY_MERGED) + cloudlog.info("git fetch success: %s", git_fetch_output) + + cloudlog.info("git reset in progress") + cmds = [ + ["git", "checkout", "--force", "--no-recurse-submodules", "-B", branch, "FETCH_HEAD"], + ["git", "reset", "--hard"], + ["git", "clean", "-xdff"], + ["git", "submodule", "sync"], + ["git", "submodule", "update", "--init", "--recursive"], + ["git", "submodule", "foreach", "--recursive", "git", "reset", "--hard"], + ] + r = [run(cmd, OVERLAY_MERGED) for cmd in cmds] + cloudlog.info("git reset success: %s", '\n'.join(r)) # TODO: show agnos download progress if AGNOS: - handle_agnos_update(self.strategy.fetched_path()) + handle_agnos_update() # Create the finalized, ready-to-swap update self.params.put("UpdaterState", "finalizing update...") - self.strategy.finalize_update() + finalize_update() cloudlog.info("finalize success!") @@ -224,7 +450,7 @@ def main() -> None: exception = None try: # TODO: reuse overlay from previous updated instance if it looks clean - updater.init() + init_overlay() # ensure we have some params written soon after startup updater.set_params(False, update_failed_count, exception) @@ -260,11 +486,11 @@ def main() -> None: returncode=e.returncode ) exception = f"command failed: {e.cmd}\n{e.output}" - updater.cleanup() + OVERLAY_INIT.unlink(missing_ok=True) except Exception as e: cloudlog.exception("uncaught updated exception, shouldn't happen") exception = str(e) - updater.cleanup() + OVERLAY_INIT.unlink(missing_ok=True) try: params.put("UpdaterState", "idle") From 5d4e324ddf105f45a84f24849b3e2baafd22a84b Mon Sep 17 00:00:00 2001 From: Lee Jong Mun <43285072+crwusiz@users.noreply.github.com> Date: Thu, 14 Mar 2024 14:39:42 +0900 Subject: [PATCH 044/384] Multilang: kor translation update (#31864) --- selfdrive/ui/translations/main_ko.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index d1a1e55997..ed751912a6 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -634,7 +634,7 @@ This may take up to a minute. System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot. - + 시스템 재설정이 시작되었습니다. 모든 콘텐츠와 설정을 지우려면 확인을 누르시고 부팅을 재개하려면 취소를 누르세요.
@@ -744,15 +744,15 @@ This may take up to a minute. Choose Software to Install - + 설치할 소프트웨어 선택 openpilot - openpilot + openpilot Custom Software - + 커스텀 소프트웨어 @@ -1129,7 +1129,7 @@ This may take up to a minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. - + 표준 모드를 권장합니다. 공격적 모드의 openpilot은 선두 차량을 더 가까이 따라가고 가감속제어를 사용하여 더욱 공격적으로 움직입니다. 편안한 모드의 openpilot은 선두 차량으로부터 더 멀리 떨어져 있습니다. 지원되는 차량에서는 스티어링 휠 거리 버튼을 사용하여 이러한 특성을 순환할 수 있습니다. From a3f2c7bf3ea008394156aab16cc226cdf36af8d5 Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Thu, 14 Mar 2024 02:40:20 -0300 Subject: [PATCH 045/384] Multilang: update pt-BR translation (#31861) * update pt-BR translation * this come from darkness?? --- selfdrive/ui/translations/main_pt-BR.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index 910466ba56..c32aeacaa3 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -1133,7 +1133,7 @@ Isso pode levar até um minuto. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. - + Neutro é o recomendado. No modo disputa o openpilot seguirá o carro da frente mais de perto e será mais agressivo com a aceleração e frenagem. No modo calmo o openpilot se manterá mais longe do carro da frente. Em carros compatíveis, você pode alternar esses temperamentos com o botão de distância do volante. From 39d432e3cda37ecceb63e04967896a2981054d04 Mon Sep 17 00:00:00 2001 From: ShaydeNZ Date: Fri, 15 Mar 2024 10:26:21 +1300 Subject: [PATCH 046/384] Added fingerprints for my 2019 Golf R Mk7.5 (#31850) --- selfdrive/car/volkswagen/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index c530288027..cf3e9287cc 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -175,6 +175,7 @@ FW_VERSIONS = { b'\xf1\x875G0906259T \xf1\x890003', b'\xf1\x878V0906259H \xf1\x890002', b'\xf1\x878V0906259J \xf1\x890003', + b'\xf1\x878V0906259J \xf1\x890103', b'\xf1\x878V0906259K \xf1\x890001', b'\xf1\x878V0906259K \xf1\x890003', b'\xf1\x878V0906259P \xf1\x890001', @@ -220,6 +221,7 @@ FW_VERSIONS = { b'\xf1\x870DD300046F \xf1\x891601', b'\xf1\x870GC300012A \xf1\x891401', b'\xf1\x870GC300012A \xf1\x891403', + b'\xf1\x870GC300012M \xf1\x892301', b'\xf1\x870GC300014B \xf1\x892401', b'\xf1\x870GC300014B \xf1\x892403', b'\xf1\x870GC300014B \xf1\x892405', @@ -238,6 +240,7 @@ FW_VERSIONS = { b'\xf1\x875Q0959655AR\xf1\x890317\xf1\x82\x13141500111233003142114A2131219333313100', b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1314160011123300314211012230229333423100', b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1314160011123300314211012230229333463100', + b'\xf1\x875Q0959655BJ\xf1\x890339\xf1\x82\x13141600111233003142115A2232229333463100', b'\xf1\x875Q0959655BS\xf1\x890403\xf1\x82\x1314160011123300314240012250229333463100', b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142404A2251229333463100', b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142404A2252229333463100', From 4dd5fd4619cb73df9b396aacda94c6afc553a9f1 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Thu, 14 Mar 2024 22:00:16 +0000 Subject: [PATCH 047/384] ui.py fix typo (#31870) --- tools/replay/ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/replay/ui.py b/tools/replay/ui.py index 126340afc8..aa03ae193c 100755 --- a/tools/replay/ui.py +++ b/tools/replay/ui.py @@ -118,7 +118,7 @@ def ui_thread(addr): sm.update(0) - camera = DEVICE_CAMERAS[("three", str(sm['roadCameraState'].sensor))] + camera = DEVICE_CAMERAS[("tici", str(sm['roadCameraState'].sensor))] imgff = np.frombuffer(yuv_img_raw.data, dtype=np.uint8).reshape((len(yuv_img_raw.data) // vipc_client.stride, vipc_client.stride)) num_px = vipc_client.width * vipc_client.height From c1d0d35f8bc043df098c483154c36bb8e955b02d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 14 Mar 2024 19:20:02 -0400 Subject: [PATCH 048/384] gha: remove trailing spaces (#31872) remove trailing spaces --- .github/workflows/auto-cache/action.yaml | 2 +- .github/workflows/selfdrive_tests.yaml | 14 +++++++------- .github/workflows/setup-pre-commit/action.yaml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/auto-cache/action.yaml b/.github/workflows/auto-cache/action.yaml index 173803f7f0..c5506e4769 100644 --- a/.github/workflows/auto-cache/action.yaml +++ b/.github/workflows/auto-cache/action.yaml @@ -19,7 +19,7 @@ runs: using: "composite" steps: - name: setup namespace cache - if: ${{ contains(runner.name, 'nsc') }} + if: ${{ contains(runner.name, 'nsc') }} uses: namespacelabs/nscloud-cache-action@v1 with: path: ${{ inputs.path }} diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index d1dff147f2..ce7dd7413c 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -69,7 +69,7 @@ jobs: matrix: arch: ${{ fromJson( ((github.repository == 'commaai/openpilot') && - ((github.event_name != 'pull_request') || + ((github.event_name != 'pull_request') || (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && '["x86_64", "aarch64"]' || '["x86_64"]' ) }} runs-on: ${{ (matrix.arch == 'aarch64') && 'namespace-profile-arm64-2x8' || 'ubuntu-20.04' }} steps: @@ -122,7 +122,7 @@ jobs: static_analysis: name: static analysis runs-on: ${{ ((github.repository == 'commaai/openpilot') && - ((github.event_name != 'pull_request') || + ((github.event_name != 'pull_request') || (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }} steps: - uses: actions/checkout@v4 @@ -155,7 +155,7 @@ jobs: unit_tests: name: unit tests runs-on: ${{ ((github.repository == 'commaai/openpilot') && - ((github.event_name != 'pull_request') || + ((github.event_name != 'pull_request') || (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }} steps: - uses: actions/checkout@v4 @@ -186,7 +186,7 @@ jobs: process_replay: name: process replay runs-on: ${{ ((github.repository == 'commaai/openpilot') && - ((github.event_name != 'pull_request') || + ((github.event_name != 'pull_request') || (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }} steps: - uses: actions/checkout@v4 @@ -235,7 +235,7 @@ jobs: regen: name: regen runs-on: 'ubuntu-20.04' - steps: + steps: - uses: actions/checkout@v4 with: submodules: true @@ -293,7 +293,7 @@ jobs: test_cars: name: cars runs-on: ${{ ((github.repository == 'commaai/openpilot') && - ((github.event_name != 'pull_request') || + ((github.event_name != 'pull_request') || (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }} strategy: fail-fast: false @@ -395,7 +395,7 @@ jobs: run: > ${{ env.RUN }} "PYTHONWARNINGS=ignore && source selfdrive/test/setup_xvfb.sh && - export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' && + export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' && python selfdrive/ui/tests/test_ui/run.py" - name: Upload Test Report uses: actions/upload-artifact@v2 diff --git a/.github/workflows/setup-pre-commit/action.yaml b/.github/workflows/setup-pre-commit/action.yaml index 1b3e16e73f..f07a106861 100644 --- a/.github/workflows/setup-pre-commit/action.yaml +++ b/.github/workflows/setup-pre-commit/action.yaml @@ -4,7 +4,7 @@ runs: using: "composite" steps: - uses: ./.github/workflows/auto-cache - with: + with: path: .ci_cache/pre-commit key: pre-commit-${{ hashFiles('**/.pre-commit-config.yaml') }} restore-keys: | From f6afb09924bf5db88f7d1e8caa0e17410a3fa537 Mon Sep 17 00:00:00 2001 From: thomasgtsr <163129375+thomasgtsr@users.noreply.github.com> Date: Thu, 14 Mar 2024 19:42:37 -0500 Subject: [PATCH 049/384] Hyundai: Santa Cruz 2024 fingerprint (#31856) * Update fingerprints.py * Update fingerprints.py * Update fingerprints.py * Update fingerprints.py * run bot --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 2 +- selfdrive/car/hyundai/fingerprints.py | 1 + selfdrive/car/hyundai/values.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 13381ec202..eed06f7110 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -110,7 +110,7 @@ A supported vehicle is one that just works when you install a comma device. All |Hyundai|Kona Electric (with HDA II, Korea only) 2023[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai R connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Kona Hybrid 2020|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai I connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Palisade 2020-22|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Santa Cruz 2022-23[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Santa Cruz 2022-24[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Santa Fe 2019-20|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Santa Fe 2021-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Santa Fe Hybrid 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 12303f806a..bd5503b47e 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1595,6 +1595,7 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW000 14M', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW010 14X', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW020 14Z', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00NX4__ 1.00 1.00 99110-K5000 ', diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 79cec1f787..bc03d83925 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -360,7 +360,7 @@ class CAR(Platforms): ) SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI SANTA CRUZ 1ST GEN", - HyundaiCarInfo("Hyundai Santa Cruz 2022-23", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarInfo("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n])), # weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2), ) From 1ecbbef46b265a36bce71cc45c0fdc521d849e06 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 14 Mar 2024 21:03:39 -0400 Subject: [PATCH 050/384] controlsd: fix saturation warning (#31869) fix saturation --- selfdrive/controls/controlsd.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 4190e84fb8..77bc787078 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -142,7 +142,6 @@ class Controls: self.current_alert_types = [ET.PERMANENT] self.logged_comm_issue = None self.not_running_prev = None - self.last_actuators = car.CarControl.Actuators.new_message() self.steer_limited = False self.desired_curvature = 0.0 self.experimental_mode = False @@ -621,7 +620,7 @@ class Controls: undershooting = abs(lac_log.desiredLateralAccel) / abs(1e-3 + lac_log.actualLateralAccel) > 1.2 turning = abs(lac_log.desiredLateralAccel) > 1.0 good_speed = CS.vEgo > 5 - max_torque = abs(self.last_actuators.steer) > 0.99 + max_torque = abs(actuators.steer) > 0.99 if undershooting and turning and good_speed and max_torque: lac_log.active and self.events.add(EventName.steerSaturated) elif lac_log.saturated: From ca5a2ed942c7560f11dd85b812c914f944318250 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 15 Mar 2024 00:58:25 -0400 Subject: [PATCH 051/384] move getting platform to get_params (#31871) * better * string * not here --- selfdrive/car/car_helpers.py | 5 +---- selfdrive/car/interfaces.py | 25 ++++++++++++++----------- selfdrive/car/tests/test_models.py | 4 ++-- tools/car_porting/test_car_model.py | 5 +---- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index b16e2e5a47..32a9dd84bd 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -5,7 +5,6 @@ from collections.abc import Callable from cereal import car from openpilot.common.params import Params from openpilot.common.basedir import BASEDIR -from openpilot.selfdrive.car.values import PLATFORMS from openpilot.system.version import is_comma_remote, is_tested_branch from openpilot.selfdrive.car.interfaces import get_interface_attr from openpilot.selfdrive.car.fingerprints import eliminate_incompatible_cars, all_legacy_fingerprint_cars @@ -192,9 +191,7 @@ def fingerprint(logcan, sendcan, num_pandas): fw_count=len(car_fw), ecu_responses=list(ecu_rx_addrs), vin_rx_addr=vin_rx_addr, vin_rx_bus=vin_rx_bus, fingerprints=repr(finger), fw_query_time=fw_query_time, error=True) - car_platform = PLATFORMS.get(car_fingerprint, MOCK.MOCK) - - return car_platform, finger, vin, car_fw, source, exact_match + return car_fingerprint, finger, vin, car_fw, source, exact_match def get_car_interface(CP): diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 9e9e668981..86f4cc7388 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -14,7 +14,8 @@ from openpilot.common.simple_kalman import KF1D, get_kalman_gain from openpilot.common.numpy_fast import clip from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.car import apply_hysteresis, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, STD_CARGO_KG -from openpilot.selfdrive.car.values import Platform +from openpilot.selfdrive.car.mock.values import CAR as MOCK +from openpilot.selfdrive.car.values import PLATFORMS from openpilot.selfdrive.controls.lib.drive_helpers import V_CRUISE_MAX, get_friction from openpilot.selfdrive.controls.lib.events import Events from openpilot.selfdrive.controls.lib.vehicle_model import VehicleModel @@ -102,24 +103,26 @@ class CarInterfaceBase(ABC): return ACCEL_MIN, ACCEL_MAX @classmethod - def get_non_essential_params(cls, candidate: Platform): + def get_non_essential_params(cls, candidate: str): """ Parameters essential to controlling the car may be incomplete or wrong without FW versions or fingerprints. """ return cls.get_params(candidate, gen_empty_fingerprint(), list(), False, False) @classmethod - def get_params(cls, candidate: Platform, fingerprint: dict[int, dict[int, int]], car_fw: list[car.CarParams.CarFw], experimental_long: bool, docs: bool): + def get_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[car.CarParams.CarFw], experimental_long: bool, docs: bool): + platform = PLATFORMS.get(candidate, MOCK.MOCK) + ret = CarInterfaceBase.get_std_params(candidate) - ret.mass = candidate.config.specs.mass - ret.wheelbase = candidate.config.specs.wheelbase - ret.steerRatio = candidate.config.specs.steerRatio - ret.centerToFront = ret.wheelbase * candidate.config.specs.centerToFrontRatio - ret.minEnableSpeed = candidate.config.specs.minEnableSpeed - ret.minSteerSpeed = candidate.config.specs.minSteerSpeed - ret.tireStiffnessFactor = candidate.config.specs.tireStiffnessFactor - ret.flags |= int(candidate.config.flags) + ret.mass = platform.config.specs.mass + ret.wheelbase = platform.config.specs.wheelbase + ret.steerRatio = platform.config.specs.steerRatio + ret.centerToFront = ret.wheelbase * platform.config.specs.centerToFrontRatio + ret.minEnableSpeed = platform.config.specs.minEnableSpeed + ret.minSteerSpeed = platform.config.specs.minSteerSpeed + ret.tireStiffnessFactor = platform.config.specs.tireStiffnessFactor + ret.flags |= int(platform.config.flags) ret = cls._get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 1ef8c5b676..81dfe195b2 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -19,7 +19,7 @@ from openpilot.selfdrive.car.fingerprints import all_known_cars from openpilot.selfdrive.car.car_helpers import FRAME_FINGERPRINT, interfaces from openpilot.selfdrive.car.honda.values import CAR as HONDA, HondaFlags from openpilot.selfdrive.car.tests.routes import non_tested_cars, routes, CarTestRoute -from openpilot.selfdrive.car.values import PLATFORMS, Platform +from openpilot.selfdrive.car.values import Platform from openpilot.selfdrive.controls.controlsd import Controls from openpilot.selfdrive.test.helpers import read_segment_list from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT @@ -95,7 +95,7 @@ class TestCarModelBase(unittest.TestCase): if msg.carParams.openpilotLongitudinalControl: experimental_long = True if cls.platform is None and not cls.ci: - cls.platform = PLATFORMS.get(msg.carParams.carFingerprint) + cls.platform = msg.carParams.carFingerprint # Log which can frame the panda safety mode left ELM327, for CAN validity checks elif msg.which() == 'pandaStates': diff --git a/tools/car_porting/test_car_model.py b/tools/car_porting/test_car_model.py index 1dfac7dcf3..b4d263667c 100755 --- a/tools/car_porting/test_car_model.py +++ b/tools/car_porting/test_car_model.py @@ -5,7 +5,6 @@ import unittest from openpilot.selfdrive.car.tests.routes import CarTestRoute from openpilot.selfdrive.car.tests.test_models import TestCarModel -from openpilot.selfdrive.car.values import PLATFORMS from openpilot.tools.lib.route import SegmentName @@ -33,9 +32,7 @@ if __name__ == "__main__": route_or_segment_name = SegmentName(args.route_or_segment_name.strip(), allow_route_name=True) segment_num = route_or_segment_name.segment_num if route_or_segment_name.segment_num != -1 else None - platform = PLATFORMS.get(args.car) - - test_route = CarTestRoute(route_or_segment_name.route_name.canonical_name, platform, segment=segment_num) + test_route = CarTestRoute(route_or_segment_name.route_name.canonical_name, args.car, segment=segment_num) test_suite = create_test_models_suite([test_route], ci=args.ci) unittest.TextTestRunner().run(test_suite) From d5852ab1b35b42a8d66bd37eee66820ab357a094 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 14 Mar 2024 22:27:32 -0700 Subject: [PATCH 052/384] CarInterface: no platform config fallback (#31873) * no mock default * rm --- selfdrive/car/interfaces.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 86f4cc7388..97c9e84c96 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -14,7 +14,6 @@ from openpilot.common.simple_kalman import KF1D, get_kalman_gain from openpilot.common.numpy_fast import clip from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.car import apply_hysteresis, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, STD_CARGO_KG -from openpilot.selfdrive.car.mock.values import CAR as MOCK from openpilot.selfdrive.car.values import PLATFORMS from openpilot.selfdrive.controls.lib.drive_helpers import V_CRUISE_MAX, get_friction from openpilot.selfdrive.controls.lib.events import Events @@ -111,10 +110,9 @@ class CarInterfaceBase(ABC): @classmethod def get_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[car.CarParams.CarFw], experimental_long: bool, docs: bool): - platform = PLATFORMS.get(candidate, MOCK.MOCK) - ret = CarInterfaceBase.get_std_params(candidate) + platform = PLATFORMS[candidate] ret.mass = platform.config.specs.mass ret.wheelbase = platform.config.specs.wheelbase ret.steerRatio = platform.config.specs.steerRatio From bdae188c6f48bc1572f6ca0cc61c4735d11d02fb Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 15 Mar 2024 00:11:41 -0700 Subject: [PATCH 053/384] docs: don't support multi-type car info (#31875) don't support multi-type car info --- selfdrive/car/__init__.py | 5 +- selfdrive/car/body/values.py | 2 +- selfdrive/car/chrysler/values.py | 16 ++--- selfdrive/car/docs.py | 5 +- selfdrive/car/ford/values.py | 6 +- selfdrive/car/gm/values.py | 24 +++---- selfdrive/car/honda/values.py | 36 +++++----- selfdrive/car/hyundai/values.py | 104 ++++++++++++++--------------- selfdrive/car/mazda/values.py | 12 ++-- selfdrive/car/mock/values.py | 2 +- selfdrive/car/nissan/values.py | 10 +-- selfdrive/car/subaru/values.py | 26 ++++---- selfdrive/car/tesla/values.py | 6 +- selfdrive/car/toyota/values.py | 20 +++--- selfdrive/car/volkswagen/values.py | 30 ++++----- 15 files changed, 149 insertions(+), 155 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 1f784a4ab2..a875447762 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -245,9 +245,6 @@ class CanSignalRateCalculator: return self.rate -CarInfos = CarInfo | list[CarInfo] | None - - @dataclass(frozen=True, kw_only=True) class CarSpecs: mass: float # kg, curb weight @@ -265,7 +262,7 @@ class CarSpecs: @dataclass(order=True) class PlatformConfig(Freezable): platform_str: str - car_info: CarInfos + car_info: list[CarInfo] specs: CarSpecs dbc_dict: DbcDict diff --git a/selfdrive/car/body/values.py b/selfdrive/car/body/values.py index 46afa857aa..bbc7a86756 100644 --- a/selfdrive/car/body/values.py +++ b/selfdrive/car/body/values.py @@ -22,7 +22,7 @@ class CarControllerParams: class CAR(Platforms): BODY = PlatformConfig( "COMMA BODY", - CarInfo("comma body", package="All"), + [CarInfo("comma body", package="All")], CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44), dbc_dict('comma_body', None), ) diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 7dcfa3749e..3fa74a9539 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -34,22 +34,22 @@ class CAR(Platforms): # Chrysler PACIFICA_2017_HYBRID = ChryslerPlatformConfig( "CHRYSLER PACIFICA HYBRID 2017", - ChryslerCarInfo("Chrysler Pacifica Hybrid 2017"), + [ChryslerCarInfo("Chrysler Pacifica Hybrid 2017")], ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2), ) PACIFICA_2018_HYBRID = ChryslerPlatformConfig( "CHRYSLER PACIFICA HYBRID 2018", - ChryslerCarInfo("Chrysler Pacifica Hybrid 2018"), + [ChryslerCarInfo("Chrysler Pacifica Hybrid 2018")], PACIFICA_2017_HYBRID.specs, ) PACIFICA_2019_HYBRID = ChryslerPlatformConfig( "CHRYSLER PACIFICA HYBRID 2019", - ChryslerCarInfo("Chrysler Pacifica Hybrid 2019-23"), + [ChryslerCarInfo("Chrysler Pacifica Hybrid 2019-23")], PACIFICA_2017_HYBRID.specs, ) PACIFICA_2018 = ChryslerPlatformConfig( "CHRYSLER PACIFICA 2018", - ChryslerCarInfo("Chrysler Pacifica 2017-18"), + [ChryslerCarInfo("Chrysler Pacifica 2017-18")], PACIFICA_2017_HYBRID.specs, ) PACIFICA_2020 = ChryslerPlatformConfig( @@ -64,27 +64,27 @@ class CAR(Platforms): # Dodge DODGE_DURANGO = ChryslerPlatformConfig( "DODGE DURANGO 2021", - ChryslerCarInfo("Dodge Durango 2020-21"), + [ChryslerCarInfo("Dodge Durango 2020-21")], PACIFICA_2017_HYBRID.specs, ) # Jeep JEEP_GRAND_CHEROKEE = ChryslerPlatformConfig( # includes 2017 Trailhawk "JEEP GRAND CHEROKEE V6 2018", - ChryslerCarInfo("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk"), + [ChryslerCarInfo("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk")], ChryslerCarSpecs(mass=1778., wheelbase=2.71, steerRatio=16.7), ) JEEP_GRAND_CHEROKEE_2019 = ChryslerPlatformConfig( # includes 2020 Trailhawk "JEEP GRAND CHEROKEE 2019", - ChryslerCarInfo("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4"), + [ChryslerCarInfo("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4")], JEEP_GRAND_CHEROKEE.specs, ) # Ram RAM_1500 = ChryslerPlatformConfig( "RAM 1500 5TH GEN", - ChryslerCarInfo("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram])), + [ChryslerCarInfo("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram]))], ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5), dbc_dict('chrysler_ram_dt_generated', None), ) diff --git a/selfdrive/car/docs.py b/selfdrive/car/docs.py index ce46bd93c2..24660261cb 100755 --- a/selfdrive/car/docs.py +++ b/selfdrive/car/docs.py @@ -34,13 +34,10 @@ def get_all_car_info() -> list[CarInfo]: CP = interfaces[model][0].get_params(platform, fingerprint=gen_empty_fingerprint(), car_fw=[car.CarParams.CarFw(ecu="unknown")], experimental_long=True, docs=True) - if CP.dashcamOnly or car_info is None: + if CP.dashcamOnly or not len(car_info): continue # A platform can include multiple car models - if not isinstance(car_info, list): - car_info = [car_info,] - for _car_info in car_info: if not hasattr(_car_info, "row"): _car_info.init_make(CP) diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 09c02d53a6..3b76be8c69 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -86,7 +86,7 @@ class FordCANFDPlatformConfig(FordPlatformConfig): class CAR(Platforms): BRONCO_SPORT_MK1 = FordPlatformConfig( "FORD BRONCO SPORT 1ST GEN", - FordCarInfo("Ford Bronco Sport 2021-23"), + [FordCarInfo("Ford Bronco Sport 2021-23")], CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7), ) ESCAPE_MK4 = FordPlatformConfig( @@ -121,7 +121,7 @@ class CAR(Platforms): ) F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( "FORD F-150 LIGHTNING 1ST GEN", - FordCarInfo("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0"), + [FordCarInfo("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0")], CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), ) FOCUS_MK4 = FordPlatformConfig( @@ -144,7 +144,7 @@ class CAR(Platforms): ) MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig( "FORD MUSTANG MACH-E 1ST GEN", - FordCarInfo("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0"), + [FordCarInfo("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0")], CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio ) diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 5401963ee6..9e18ea18d5 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -92,52 +92,52 @@ class GMPlatformConfig(PlatformConfig): class CAR(Platforms): HOLDEN_ASTRA = GMPlatformConfig( "HOLDEN ASTRA RS-V BK 2017", - GMCarInfo("Holden Astra 2017"), + [GMCarInfo("Holden Astra 2017")], GMCarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4), ) VOLT = GMPlatformConfig( "CHEVROLET VOLT PREMIER 2017", - GMCarInfo("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ"), + [GMCarInfo("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ")], GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469), ) CADILLAC_ATS = GMPlatformConfig( "CADILLAC ATS Premium Performance 2018", - GMCarInfo("Cadillac ATS Premium Performance 2018"), + [GMCarInfo("Cadillac ATS Premium Performance 2018")], GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), ) MALIBU = GMPlatformConfig( "CHEVROLET MALIBU PREMIER 2017", - GMCarInfo("Chevrolet Malibu Premier 2017"), + [GMCarInfo("Chevrolet Malibu Premier 2017")], GMCarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4), ) ACADIA = GMPlatformConfig( "GMC ACADIA DENALI 2018", - GMCarInfo("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo"), + [GMCarInfo("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo")], GMCarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4), ) BUICK_LACROSSE = GMPlatformConfig( "BUICK LACROSSE 2017", - GMCarInfo("Buick LaCrosse 2017-19", "Driver Confidence Package 2"), + [GMCarInfo("Buick LaCrosse 2017-19", "Driver Confidence Package 2")], GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), ) BUICK_REGAL = GMPlatformConfig( "BUICK REGAL ESSENCE 2018", - GMCarInfo("Buick Regal Essence 2018"), + [GMCarInfo("Buick Regal Essence 2018")], GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), ) ESCALADE = GMPlatformConfig( "CADILLAC ESCALADE 2017", - GMCarInfo("Cadillac Escalade 2017", "Driver Assist Package"), + [GMCarInfo("Cadillac Escalade 2017", "Driver Assist Package")], GMCarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3), ) ESCALADE_ESV = GMPlatformConfig( "CADILLAC ESCALADE ESV 2016", - GMCarInfo("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS"), + [GMCarInfo("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")], GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0), ) ESCALADE_ESV_2019 = GMPlatformConfig( "CADILLAC ESCALADE ESV 2019", - GMCarInfo("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS"), + [GMCarInfo("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")], ESCALADE_ESV.specs, ) BOLT_EUV = GMPlatformConfig( @@ -158,12 +158,12 @@ class CAR(Platforms): ) EQUINOX = GMPlatformConfig( "CHEVROLET EQUINOX 2019", - GMCarInfo("Chevrolet Equinox 2019-22"), + [GMCarInfo("Chevrolet Equinox 2019-22")], GMCarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), ) TRAILBLAZER = GMPlatformConfig( "CHEVROLET TRAILBLAZER 2021", - GMCarInfo("Chevrolet Trailblazer 2021-22"), + [GMCarInfo("Chevrolet Trailblazer 2021-22")], GMCarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), ) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index eed76c42ab..96de8b0b29 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -138,7 +138,7 @@ class CAR(Platforms): ) CIVIC_BOSCH_DIESEL = HondaBoschPlatformConfig( "HONDA CIVIC SEDAN 1.6 DIESEL 2019", - None, # don't show in docs + [], # don't show in docs CIVIC_BOSCH.specs, dbc_dict('honda_accord_2018_can_generated', None), ) @@ -154,7 +154,7 @@ class CAR(Platforms): ) CRV_5G = HondaBoschPlatformConfig( "HONDA CR-V 2017", - HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS), + [HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS)], # steerRatio: 12.3 is spec end-to-end CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), @@ -162,34 +162,34 @@ class CAR(Platforms): ) CRV_HYBRID = HondaBoschPlatformConfig( "HONDA CR-V HYBRID 2019", - HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS), + [HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS)], # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), dbc_dict('honda_accord_2018_can_generated', None), ) HRV_3G = HondaBoschPlatformConfig( "HONDA HR-V 2023", - HondaCarInfo("Honda HR-V 2023", "All"), + [HondaCarInfo("Honda HR-V 2023", "All")], CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41, tireStiffnessFactor=0.5), dbc_dict('honda_civic_ex_2022_can_generated', None), flags=HondaFlags.BOSCH_RADARLESS | HondaFlags.BOSCH_ALT_BRAKE, ) ACURA_RDX_3G = HondaBoschPlatformConfig( "ACURA RDX 2020", - HondaCarInfo("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), + [HondaCarInfo("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), # as spec dbc_dict('acura_rdx_2020_can_generated', None), flags=HondaFlags.BOSCH_ALT_BRAKE, ) INSIGHT = HondaBoschPlatformConfig( "HONDA INSIGHT 2019", - HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), + [HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39, tireStiffnessFactor=0.82), # as spec dbc_dict('honda_insight_ex_2019_can_generated', None), ) HONDA_E = HondaBoschPlatformConfig( "HONDA E 2020", - HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS), + [HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71, tireStiffnessFactor=0.82), dbc_dict('acura_rdx_2020_can_generated', None), ) @@ -197,63 +197,63 @@ class CAR(Platforms): # Nidec Cars ACURA_ILX = HondaNidecPlatformConfig( "ACURA ILX 2016", - HondaCarInfo("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS), + [HondaCarInfo("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS)], CarSpecs(mass=3095 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=18.61, centerToFrontRatio=0.37, tireStiffnessFactor=0.72), # 15.3 is spec end-to-end dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CRV = HondaNidecPlatformConfig( "HONDA CR-V 2016", - HondaCarInfo("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS), + [HondaCarInfo("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41, tireStiffnessFactor=0.444), # as spec dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CRV_EU = HondaNidecPlatformConfig( "HONDA CR-V EU 2016", - None, # Euro version of CRV Touring, don't show in docs + [], # Euro version of CRV Touring, don't show in docs CRV.specs, dbc_dict('honda_crv_executive_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) FIT = HondaNidecPlatformConfig( "HONDA FIT 2018", - HondaCarInfo("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS), + [HondaCarInfo("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) FREED = HondaNidecPlatformConfig( "HONDA FREED 2020", - HondaCarInfo("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS), + [HondaCarInfo("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), # mostly copied from FIT dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) HRV = HondaNidecPlatformConfig( "HONDA HRV 2019", - HondaCarInfo("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS), + [HondaCarInfo("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS)], HRV_3G.specs, dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) ODYSSEY = HondaNidecPlatformConfig( "HONDA ODYSSEY 2018", - HondaCarInfo("Honda Odyssey 2018-20"), + [HondaCarInfo("Honda Odyssey 2018-20")], CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41, tireStiffnessFactor=0.82), dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_PCM_ACCEL, ) ODYSSEY_CHN = HondaNidecPlatformConfig( "HONDA ODYSSEY CHN 2019", - None, # Chinese version of Odyssey, don't show in docs + [], # Chinese version of Odyssey, don't show in docs ODYSSEY.specs, dbc_dict('honda_odyssey_extreme_edition_2018_china_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) ACURA_RDX = HondaNidecPlatformConfig( "ACURA RDX 2018", - HondaCarInfo("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS), + [HondaCarInfo("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38, tireStiffnessFactor=0.444), # as spec dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, @@ -270,14 +270,14 @@ class CAR(Platforms): ) RIDGELINE = HondaNidecPlatformConfig( "HONDA RIDGELINE 2017", - HondaCarInfo("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS), + [HondaCarInfo("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59, tireStiffnessFactor=0.444), # as spec dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CIVIC = HondaNidecPlatformConfig( "HONDA CIVIC 2016", - HondaCarInfo("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE"), + [HondaCarInfo("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE")], CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'), ) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index bc03d83925..c17d57880c 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -136,7 +136,7 @@ class CAR(Platforms): # Hyundai AZERA_6TH_GEN = HyundaiPlatformConfig( "HYUNDAI AZERA 6TH GEN", - HyundaiCarInfo("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + [HyundaiCarInfo("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5), ) AZERA_HEV_6TH_GEN = HyundaiPlatformConfig( @@ -170,14 +170,14 @@ class CAR(Platforms): ) ELANTRA_2021 = HyundaiPlatformConfig( "HYUNDAI ELANTRA 2021", - HyundaiCarInfo("Hyundai Elantra 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k])), + [HyundaiCarInfo("Hyundai Elantra 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=2800 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), flags=HyundaiFlags.CHECKSUM_CRC8, ) ELANTRA_HEV_2021 = HyundaiPlatformConfig( "HYUNDAI ELANTRA HYBRID 2021", - HyundaiCarInfo("Hyundai Elantra Hybrid 2021-23", video_link="https://youtu.be/_EdYQtV52-c", - car_parts=CarParts.common([CarHarness.hyundai_k])), + [HyundaiCarInfo("Hyundai Elantra Hybrid 2021-23", video_link="https://youtu.be/_EdYQtV52-c", + car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=3017 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) @@ -193,114 +193,114 @@ class CAR(Platforms): ) IONIQ = HyundaiPlatformConfig( "HYUNDAI IONIQ HYBRID 2017-2019", - HyundaiCarInfo("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c])), + [HyundaiCarInfo("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, ) IONIQ_HEV_2022 = HyundaiPlatformConfig( "HYUNDAI IONIQ HYBRID 2020-2022", - HyundaiCarInfo("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h])), # TODO: confirm 2020-21 harness, + [HyundaiCarInfo("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], # TODO: confirm 2020-21 harness, CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, ) IONIQ_EV_LTD = HyundaiPlatformConfig( "HYUNDAI IONIQ ELECTRIC LIMITED 2019", - HyundaiCarInfo("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c])), + [HyundaiCarInfo("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY | HyundaiFlags.MIN_STEER_32_MPH, ) IONIQ_EV_2020 = HyundaiPlatformConfig( "HYUNDAI IONIQ ELECTRIC 2020", - HyundaiCarInfo("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), + [HyundaiCarInfo("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV, ) IONIQ_PHEV_2019 = HyundaiPlatformConfig( "HYUNDAI IONIQ PLUG-IN HYBRID 2019", - HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c])), + [HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, ) IONIQ_PHEV = HyundaiPlatformConfig( "HYUNDAI IONIQ PHEV 2020", - HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), + [HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID, ) KONA = HyundaiPlatformConfig( "HYUNDAI KONA 2020", - HyundaiCarInfo("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b])), + [HyundaiCarInfo("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b]))], CarSpecs(mass=1275, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CLUSTER_GEARS, ) KONA_EV = HyundaiPlatformConfig( "HYUNDAI KONA ELECTRIC 2019", - HyundaiCarInfo("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g])), + [HyundaiCarInfo("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))], CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV, ) KONA_EV_2022 = HyundaiPlatformConfig( "HYUNDAI KONA ELECTRIC 2022", - HyundaiCarInfo("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o])), + [HyundaiCarInfo("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))], CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV, ) KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI KONA ELECTRIC 2ND GEN", - HyundaiCarInfo("Hyundai Kona Electric (with HDA II, Korea only) 2023", video_link="https://www.youtube.com/watch?v=U2fOCmcQ8hw", - car_parts=CarParts.common([CarHarness.hyundai_r])), + [HyundaiCarInfo("Hyundai Kona Electric (with HDA II, Korea only) 2023", video_link="https://www.youtube.com/watch?v=U2fOCmcQ8hw", + car_parts=CarParts.common([CarHarness.hyundai_r]))], CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, ) KONA_HEV = HyundaiPlatformConfig( "HYUNDAI KONA HYBRID 2020", - HyundaiCarInfo("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i])), # TODO: check packages, + [HyundaiCarInfo("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages, CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID, ) SANTA_FE = HyundaiPlatformConfig( "HYUNDAI SANTA FE 2019", - HyundaiCarInfo("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s", - car_parts=CarParts.common([CarHarness.hyundai_d])), + [HyundaiCarInfo("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s", + car_parts=CarParts.common([CarHarness.hyundai_d]))], CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.766, steerRatio=16.55, tireStiffnessFactor=0.82), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) SANTA_FE_2022 = HyundaiPlatformConfig( "HYUNDAI SANTA FE 2022", - HyundaiCarInfo("Hyundai Santa Fe 2021-23", "All", video_link="https://youtu.be/VnHzSTygTS4", - car_parts=CarParts.common([CarHarness.hyundai_l])), + [HyundaiCarInfo("Hyundai Santa Fe 2021-23", "All", video_link="https://youtu.be/VnHzSTygTS4", + car_parts=CarParts.common([CarHarness.hyundai_l]))], SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8, ) SANTA_FE_HEV_2022 = HyundaiPlatformConfig( "HYUNDAI SANTA FE HYBRID 2022", - HyundaiCarInfo("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), + [HyundaiCarInfo("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) SANTA_FE_PHEV_2022 = HyundaiPlatformConfig( "HYUNDAI SANTA FE PlUG-IN HYBRID 2022", - HyundaiCarInfo("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), + [HyundaiCarInfo("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) SONATA = HyundaiPlatformConfig( "HYUNDAI SONATA 2020", - HyundaiCarInfo("Hyundai Sonata 2020-23", "All", video_link="https://www.youtube.com/watch?v=ix63r9kE3Fw", - car_parts=CarParts.common([CarHarness.hyundai_a])), + [HyundaiCarInfo("Hyundai Sonata 2020-23", "All", video_link="https://www.youtube.com/watch?v=ix63r9kE3Fw", + car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) SONATA_LF = HyundaiPlatformConfig( "HYUNDAI SONATA 2019", - HyundaiCarInfo("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e])), + [HyundaiCarInfo("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, ) STARIA_4TH_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI STARIA 4TH GEN", - HyundaiCarInfo("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + [HyundaiCarInfo("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=2205, wheelbase=3.273, steerRatio=11.94), # https://www.hyundai.com/content/dam/hyundai/au/en/models/staria-load/premium-pip-update-2023/spec-sheet/STARIA_Load_Spec-Table_March_2023_v3.1.pdf ) TUCSON = HyundaiPlatformConfig( @@ -323,13 +323,13 @@ class CAR(Platforms): ) VELOSTER = HyundaiPlatformConfig( "HYUNDAI VELOSTER 2019", - HyundaiCarInfo("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e])), + [HyundaiCarInfo("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS, ) SONATA_HYBRID = HyundaiPlatformConfig( "HYUNDAI SONATA HYBRID 2021", - HyundaiCarInfo("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), + [HyundaiCarInfo("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], SONATA.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) @@ -345,7 +345,7 @@ class CAR(Platforms): ) IONIQ_6 = HyundaiCanFDPlatformConfig( "HYUNDAI IONIQ 6 2023", - HyundaiCarInfo("Hyundai Ioniq 6 (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p])), + [HyundaiCarInfo("Hyundai Ioniq 6 (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))], IONIQ_5.specs, flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, ) @@ -360,13 +360,13 @@ class CAR(Platforms): ) SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI SANTA CRUZ 1ST GEN", - HyundaiCarInfo("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n])), + [HyundaiCarInfo("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))], # weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2), ) CUSTIN_1ST_GEN = HyundaiPlatformConfig( "HYUNDAI CUSTIN 1ST GEN", - HyundaiCarInfo("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + [HyundaiCarInfo("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner flags=HyundaiFlags.CHECKSUM_CRC8, ) @@ -382,19 +382,19 @@ class CAR(Platforms): ) KIA_K5_2021 = HyundaiPlatformConfig( "KIA K5 2021", - HyundaiCarInfo("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a])), + [HyundaiCarInfo("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=3381 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), # 2021 Kia K5 Steering Ratio (all trims) flags=HyundaiFlags.CHECKSUM_CRC8, ) KIA_K5_HEV_2020 = HyundaiPlatformConfig( "KIA K5 HYBRID 2020", - HyundaiCarInfo("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a])), + [HyundaiCarInfo("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a]))], KIA_K5_2021.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) KIA_K8_HEV_1ST_GEN = HyundaiCanFDPlatformConfig( "KIA K8 HYBRID 1ST GEN", - HyundaiCarInfo("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), + [HyundaiCarInfo("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q]))], # mass: https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid, steerRatio: guesstimate from K5 platform CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27) ) @@ -411,7 +411,7 @@ class CAR(Platforms): ) KIA_NIRO_EV_2ND_GEN = HyundaiCanFDPlatformConfig( "KIA NIRO EV 2ND GEN", - HyundaiCarInfo("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), + [HyundaiCarInfo("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], KIA_NIRO_EV.specs, flags=HyundaiFlags.EV, ) @@ -445,38 +445,38 @@ class CAR(Platforms): ) KIA_NIRO_HEV_2ND_GEN = HyundaiCanFDPlatformConfig( "KIA NIRO HYBRID 2ND GEN", - HyundaiCarInfo("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a])), + [HyundaiCarInfo("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a]))], KIA_NIRO_EV.specs, ) KIA_OPTIMA_G4 = HyundaiPlatformConfig( "KIA OPTIMA 4TH GEN", - HyundaiCarInfo("Kia Optima 2017", "Advanced Smart Cruise Control", - car_parts=CarParts.common([CarHarness.hyundai_b])), # TODO: may support 2016, 2018 + [HyundaiCarInfo("Kia Optima 2017", "Advanced Smart Cruise Control", + car_parts=CarParts.common([CarHarness.hyundai_b]))], # TODO: may support 2016, 2018 CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS | HyundaiFlags.MIN_STEER_32_MPH, ) KIA_OPTIMA_G4_FL = HyundaiPlatformConfig( "KIA OPTIMA 4TH GEN FACELIFT", - HyundaiCarInfo("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g])), + [HyundaiCarInfo("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g]))], CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, ) # TODO: may support adjacent years. may have a non-zero minimum steering speed KIA_OPTIMA_H = HyundaiPlatformConfig( "KIA OPTIMA HYBRID 2017 & SPORTS 2019", - HyundaiCarInfo("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c])), + [HyundaiCarInfo("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, ) KIA_OPTIMA_H_G4_FL = HyundaiPlatformConfig( "KIA OPTIMA HYBRID 4TH GEN FACELIFT", - HyundaiCarInfo("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h])), + [HyundaiCarInfo("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, ) KIA_SELTOS = HyundaiPlatformConfig( "KIA SELTOS 2021", - HyundaiCarInfo("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a])), + [HyundaiCarInfo("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56), flags=HyundaiFlags.CHECKSUM_CRC8, ) @@ -501,7 +501,7 @@ class CAR(Platforms): ) KIA_SORENTO_4TH_GEN = HyundaiCanFDPlatformConfig( "KIA SORENTO 4TH GEN", - HyundaiCarInfo("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k])), + [HyundaiCarInfo("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms flags=HyundaiFlags.RADAR_SCC, ) @@ -516,18 +516,18 @@ class CAR(Platforms): ) KIA_STINGER = HyundaiPlatformConfig( "KIA STINGER GT2 2018", - HyundaiCarInfo("Kia Stinger 2018-20", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0", - car_parts=CarParts.common([CarHarness.hyundai_c])), + [HyundaiCarInfo("Kia Stinger 2018-20", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0", + car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1825, wheelbase=2.78, steerRatio=14.4 * 1.15) # 15% higher at the center seems reasonable ) KIA_STINGER_2022 = HyundaiPlatformConfig( "KIA STINGER 2022", - HyundaiCarInfo("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + [HyundaiCarInfo("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], KIA_STINGER.specs, ) KIA_CEED = HyundaiPlatformConfig( "KIA CEED INTRO ED 2019", - HyundaiCarInfo("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e])), + [HyundaiCarInfo("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY, ) @@ -563,13 +563,13 @@ class CAR(Platforms): ) GENESIS_G70 = HyundaiPlatformConfig( "GENESIS G70 2018", - HyundaiCarInfo("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + [HyundaiCarInfo("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56), flags=HyundaiFlags.LEGACY, ) GENESIS_G70_2020 = HyundaiPlatformConfig( "GENESIS G70 2020", - HyundaiCarInfo("Genesis G70 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + [HyundaiCarInfo("Genesis G70 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9), flags=HyundaiFlags.MANDO_RADAR, ) @@ -584,18 +584,18 @@ class CAR(Platforms): ) GENESIS_G80 = HyundaiPlatformConfig( "GENESIS G80 2017", - HyundaiCarInfo("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), + [HyundaiCarInfo("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5), flags=HyundaiFlags.LEGACY, ) GENESIS_G90 = HyundaiPlatformConfig( "GENESIS G90 2017", - HyundaiCarInfo("Genesis G90 2017-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), + [HyundaiCarInfo("Genesis G90 2017-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=2200, wheelbase=3.15, steerRatio=12.069), ) GENESIS_GV80 = HyundaiCanFDPlatformConfig( "GENESIS GV80 2023", - HyundaiCarInfo("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), + [HyundaiCarInfo("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))], CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14), flags=HyundaiFlags.RADAR_SCC, ) diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index b55690f39a..2bb5b4ff08 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -52,32 +52,32 @@ class MazdaPlatformConfig(PlatformConfig): class CAR(Platforms): CX5 = MazdaPlatformConfig( "MAZDA CX-5", - MazdaCarInfo("Mazda CX-5 2017-21"), + [MazdaCarInfo("Mazda CX-5 2017-21")], MazdaCarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) ) CX9 = MazdaPlatformConfig( "MAZDA CX-9", - MazdaCarInfo("Mazda CX-9 2016-20"), + [MazdaCarInfo("Mazda CX-9 2016-20")], MazdaCarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) ) MAZDA3 = MazdaPlatformConfig( "MAZDA 3", - MazdaCarInfo("Mazda 3 2017-18"), + [MazdaCarInfo("Mazda 3 2017-18")], MazdaCarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) ) MAZDA6 = MazdaPlatformConfig( "MAZDA 6", - MazdaCarInfo("Mazda 6 2017-20"), + [MazdaCarInfo("Mazda 6 2017-20")], MazdaCarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5) ) CX9_2021 = MazdaPlatformConfig( "MAZDA CX-9 2021", - MazdaCarInfo("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4"), + [MazdaCarInfo("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4")], CX9.specs ) CX5_2022 = MazdaPlatformConfig( "MAZDA CX-5 2022", - MazdaCarInfo("Mazda CX-5 2022-24"), + [MazdaCarInfo("Mazda CX-5 2022-24")], CX5.specs, ) diff --git a/selfdrive/car/mock/values.py b/selfdrive/car/mock/values.py index ddab599a93..214c6809db 100644 --- a/selfdrive/car/mock/values.py +++ b/selfdrive/car/mock/values.py @@ -4,7 +4,7 @@ from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms class CAR(Platforms): MOCK = PlatformConfig( 'mock', - None, + [], CarSpecs(mass=1700, wheelbase=2.7, steerRatio=13), {} ) diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index c0ccb0febf..dd51437dd9 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -39,26 +39,26 @@ class NissanPlaformConfig(PlatformConfig): class CAR(Platforms): XTRAIL = NissanPlaformConfig( "NISSAN X-TRAIL 2017", - NissanCarInfo("Nissan X-Trail 2017"), + [NissanCarInfo("Nissan X-Trail 2017")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) LEAF = NissanPlaformConfig( "NISSAN LEAF 2018", - NissanCarInfo("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY"), + [NissanCarInfo("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY")], NissanCarSpecs(mass=1610, wheelbase=2.705), dbc_dict('nissan_leaf_2018_generated', None), ) # Leaf with ADAS ECU found behind instrument cluster instead of glovebox # Currently the only known difference between them is the inverted seatbelt signal. - LEAF_IC = LEAF.override(platform_str="NISSAN LEAF 2018 Instrument Cluster", car_info=None) + LEAF_IC = LEAF.override(platform_str="NISSAN LEAF 2018 Instrument Cluster", car_info=[]) ROGUE = NissanPlaformConfig( "NISSAN ROGUE 2019", - NissanCarInfo("Nissan Rogue 2018-20"), + [NissanCarInfo("Nissan Rogue 2018-20")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) ALTIMA = NissanPlaformConfig( "NISSAN ALTIMA 2020", - NissanCarInfo("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b])), + [NissanCarInfo("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b]))], NissanCarSpecs(mass=1492, wheelbase=2.824) ) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 6f799e2206..d1faed47f0 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -122,17 +122,17 @@ class CAR(Platforms): # Global platform ASCENT = SubaruPlatformConfig( "SUBARU ASCENT LIMITED 2019", - SubaruCarInfo("Subaru Ascent 2019-21", "All"), + [SubaruCarInfo("Subaru Ascent 2019-21", "All")], CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5), ) OUTBACK = SubaruGen2PlatformConfig( "SUBARU OUTBACK 6TH GEN", - SubaruCarInfo("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), + [SubaruCarInfo("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), ) LEGACY = SubaruGen2PlatformConfig( "SUBARU LEGACY 7TH GEN", - SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), + [SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], OUTBACK.specs, ) IMPREZA = SubaruPlatformConfig( @@ -157,47 +157,47 @@ class CAR(Platforms): # TODO: is there an XV and Impreza too? CROSSTREK_HYBRID = SubaruPlatformConfig( "SUBARU CROSSTREK HYBRID 2020", - SubaruCarInfo("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b])), + [SubaruCarInfo("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b]))], CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.HYBRID, ) FORESTER = SubaruPlatformConfig( "SUBARU FORESTER 2019", - SubaruCarInfo("Subaru Forester 2019-21", "All"), + [SubaruCarInfo("Subaru Forester 2019-21", "All")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.STEER_RATE_LIMITED, ) FORESTER_HYBRID = SubaruPlatformConfig( "SUBARU FORESTER HYBRID 2020", - SubaruCarInfo("Subaru Forester Hybrid 2020"), + [SubaruCarInfo("Subaru Forester Hybrid 2020")], FORESTER.specs, flags=SubaruFlags.HYBRID, ) # Pre-global FORESTER_PREGLOBAL = SubaruPlatformConfig( "SUBARU FORESTER 2017 - 2018", - SubaruCarInfo("Subaru Forester 2017-18"), + [SubaruCarInfo("Subaru Forester 2017-18")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), dbc_dict('subaru_forester_2017_generated', None), flags=SubaruFlags.PREGLOBAL, ) LEGACY_PREGLOBAL = SubaruPlatformConfig( "SUBARU LEGACY 2015 - 2018", - SubaruCarInfo("Subaru Legacy 2015-18"), + [SubaruCarInfo("Subaru Legacy 2015-18")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), dbc_dict('subaru_outback_2015_generated', None), flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL = SubaruPlatformConfig( "SUBARU OUTBACK 2015 - 2017", - SubaruCarInfo("Subaru Outback 2015-17"), + [SubaruCarInfo("Subaru Outback 2015-17")], FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2015_generated', None), flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( "SUBARU OUTBACK 2018 - 2019", - SubaruCarInfo("Subaru Outback 2018-19"), + [SubaruCarInfo("Subaru Outback 2018-19")], FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2019_generated', None), flags=SubaruFlags.PREGLOBAL, @@ -205,19 +205,19 @@ class CAR(Platforms): # Angle LKAS FORESTER_2022 = SubaruPlatformConfig( "SUBARU FORESTER 2022", - SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c])), + [SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c]))], FORESTER.specs, flags=SubaruFlags.LKAS_ANGLE, ) OUTBACK_2023 = SubaruGen2PlatformConfig( "SUBARU OUTBACK 7TH GEN", - SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), + [SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], OUTBACK.specs, flags=SubaruFlags.LKAS_ANGLE, ) ASCENT_2023 = SubaruGen2PlatformConfig( "SUBARU ASCENT 2023", - SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), + [SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], ASCENT.specs, flags=SubaruFlags.LKAS_ANGLE, ) diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index ca3bb38a7a..d098e93182 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -12,19 +12,19 @@ Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values']) class CAR(Platforms): AP1_MODELS = PlatformConfig( 'TESLA AP1 MODEL S', - CarInfo("Tesla AP1 Model S", "All"), + [CarInfo("Tesla AP1 Model S", "All")], CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0), dbc_dict('tesla_powertrain', 'tesla_radar_bosch_generated', chassis_dbc='tesla_can') ) AP2_MODELS = PlatformConfig( 'TESLA AP2 MODEL S', - CarInfo("Tesla AP2 Model S", "All"), + [CarInfo("Tesla AP2 Model S", "All")], AP1_MODELS.specs, AP1_MODELS.dbc_dict ) MODELS_RAVEN = PlatformConfig( 'TESLA MODEL S RAVEN', - CarInfo("Tesla Model S Raven", "All"), + [CarInfo("Tesla Model S Raven", "All")], AP1_MODELS.specs, dbc_dict('tesla_powertrain', 'tesla_radar_continental_generated', chassis_dbc='tesla_can') ) diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 2be7ca1865..ce035ae573 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -158,7 +158,7 @@ class CAR(Platforms): ) COROLLA = PlatformConfig( "TOYOTA COROLLA 2017", - ToyotaCarInfo("Toyota Corolla 2017-19"), + [ToyotaCarInfo("Toyota Corolla 2017-19")], CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) @@ -207,7 +207,7 @@ class CAR(Platforms): ) PRIUS_V = PlatformConfig( "TOYOTA PRIUS v 2017", - ToyotaCarInfo("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED), + [ToyotaCarInfo("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED)], CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, @@ -267,12 +267,12 @@ class CAR(Platforms): ) MIRAI = ToyotaTSS2PlatformConfig( "TOYOTA MIRAI 2021", # TSS 2.5 - ToyotaCarInfo("Toyota Mirai 2021"), + [ToyotaCarInfo("Toyota Mirai 2021")], CarSpecs(mass=4300. * CV.LB_TO_KG, wheelbase=2.91, steerRatio=14.8, tireStiffnessFactor=0.8), ) SIENNA = PlatformConfig( "TOYOTA SIENNA 2018", - ToyotaCarInfo("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED), + [ToyotaCarInfo("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED)], CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_STOP_TIMER, @@ -281,7 +281,7 @@ class CAR(Platforms): # Lexus LEXUS_CTH = PlatformConfig( "LEXUS CT HYBRID 2018", - ToyotaCarInfo("Lexus CT Hybrid 2017-18", "Lexus Safety System+"), + [ToyotaCarInfo("Lexus CT Hybrid 2017-18", "Lexus Safety System+")], CarSpecs(mass=3108. * CV.LB_TO_KG, wheelbase=2.6, steerRatio=18.6, tireStiffnessFactor=0.517), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) @@ -304,14 +304,14 @@ class CAR(Platforms): ) LEXUS_IS = PlatformConfig( "LEXUS IS 2018", - ToyotaCarInfo("Lexus IS 2017-19"), + [ToyotaCarInfo("Lexus IS 2017-19")], CarSpecs(mass=3736.8 * CV.LB_TO_KG, wheelbase=2.79908, steerRatio=13.3, tireStiffnessFactor=0.444), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.UNSUPPORTED_DSU, ) LEXUS_IS_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS IS 2023", - ToyotaCarInfo("Lexus IS 2022-23"), + [ToyotaCarInfo("Lexus IS 2022-23")], LEXUS_IS.specs, ) LEXUS_NX = PlatformConfig( @@ -333,12 +333,12 @@ class CAR(Platforms): ) LEXUS_LC_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS LC 2024", - ToyotaCarInfo("Lexus LC 2024"), + [ToyotaCarInfo("Lexus LC 2024")], CarSpecs(mass=4500. * CV.LB_TO_KG, wheelbase=2.87, steerRatio=13.0, tireStiffnessFactor=0.444), ) LEXUS_RC = PlatformConfig( "LEXUS RC 2020", - ToyotaCarInfo("Lexus RC 2018-20"), + [ToyotaCarInfo("Lexus RC 2018-20")], LEXUS_IS.specs, dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.UNSUPPORTED_DSU, @@ -365,7 +365,7 @@ class CAR(Platforms): ) LEXUS_GS_F = PlatformConfig( "LEXUS GS F 2016", - ToyotaCarInfo("Lexus GS F 2016"), + [ToyotaCarInfo("Lexus GS F 2016")], CarSpecs(mass=4034. * CV.LB_TO_KG, wheelbase=2.84988, steerRatio=13.3, tireStiffnessFactor=0.444), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), flags=ToyotaFlags.UNSUPPORTED_DSU, diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index a45ddf431f..83b30d2569 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -250,7 +250,7 @@ class CAR(Platforms): ) PASSAT_NMS = VolkswagenPQPlatformConfig( "VOLKSWAGEN PASSAT NMS", # Chassis A3 - VWCarInfo("Volkswagen Passat NMS 2017-22"), + [VWCarInfo("Volkswagen Passat NMS 2017-22")], VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50*CV.KPH_TO_MS, minEnableSpeed=20*CV.KPH_TO_MS), ) POLO_MK6 = VolkswagenMQBPlatformConfig( @@ -271,12 +271,12 @@ class CAR(Platforms): ) TAOS_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN TAOS 1ST GEN", # Chassis B2 - VWCarInfo("Volkswagen Taos 2022-23"), + [VWCarInfo("Volkswagen Taos 2022-23")], VolkswagenCarSpecs(mass=1498, wheelbase=2.69), ) TCROSS_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN T-CROSS 1ST GEN", # Chassis C1 - VWCarInfo("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0]), + [VWCarInfo("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1150, wheelbase=2.60), ) TIGUAN_MK2 = VolkswagenMQBPlatformConfig( @@ -289,7 +289,7 @@ class CAR(Platforms): ) TOURAN_MK2 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN TOURAN 2ND GEN", # Chassis 1T - VWCarInfo("Volkswagen Touran 2016-23"), + [VWCarInfo("Volkswagen Touran 2016-23")], VolkswagenCarSpecs(mass=1516, wheelbase=2.79), ) TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( @@ -302,7 +302,7 @@ class CAR(Platforms): ) TROC_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN T-ROC 1ST GEN", # Chassis A1 - VWCarInfo("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0]), + [VWCarInfo("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1413, wheelbase=2.63), ) AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( @@ -317,42 +317,42 @@ class CAR(Platforms): ) AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( "AUDI Q2 1ST GEN", # Chassis GA - VWCarInfo("Audi Q2 2018"), + [VWCarInfo("Audi Q2 2018")], VolkswagenCarSpecs(mass=1205, wheelbase=2.61), ) AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( "AUDI Q3 2ND GEN", # Chassis 8U/F3/FS - VWCarInfo("Audi Q3 2019-23"), + [VWCarInfo("Audi Q3 2019-23")], VolkswagenCarSpecs(mass=1623, wheelbase=2.68), ) SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( "SEAT ATECA 1ST GEN", # Chassis 5F - VWCarInfo("SEAT Ateca 2018"), + [VWCarInfo("SEAT Ateca 2018")], VolkswagenCarSpecs(mass=1900, wheelbase=2.64), ) SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( "SEAT LEON 3RD GEN", # Chassis 5F - VWCarInfo("SEAT Leon 2014-20"), + [VWCarInfo("SEAT Leon 2014-20")], VolkswagenCarSpecs(mass=1227, wheelbase=2.64), ) SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( "SKODA FABIA 4TH GEN", # Chassis PJ - VWCarInfo("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0]), + [VWCarInfo("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1266, wheelbase=2.56), ) SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( "SKODA KAMIQ 1ST GEN", # Chassis NW - VWCarInfo("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ]), + [VWCarInfo("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ])], VolkswagenCarSpecs(mass=1265, wheelbase=2.66), ) SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( "SKODA KAROQ 1ST GEN", # Chassis NU - VWCarInfo("Škoda Karoq 2019-23"), + [VWCarInfo("Škoda Karoq 2019-23")], VolkswagenCarSpecs(mass=1278, wheelbase=2.66), ) SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( "SKODA KODIAQ 1ST GEN", # Chassis NS - VWCarInfo("Škoda Kodiaq 2017-23"), + [VWCarInfo("Škoda Kodiaq 2017-23")], VolkswagenCarSpecs(mass=1569, wheelbase=2.79), ) SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( @@ -365,12 +365,12 @@ class CAR(Platforms): ) SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig( "SKODA SCALA 1ST GEN", # Chassis NW - VWCarInfo("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0]), + [VWCarInfo("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1192, wheelbase=2.65), ) SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( "SKODA SUPERB 3RD GEN", # Chassis 3V/NP - VWCarInfo("Škoda Superb 2015-22"), + [VWCarInfo("Škoda Superb 2015-22")], VolkswagenCarSpecs(mass=1505, wheelbase=2.84), ) From 1d7860701f6d2b2c65d8cefd18b7d882a0d4c51c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 15 Mar 2024 11:09:37 -0700 Subject: [PATCH 054/384] close > bad PR --- docs/BOUNTIES.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/BOUNTIES.md b/docs/BOUNTIES.md index 5ff5dd939f..3f55707423 100644 --- a/docs/BOUNTIES.md +++ b/docs/BOUNTIES.md @@ -10,7 +10,8 @@ Get paid to improve openpilot! * open a ticket at [comma.ai/support](https://comma.ai/support/shop-order) with links to your PRs to claim * get an extra 20% if you redeem your bounty in [comma shop](https://comma.ai/shop) credit (including refunds on previous orders) -New bounties can be proposed in the [**#contributing**](https://discord.com/channels/469524606043160576/1183173332531687454) channel in Discord. +We put up each bounty with the intention that it'll get merged, but ocasionally the right resolution is to close the bounty, which only becomes clear once some effort is put in. +This is still valuable work, so we'll pay out $100 for getting any bounty closed with a good explanation. ## Issue bounties @@ -20,6 +21,8 @@ We've tagged bounty-eligible issues across openpilot and the rest of our repos; * **$500** - a few days of work for an experienced openpilot developer * **$1k+** - a week or two of work (could be less for the right person) +New bounties can be proposed in the [**#contributing**](https://discord.com/channels/469524606043160576/1183173332531687454) channel in Discord. + ## Car bounties The car bounties only apply to cars that have a path to ship in openpilot release, which excludes unsupportable cars (e.g. Fords with a steering lockout) or cars that require extra hardware (Honda Accord with serial steering). From 824782d6376998f06637fba87807430fc93ea99e Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 15 Mar 2024 11:11:54 -0700 Subject: [PATCH 055/384] fix typo --- docs/BOUNTIES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BOUNTIES.md b/docs/BOUNTIES.md index 3f55707423..7e7ee3b8d3 100644 --- a/docs/BOUNTIES.md +++ b/docs/BOUNTIES.md @@ -10,7 +10,7 @@ Get paid to improve openpilot! * open a ticket at [comma.ai/support](https://comma.ai/support/shop-order) with links to your PRs to claim * get an extra 20% if you redeem your bounty in [comma shop](https://comma.ai/shop) credit (including refunds on previous orders) -We put up each bounty with the intention that it'll get merged, but ocasionally the right resolution is to close the bounty, which only becomes clear once some effort is put in. +We put up each bounty with the intention that it'll get merged, but occasionally the right resolution is to close the bounty, which only becomes clear once some effort is put in. This is still valuable work, so we'll pay out $100 for getting any bounty closed with a good explanation. ## Issue bounties From 655e5f7c3e0312054da1f3075bf6b20d97d8a15c Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 15 Mar 2024 14:45:44 -0400 Subject: [PATCH 056/384] rename CarInfo to CarDocs (#31879) car info to car docs --- .github/PULL_REQUEST_TEMPLATE/car_port.md | 2 +- .github/pull_request_template.md | 2 +- selfdrive/car/__init__.py | 4 +- selfdrive/car/body/values.py | 4 +- selfdrive/car/chrysler/values.py | 28 ++-- selfdrive/car/docs.py | 12 +- selfdrive/car/docs_definitions.py | 6 +- selfdrive/car/ford/values.py | 46 +++--- selfdrive/car/gm/values.py | 36 ++--- selfdrive/car/honda/values.py | 52 +++--- selfdrive/car/hyundai/values.py | 186 +++++++++++----------- selfdrive/car/mazda/values.py | 16 +- selfdrive/car/nissan/values.py | 12 +- selfdrive/car/subaru/values.py | 42 ++--- selfdrive/car/tesla/values.py | 8 +- selfdrive/car/tests/test_docs.py | 2 +- selfdrive/car/toyota/values.py | 136 ++++++++-------- selfdrive/car/volkswagen/values.py | 120 +++++++------- 18 files changed, 357 insertions(+), 357 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE/car_port.md b/.github/PULL_REQUEST_TEMPLATE/car_port.md index 690c24c9b0..c7aa2b96c2 100644 --- a/.github/PULL_REQUEST_TEMPLATE/car_port.md +++ b/.github/PULL_REQUEST_TEMPLATE/car_port.md @@ -8,7 +8,7 @@ assignees: '' **Checklist** -- [ ] added entry to CarInfo in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs +- [ ] added entry to CAR in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs - [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py) - [ ] route with openpilot: - [ ] route with stock system: diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 3e3f42dcbc..2b4a5ed48f 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -44,7 +44,7 @@ Explain how you tested this bug fix. **Checklist** -- [ ] added entry to CarInfo in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs +- [ ] added entry to CAR in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs - [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py) - [ ] route with openpilot: - [ ] route with stock system: diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index a875447762..3c6d8b7996 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -9,7 +9,7 @@ import capnp from cereal import car from openpilot.common.numpy_fast import clip, interp from openpilot.common.utils import Freezable -from openpilot.selfdrive.car.docs_definitions import CarInfo +from openpilot.selfdrive.car.docs_definitions import CarDocs # kg of standard extra cargo to count for drive, gas, etc... @@ -262,7 +262,7 @@ class CarSpecs: @dataclass(order=True) class PlatformConfig(Freezable): platform_str: str - car_info: list[CarInfo] + car_info: list[CarDocs] specs: CarSpecs dbc_dict: DbcDict diff --git a/selfdrive/car/body/values.py b/selfdrive/car/body/values.py index bbc7a86756..d1ba0159fb 100644 --- a/selfdrive/car/body/values.py +++ b/selfdrive/car/body/values.py @@ -1,6 +1,6 @@ from cereal import car from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms, dbc_dict -from openpilot.selfdrive.car.docs_definitions import CarInfo +from openpilot.selfdrive.car.docs_definitions import CarDocs from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries Ecu = car.CarParams.Ecu @@ -22,7 +22,7 @@ class CarControllerParams: class CAR(Platforms): BODY = PlatformConfig( "COMMA BODY", - [CarInfo("comma body", package="All")], + [CarDocs("comma body", package="All")], CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44), dbc_dict('comma_body', None), ) diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 3fa74a9539..dfda1d1aaa 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -4,7 +4,7 @@ from dataclasses import dataclass, field from cereal import car from panda.python import uds from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict -from openpilot.selfdrive.car.docs_definitions import CarHarness, CarInfo, CarParts +from openpilot.selfdrive.car.docs_definitions import CarHarness, CarDocs, CarParts from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 Ecu = car.CarParams.Ecu @@ -15,7 +15,7 @@ class ChryslerFlags(IntFlag): HIGHER_MIN_STEERING_SPEED = 1 @dataclass -class ChryslerCarInfo(CarInfo): +class ChryslerCarDocs(CarDocs): package: str = "Adaptive Cruise Control (ACC)" car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca])) @@ -34,29 +34,29 @@ class CAR(Platforms): # Chrysler PACIFICA_2017_HYBRID = ChryslerPlatformConfig( "CHRYSLER PACIFICA HYBRID 2017", - [ChryslerCarInfo("Chrysler Pacifica Hybrid 2017")], + [ChryslerCarDocs("Chrysler Pacifica Hybrid 2017")], ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2), ) PACIFICA_2018_HYBRID = ChryslerPlatformConfig( "CHRYSLER PACIFICA HYBRID 2018", - [ChryslerCarInfo("Chrysler Pacifica Hybrid 2018")], + [ChryslerCarDocs("Chrysler Pacifica Hybrid 2018")], PACIFICA_2017_HYBRID.specs, ) PACIFICA_2019_HYBRID = ChryslerPlatformConfig( "CHRYSLER PACIFICA HYBRID 2019", - [ChryslerCarInfo("Chrysler Pacifica Hybrid 2019-23")], + [ChryslerCarDocs("Chrysler Pacifica Hybrid 2019-23")], PACIFICA_2017_HYBRID.specs, ) PACIFICA_2018 = ChryslerPlatformConfig( "CHRYSLER PACIFICA 2018", - [ChryslerCarInfo("Chrysler Pacifica 2017-18")], + [ChryslerCarDocs("Chrysler Pacifica 2017-18")], PACIFICA_2017_HYBRID.specs, ) PACIFICA_2020 = ChryslerPlatformConfig( "CHRYSLER PACIFICA 2020", [ - ChryslerCarInfo("Chrysler Pacifica 2019-20"), - ChryslerCarInfo("Chrysler Pacifica 2021-23", package="All"), + ChryslerCarDocs("Chrysler Pacifica 2019-20"), + ChryslerCarDocs("Chrysler Pacifica 2021-23", package="All"), ], PACIFICA_2017_HYBRID.specs, ) @@ -64,35 +64,35 @@ class CAR(Platforms): # Dodge DODGE_DURANGO = ChryslerPlatformConfig( "DODGE DURANGO 2021", - [ChryslerCarInfo("Dodge Durango 2020-21")], + [ChryslerCarDocs("Dodge Durango 2020-21")], PACIFICA_2017_HYBRID.specs, ) # Jeep JEEP_GRAND_CHEROKEE = ChryslerPlatformConfig( # includes 2017 Trailhawk "JEEP GRAND CHEROKEE V6 2018", - [ChryslerCarInfo("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk")], + [ChryslerCarDocs("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk")], ChryslerCarSpecs(mass=1778., wheelbase=2.71, steerRatio=16.7), ) JEEP_GRAND_CHEROKEE_2019 = ChryslerPlatformConfig( # includes 2020 Trailhawk "JEEP GRAND CHEROKEE 2019", - [ChryslerCarInfo("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4")], + [ChryslerCarDocs("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4")], JEEP_GRAND_CHEROKEE.specs, ) # Ram RAM_1500 = ChryslerPlatformConfig( "RAM 1500 5TH GEN", - [ChryslerCarInfo("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram]))], + [ChryslerCarDocs("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram]))], ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5), dbc_dict('chrysler_ram_dt_generated', None), ) RAM_HD = ChryslerPlatformConfig( "RAM HD 5TH GEN", [ - ChryslerCarInfo("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), - ChryslerCarInfo("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])), + ChryslerCarDocs("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), + ChryslerCarDocs("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])), ], ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16.), dbc_dict('chrysler_ram_hd_generated', None), diff --git a/selfdrive/car/docs.py b/selfdrive/car/docs.py index 24660261cb..4d0a1f45b2 100755 --- a/selfdrive/car/docs.py +++ b/selfdrive/car/docs.py @@ -9,7 +9,7 @@ from natsort import natsorted from cereal import car from openpilot.common.basedir import BASEDIR from openpilot.selfdrive.car import gen_empty_fingerprint -from openpilot.selfdrive.car.docs_definitions import CarInfo, Column, CommonFootnote, PartType +from openpilot.selfdrive.car.docs_definitions import CarDocs, Column, CommonFootnote, PartType from openpilot.selfdrive.car.car_helpers import interfaces, get_interface_attr from openpilot.selfdrive.car.values import PLATFORMS @@ -25,8 +25,8 @@ CARS_MD_OUT = os.path.join(BASEDIR, "docs", "CARS.md") CARS_MD_TEMPLATE = os.path.join(BASEDIR, "selfdrive", "car", "CARS_template.md") -def get_all_car_info() -> list[CarInfo]: - all_car_info: list[CarInfo] = [] +def get_all_car_info() -> list[CarDocs]: + all_car_info: list[CarDocs] = [] footnotes = get_all_footnotes() for model, platform in PLATFORMS.items(): car_info = platform.config.car_info @@ -45,18 +45,18 @@ def get_all_car_info() -> list[CarInfo]: all_car_info.append(_car_info) # Sort cars by make and model + year - sorted_cars: list[CarInfo] = natsorted(all_car_info, key=lambda car: car.name.lower()) + sorted_cars: list[CarDocs] = natsorted(all_car_info, key=lambda car: car.name.lower()) return sorted_cars -def group_by_make(all_car_info: list[CarInfo]) -> dict[str, list[CarInfo]]: +def group_by_make(all_car_info: list[CarDocs]) -> dict[str, list[CarDocs]]: sorted_car_info = defaultdict(list) for car_info in all_car_info: sorted_car_info[car_info.make].append(car_info) return dict(sorted_car_info) -def generate_cars_md(all_car_info: list[CarInfo], template_fn: str) -> str: +def generate_cars_md(all_car_info: list[CarDocs], template_fn: str) -> str: with open(template_fn) as f: template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True) diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index 1adf78b1c8..c9d8dd10a8 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -220,7 +220,7 @@ def split_name(name: str) -> tuple[str, str, str]: @dataclass -class CarInfo: +class CarDocs: # make + model + model years name: str @@ -266,7 +266,7 @@ class CarInfo: # min steer & enable speed columns # TODO: set all the min steer speeds in carParams and remove this if self.min_steer_speed is not None: - assert CP.minSteerSpeed == 0, f"{CP.carFingerprint}: Minimum steer speed set in both CarInfo and CarParams" + assert CP.minSteerSpeed == 0, f"{CP.carFingerprint}: Minimum steer speed set in both CarDocs and CarParams" else: self.min_steer_speed = CP.minSteerSpeed @@ -317,7 +317,7 @@ class CarInfo: return self def init_make(self, CP: car.CarParams): - """CarInfo subclasses can add make-specific logic for harness selection, footnotes, etc.""" + """CarDocs subclasses can add make-specific logic for harness selection, footnotes, etc.""" def get_detail_sentence(self, CP): if not CP.notCar: diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 3b76be8c69..5869a800a3 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -4,7 +4,7 @@ from enum import Enum, IntFlag import panda.python.uds as uds from cereal import car from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, dbc_dict, DbcDict, PlatformConfig, Platforms -from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ +from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, \ Device from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -58,7 +58,7 @@ class Footnote(Enum): @dataclass -class FordCarInfo(CarInfo): +class FordCarDocs(CarDocs): package: str = "Co-Pilot360 Assist+" def init_make(self, CP: car.CarParams): @@ -86,65 +86,65 @@ class FordCANFDPlatformConfig(FordPlatformConfig): class CAR(Platforms): BRONCO_SPORT_MK1 = FordPlatformConfig( "FORD BRONCO SPORT 1ST GEN", - [FordCarInfo("Ford Bronco Sport 2021-23")], + [FordCarDocs("Ford Bronco Sport 2021-23")], CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7), ) ESCAPE_MK4 = FordPlatformConfig( "FORD ESCAPE 4TH GEN", [ - FordCarInfo("Ford Escape 2020-22"), - FordCarInfo("Ford Escape Hybrid 2020-22"), - FordCarInfo("Ford Escape Plug-in Hybrid 2020-22"), - FordCarInfo("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering"), - FordCarInfo("Ford Kuga Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), - FordCarInfo("Ford Kuga Plug-in Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), + FordCarDocs("Ford Escape 2020-22"), + FordCarDocs("Ford Escape Hybrid 2020-22"), + FordCarDocs("Ford Escape Plug-in Hybrid 2020-22"), + FordCarDocs("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering"), + FordCarDocs("Ford Kuga Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), + FordCarDocs("Ford Kuga Plug-in Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), ], CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), ) EXPLORER_MK6 = FordPlatformConfig( "FORD EXPLORER 6TH GEN", [ - FordCarInfo("Ford Explorer 2020-23"), - FordCarInfo("Ford Explorer Hybrid 2020-23"), # Limited and Platinum only - FordCarInfo("Lincoln Aviator 2020-23", "Co-Pilot360 Plus"), - FordCarInfo("Lincoln Aviator Plug-in Hybrid 2020-23", "Co-Pilot360 Plus"), # Grand Touring only + FordCarDocs("Ford Explorer 2020-23"), + FordCarDocs("Ford Explorer Hybrid 2020-23"), # Limited and Platinum only + FordCarDocs("Lincoln Aviator 2020-23", "Co-Pilot360 Plus"), + FordCarDocs("Lincoln Aviator Plug-in Hybrid 2020-23", "Co-Pilot360 Plus"), # Grand Touring only ], CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), ) F_150_MK14 = FordCANFDPlatformConfig( "FORD F-150 14TH GEN", [ - FordCarInfo("Ford F-150 2022-23", "Co-Pilot360 Active 2.0"), - FordCarInfo("Ford F-150 Hybrid 2022-23", "Co-Pilot360 Active 2.0"), + FordCarDocs("Ford F-150 2022-23", "Co-Pilot360 Active 2.0"), + FordCarDocs("Ford F-150 Hybrid 2022-23", "Co-Pilot360 Active 2.0"), ], CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), ) F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( "FORD F-150 LIGHTNING 1ST GEN", - [FordCarInfo("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0")], + [FordCarDocs("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0")], CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), ) FOCUS_MK4 = FordPlatformConfig( "FORD FOCUS 4TH GEN", [ - FordCarInfo("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), - FordCarInfo("Ford Focus Hybrid 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), # mHEV only + FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), + FordCarDocs("Ford Focus Hybrid 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), # mHEV only ], CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0), ) MAVERICK_MK1 = FordPlatformConfig( "FORD MAVERICK 1ST GEN", [ - FordCarInfo("Ford Maverick 2022", "LARIAT Luxury"), - FordCarInfo("Ford Maverick Hybrid 2022", "LARIAT Luxury"), - FordCarInfo("Ford Maverick 2023-24", "Co-Pilot360 Assist"), - FordCarInfo("Ford Maverick Hybrid 2023-24", "Co-Pilot360 Assist"), + FordCarDocs("Ford Maverick 2022", "LARIAT Luxury"), + FordCarDocs("Ford Maverick Hybrid 2022", "LARIAT Luxury"), + FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist"), + FordCarDocs("Ford Maverick Hybrid 2023-24", "Co-Pilot360 Assist"), ], CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), ) MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig( "FORD MUSTANG MACH-E 1ST GEN", - [FordCarInfo("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0")], + [FordCarDocs("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0")], CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio ) diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 9e18ea18d5..ec6453757b 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -3,7 +3,7 @@ from enum import Enum from cereal import car from openpilot.selfdrive.car import dbc_dict, PlatformConfig, DbcDict, Platforms, CarSpecs -from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column +from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries Ecu = car.CarParams.Ecu @@ -68,7 +68,7 @@ class Footnote(Enum): @dataclass -class GMCarInfo(CarInfo): +class GMCarDocs(CarDocs): package: str = "Adaptive Cruise Control (ACC)" def init_make(self, CP: car.CarParams): @@ -92,78 +92,78 @@ class GMPlatformConfig(PlatformConfig): class CAR(Platforms): HOLDEN_ASTRA = GMPlatformConfig( "HOLDEN ASTRA RS-V BK 2017", - [GMCarInfo("Holden Astra 2017")], + [GMCarDocs("Holden Astra 2017")], GMCarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4), ) VOLT = GMPlatformConfig( "CHEVROLET VOLT PREMIER 2017", - [GMCarInfo("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ")], + [GMCarDocs("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ")], GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469), ) CADILLAC_ATS = GMPlatformConfig( "CADILLAC ATS Premium Performance 2018", - [GMCarInfo("Cadillac ATS Premium Performance 2018")], + [GMCarDocs("Cadillac ATS Premium Performance 2018")], GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), ) MALIBU = GMPlatformConfig( "CHEVROLET MALIBU PREMIER 2017", - [GMCarInfo("Chevrolet Malibu Premier 2017")], + [GMCarDocs("Chevrolet Malibu Premier 2017")], GMCarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4), ) ACADIA = GMPlatformConfig( "GMC ACADIA DENALI 2018", - [GMCarInfo("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo")], + [GMCarDocs("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo")], GMCarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4), ) BUICK_LACROSSE = GMPlatformConfig( "BUICK LACROSSE 2017", - [GMCarInfo("Buick LaCrosse 2017-19", "Driver Confidence Package 2")], + [GMCarDocs("Buick LaCrosse 2017-19", "Driver Confidence Package 2")], GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), ) BUICK_REGAL = GMPlatformConfig( "BUICK REGAL ESSENCE 2018", - [GMCarInfo("Buick Regal Essence 2018")], + [GMCarDocs("Buick Regal Essence 2018")], GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), ) ESCALADE = GMPlatformConfig( "CADILLAC ESCALADE 2017", - [GMCarInfo("Cadillac Escalade 2017", "Driver Assist Package")], + [GMCarDocs("Cadillac Escalade 2017", "Driver Assist Package")], GMCarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3), ) ESCALADE_ESV = GMPlatformConfig( "CADILLAC ESCALADE ESV 2016", - [GMCarInfo("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")], + [GMCarDocs("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")], GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0), ) ESCALADE_ESV_2019 = GMPlatformConfig( "CADILLAC ESCALADE ESV 2019", - [GMCarInfo("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")], + [GMCarDocs("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")], ESCALADE_ESV.specs, ) BOLT_EUV = GMPlatformConfig( "CHEVROLET BOLT EUV 2022", [ - GMCarInfo("Chevrolet Bolt EUV 2022-23", "Premier or Premier Redline Trim without Super Cruise Package", video_link="https://youtu.be/xvwzGMUA210"), - GMCarInfo("Chevrolet Bolt EV 2022-23", "2LT Trim with Adaptive Cruise Control Package"), + GMCarDocs("Chevrolet Bolt EUV 2022-23", "Premier or Premier Redline Trim without Super Cruise Package", video_link="https://youtu.be/xvwzGMUA210"), + GMCarDocs("Chevrolet Bolt EV 2022-23", "2LT Trim with Adaptive Cruise Control Package"), ], GMCarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), ) SILVERADO = GMPlatformConfig( "CHEVROLET SILVERADO 1500 2020", [ - GMCarInfo("Chevrolet Silverado 1500 2020-21", "Safety Package II"), - GMCarInfo("GMC Sierra 1500 2020-21", "Driver Alert Package II", video_link="https://youtu.be/5HbNoBLzRwE"), + GMCarDocs("Chevrolet Silverado 1500 2020-21", "Safety Package II"), + GMCarDocs("GMC Sierra 1500 2020-21", "Driver Alert Package II", video_link="https://youtu.be/5HbNoBLzRwE"), ], GMCarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3, tireStiffnessFactor=1.0), ) EQUINOX = GMPlatformConfig( "CHEVROLET EQUINOX 2019", - [GMCarInfo("Chevrolet Equinox 2019-22")], + [GMCarDocs("Chevrolet Equinox 2019-22")], GMCarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), ) TRAILBLAZER = GMPlatformConfig( "CHEVROLET TRAILBLAZER 2021", - [GMCarInfo("Chevrolet Trailblazer 2021-22")], + [GMCarDocs("Chevrolet Trailblazer 2021-22")], GMCarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), ) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 96de8b0b29..6789667fe6 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -5,7 +5,7 @@ from cereal import car from openpilot.common.conversions import Conversions as CV from panda.python import uds from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms, dbc_dict -from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column +from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 Ecu = car.CarParams.Ecu @@ -87,7 +87,7 @@ VISUAL_HUD = { @dataclass -class HondaCarInfo(CarInfo): +class HondaCarDocs(CarDocs): package: str = "Honda Sensing" def init_make(self, CP: car.CarParams): @@ -118,9 +118,9 @@ class CAR(Platforms): ACCORD = HondaBoschPlatformConfig( "HONDA ACCORD 2018", [ - HondaCarInfo("Honda Accord 2018-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS), - HondaCarInfo("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS), - HondaCarInfo("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), + HondaCarDocs("Honda Accord 2018-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS), + HondaCarDocs("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS), + HondaCarDocs("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), ], # steerRatio: 11.82 is spec end-to-end CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39, tireStiffnessFactor=0.8467), @@ -129,9 +129,9 @@ class CAR(Platforms): CIVIC_BOSCH = HondaBoschPlatformConfig( "HONDA CIVIC (BOSCH) 2019", [ - HondaCarInfo("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", + HondaCarDocs("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS), - HondaCarInfo("Honda Civic Hatchback 2017-21", min_steer_speed=12. * CV.MPH_TO_MS), + HondaCarDocs("Honda Civic Hatchback 2017-21", min_steer_speed=12. * CV.MPH_TO_MS), ], CarSpecs(mass=1326, wheelbase=2.7, steerRatio=15.38, centerToFrontRatio=0.4), # steerRatio: 10.93 is end-to-end spec dbc_dict('honda_civic_hatchback_ex_2017_can_generated', None), @@ -145,8 +145,8 @@ class CAR(Platforms): CIVIC_2022 = HondaBoschPlatformConfig( "HONDA CIVIC 2022", [ - HondaCarInfo("Honda Civic 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), - HondaCarInfo("Honda Civic Hatchback 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), + HondaCarDocs("Honda Civic 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), + HondaCarDocs("Honda Civic Hatchback 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), ], CIVIC_BOSCH.specs, dbc_dict('honda_civic_ex_2022_can_generated', None), @@ -154,7 +154,7 @@ class CAR(Platforms): ) CRV_5G = HondaBoschPlatformConfig( "HONDA CR-V 2017", - [HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS)], # steerRatio: 12.3 is spec end-to-end CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), @@ -162,34 +162,34 @@ class CAR(Platforms): ) CRV_HYBRID = HondaBoschPlatformConfig( "HONDA CR-V HYBRID 2019", - [HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS)], # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), dbc_dict('honda_accord_2018_can_generated', None), ) HRV_3G = HondaBoschPlatformConfig( "HONDA HR-V 2023", - [HondaCarInfo("Honda HR-V 2023", "All")], + [HondaCarDocs("Honda HR-V 2023", "All")], CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41, tireStiffnessFactor=0.5), dbc_dict('honda_civic_ex_2022_can_generated', None), flags=HondaFlags.BOSCH_RADARLESS | HondaFlags.BOSCH_ALT_BRAKE, ) ACURA_RDX_3G = HondaBoschPlatformConfig( "ACURA RDX 2020", - [HondaCarInfo("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], + [HondaCarDocs("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), # as spec dbc_dict('acura_rdx_2020_can_generated', None), flags=HondaFlags.BOSCH_ALT_BRAKE, ) INSIGHT = HondaBoschPlatformConfig( "HONDA INSIGHT 2019", - [HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39, tireStiffnessFactor=0.82), # as spec dbc_dict('honda_insight_ex_2019_can_generated', None), ) HONDA_E = HondaBoschPlatformConfig( "HONDA E 2020", - [HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71, tireStiffnessFactor=0.82), dbc_dict('acura_rdx_2020_can_generated', None), ) @@ -197,14 +197,14 @@ class CAR(Platforms): # Nidec Cars ACURA_ILX = HondaNidecPlatformConfig( "ACURA ILX 2016", - [HondaCarInfo("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS)], + [HondaCarDocs("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS)], CarSpecs(mass=3095 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=18.61, centerToFrontRatio=0.37, tireStiffnessFactor=0.72), # 15.3 is spec end-to-end dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CRV = HondaNidecPlatformConfig( "HONDA CR-V 2016", - [HondaCarInfo("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41, tireStiffnessFactor=0.444), # as spec dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, @@ -218,28 +218,28 @@ class CAR(Platforms): ) FIT = HondaNidecPlatformConfig( "HONDA FIT 2018", - [HondaCarInfo("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) FREED = HondaNidecPlatformConfig( "HONDA FREED 2020", - [HondaCarInfo("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), # mostly copied from FIT dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) HRV = HondaNidecPlatformConfig( "HONDA HRV 2019", - [HondaCarInfo("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS)], HRV_3G.specs, dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) ODYSSEY = HondaNidecPlatformConfig( "HONDA ODYSSEY 2018", - [HondaCarInfo("Honda Odyssey 2018-20")], + [HondaCarDocs("Honda Odyssey 2018-20")], CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41, tireStiffnessFactor=0.82), dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_PCM_ACCEL, @@ -253,7 +253,7 @@ class CAR(Platforms): ) ACURA_RDX = HondaNidecPlatformConfig( "ACURA RDX 2018", - [HondaCarInfo("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS)], + [HondaCarDocs("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38, tireStiffnessFactor=0.444), # as spec dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, @@ -261,8 +261,8 @@ class CAR(Platforms): PILOT = HondaNidecPlatformConfig( "HONDA PILOT 2017", [ - HondaCarInfo("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS), - HondaCarInfo("Honda Passport 2019-23", "All", min_steer_speed=12. * CV.MPH_TO_MS), + HondaCarDocs("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS), + HondaCarDocs("Honda Passport 2019-23", "All", min_steer_speed=12. * CV.MPH_TO_MS), ], CarSpecs(mass=4278 * CV.LB_TO_KG, wheelbase=2.86, centerToFrontRatio=0.428, steerRatio=16.0, tireStiffnessFactor=0.444), # as spec dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), @@ -270,14 +270,14 @@ class CAR(Platforms): ) RIDGELINE = HondaNidecPlatformConfig( "HONDA RIDGELINE 2017", - [HondaCarInfo("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59, tireStiffnessFactor=0.444), # as spec dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CIVIC = HondaNidecPlatformConfig( "HONDA CIVIC 2016", - [HondaCarInfo("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE")], + [HondaCarDocs("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE")], CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'), ) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index c17d57880c..4419cde27f 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -6,7 +6,7 @@ from cereal import car from panda.python import uds from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict -from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column +from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 Ecu = car.CarParams.Ecu @@ -104,7 +104,7 @@ class Footnote(Enum): @dataclass -class HyundaiCarInfo(CarInfo): +class HyundaiCarDocs(CarDocs): package: str = "Smart Cruise Control (SCC)" def init_make(self, CP: car.CarParams): @@ -136,14 +136,14 @@ class CAR(Platforms): # Hyundai AZERA_6TH_GEN = HyundaiPlatformConfig( "HYUNDAI AZERA 6TH GEN", - [HyundaiCarInfo("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + [HyundaiCarDocs("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5), ) AZERA_HEV_6TH_GEN = HyundaiPlatformConfig( "HYUNDAI AZERA HYBRID 6TH GEN", [ - HyundaiCarInfo("Hyundai Azera Hybrid 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), - HyundaiCarInfo("Hyundai Azera Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + HyundaiCarDocs("Hyundai Azera Hybrid 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), + HyundaiCarDocs("Hyundai Azera Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), ], CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5), flags=HyundaiFlags.HYBRID, @@ -152,8 +152,8 @@ class CAR(Platforms): "HYUNDAI ELANTRA 2017", [ # TODO: 2017-18 could be Hyundai G - HyundaiCarInfo("Hyundai Elantra 2017-18", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b])), - HyundaiCarInfo("Hyundai Elantra 2019", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_g])), + HyundaiCarDocs("Hyundai Elantra 2017-18", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b])), + HyundaiCarDocs("Hyundai Elantra 2019", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_g])), ], # steerRatio: 14 is Stock | Settled Params Learner values are steerRatio: 15.401566348670535, stiffnessFactor settled on 1.0081302973865127 CarSpecs(mass=1275, wheelbase=2.7, steerRatio=15.4, tireStiffnessFactor=0.385), @@ -162,21 +162,21 @@ class CAR(Platforms): ELANTRA_GT_I30 = HyundaiPlatformConfig( "HYUNDAI I30 N LINE 2019 & GT 2018 DCT", [ - HyundaiCarInfo("Hyundai Elantra GT 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), - HyundaiCarInfo("Hyundai i30 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), + HyundaiCarDocs("Hyundai Elantra GT 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), + HyundaiCarDocs("Hyundai i30 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), ], ELANTRA.specs, flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH, ) ELANTRA_2021 = HyundaiPlatformConfig( "HYUNDAI ELANTRA 2021", - [HyundaiCarInfo("Hyundai Elantra 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], + [HyundaiCarDocs("Hyundai Elantra 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=2800 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), flags=HyundaiFlags.CHECKSUM_CRC8, ) ELANTRA_HEV_2021 = HyundaiPlatformConfig( "HYUNDAI ELANTRA HYBRID 2021", - [HyundaiCarInfo("Hyundai Elantra Hybrid 2021-23", video_link="https://youtu.be/_EdYQtV52-c", + [HyundaiCarDocs("Hyundai Elantra Hybrid 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=3017 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, @@ -185,129 +185,129 @@ class CAR(Platforms): "HYUNDAI GENESIS 2015-2016", [ # TODO: check 2015 packages - HyundaiCarInfo("Hyundai Genesis 2015-16", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])), - HyundaiCarInfo("Genesis G80 2017", "All", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])), + HyundaiCarDocs("Hyundai Genesis 2015-16", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])), + HyundaiCarDocs("Genesis G80 2017", "All", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])), ], CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5, minSteerSpeed=60 * CV.KPH_TO_MS), flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.LEGACY, ) IONIQ = HyundaiPlatformConfig( "HYUNDAI IONIQ HYBRID 2017-2019", - [HyundaiCarInfo("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))], + [HyundaiCarDocs("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, ) IONIQ_HEV_2022 = HyundaiPlatformConfig( "HYUNDAI IONIQ HYBRID 2020-2022", - [HyundaiCarInfo("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], # TODO: confirm 2020-21 harness, + [HyundaiCarDocs("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], # TODO: confirm 2020-21 harness, CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, ) IONIQ_EV_LTD = HyundaiPlatformConfig( "HYUNDAI IONIQ ELECTRIC LIMITED 2019", - [HyundaiCarInfo("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], + [HyundaiCarDocs("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY | HyundaiFlags.MIN_STEER_32_MPH, ) IONIQ_EV_2020 = HyundaiPlatformConfig( "HYUNDAI IONIQ ELECTRIC 2020", - [HyundaiCarInfo("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], + [HyundaiCarDocs("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV, ) IONIQ_PHEV_2019 = HyundaiPlatformConfig( "HYUNDAI IONIQ PLUG-IN HYBRID 2019", - [HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], + [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, ) IONIQ_PHEV = HyundaiPlatformConfig( "HYUNDAI IONIQ PHEV 2020", - [HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], + [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID, ) KONA = HyundaiPlatformConfig( "HYUNDAI KONA 2020", - [HyundaiCarInfo("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b]))], + [HyundaiCarDocs("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b]))], CarSpecs(mass=1275, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CLUSTER_GEARS, ) KONA_EV = HyundaiPlatformConfig( "HYUNDAI KONA ELECTRIC 2019", - [HyundaiCarInfo("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))], + [HyundaiCarDocs("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))], CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV, ) KONA_EV_2022 = HyundaiPlatformConfig( "HYUNDAI KONA ELECTRIC 2022", - [HyundaiCarInfo("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))], + [HyundaiCarDocs("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))], CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV, ) KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI KONA ELECTRIC 2ND GEN", - [HyundaiCarInfo("Hyundai Kona Electric (with HDA II, Korea only) 2023", video_link="https://www.youtube.com/watch?v=U2fOCmcQ8hw", + [HyundaiCarDocs("Hyundai Kona Electric (with HDA II, Korea only) 2023", video_link="https://www.youtube.com/watch?v=U2fOCmcQ8hw", car_parts=CarParts.common([CarHarness.hyundai_r]))], CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, ) KONA_HEV = HyundaiPlatformConfig( "HYUNDAI KONA HYBRID 2020", - [HyundaiCarInfo("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages, + [HyundaiCarDocs("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages, CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID, ) SANTA_FE = HyundaiPlatformConfig( "HYUNDAI SANTA FE 2019", - [HyundaiCarInfo("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s", + [HyundaiCarDocs("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s", car_parts=CarParts.common([CarHarness.hyundai_d]))], CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.766, steerRatio=16.55, tireStiffnessFactor=0.82), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) SANTA_FE_2022 = HyundaiPlatformConfig( "HYUNDAI SANTA FE 2022", - [HyundaiCarInfo("Hyundai Santa Fe 2021-23", "All", video_link="https://youtu.be/VnHzSTygTS4", + [HyundaiCarDocs("Hyundai Santa Fe 2021-23", "All", video_link="https://youtu.be/VnHzSTygTS4", car_parts=CarParts.common([CarHarness.hyundai_l]))], SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8, ) SANTA_FE_HEV_2022 = HyundaiPlatformConfig( "HYUNDAI SANTA FE HYBRID 2022", - [HyundaiCarInfo("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], + [HyundaiCarDocs("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) SANTA_FE_PHEV_2022 = HyundaiPlatformConfig( "HYUNDAI SANTA FE PlUG-IN HYBRID 2022", - [HyundaiCarInfo("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], + [HyundaiCarDocs("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) SONATA = HyundaiPlatformConfig( "HYUNDAI SONATA 2020", - [HyundaiCarInfo("Hyundai Sonata 2020-23", "All", video_link="https://www.youtube.com/watch?v=ix63r9kE3Fw", + [HyundaiCarDocs("Hyundai Sonata 2020-23", "All", video_link="https://www.youtube.com/watch?v=ix63r9kE3Fw", car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) SONATA_LF = HyundaiPlatformConfig( "HYUNDAI SONATA 2019", - [HyundaiCarInfo("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))], + [HyundaiCarDocs("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, ) STARIA_4TH_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI STARIA 4TH GEN", - [HyundaiCarInfo("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + [HyundaiCarDocs("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=2205, wheelbase=3.273, steerRatio=11.94), # https://www.hyundai.com/content/dam/hyundai/au/en/models/staria-load/premium-pip-update-2023/spec-sheet/STARIA_Load_Spec-Table_March_2023_v3.1.pdf ) TUCSON = HyundaiPlatformConfig( "HYUNDAI TUCSON 2019", [ - HyundaiCarInfo("Hyundai Tucson 2021", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_l])), - HyundaiCarInfo("Hyundai Tucson Diesel 2019", car_parts=CarParts.common([CarHarness.hyundai_l])), + HyundaiCarDocs("Hyundai Tucson 2021", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_l])), + HyundaiCarDocs("Hyundai Tucson Diesel 2019", car_parts=CarParts.common([CarHarness.hyundai_l])), ], CarSpecs(mass=3520 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=16.1, tireStiffnessFactor=0.385), flags=HyundaiFlags.TCU_GEARS, @@ -315,58 +315,58 @@ class CAR(Platforms): PALISADE = HyundaiPlatformConfig( "HYUNDAI PALISADE 2020", [ - HyundaiCarInfo("Hyundai Palisade 2020-22", "All", video_link="https://youtu.be/TAnDqjF4fDY?t=456", car_parts=CarParts.common([CarHarness.hyundai_h])), - HyundaiCarInfo("Kia Telluride 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), + HyundaiCarDocs("Hyundai Palisade 2020-22", "All", video_link="https://youtu.be/TAnDqjF4fDY?t=456", car_parts=CarParts.common([CarHarness.hyundai_h])), + HyundaiCarDocs("Kia Telluride 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), ], CarSpecs(mass=1999, wheelbase=2.9, steerRatio=15.6 * 1.15, tireStiffnessFactor=0.63), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) VELOSTER = HyundaiPlatformConfig( "HYUNDAI VELOSTER 2019", - [HyundaiCarInfo("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))], + [HyundaiCarDocs("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS, ) SONATA_HYBRID = HyundaiPlatformConfig( "HYUNDAI SONATA HYBRID 2021", - [HyundaiCarInfo("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], + [HyundaiCarDocs("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], SONATA.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) IONIQ_5 = HyundaiCanFDPlatformConfig( "HYUNDAI IONIQ 5 2022", [ - HyundaiCarInfo("Hyundai Ioniq 5 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), - HyundaiCarInfo("Hyundai Ioniq 5 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])), - HyundaiCarInfo("Hyundai Ioniq 5 (with HDA II) 2022-23", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), + HyundaiCarDocs("Hyundai Ioniq 5 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), + HyundaiCarDocs("Hyundai Ioniq 5 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])), + HyundaiCarDocs("Hyundai Ioniq 5 (with HDA II) 2022-23", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), ], CarSpecs(mass=1948, wheelbase=2.97, steerRatio=14.26, tireStiffnessFactor=0.65), flags=HyundaiFlags.EV, ) IONIQ_6 = HyundaiCanFDPlatformConfig( "HYUNDAI IONIQ 6 2023", - [HyundaiCarInfo("Hyundai Ioniq 6 (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))], + [HyundaiCarDocs("Hyundai Ioniq 6 (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))], IONIQ_5.specs, flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, ) TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI TUCSON 4TH GEN", [ - HyundaiCarInfo("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])), - HyundaiCarInfo("Hyundai Tucson 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), - HyundaiCarInfo("Hyundai Tucson Hybrid 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Hyundai Tucson 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Hyundai Tucson Hybrid 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), ], CarSpecs(mass=1630, wheelbase=2.756, steerRatio=16, tireStiffnessFactor=0.385), ) SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI SANTA CRUZ 1ST GEN", - [HyundaiCarInfo("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))], + [HyundaiCarDocs("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))], # weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2), ) CUSTIN_1ST_GEN = HyundaiPlatformConfig( "HYUNDAI CUSTIN 1ST GEN", - [HyundaiCarInfo("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + [HyundaiCarDocs("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner flags=HyundaiFlags.CHECKSUM_CRC8, ) @@ -375,52 +375,52 @@ class CAR(Platforms): KIA_FORTE = HyundaiPlatformConfig( "KIA FORTE E 2018 & GT 2021", [ - HyundaiCarInfo("Kia Forte 2019-21", car_parts=CarParts.common([CarHarness.hyundai_g])), - HyundaiCarInfo("Kia Forte 2023", car_parts=CarParts.common([CarHarness.hyundai_e])), + HyundaiCarDocs("Kia Forte 2019-21", car_parts=CarParts.common([CarHarness.hyundai_g])), + HyundaiCarDocs("Kia Forte 2023", car_parts=CarParts.common([CarHarness.hyundai_e])), ], CarSpecs(mass=2878 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5) ) KIA_K5_2021 = HyundaiPlatformConfig( "KIA K5 2021", - [HyundaiCarInfo("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a]))], + [HyundaiCarDocs("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=3381 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), # 2021 Kia K5 Steering Ratio (all trims) flags=HyundaiFlags.CHECKSUM_CRC8, ) KIA_K5_HEV_2020 = HyundaiPlatformConfig( "KIA K5 HYBRID 2020", - [HyundaiCarInfo("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a]))], + [HyundaiCarDocs("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a]))], KIA_K5_2021.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) KIA_K8_HEV_1ST_GEN = HyundaiCanFDPlatformConfig( "KIA K8 HYBRID 1ST GEN", - [HyundaiCarInfo("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q]))], + [HyundaiCarDocs("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q]))], # mass: https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid, steerRatio: guesstimate from K5 platform CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27) ) KIA_NIRO_EV = HyundaiPlatformConfig( "KIA NIRO EV 2020", [ - HyundaiCarInfo("Kia Niro EV 2019", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])), - HyundaiCarInfo("Kia Niro EV 2020", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_f])), - HyundaiCarInfo("Kia Niro EV 2021", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_c])), - HyundaiCarInfo("Kia Niro EV 2022", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])), + HyundaiCarDocs("Kia Niro EV 2019", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])), + HyundaiCarDocs("Kia Niro EV 2020", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_f])), + HyundaiCarDocs("Kia Niro EV 2021", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_c])), + HyundaiCarDocs("Kia Niro EV 2022", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])), ], CarSpecs(mass=3543 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=13.6, tireStiffnessFactor=0.385), # average of all the cars flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV, ) KIA_NIRO_EV_2ND_GEN = HyundaiCanFDPlatformConfig( "KIA NIRO EV 2ND GEN", - [HyundaiCarInfo("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], + [HyundaiCarDocs("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], KIA_NIRO_EV.specs, flags=HyundaiFlags.EV, ) KIA_NIRO_PHEV = HyundaiPlatformConfig( "KIA NIRO HYBRID 2019", [ - HyundaiCarInfo("Kia Niro Hybrid 2018", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), - HyundaiCarInfo("Kia Niro Plug-in Hybrid 2018-19", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), - HyundaiCarInfo("Kia Niro Plug-in Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_d])), + HyundaiCarDocs("Kia Niro Hybrid 2018", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2018-19", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_d])), ], KIA_NIRO_EV.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.MIN_STEER_32_MPH, @@ -428,8 +428,8 @@ class CAR(Platforms): KIA_NIRO_PHEV_2022 = HyundaiPlatformConfig( "KIA NIRO PLUG-IN HYBRID 2022", [ - HyundaiCarInfo("Kia Niro Plug-in Hybrid 2021", "All", car_parts=CarParts.common([CarHarness.hyundai_d])), - HyundaiCarInfo("Kia Niro Plug-in Hybrid 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2021", "All", car_parts=CarParts.common([CarHarness.hyundai_d])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), ], KIA_NIRO_EV.specs, flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR, @@ -437,54 +437,54 @@ class CAR(Platforms): KIA_NIRO_HEV_2021 = HyundaiPlatformConfig( "KIA NIRO HYBRID 2021", [ - HyundaiCarInfo("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), - HyundaiCarInfo("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), + HyundaiCarDocs("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), + HyundaiCarDocs("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), ], KIA_NIRO_EV.specs, flags=HyundaiFlags.HYBRID, ) KIA_NIRO_HEV_2ND_GEN = HyundaiCanFDPlatformConfig( "KIA NIRO HYBRID 2ND GEN", - [HyundaiCarInfo("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a]))], + [HyundaiCarDocs("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a]))], KIA_NIRO_EV.specs, ) KIA_OPTIMA_G4 = HyundaiPlatformConfig( "KIA OPTIMA 4TH GEN", - [HyundaiCarInfo("Kia Optima 2017", "Advanced Smart Cruise Control", + [HyundaiCarDocs("Kia Optima 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_b]))], # TODO: may support 2016, 2018 CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS | HyundaiFlags.MIN_STEER_32_MPH, ) KIA_OPTIMA_G4_FL = HyundaiPlatformConfig( "KIA OPTIMA 4TH GEN FACELIFT", - [HyundaiCarInfo("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g]))], + [HyundaiCarDocs("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g]))], CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, ) # TODO: may support adjacent years. may have a non-zero minimum steering speed KIA_OPTIMA_H = HyundaiPlatformConfig( "KIA OPTIMA HYBRID 2017 & SPORTS 2019", - [HyundaiCarInfo("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c]))], + [HyundaiCarDocs("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, ) KIA_OPTIMA_H_G4_FL = HyundaiPlatformConfig( "KIA OPTIMA HYBRID 4TH GEN FACELIFT", - [HyundaiCarInfo("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h]))], + [HyundaiCarDocs("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, ) KIA_SELTOS = HyundaiPlatformConfig( "KIA SELTOS 2021", - [HyundaiCarInfo("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a]))], + [HyundaiCarDocs("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56), flags=HyundaiFlags.CHECKSUM_CRC8, ) KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig( "KIA SPORTAGE 5TH GEN", [ - HyundaiCarInfo("Kia Sportage 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), - HyundaiCarInfo("Kia Sportage Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Kia Sportage 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Kia Sportage Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), ], # weight from SX and above trims, average of FWD and AWD version, steering ratio according to Kia News https://www.kiamedia.com/us/en/models/sportage/2023/specifications CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6), @@ -492,51 +492,51 @@ class CAR(Platforms): KIA_SORENTO = HyundaiPlatformConfig( "KIA SORENTO GT LINE 2018", [ - HyundaiCarInfo("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", + HyundaiCarDocs("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", car_parts=CarParts.common([CarHarness.hyundai_e])), - HyundaiCarInfo("Kia Sorento 2019", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", car_parts=CarParts.common([CarHarness.hyundai_e])), + HyundaiCarDocs("Kia Sorento 2019", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", car_parts=CarParts.common([CarHarness.hyundai_e])), ], CarSpecs(mass=1985, wheelbase=2.78, steerRatio=14.4 * 1.1), # 10% higher at the center seems reasonable flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, ) KIA_SORENTO_4TH_GEN = HyundaiCanFDPlatformConfig( "KIA SORENTO 4TH GEN", - [HyundaiCarInfo("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k]))], + [HyundaiCarDocs("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms flags=HyundaiFlags.RADAR_SCC, ) KIA_SORENTO_HEV_4TH_GEN = HyundaiCanFDPlatformConfig( "KIA SORENTO HYBRID 4TH GEN", [ - HyundaiCarInfo("Kia Sorento Hybrid 2021-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), - HyundaiCarInfo("Kia Sorento Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), + HyundaiCarDocs("Kia Sorento Hybrid 2021-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), + HyundaiCarDocs("Kia Sorento Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), ], CarSpecs(mass=4395 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms flags=HyundaiFlags.RADAR_SCC, ) KIA_STINGER = HyundaiPlatformConfig( "KIA STINGER GT2 2018", - [HyundaiCarInfo("Kia Stinger 2018-20", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0", + [HyundaiCarDocs("Kia Stinger 2018-20", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1825, wheelbase=2.78, steerRatio=14.4 * 1.15) # 15% higher at the center seems reasonable ) KIA_STINGER_2022 = HyundaiPlatformConfig( "KIA STINGER 2022", - [HyundaiCarInfo("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + [HyundaiCarDocs("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], KIA_STINGER.specs, ) KIA_CEED = HyundaiPlatformConfig( "KIA CEED INTRO ED 2019", - [HyundaiCarInfo("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e]))], + [HyundaiCarDocs("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY, ) KIA_EV6 = HyundaiCanFDPlatformConfig( "KIA EV6 2022", [ - HyundaiCarInfo("Kia EV6 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_p])), - HyundaiCarInfo("Kia EV6 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])), - HyundaiCarInfo("Kia EV6 (with HDA II) 2022-23", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p])) + HyundaiCarDocs("Kia EV6 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_p])), + HyundaiCarDocs("Kia EV6 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])), + HyundaiCarDocs("Kia EV6 (with HDA II) 2022-23", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p])) ], CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65), flags=HyundaiFlags.EV, @@ -544,8 +544,8 @@ class CAR(Platforms): KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig( "KIA CARNIVAL 4TH GEN", [ - HyundaiCarInfo("Kia Carnival 2022-24", car_parts=CarParts.common([CarHarness.hyundai_a])), - HyundaiCarInfo("Kia Carnival (China only) 2023", car_parts=CarParts.common([CarHarness.hyundai_k])) + HyundaiCarDocs("Kia Carnival 2022-24", car_parts=CarParts.common([CarHarness.hyundai_a])), + HyundaiCarDocs("Kia Carnival (China only) 2023", car_parts=CarParts.common([CarHarness.hyundai_k])) ], CarSpecs(mass=2087, wheelbase=3.09, steerRatio=14.23), flags=HyundaiFlags.RADAR_SCC, @@ -555,47 +555,47 @@ class CAR(Platforms): GENESIS_GV60_EV_1ST_GEN = HyundaiCanFDPlatformConfig( "GENESIS GV60 ELECTRIC 1ST GEN", [ - HyundaiCarInfo("Genesis GV60 (Advanced Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), - HyundaiCarInfo("Genesis GV60 (Performance Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + HyundaiCarDocs("Genesis GV60 (Advanced Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), + HyundaiCarDocs("Genesis GV60 (Performance Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), ], CarSpecs(mass=2205, wheelbase=2.9, steerRatio=12.6), # steerRatio: https://www.motor1.com/reviews/586376/2023-genesis-gv60-first-drive/#:~:text=Relative%20to%20the%20related%20Ioniq,5%2FEV6%27s%2014.3%3A1. flags=HyundaiFlags.EV, ) GENESIS_G70 = HyundaiPlatformConfig( "GENESIS G70 2018", - [HyundaiCarInfo("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], + [HyundaiCarDocs("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56), flags=HyundaiFlags.LEGACY, ) GENESIS_G70_2020 = HyundaiPlatformConfig( "GENESIS G70 2020", - [HyundaiCarInfo("Genesis G70 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], + [HyundaiCarDocs("Genesis G70 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9), flags=HyundaiFlags.MANDO_RADAR, ) GENESIS_GV70_1ST_GEN = HyundaiCanFDPlatformConfig( "GENESIS GV70 1ST GEN", [ - HyundaiCarInfo("Genesis GV70 (2.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), - HyundaiCarInfo("Genesis GV70 (3.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), + HyundaiCarDocs("Genesis GV70 (2.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), + HyundaiCarDocs("Genesis GV70 (3.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), ], CarSpecs(mass=1950, wheelbase=2.87, steerRatio=14.6), flags=HyundaiFlags.RADAR_SCC, ) GENESIS_G80 = HyundaiPlatformConfig( "GENESIS G80 2017", - [HyundaiCarInfo("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], + [HyundaiCarDocs("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5), flags=HyundaiFlags.LEGACY, ) GENESIS_G90 = HyundaiPlatformConfig( "GENESIS G90 2017", - [HyundaiCarInfo("Genesis G90 2017-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + [HyundaiCarDocs("Genesis G90 2017-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=2200, wheelbase=3.15, steerRatio=12.069), ) GENESIS_GV80 = HyundaiCanFDPlatformConfig( "GENESIS GV80 2023", - [HyundaiCarInfo("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))], + [HyundaiCarDocs("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))], CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14), flags=HyundaiFlags.RADAR_SCC, ) diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 2bb5b4ff08..d10b47e2b4 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -4,7 +4,7 @@ from enum import IntFlag from cereal import car from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict -from openpilot.selfdrive.car.docs_definitions import CarHarness, CarInfo, CarParts +from openpilot.selfdrive.car.docs_definitions import CarHarness, CarDocs, CarParts from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries Ecu = car.CarParams.Ecu @@ -27,7 +27,7 @@ class CarControllerParams: @dataclass -class MazdaCarInfo(CarInfo): +class MazdaCarDocs(CarDocs): package: str = "All" car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.mazda])) @@ -52,32 +52,32 @@ class MazdaPlatformConfig(PlatformConfig): class CAR(Platforms): CX5 = MazdaPlatformConfig( "MAZDA CX-5", - [MazdaCarInfo("Mazda CX-5 2017-21")], + [MazdaCarDocs("Mazda CX-5 2017-21")], MazdaCarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) ) CX9 = MazdaPlatformConfig( "MAZDA CX-9", - [MazdaCarInfo("Mazda CX-9 2016-20")], + [MazdaCarDocs("Mazda CX-9 2016-20")], MazdaCarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) ) MAZDA3 = MazdaPlatformConfig( "MAZDA 3", - [MazdaCarInfo("Mazda 3 2017-18")], + [MazdaCarDocs("Mazda 3 2017-18")], MazdaCarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) ) MAZDA6 = MazdaPlatformConfig( "MAZDA 6", - [MazdaCarInfo("Mazda 6 2017-20")], + [MazdaCarDocs("Mazda 6 2017-20")], MazdaCarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5) ) CX9_2021 = MazdaPlatformConfig( "MAZDA CX-9 2021", - [MazdaCarInfo("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4")], + [MazdaCarDocs("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4")], CX9.specs ) CX5_2022 = MazdaPlatformConfig( "MAZDA CX-5 2022", - [MazdaCarInfo("Mazda CX-5 2022-24")], + [MazdaCarDocs("Mazda CX-5 2022-24")], CX5.specs, ) diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index dd51437dd9..f2123cad56 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -3,7 +3,7 @@ from dataclasses import dataclass, field from cereal import car from panda.python import uds from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict -from openpilot.selfdrive.car.docs_definitions import CarInfo, CarHarness, CarParts +from openpilot.selfdrive.car.docs_definitions import CarDocs, CarHarness, CarParts from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries Ecu = car.CarParams.Ecu @@ -20,7 +20,7 @@ class CarControllerParams: @dataclass -class NissanCarInfo(CarInfo): +class NissanCarDocs(CarDocs): package: str = "ProPILOT Assist" car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.nissan_a])) @@ -39,12 +39,12 @@ class NissanPlaformConfig(PlatformConfig): class CAR(Platforms): XTRAIL = NissanPlaformConfig( "NISSAN X-TRAIL 2017", - [NissanCarInfo("Nissan X-Trail 2017")], + [NissanCarDocs("Nissan X-Trail 2017")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) LEAF = NissanPlaformConfig( "NISSAN LEAF 2018", - [NissanCarInfo("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY")], + [NissanCarDocs("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY")], NissanCarSpecs(mass=1610, wheelbase=2.705), dbc_dict('nissan_leaf_2018_generated', None), ) @@ -53,12 +53,12 @@ class CAR(Platforms): LEAF_IC = LEAF.override(platform_str="NISSAN LEAF 2018 Instrument Cluster", car_info=[]) ROGUE = NissanPlaformConfig( "NISSAN ROGUE 2019", - [NissanCarInfo("Nissan Rogue 2018-20")], + [NissanCarDocs("Nissan Rogue 2018-20")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) ALTIMA = NissanPlaformConfig( "NISSAN ALTIMA 2020", - [NissanCarInfo("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b]))], + [NissanCarDocs("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b]))], NissanCarSpecs(mass=1492, wheelbase=2.824) ) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index d1faed47f0..3a57fde39d 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -4,7 +4,7 @@ from enum import Enum, IntFlag from cereal import car from panda.python import uds from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict -from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Tool, Column +from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Tool, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 Ecu = car.CarParams.Ecu @@ -88,7 +88,7 @@ class Footnote(Enum): @dataclass -class SubaruCarInfo(CarInfo): +class SubaruCarDocs(CarDocs): package: str = "EyeSight Driver Assistance" car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.subaru_a])) footnotes: list[Enum] = field(default_factory=lambda: [Footnote.GLOBAL]) @@ -122,34 +122,34 @@ class CAR(Platforms): # Global platform ASCENT = SubaruPlatformConfig( "SUBARU ASCENT LIMITED 2019", - [SubaruCarInfo("Subaru Ascent 2019-21", "All")], + [SubaruCarDocs("Subaru Ascent 2019-21", "All")], CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5), ) OUTBACK = SubaruGen2PlatformConfig( "SUBARU OUTBACK 6TH GEN", - [SubaruCarInfo("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], + [SubaruCarDocs("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), ) LEGACY = SubaruGen2PlatformConfig( "SUBARU LEGACY 7TH GEN", - [SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], + [SubaruCarDocs("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], OUTBACK.specs, ) IMPREZA = SubaruPlatformConfig( "SUBARU IMPREZA LIMITED 2019", [ - SubaruCarInfo("Subaru Impreza 2017-19"), - SubaruCarInfo("Subaru Crosstrek 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), - SubaruCarInfo("Subaru XV 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), + SubaruCarDocs("Subaru Impreza 2017-19"), + SubaruCarDocs("Subaru Crosstrek 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), + SubaruCarDocs("Subaru XV 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), ], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15), ) IMPREZA_2020 = SubaruPlatformConfig( "SUBARU IMPREZA SPORT 2020", [ - SubaruCarInfo("Subaru Impreza 2020-22"), - SubaruCarInfo("Subaru Crosstrek 2020-23"), - SubaruCarInfo("Subaru XV 2020-21"), + SubaruCarDocs("Subaru Impreza 2020-22"), + SubaruCarDocs("Subaru Crosstrek 2020-23"), + SubaruCarDocs("Subaru XV 2020-21"), ], CarSpecs(mass=1480, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.STEER_RATE_LIMITED, @@ -157,47 +157,47 @@ class CAR(Platforms): # TODO: is there an XV and Impreza too? CROSSTREK_HYBRID = SubaruPlatformConfig( "SUBARU CROSSTREK HYBRID 2020", - [SubaruCarInfo("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b]))], + [SubaruCarDocs("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b]))], CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.HYBRID, ) FORESTER = SubaruPlatformConfig( "SUBARU FORESTER 2019", - [SubaruCarInfo("Subaru Forester 2019-21", "All")], + [SubaruCarDocs("Subaru Forester 2019-21", "All")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.STEER_RATE_LIMITED, ) FORESTER_HYBRID = SubaruPlatformConfig( "SUBARU FORESTER HYBRID 2020", - [SubaruCarInfo("Subaru Forester Hybrid 2020")], + [SubaruCarDocs("Subaru Forester Hybrid 2020")], FORESTER.specs, flags=SubaruFlags.HYBRID, ) # Pre-global FORESTER_PREGLOBAL = SubaruPlatformConfig( "SUBARU FORESTER 2017 - 2018", - [SubaruCarInfo("Subaru Forester 2017-18")], + [SubaruCarDocs("Subaru Forester 2017-18")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), dbc_dict('subaru_forester_2017_generated', None), flags=SubaruFlags.PREGLOBAL, ) LEGACY_PREGLOBAL = SubaruPlatformConfig( "SUBARU LEGACY 2015 - 2018", - [SubaruCarInfo("Subaru Legacy 2015-18")], + [SubaruCarDocs("Subaru Legacy 2015-18")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), dbc_dict('subaru_outback_2015_generated', None), flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL = SubaruPlatformConfig( "SUBARU OUTBACK 2015 - 2017", - [SubaruCarInfo("Subaru Outback 2015-17")], + [SubaruCarDocs("Subaru Outback 2015-17")], FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2015_generated', None), flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( "SUBARU OUTBACK 2018 - 2019", - [SubaruCarInfo("Subaru Outback 2018-19")], + [SubaruCarDocs("Subaru Outback 2018-19")], FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2019_generated', None), flags=SubaruFlags.PREGLOBAL, @@ -205,19 +205,19 @@ class CAR(Platforms): # Angle LKAS FORESTER_2022 = SubaruPlatformConfig( "SUBARU FORESTER 2022", - [SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c]))], + [SubaruCarDocs("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c]))], FORESTER.specs, flags=SubaruFlags.LKAS_ANGLE, ) OUTBACK_2023 = SubaruGen2PlatformConfig( "SUBARU OUTBACK 7TH GEN", - [SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], + [SubaruCarDocs("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], OUTBACK.specs, flags=SubaruFlags.LKAS_ANGLE, ) ASCENT_2023 = SubaruGen2PlatformConfig( "SUBARU ASCENT 2023", - [SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], + [SubaruCarDocs("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], ASCENT.specs, flags=SubaruFlags.LKAS_ANGLE, ) diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index d098e93182..74f38f2dc0 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -2,7 +2,7 @@ from collections import namedtuple from cereal import car from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, PlatformConfig, Platforms, dbc_dict -from openpilot.selfdrive.car.docs_definitions import CarInfo +from openpilot.selfdrive.car.docs_definitions import CarDocs from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries Ecu = car.CarParams.Ecu @@ -12,19 +12,19 @@ Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values']) class CAR(Platforms): AP1_MODELS = PlatformConfig( 'TESLA AP1 MODEL S', - [CarInfo("Tesla AP1 Model S", "All")], + [CarDocs("Tesla AP1 Model S", "All")], CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0), dbc_dict('tesla_powertrain', 'tesla_radar_bosch_generated', chassis_dbc='tesla_can') ) AP2_MODELS = PlatformConfig( 'TESLA AP2 MODEL S', - [CarInfo("Tesla AP2 Model S", "All")], + [CarDocs("Tesla AP2 Model S", "All")], AP1_MODELS.specs, AP1_MODELS.dbc_dict ) MODELS_RAVEN = PlatformConfig( 'TESLA MODEL S RAVEN', - [CarInfo("Tesla Model S Raven", "All")], + [CarDocs("Tesla Model S Raven", "All")], AP1_MODELS.specs, dbc_dict('tesla_powertrain', 'tesla_radar_continental_generated', chassis_dbc='tesla_can') ) diff --git a/selfdrive/car/tests/test_docs.py b/selfdrive/car/tests/test_docs.py index 0ee35dd92d..f64effc437 100755 --- a/selfdrive/car/tests/test_docs.py +++ b/selfdrive/car/tests/test_docs.py @@ -46,7 +46,7 @@ class TestCarDocs(unittest.TestCase): all_car_info_platforms = [name for name, config in PLATFORMS.items()] for platform in sorted(interfaces.keys()): with self.subTest(platform=platform): - self.assertTrue(platform in all_car_info_platforms, f"Platform: {platform} doesn't have a CarInfo entry") + self.assertTrue(platform in all_car_info_platforms, f"Platform: {platform} doesn't have a CarDocs entry") def test_naming_conventions(self): # Asserts market-standard car naming conventions by brand diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index ce035ae573..9a3e73048a 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -7,7 +7,7 @@ from cereal import car from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms from openpilot.selfdrive.car import AngleRateLimit, dbc_dict -from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarInfo, Column, CarParts, CarHarness +from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarDocs, Column, CarParts, CarHarness from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries Ecu = car.CarParams.Ecu @@ -67,7 +67,7 @@ class Footnote(Enum): @dataclass -class ToyotaCarInfo(CarInfo): +class ToyotaCarDocs(CarDocs): package: str = "All" car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.toyota_a])) @@ -88,16 +88,16 @@ class CAR(Platforms): ALPHARD_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA ALPHARD 2020", [ - ToyotaCarInfo("Toyota Alphard 2019-20"), - ToyotaCarInfo("Toyota Alphard Hybrid 2021"), + ToyotaCarDocs("Toyota Alphard 2019-20"), + ToyotaCarDocs("Toyota Alphard Hybrid 2021"), ], CarSpecs(mass=4305. * CV.LB_TO_KG, wheelbase=3.0, steerRatio=14.2, tireStiffnessFactor=0.444), ) AVALON = PlatformConfig( "TOYOTA AVALON 2016", [ - ToyotaCarInfo("Toyota Avalon 2016", "Toyota Safety Sense P"), - ToyotaCarInfo("Toyota Avalon 2017-18"), + ToyotaCarDocs("Toyota Avalon 2016", "Toyota Safety Sense P"), + ToyotaCarDocs("Toyota Avalon 2017-18"), ], CarSpecs(mass=3505. * CV.LB_TO_KG, wheelbase=2.82, steerRatio=14.8, tireStiffnessFactor=0.7983), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), @@ -105,8 +105,8 @@ class CAR(Platforms): AVALON_2019 = PlatformConfig( "TOYOTA AVALON 2019", [ - ToyotaCarInfo("Toyota Avalon 2019-21"), - ToyotaCarInfo("Toyota Avalon Hybrid 2019-21"), + ToyotaCarDocs("Toyota Avalon 2019-21"), + ToyotaCarDocs("Toyota Avalon Hybrid 2019-21"), ], AVALON.specs, dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), @@ -114,16 +114,16 @@ class CAR(Platforms): AVALON_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA AVALON 2022", # TSS 2.5 [ - ToyotaCarInfo("Toyota Avalon 2022"), - ToyotaCarInfo("Toyota Avalon Hybrid 2022"), + ToyotaCarDocs("Toyota Avalon 2022"), + ToyotaCarDocs("Toyota Avalon Hybrid 2022"), ], AVALON.specs, ) CAMRY = PlatformConfig( "TOYOTA CAMRY 2018", [ - ToyotaCarInfo("Toyota Camry 2018-20", video_link="https://www.youtube.com/watch?v=fkcjviZY9CM", footnotes=[Footnote.CAMRY]), - ToyotaCarInfo("Toyota Camry Hybrid 2018-20", video_link="https://www.youtube.com/watch?v=Q2DYY0AWKgk"), + ToyotaCarDocs("Toyota Camry 2018-20", video_link="https://www.youtube.com/watch?v=fkcjviZY9CM", footnotes=[Footnote.CAMRY]), + ToyotaCarDocs("Toyota Camry Hybrid 2018-20", video_link="https://www.youtube.com/watch?v=Q2DYY0AWKgk"), ], CarSpecs(mass=3400. * CV.LB_TO_KG, wheelbase=2.82448, steerRatio=13.7, tireStiffnessFactor=0.7933), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), @@ -132,16 +132,16 @@ class CAR(Platforms): CAMRY_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA CAMRY 2021", # TSS 2.5 [ - ToyotaCarInfo("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]), - ToyotaCarInfo("Toyota Camry Hybrid 2021-24"), + ToyotaCarDocs("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]), + ToyotaCarDocs("Toyota Camry Hybrid 2021-24"), ], CAMRY.specs, ) CHR = PlatformConfig( "TOYOTA C-HR 2018", [ - ToyotaCarInfo("Toyota C-HR 2017-20"), - ToyotaCarInfo("Toyota C-HR Hybrid 2017-20"), + ToyotaCarDocs("Toyota C-HR 2017-20"), + ToyotaCarDocs("Toyota C-HR Hybrid 2017-20"), ], CarSpecs(mass=3300. * CV.LB_TO_KG, wheelbase=2.63906, steerRatio=13.6, tireStiffnessFactor=0.7933), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), @@ -150,15 +150,15 @@ class CAR(Platforms): CHR_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA C-HR 2021", [ - ToyotaCarInfo("Toyota C-HR 2021"), - ToyotaCarInfo("Toyota C-HR Hybrid 2021-22"), + ToyotaCarDocs("Toyota C-HR 2021"), + ToyotaCarDocs("Toyota C-HR Hybrid 2021-22"), ], CHR.specs, flags=ToyotaFlags.RADAR_ACC, ) COROLLA = PlatformConfig( "TOYOTA COROLLA 2017", - [ToyotaCarInfo("Toyota Corolla 2017-19")], + [ToyotaCarDocs("Toyota Corolla 2017-19")], CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) @@ -166,22 +166,22 @@ class CAR(Platforms): COROLLA_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA COROLLA TSS2 2019", [ - ToyotaCarInfo("Toyota Corolla 2020-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), - ToyotaCarInfo("Toyota Corolla Cross (Non-US only) 2020-23", min_enable_speed=7.5), - ToyotaCarInfo("Toyota Corolla Hatchback 2019-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), + ToyotaCarDocs("Toyota Corolla 2020-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), + ToyotaCarDocs("Toyota Corolla Cross (Non-US only) 2020-23", min_enable_speed=7.5), + ToyotaCarDocs("Toyota Corolla Hatchback 2019-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), # Hybrid platforms - ToyotaCarInfo("Toyota Corolla Hybrid 2020-22"), - ToyotaCarInfo("Toyota Corolla Hybrid (Non-US only) 2020-23", min_enable_speed=7.5), - ToyotaCarInfo("Toyota Corolla Cross Hybrid (Non-US only) 2020-22", min_enable_speed=7.5), - ToyotaCarInfo("Lexus UX Hybrid 2019-23"), + ToyotaCarDocs("Toyota Corolla Hybrid 2020-22"), + ToyotaCarDocs("Toyota Corolla Hybrid (Non-US only) 2020-23", min_enable_speed=7.5), + ToyotaCarDocs("Toyota Corolla Cross Hybrid (Non-US only) 2020-22", min_enable_speed=7.5), + ToyotaCarDocs("Lexus UX Hybrid 2019-23"), ], CarSpecs(mass=3060. * CV.LB_TO_KG, wheelbase=2.67, steerRatio=13.9, tireStiffnessFactor=0.444), ) HIGHLANDER = PlatformConfig( "TOYOTA HIGHLANDER 2017", [ - ToyotaCarInfo("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo"), - ToyotaCarInfo("Toyota Highlander Hybrid 2017-19"), + ToyotaCarDocs("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo"), + ToyotaCarDocs("Toyota Highlander Hybrid 2017-19"), ], CarSpecs(mass=4516. * CV.LB_TO_KG, wheelbase=2.8194, steerRatio=16.0, tireStiffnessFactor=0.8), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), @@ -190,24 +190,24 @@ class CAR(Platforms): HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA HIGHLANDER 2020", [ - ToyotaCarInfo("Toyota Highlander 2020-23"), - ToyotaCarInfo("Toyota Highlander Hybrid 2020-23"), + ToyotaCarDocs("Toyota Highlander 2020-23"), + ToyotaCarDocs("Toyota Highlander Hybrid 2020-23"), ], HIGHLANDER.specs, ) PRIUS = PlatformConfig( "TOYOTA PRIUS 2017", [ - ToyotaCarInfo("Toyota Prius 2016", "Toyota Safety Sense P", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), - ToyotaCarInfo("Toyota Prius 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), - ToyotaCarInfo("Toyota Prius Prime 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), + ToyotaCarDocs("Toyota Prius 2016", "Toyota Safety Sense P", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), + ToyotaCarDocs("Toyota Prius 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), + ToyotaCarDocs("Toyota Prius Prime 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), ], CarSpecs(mass=3045. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.74, tireStiffnessFactor=0.6371), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), ) PRIUS_V = PlatformConfig( "TOYOTA PRIUS v 2017", - [ToyotaCarInfo("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED)], + [ToyotaCarDocs("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED)], CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, @@ -215,16 +215,16 @@ class CAR(Platforms): PRIUS_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA PRIUS TSS2 2021", [ - ToyotaCarInfo("Toyota Prius 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), - ToyotaCarInfo("Toyota Prius Prime 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), + ToyotaCarDocs("Toyota Prius 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), + ToyotaCarDocs("Toyota Prius Prime 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), ], CarSpecs(mass=3115. * CV.LB_TO_KG, wheelbase=2.70002, steerRatio=13.4, tireStiffnessFactor=0.6371), ) RAV4 = PlatformConfig( "TOYOTA RAV4 2017", [ - ToyotaCarInfo("Toyota RAV4 2016", "Toyota Safety Sense P"), - ToyotaCarInfo("Toyota RAV4 2017-18") + ToyotaCarDocs("Toyota RAV4 2016", "Toyota Safety Sense P"), + ToyotaCarDocs("Toyota RAV4 2017-18") ], CarSpecs(mass=3650. * CV.LB_TO_KG, wheelbase=2.65, steerRatio=16.88, tireStiffnessFactor=0.5533), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), @@ -232,8 +232,8 @@ class CAR(Platforms): RAV4H = PlatformConfig( "TOYOTA RAV4 HYBRID 2017", [ - ToyotaCarInfo("Toyota RAV4 Hybrid 2016", "Toyota Safety Sense P", video_link="https://youtu.be/LhT5VzJVfNI?t=26"), - ToyotaCarInfo("Toyota RAV4 Hybrid 2017-18", video_link="https://youtu.be/LhT5VzJVfNI?t=26") + ToyotaCarDocs("Toyota RAV4 Hybrid 2016", "Toyota Safety Sense P", video_link="https://youtu.be/LhT5VzJVfNI?t=26"), + ToyotaCarDocs("Toyota RAV4 Hybrid 2017-18", video_link="https://youtu.be/LhT5VzJVfNI?t=26") ], RAV4.specs, dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), @@ -242,16 +242,16 @@ class CAR(Platforms): RAV4_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA RAV4 2019", [ - ToyotaCarInfo("Toyota RAV4 2019-21", video_link="https://www.youtube.com/watch?v=wJxjDd42gGA"), - ToyotaCarInfo("Toyota RAV4 Hybrid 2019-21"), + ToyotaCarDocs("Toyota RAV4 2019-21", video_link="https://www.youtube.com/watch?v=wJxjDd42gGA"), + ToyotaCarDocs("Toyota RAV4 Hybrid 2019-21"), ], CarSpecs(mass=3585. * CV.LB_TO_KG, wheelbase=2.68986, steerRatio=14.3, tireStiffnessFactor=0.7933), ) RAV4_TSS2_2022 = ToyotaTSS2PlatformConfig( "TOYOTA RAV4 2022", [ - ToyotaCarInfo("Toyota RAV4 2022"), - ToyotaCarInfo("Toyota RAV4 Hybrid 2022", video_link="https://youtu.be/U0nH9cnrFB0"), + ToyotaCarDocs("Toyota RAV4 2022"), + ToyotaCarDocs("Toyota RAV4 Hybrid 2022", video_link="https://youtu.be/U0nH9cnrFB0"), ], RAV4_TSS2.specs, flags=ToyotaFlags.RADAR_ACC, @@ -259,20 +259,20 @@ class CAR(Platforms): RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig( "TOYOTA RAV4 2023", [ - ToyotaCarInfo("Toyota RAV4 2023-24"), - ToyotaCarInfo("Toyota RAV4 Hybrid 2023-24"), + ToyotaCarDocs("Toyota RAV4 2023-24"), + ToyotaCarDocs("Toyota RAV4 Hybrid 2023-24"), ], RAV4_TSS2.specs, flags=ToyotaFlags.RADAR_ACC | ToyotaFlags.ANGLE_CONTROL, ) MIRAI = ToyotaTSS2PlatformConfig( "TOYOTA MIRAI 2021", # TSS 2.5 - [ToyotaCarInfo("Toyota Mirai 2021")], + [ToyotaCarDocs("Toyota Mirai 2021")], CarSpecs(mass=4300. * CV.LB_TO_KG, wheelbase=2.91, steerRatio=14.8, tireStiffnessFactor=0.8), ) SIENNA = PlatformConfig( "TOYOTA SIENNA 2018", - [ToyotaCarInfo("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED)], + [ToyotaCarDocs("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED)], CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_STOP_TIMER, @@ -281,15 +281,15 @@ class CAR(Platforms): # Lexus LEXUS_CTH = PlatformConfig( "LEXUS CT HYBRID 2018", - [ToyotaCarInfo("Lexus CT Hybrid 2017-18", "Lexus Safety System+")], + [ToyotaCarDocs("Lexus CT Hybrid 2017-18", "Lexus Safety System+")], CarSpecs(mass=3108. * CV.LB_TO_KG, wheelbase=2.6, steerRatio=18.6, tireStiffnessFactor=0.517), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) LEXUS_ES = PlatformConfig( "LEXUS ES 2018", [ - ToyotaCarInfo("Lexus ES 2017-18"), - ToyotaCarInfo("Lexus ES Hybrid 2017-18"), + ToyotaCarDocs("Lexus ES 2017-18"), + ToyotaCarDocs("Lexus ES Hybrid 2017-18"), ], CarSpecs(mass=3677. * CV.LB_TO_KG, wheelbase=2.8702, steerRatio=16.0, tireStiffnessFactor=0.444), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), @@ -297,28 +297,28 @@ class CAR(Platforms): LEXUS_ES_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS ES 2019", [ - ToyotaCarInfo("Lexus ES 2019-24"), - ToyotaCarInfo("Lexus ES Hybrid 2019-24", video_link="https://youtu.be/BZ29osRVJeg?t=12"), + ToyotaCarDocs("Lexus ES 2019-24"), + ToyotaCarDocs("Lexus ES Hybrid 2019-24", video_link="https://youtu.be/BZ29osRVJeg?t=12"), ], LEXUS_ES.specs, ) LEXUS_IS = PlatformConfig( "LEXUS IS 2018", - [ToyotaCarInfo("Lexus IS 2017-19")], + [ToyotaCarDocs("Lexus IS 2017-19")], CarSpecs(mass=3736.8 * CV.LB_TO_KG, wheelbase=2.79908, steerRatio=13.3, tireStiffnessFactor=0.444), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.UNSUPPORTED_DSU, ) LEXUS_IS_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS IS 2023", - [ToyotaCarInfo("Lexus IS 2022-23")], + [ToyotaCarDocs("Lexus IS 2022-23")], LEXUS_IS.specs, ) LEXUS_NX = PlatformConfig( "LEXUS NX 2018", [ - ToyotaCarInfo("Lexus NX 2018-19"), - ToyotaCarInfo("Lexus NX Hybrid 2018-19"), + ToyotaCarDocs("Lexus NX 2018-19"), + ToyotaCarDocs("Lexus NX Hybrid 2018-19"), ], CarSpecs(mass=4070. * CV.LB_TO_KG, wheelbase=2.66, steerRatio=14.7, tireStiffnessFactor=0.444), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), @@ -326,19 +326,19 @@ class CAR(Platforms): LEXUS_NX_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS NX 2020", [ - ToyotaCarInfo("Lexus NX 2020-21"), - ToyotaCarInfo("Lexus NX Hybrid 2020-21"), + ToyotaCarDocs("Lexus NX 2020-21"), + ToyotaCarDocs("Lexus NX Hybrid 2020-21"), ], LEXUS_NX.specs, ) LEXUS_LC_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS LC 2024", - [ToyotaCarInfo("Lexus LC 2024")], + [ToyotaCarDocs("Lexus LC 2024")], CarSpecs(mass=4500. * CV.LB_TO_KG, wheelbase=2.87, steerRatio=13.0, tireStiffnessFactor=0.444), ) LEXUS_RC = PlatformConfig( "LEXUS RC 2020", - [ToyotaCarInfo("Lexus RC 2018-20")], + [ToyotaCarDocs("Lexus RC 2018-20")], LEXUS_IS.specs, dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.UNSUPPORTED_DSU, @@ -346,11 +346,11 @@ class CAR(Platforms): LEXUS_RX = PlatformConfig( "LEXUS RX 2016", [ - ToyotaCarInfo("Lexus RX 2016", "Lexus Safety System+"), - ToyotaCarInfo("Lexus RX 2017-19"), + ToyotaCarDocs("Lexus RX 2016", "Lexus Safety System+"), + ToyotaCarDocs("Lexus RX 2017-19"), # Hybrid platforms - ToyotaCarInfo("Lexus RX Hybrid 2016", "Lexus Safety System+"), - ToyotaCarInfo("Lexus RX Hybrid 2017-19"), + ToyotaCarDocs("Lexus RX Hybrid 2016", "Lexus Safety System+"), + ToyotaCarDocs("Lexus RX Hybrid 2017-19"), ], CarSpecs(mass=4481. * CV.LB_TO_KG, wheelbase=2.79, steerRatio=16., tireStiffnessFactor=0.5533), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), @@ -358,14 +358,14 @@ class CAR(Platforms): LEXUS_RX_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS RX 2020", [ - ToyotaCarInfo("Lexus RX 2020-22"), - ToyotaCarInfo("Lexus RX Hybrid 2020-22"), + ToyotaCarDocs("Lexus RX 2020-22"), + ToyotaCarDocs("Lexus RX Hybrid 2020-22"), ], LEXUS_RX.specs, ) LEXUS_GS_F = PlatformConfig( "LEXUS GS F 2016", - [ToyotaCarInfo("Lexus GS F 2016")], + [ToyotaCarDocs("Lexus GS F 2016")], CarSpecs(mass=4034. * CV.LB_TO_KG, wheelbase=2.84988, steerRatio=13.3, tireStiffnessFactor=0.444), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), flags=ToyotaFlags.UNSUPPORTED_DSU, diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 83b30d2569..9019d857b8 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -7,7 +7,7 @@ from panda.python import uds from opendbc.can.can_define import CANDefine from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car import dbc_dict, CarSpecs, DbcDict, PlatformConfig, Platforms -from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ +from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, \ Device from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 @@ -158,7 +158,7 @@ class Footnote(Enum): @dataclass -class VWCarInfo(CarInfo): +class VWCarDocs(CarDocs): package: str = "Adaptive Cruise Control (ACC) & Lane Assist" car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.j533])) @@ -180,197 +180,197 @@ class CAR(Platforms): ARTEON_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN ARTEON 1ST GEN", # Chassis AN [ - VWCarInfo("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"), - VWCarInfo("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), - VWCarInfo("Volkswagen Arteon eHybrid 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), - VWCarInfo("Volkswagen CC 2018-22", video_link="https://youtu.be/FAomFKPFlDA"), + VWCarDocs("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"), + VWCarDocs("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), + VWCarDocs("Volkswagen Arteon eHybrid 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), + VWCarDocs("Volkswagen CC 2018-22", video_link="https://youtu.be/FAomFKPFlDA"), ], VolkswagenCarSpecs(mass=1733, wheelbase=2.84), ) ATLAS_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN ATLAS 1ST GEN", # Chassis CA [ - VWCarInfo("Volkswagen Atlas 2018-23"), - VWCarInfo("Volkswagen Atlas Cross Sport 2020-22"), - VWCarInfo("Volkswagen Teramont 2018-22"), - VWCarInfo("Volkswagen Teramont Cross Sport 2021-22"), - VWCarInfo("Volkswagen Teramont X 2021-22"), + VWCarDocs("Volkswagen Atlas 2018-23"), + VWCarDocs("Volkswagen Atlas Cross Sport 2020-22"), + VWCarDocs("Volkswagen Teramont 2018-22"), + VWCarDocs("Volkswagen Teramont Cross Sport 2021-22"), + VWCarDocs("Volkswagen Teramont X 2021-22"), ], VolkswagenCarSpecs(mass=2011, wheelbase=2.98), ) CADDY_MK3 = VolkswagenPQPlatformConfig( "VOLKSWAGEN CADDY 3RD GEN", # Chassis 2K [ - VWCarInfo("Volkswagen Caddy 2019"), - VWCarInfo("Volkswagen Caddy Maxi 2019"), + VWCarDocs("Volkswagen Caddy 2019"), + VWCarDocs("Volkswagen Caddy Maxi 2019"), ], VolkswagenCarSpecs(mass=1613, wheelbase=2.6, minSteerSpeed=21 * CV.KPH_TO_MS), ) CRAFTER_MK2 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN CRAFTER 2ND GEN", # Chassis SY/SZ [ - VWCarInfo("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"), - VWCarInfo("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"), - VWCarInfo("Volkswagen Grand California 2019-23", video_link="https://youtu.be/4100gLeabmo"), - VWCarInfo("MAN TGE 2017-23", video_link="https://youtu.be/4100gLeabmo"), - VWCarInfo("MAN eTGE 2020-23", video_link="https://youtu.be/4100gLeabmo"), + VWCarDocs("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"), + VWCarDocs("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"), + VWCarDocs("Volkswagen Grand California 2019-23", video_link="https://youtu.be/4100gLeabmo"), + VWCarDocs("MAN TGE 2017-23", video_link="https://youtu.be/4100gLeabmo"), + VWCarDocs("MAN eTGE 2020-23", video_link="https://youtu.be/4100gLeabmo"), ], VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS), ) GOLF_MK7 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN GOLF 7TH GEN", # Chassis 5G/AU/BA/BE [ - VWCarInfo("Volkswagen e-Golf 2014-20"), - VWCarInfo("Volkswagen Golf 2015-20", auto_resume=False), - VWCarInfo("Volkswagen Golf Alltrack 2015-19", auto_resume=False), - VWCarInfo("Volkswagen Golf GTD 2015-20"), - VWCarInfo("Volkswagen Golf GTE 2015-20"), - VWCarInfo("Volkswagen Golf GTI 2015-21", auto_resume=False), - VWCarInfo("Volkswagen Golf R 2015-19"), - VWCarInfo("Volkswagen Golf SportsVan 2015-20"), + VWCarDocs("Volkswagen e-Golf 2014-20"), + VWCarDocs("Volkswagen Golf 2015-20", auto_resume=False), + VWCarDocs("Volkswagen Golf Alltrack 2015-19", auto_resume=False), + VWCarDocs("Volkswagen Golf GTD 2015-20"), + VWCarDocs("Volkswagen Golf GTE 2015-20"), + VWCarDocs("Volkswagen Golf GTI 2015-21", auto_resume=False), + VWCarDocs("Volkswagen Golf R 2015-19"), + VWCarDocs("Volkswagen Golf SportsVan 2015-20"), ], VolkswagenCarSpecs(mass=1397, wheelbase=2.62), ) JETTA_MK7 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN JETTA 7TH GEN", # Chassis BU [ - VWCarInfo("Volkswagen Jetta 2018-24"), - VWCarInfo("Volkswagen Jetta GLI 2021-24"), + VWCarDocs("Volkswagen Jetta 2018-24"), + VWCarDocs("Volkswagen Jetta GLI 2021-24"), ], VolkswagenCarSpecs(mass=1328, wheelbase=2.71), ) PASSAT_MK8 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN PASSAT 8TH GEN", # Chassis 3G [ - VWCarInfo("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), - VWCarInfo("Volkswagen Passat Alltrack 2015-22"), - VWCarInfo("Volkswagen Passat GTE 2015-22"), + VWCarDocs("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), + VWCarDocs("Volkswagen Passat Alltrack 2015-22"), + VWCarDocs("Volkswagen Passat GTE 2015-22"), ], VolkswagenCarSpecs(mass=1551, wheelbase=2.79), ) PASSAT_NMS = VolkswagenPQPlatformConfig( "VOLKSWAGEN PASSAT NMS", # Chassis A3 - [VWCarInfo("Volkswagen Passat NMS 2017-22")], + [VWCarDocs("Volkswagen Passat NMS 2017-22")], VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50*CV.KPH_TO_MS, minEnableSpeed=20*CV.KPH_TO_MS), ) POLO_MK6 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN POLO 6TH GEN", # Chassis AW [ - VWCarInfo("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), - VWCarInfo("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), + VWCarDocs("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), + VWCarDocs("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), ], VolkswagenCarSpecs(mass=1230, wheelbase=2.55), ) SHARAN_MK2 = VolkswagenPQPlatformConfig( "VOLKSWAGEN SHARAN 2ND GEN", # Chassis 7N [ - VWCarInfo("Volkswagen Sharan 2018-22"), - VWCarInfo("SEAT Alhambra 2018-20"), + VWCarDocs("Volkswagen Sharan 2018-22"), + VWCarDocs("SEAT Alhambra 2018-20"), ], VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50*CV.KPH_TO_MS), ) TAOS_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN TAOS 1ST GEN", # Chassis B2 - [VWCarInfo("Volkswagen Taos 2022-23")], + [VWCarDocs("Volkswagen Taos 2022-23")], VolkswagenCarSpecs(mass=1498, wheelbase=2.69), ) TCROSS_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN T-CROSS 1ST GEN", # Chassis C1 - [VWCarInfo("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], + [VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1150, wheelbase=2.60), ) TIGUAN_MK2 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN TIGUAN 2ND GEN", # Chassis AD/BW [ - VWCarInfo("Volkswagen Tiguan 2018-24"), - VWCarInfo("Volkswagen Tiguan eHybrid 2021-23"), + VWCarDocs("Volkswagen Tiguan 2018-24"), + VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"), ], VolkswagenCarSpecs(mass=1715, wheelbase=2.74), ) TOURAN_MK2 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN TOURAN 2ND GEN", # Chassis 1T - [VWCarInfo("Volkswagen Touran 2016-23")], + [VWCarDocs("Volkswagen Touran 2016-23")], VolkswagenCarSpecs(mass=1516, wheelbase=2.79), ) TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN TRANSPORTER T6.1", # Chassis 7H/7L [ - VWCarInfo("Volkswagen Caravelle 2020"), - VWCarInfo("Volkswagen California 2021-23"), + VWCarDocs("Volkswagen Caravelle 2020"), + VWCarDocs("Volkswagen California 2021-23"), ], VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0), ) TROC_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN T-ROC 1ST GEN", # Chassis A1 - [VWCarInfo("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])], + [VWCarDocs("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1413, wheelbase=2.63), ) AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( "AUDI A3 3RD GEN", # Chassis 8V/FF [ - VWCarInfo("Audi A3 2014-19"), - VWCarInfo("Audi A3 Sportback e-tron 2017-18"), - VWCarInfo("Audi RS3 2018"), - VWCarInfo("Audi S3 2015-17"), + VWCarDocs("Audi A3 2014-19"), + VWCarDocs("Audi A3 Sportback e-tron 2017-18"), + VWCarDocs("Audi RS3 2018"), + VWCarDocs("Audi S3 2015-17"), ], VolkswagenCarSpecs(mass=1335, wheelbase=2.61), ) AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( "AUDI Q2 1ST GEN", # Chassis GA - [VWCarInfo("Audi Q2 2018")], + [VWCarDocs("Audi Q2 2018")], VolkswagenCarSpecs(mass=1205, wheelbase=2.61), ) AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( "AUDI Q3 2ND GEN", # Chassis 8U/F3/FS - [VWCarInfo("Audi Q3 2019-23")], + [VWCarDocs("Audi Q3 2019-23")], VolkswagenCarSpecs(mass=1623, wheelbase=2.68), ) SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( "SEAT ATECA 1ST GEN", # Chassis 5F - [VWCarInfo("SEAT Ateca 2018")], + [VWCarDocs("SEAT Ateca 2018")], VolkswagenCarSpecs(mass=1900, wheelbase=2.64), ) SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( "SEAT LEON 3RD GEN", # Chassis 5F - [VWCarInfo("SEAT Leon 2014-20")], + [VWCarDocs("SEAT Leon 2014-20")], VolkswagenCarSpecs(mass=1227, wheelbase=2.64), ) SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( "SKODA FABIA 4TH GEN", # Chassis PJ - [VWCarInfo("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])], + [VWCarDocs("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1266, wheelbase=2.56), ) SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( "SKODA KAMIQ 1ST GEN", # Chassis NW - [VWCarInfo("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ])], + [VWCarDocs("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ])], VolkswagenCarSpecs(mass=1265, wheelbase=2.66), ) SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( "SKODA KAROQ 1ST GEN", # Chassis NU - [VWCarInfo("Škoda Karoq 2019-23")], + [VWCarDocs("Škoda Karoq 2019-23")], VolkswagenCarSpecs(mass=1278, wheelbase=2.66), ) SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( "SKODA KODIAQ 1ST GEN", # Chassis NS - [VWCarInfo("Škoda Kodiaq 2017-23")], + [VWCarDocs("Škoda Kodiaq 2017-23")], VolkswagenCarSpecs(mass=1569, wheelbase=2.79), ) SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( "SKODA OCTAVIA 3RD GEN", # Chassis NE [ - VWCarInfo("Škoda Octavia 2015-19"), - VWCarInfo("Škoda Octavia RS 2016"), + VWCarDocs("Škoda Octavia 2015-19"), + VWCarDocs("Škoda Octavia RS 2016"), ], VolkswagenCarSpecs(mass=1388, wheelbase=2.68), ) SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig( "SKODA SCALA 1ST GEN", # Chassis NW - [VWCarInfo("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0])], + [VWCarDocs("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1192, wheelbase=2.65), ) SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( "SKODA SUPERB 3RD GEN", # Chassis 3V/NP - [VWCarInfo("Škoda Superb 2015-22")], + [VWCarDocs("Škoda Superb 2015-22")], VolkswagenCarSpecs(mass=1505, wheelbase=2.84), ) From 07ec5e5fdb322977c6c7c24286e537b76e5f9203 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 15 Mar 2024 17:10:38 -0400 Subject: [PATCH 057/384] test_updated: test permissions are preserved (#31881) * test perserved * space --- selfdrive/updated/tests/test_base.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/selfdrive/updated/tests/test_base.py b/selfdrive/updated/tests/test_base.py index b79785277a..1d81459883 100644 --- a/selfdrive/updated/tests/test_base.py +++ b/selfdrive/updated/tests/test_base.py @@ -2,6 +2,7 @@ import os import pathlib import shutil import signal +import stat import subprocess import tempfile import time @@ -29,9 +30,13 @@ def update_release(directory, name, version, agnos_version, release_notes): with open(directory / "common" / "version.h", "w") as f: f.write(f'#define COMMA_VERSION "{version}"') - with open(directory / "launch_env.sh", "w") as f: + launch_env = directory / "launch_env.sh" + with open(launch_env, "w") as f: f.write(f'export AGNOS_VERSION="{agnos_version}"') + st = os.stat(launch_env) + os.chmod(launch_env, st.st_mode | stat.S_IEXEC) + test_symlink = directory / "test_symlink" if not os.path.exists(str(test_symlink)): os.symlink("common/version.h", test_symlink) @@ -123,6 +128,7 @@ class BaseUpdateTest(unittest.TestCase): self.assertEqual(self.params.get("UpdaterNewReleaseNotes", encoding="utf-8"), f"

{release_notes}

\n") self.assertEqual(get_version(str(self.staging_root / "finalized")), version) self.assertEqual(get_consistent_flag(str(self.staging_root / "finalized")), True) + self.assertTrue(os.access(str(self.staging_root / "finalized" / "launch_env.sh"), os.X_OK)) with open(self.staging_root / "finalized" / "test_symlink") as f: self.assertIn(version, f.read()) From 91933b5f428332028e7b5be3ac58cb063486ca89 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 15 Mar 2024 14:46:29 -0700 Subject: [PATCH 058/384] Hyundai CAN FD: allow more platforms to use enhanced fuzzy fingerprinting (#31882) * K8 has hybrid descriptor (GL3H), AND we detect hybrid now * don't know if Carnival's hybrid variant has them, but it's not out yet, and we detect hybrid fixes: ec32d6aa1c7735d1/2024-03-15--16-41-46 * cmt --- selfdrive/car/hyundai/values.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 4419cde27f..f4c256fda9 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -701,7 +701,9 @@ DATE_FW_PATTERN = re.compile(b'(?<=[ -])([0-9]{6}$)') PART_NUMBER_FW_PATTERN = re.compile(b'(?<=[0-9][.,][0-9]{2} )([0-9]{5}[-/]?[A-Z][A-Z0-9]{3}[0-9])') # We've seen both ICE and hybrid for these platforms, and they have hybrid descriptors (e.g. MQ4 vs MQ4H) -CANFD_FUZZY_WHITELIST = {CAR.KIA_SORENTO_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN} +CANFD_FUZZY_WHITELIST = {CAR.KIA_SORENTO_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN, CAR.KIA_K8_HEV_1ST_GEN, + # TODO: the hybrid variant is not out yet + CAR.KIA_CARNIVAL_4TH_GEN} # List of ECUs expected to have platform codes, camera and radar should exist on all cars # TODO: use abs, it has the platform code and part number on many platforms From 5746c4672dffbdee0209318b6492a37c48977b3e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 15 Mar 2024 15:37:29 -0700 Subject: [PATCH 059/384] Ford: hybrid docs (#31874) * kinda works * fix * clean up * rm hybrid entries * shorter * shorter * fix that * one line! * we can get rid of this now! --- selfdrive/car/ford/values.py | 44 +++++++++++++++++------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 5869a800a3..917f50d6fd 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -1,4 +1,5 @@ -from dataclasses import dataclass, field +import copy +from dataclasses import dataclass, field, replace from enum import Enum, IntFlag import panda.python.uds as uds @@ -60,6 +61,8 @@ class Footnote(Enum): @dataclass class FordCarDocs(CarDocs): package: str = "Co-Pilot360 Assist+" + hybrid: bool = False + plug_in_hybrid: bool = False def init_make(self, CP: car.CarParams): harness = CarHarness.ford_q4 if CP.flags & FordFlags.CANFD else CarHarness.ford_q3 @@ -73,6 +76,15 @@ class FordCarDocs(CarDocs): class FordPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', RADAR.DELPHI_MRR)) + def init(self): + for car_info in list(self.car_info): + if car_info.hybrid: + name = f"{car_info.make} {car_info.model} Hybrid {car_info.years}" + self.car_info.append(replace(copy.deepcopy(car_info), name=name)) + if car_info.plug_in_hybrid: + name = f"{car_info.make} {car_info.model} Plug-in Hybrid {car_info.years}" + self.car_info.append(replace(copy.deepcopy(car_info), name=name)) + @dataclass class FordCANFDPlatformConfig(FordPlatformConfig): @@ -92,31 +104,22 @@ class CAR(Platforms): ESCAPE_MK4 = FordPlatformConfig( "FORD ESCAPE 4TH GEN", [ - FordCarDocs("Ford Escape 2020-22"), - FordCarDocs("Ford Escape Hybrid 2020-22"), - FordCarDocs("Ford Escape Plug-in Hybrid 2020-22"), - FordCarDocs("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering"), - FordCarDocs("Ford Kuga Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), - FordCarDocs("Ford Kuga Plug-in Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), + FordCarDocs("Ford Escape 2020-22", hybrid=True, plug_in_hybrid=True), + FordCarDocs("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering", hybrid=True, plug_in_hybrid=True), ], CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), ) EXPLORER_MK6 = FordPlatformConfig( "FORD EXPLORER 6TH GEN", [ - FordCarDocs("Ford Explorer 2020-23"), - FordCarDocs("Ford Explorer Hybrid 2020-23"), # Limited and Platinum only - FordCarDocs("Lincoln Aviator 2020-23", "Co-Pilot360 Plus"), - FordCarDocs("Lincoln Aviator Plug-in Hybrid 2020-23", "Co-Pilot360 Plus"), # Grand Touring only + FordCarDocs("Ford Explorer 2020-23", hybrid=True), # Hybrid: Limited and Platinum only + FordCarDocs("Lincoln Aviator 2020-23", "Co-Pilot360 Plus", plug_in_hybrid=True), # Hybrid: Grand Touring only ], CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), ) F_150_MK14 = FordCANFDPlatformConfig( "FORD F-150 14TH GEN", - [ - FordCarDocs("Ford F-150 2022-23", "Co-Pilot360 Active 2.0"), - FordCarDocs("Ford F-150 Hybrid 2022-23", "Co-Pilot360 Active 2.0"), - ], + [FordCarDocs("Ford F-150 2022-23", "Co-Pilot360 Active 2.0", hybrid=True)], CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), ) F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( @@ -126,19 +129,14 @@ class CAR(Platforms): ) FOCUS_MK4 = FordPlatformConfig( "FORD FOCUS 4TH GEN", - [ - FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), - FordCarDocs("Ford Focus Hybrid 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), # mHEV only - ], + [FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS], hybrid=True)], # mHEV only CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0), ) MAVERICK_MK1 = FordPlatformConfig( "FORD MAVERICK 1ST GEN", [ - FordCarDocs("Ford Maverick 2022", "LARIAT Luxury"), - FordCarDocs("Ford Maverick Hybrid 2022", "LARIAT Luxury"), - FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist"), - FordCarDocs("Ford Maverick Hybrid 2023-24", "Co-Pilot360 Assist"), + FordCarDocs("Ford Maverick 2022", "LARIAT Luxury", hybrid=True), + FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist", hybrid=True), ], CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), ) From 6f9b663ff23716ed5b20c1809066001d7a137c06 Mon Sep 17 00:00:00 2001 From: Stanley Lee Date: Fri, 15 Mar 2024 16:12:07 -0700 Subject: [PATCH 060/384] VW MQB: Add FW for 2024 Volkswagen Tiguan (#30978) * VW MQB: Add FW for 2024 Volkswagen Tiguan * VW MQB: Update sort order of new 2024 Volkswagen Tiguan FW --- selfdrive/car/volkswagen/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index cf3e9287cc..8792b66f91 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -581,6 +581,7 @@ FW_VERSIONS = { b'\xf1\x8709G927158GM\xf1\x893936', b'\xf1\x8709G927158GN\xf1\x893938', b'\xf1\x8709G927158HB\xf1\x894069', + b'\xf1\x8709G927158HC\xf1\x894070', b'\xf1\x870D9300043 \xf1\x895202', b'\xf1\x870DD300046K \xf1\x892302', b'\xf1\x870DL300011N \xf1\x892001', From 1610010ad2b174ec43ea33a5852b0c9ea721285e Mon Sep 17 00:00:00 2001 From: ilxszh <124226489+ilxszh@users.noreply.github.com> Date: Sat, 16 Mar 2024 07:24:19 +0800 Subject: [PATCH 061/384] Add VW Touran CN model fingerprint (#31295) * Update fingerprints.py Add Touran CN model support * Update fingerprints.py Remove repeated FR fwVersion. * run bot --------- Co-authored-by: Shane Smiskol --- selfdrive/car/volkswagen/fingerprints.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 8792b66f91..b31e8cf39d 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -640,11 +640,13 @@ FW_VERSIONS = { }, CAR.TOURAN_MK2: { (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906025BE\xf1\x890720', b'\xf1\x8704E906027HQ\xf1\x893746', b'\xf1\x8704L906026HM\xf1\x893017', b'\xf1\x8705E906018CQ\xf1\x890808', ], (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300020A \xf1\x891936', b'\xf1\x870CW300041E \xf1\x891005', b'\xf1\x870CW300041Q \xf1\x891606', b'\xf1\x870CW300051M \xf1\x891926', @@ -653,10 +655,12 @@ FW_VERSIONS = { b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x1336350021353335314132014730479333313100', b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x13363500213533353141324C4732479333313100', b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1336350021353336314740025250529333613100', + b'\xf1\x875QD959655AJ\xf1\x890421\xf1\x82\x1336350021313300314240023330339333663100', ], (Ecu.eps, 0x712, None): [ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820531B0062105', b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A8090400', + b'\xf1\x875QD909144F \xf1\x891082\xf1\x82\x0521A00642A1', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x872Q0907572AA\xf1\x890396', From 0821201dc4edf3c75ae18ec2a30c1fbfca76dfcd Mon Sep 17 00:00:00 2001 From: "fri.K" Date: Sat, 16 Mar 2024 00:32:39 +0100 Subject: [PATCH 062/384] Fingerprint for Skoda Octavia MK3 Scout with 6 speed DSG (#31574) Fingerprint for Skoda Octavia MK3 Scout with DSG retrofitted ACC with Audi A3 rounded radar --- selfdrive/car/volkswagen/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index b31e8cf39d..8a30b94cb7 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -1062,6 +1062,7 @@ FW_VERSIONS = { b'\xf1\x8704E906027HD\xf1\x893742', b'\xf1\x8704E906027MH\xf1\x894786', b'\xf1\x8704L906021DT\xf1\x898127', + b'\xf1\x8704L906021ER\xf1\x898361', b'\xf1\x8704L906026BP\xf1\x897608', b'\xf1\x8704L906026BS\xf1\x891541', b'\xf1\x875G0906259C \xf1\x890002', @@ -1071,6 +1072,7 @@ FW_VERSIONS = { b'\xf1\x870CW300041N \xf1\x891605', b'\xf1\x870CW300043B \xf1\x891601', b'\xf1\x870CW300043P \xf1\x891605', + b'\xf1\x870D9300012H \xf1\x894518', b'\xf1\x870D9300041C \xf1\x894936', b'\xf1\x870D9300041H \xf1\x895220', b'\xf1\x870D9300041J \xf1\x894902', @@ -1096,6 +1098,7 @@ FW_VERSIONS = { b'\xf1\x875QD909144E \xf1\x891081\xf1\x82\x0521T00503A1', ], (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x875Q0907567P \xf1\x890100\xf1\x82\x0101', b'\xf1\x875Q0907572D \xf1\x890304\xf1\x82\x0101', b'\xf1\x875Q0907572F \xf1\x890400\xf1\x82\x0101', b'\xf1\x875Q0907572H \xf1\x890620', From a790b49fd5e0217744d7dd0209606a497b10ae50 Mon Sep 17 00:00:00 2001 From: Chase Bolt Date: Fri, 15 Mar 2024 17:03:45 -0700 Subject: [PATCH 063/384] Kia: add 2024 Sportage X-Pro Prestige camera FW version (#31581) * adding fingerprint for 2024 Kia Sportage X-Pro Prestige * update docs --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 2 +- selfdrive/car/hyundai/fingerprints.py | 1 + selfdrive/car/hyundai/values.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index eed06f7110..6202b2f0c2 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -160,7 +160,7 @@ A supported vehicle is one that just works when you install a comma device. All |Kia|Sorento 2021-23[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Sorento Hybrid 2021-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Sorento Plug-in Hybrid 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sportage 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sportage 2023-24[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Sportage Hybrid 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Stinger 2018-20|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Stinger 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index bd5503b47e..d438130967 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1609,6 +1609,7 @@ FW_VERSIONS = { b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1030 662', b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1040 663', b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1060 665', + b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1070 690', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00NQ5__ 1.00 1.02 99110-P1000 ', diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index f4c256fda9..003484f2bd 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -483,7 +483,7 @@ class CAR(Platforms): KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig( "KIA SPORTAGE 5TH GEN", [ - HyundaiCarDocs("Kia Sportage 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Kia Sportage 2023-24", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Kia Sportage Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), ], # weight from SX and above trims, average of FWD and AWD version, steering ratio according to Kia News https://www.kiamedia.com/us/en/models/sportage/2023/specifications From 1723d27b9cc2a7bda6a4d40d3e887b2d85d8e4ca Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 15 Mar 2024 17:33:38 -0700 Subject: [PATCH 064/384] Kia Niro Plug-in Hybrid: update required package (#31888) * from https://www.applewoodkialangley.ca/new/2022-Kia-Niro%20plug_in%20hybrid-brochure.html?lang=ENGLISH&vehicle=kia-niropluginhybrid-2022 * LXS on 2021 also lacks SCC - https://www.kiamedia.com/us/en/models/niro-phev/2021/documents * 2020 too?! https://www.kiamedia.com/us/en/models/niro-phev/2020/documents * update --- docs/CARS.md | 6 +++--- selfdrive/car/hyundai/values.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 6202b2f0c2..f760f29912 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -148,9 +148,9 @@ A supported vehicle is one that just works when you install a comma device. All |Kia|Niro Hybrid 2022|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Hybrid 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Plug-in Hybrid 2018-19|All|Stock|10 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro Plug-in Hybrid 2020|All|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro Plug-in Hybrid 2021|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro Plug-in Hybrid 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Plug-in Hybrid 2020|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Plug-in Hybrid 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Plug-in Hybrid 2022|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Optima 2017|Advanced Smart Cruise Control|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai B connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Optima 2019-20|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai G connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Optima Hybrid 2019|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 003484f2bd..f274e5e9e1 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -420,7 +420,7 @@ class CAR(Platforms): [ HyundaiCarDocs("Kia Niro Hybrid 2018", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), HyundaiCarDocs("Kia Niro Plug-in Hybrid 2018-19", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), - HyundaiCarDocs("Kia Niro Plug-in Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_d])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_d])), ], KIA_NIRO_EV.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.MIN_STEER_32_MPH, @@ -428,8 +428,8 @@ class CAR(Platforms): KIA_NIRO_PHEV_2022 = HyundaiPlatformConfig( "KIA NIRO PLUG-IN HYBRID 2022", [ - HyundaiCarDocs("Kia Niro Plug-in Hybrid 2021", "All", car_parts=CarParts.common([CarHarness.hyundai_d])), - HyundaiCarDocs("Kia Niro Plug-in Hybrid 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), ], KIA_NIRO_EV.specs, flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR, From 1cb49ae44d8a5c2ecc2e8a38cb6aea2d5cfcb674 Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Fri, 15 Mar 2024 22:56:04 -0700 Subject: [PATCH 065/384] Fix radard comment (#31891) --- selfdrive/controls/radard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index 4de4208e9d..16c9e0635c 100755 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -133,7 +133,7 @@ def match_vision_to_track(v_ego: float, lead: capnp._DynamicStructReader, tracks prob_y = laplacian_pdf(c.yRel, -lead.y[0], lead.yStd[0]) prob_v = laplacian_pdf(c.vRel + v_ego, lead.v[0], lead.vStd[0]) - # This is isn't exactly right, but good heuristic + # This isn't exactly right, but it's a good heuristic return prob_d * prob_y * prob_v track = max(tracks.values(), key=prob) From 93c06eaf43e525b4eeb9e53de889a0fb8d542c4d Mon Sep 17 00:00:00 2001 From: ishfaaq Date: Sun, 17 Mar 2024 04:44:26 -0400 Subject: [PATCH 066/384] Updating steerRatio for 4th gen Hyundai Tucson (2022+) (#31877) Update values.py --- selfdrive/car/hyundai/values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index f274e5e9e1..4b99fb096d 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -356,7 +356,7 @@ class CAR(Platforms): HyundaiCarDocs("Hyundai Tucson 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Hyundai Tucson Hybrid 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), ], - CarSpecs(mass=1630, wheelbase=2.756, steerRatio=16, tireStiffnessFactor=0.385), + CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385), ) SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI SANTA CRUZ 1ST GEN", From 9d5c70fbc9349d420c181ff098250e24d03eba07 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 17 Mar 2024 03:55:48 -0500 Subject: [PATCH 067/384] Toyota: check FW valid (#31898) * basic check * basic check * fix --- selfdrive/car/toyota/tests/test_toyota.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/selfdrive/car/toyota/tests/test_toyota.py b/selfdrive/car/toyota/tests/test_toyota.py index d9d4fe087f..6a2476dff9 100755 --- a/selfdrive/car/toyota/tests/test_toyota.py +++ b/selfdrive/car/toyota/tests/test_toyota.py @@ -13,6 +13,10 @@ Ecu = car.CarParams.Ecu ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()} +def check_fw_version(fw_version: bytes) -> bool: + return b'?' not in fw_version + + class TestToyotaInterfaces(unittest.TestCase): def test_car_sets(self): self.assertTrue(len(ANGLE_CONTROL_CAR - TSS2_CAR) == 0) @@ -59,6 +63,14 @@ class TestToyotaFingerprint(unittest.TestCase): car_model in FW_QUERY_CONFIG.non_essential_ecus[Ecu.engine], f"Car model unexpectedly {'not ' if len(engine_ecus) > 1 else ''}in non-essential list") + def test_valid_fw_versions(self): + # Asserts all FW versions are valid + for car_model, ecus in FW_VERSIONS.items(): + with self.subTest(car_model=car_model.value): + for fws in ecus.values(): + for fw in fws: + self.assertTrue(check_fw_version(fw), fw) + # Tests for part numbers, platform codes, and sub-versions which Toyota will use to fuzzy # fingerprint in the absence of full FW matches: @settings(max_examples=100) From 96aa3223e523a555c04a10ab68a64ef43ef35803 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 17 Mar 2024 04:05:13 -0500 Subject: [PATCH 068/384] [bot] Fingerprints: add missing FW versions from new users (#31897) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 4 ++++ selfdrive/car/honda/fingerprints.py | 3 +++ 2 files changed, 7 insertions(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index c021facba5..219ec3e2b8 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -95,6 +95,7 @@ FW_VERSIONS = { b'68405327AC', b'68436233AB', b'68436233AC', + b'68436234AB', b'68436250AE', b'68529067AA', b'68594993AB', @@ -379,6 +380,7 @@ FW_VERSIONS = { b'68434859AC', b'68434860AC', b'68453483AC', + b'68453483AD', b'68453487AD', b'68453491AC', b'68453499AD', @@ -511,11 +513,13 @@ FW_VERSIONS = { b'68455145AE ', b'68455146AC ', b'68467915AC ', + b'68467916AC ', b'68467936AC ', b'68500630AD', b'68500630AE', b'68502719AC ', b'68502722AC ', + b'68502733AC ', b'68502734AF ', b'68502740AF ', b'68502741AF ', diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 83c2c3f1eb..5296a91e50 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -922,6 +922,7 @@ FW_VERSIONS = { b'54008-TG7-A530\x00\x00', ], (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-5EY-A040\x00\x00', b'28101-5EY-A050\x00\x00', b'28101-5EY-A100\x00\x00', b'28101-5EY-A430\x00\x00', @@ -942,6 +943,7 @@ FW_VERSIONS = { b'37805-RLV-4070\x00\x00', b'37805-RLV-5140\x00\x00', b'37805-RLV-5230\x00\x00', + b'37805-RLV-A630\x00\x00', b'37805-RLV-A830\x00\x00', b'37805-RLV-A840\x00\x00', b'37805-RLV-B210\x00\x00', @@ -1057,6 +1059,7 @@ FW_VERSIONS = { b'57114-TG7-A630\x00\x00', b'57114-TG7-A730\x00\x00', b'57114-TG8-A140\x00\x00', + b'57114-TG8-A230\x00\x00', b'57114-TG8-A240\x00\x00', b'57114-TG8-A630\x00\x00', b'57114-TG8-A730\x00\x00', From 04382115c1cf9a2082ce9f644106d63f7d99d837 Mon Sep 17 00:00:00 2001 From: gittyhubbyfrankybobby Date: Sun, 17 Mar 2024 05:14:01 -0400 Subject: [PATCH 069/384] Add Genesis G90 2020 Fingerprint (#31893) * add 2020 G90 fingerprint * Add G90 fingerprint * Add 2020 G90 transmission and fwdRadar fingerprints * run bot * probably fine to include 2019 --------- Co-authored-by: Dwight Awesome Co-authored-by: Shane Smiskol --- docs/CARS.md | 2 +- selfdrive/car/hyundai/fingerprints.py | 3 +++ selfdrive/car/hyundai/values.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index f760f29912..251ceb4780 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -54,7 +54,7 @@ A supported vehicle is one that just works when you install a comma device. All |Genesis|G70 2020-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G90 2017-18|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G90 2017-20|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|GV60 (Advanced Trim) 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|GV60 (Performance Trim) 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|GV70 (2.5T Trim) 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index d438130967..4116c65b3f 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -900,16 +900,19 @@ FW_VERSIONS = { }, CAR.GENESIS_G90: { (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SHI0G50NH0\xff\x80\xc2*', b'\xf1\x87VDGMD15352242DD3w\x87gxwvgv\x87wvw\x88wXwffVfffUfw\x88o\xff\x06J\xf1\x81E14\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcshcm49 E14\x00\x00\x00\x00\x00\x00\x00SHI0G50NB1tc5\xb7', b'\xf1\x87VDGMD15866192DD3x\x88x\x89wuFvvfUf\x88vWwgwwwvfVgx\x87o\xff\xbc^\xf1\x81E14\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcshcm49 E14\x00\x00\x00\x00\x00\x00\x00SHI0G50NB1tc5\xb7', b'\xf1\x87VDHMD16446682DD3WwwxxvGw\x88\x88\x87\x88\x88whxx\x87\x87\x87\x85fUfwu_\xffT\xf8\xf1\x81E14\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcshcm49 E14\x00\x00\x00\x00\x00\x00\x00SHI0G50NB1tc5\xb7', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00HI__ SCC F-CUP 1.00 1.01 96400-D2100 ', + b'\xf1\x00HI__ SCC FHCUP 1.00 1.02 99110-D2100 ', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00HI LKAS AT USA LHD 1.00 1.00 95895-D2020 160302', b'\xf1\x00HI LKAS AT USA LHD 1.00 1.00 95895-D2030 170208', + b'\xf1\x00HI MFC AT USA LHD 1.00 1.03 99211-D2000 190831', ], (Ecu.engine, 0x7e0, None): [ b'\xf1\x810000000000\x00', diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 4b99fb096d..d81d9ad510 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -590,7 +590,7 @@ class CAR(Platforms): ) GENESIS_G90 = HyundaiPlatformConfig( "GENESIS G90 2017", - [HyundaiCarDocs("Genesis G90 2017-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + [HyundaiCarDocs("Genesis G90 2017-20", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=2200, wheelbase=3.15, steerRatio=12.069), ) GENESIS_GV80 = HyundaiCanFDPlatformConfig( From 7e9a909e0e57ecb31df4c87c5b9a06b1204fd034 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 17 Mar 2024 04:23:44 -0500 Subject: [PATCH 070/384] [bot] Fingerprints: add missing Volkswagen FW versions from new users (#31734) Export fingerprints --- selfdrive/car/volkswagen/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 8a30b94cb7..e39e65b52c 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -80,6 +80,7 @@ FW_VERSIONS = { b'\xf1\x873Q0959655BN\xf1\x890713\xf1\x82\x0e2214152212001105141122052900', b'\xf1\x873Q0959655DB\xf1\x890720\xf1\x82\x0e1114151112001105111122052900', b'\xf1\x873Q0959655DB\xf1\x890720\xf1\x82\x0e2214152212001105141122052900', + b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1114151112001105111122052J00', b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1114151112001105161122052J00', b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1115151112001105171122052J00', ], @@ -87,6 +88,7 @@ FW_VERSIONS = { b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B60924A1', b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6G920A1', b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6M921A1', + b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6N920A1', b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820528B6080105', b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820528B6090105', ], @@ -331,6 +333,7 @@ FW_VERSIONS = { b'\xf1\x8704E906024BC\xf1\x899971', b'\xf1\x8704E906024BG\xf1\x891057', b'\xf1\x8704E906024C \xf1\x899970', + b'\xf1\x8704E906024C \xf1\x899971', b'\xf1\x8704E906024L \xf1\x895595', b'\xf1\x8704E906024L \xf1\x899970', b'\xf1\x8704E906027MS\xf1\x896223', From 3e816e7df89eccb6375f87c8ae4276312116e5ad Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Sun, 17 Mar 2024 18:17:29 +0000 Subject: [PATCH 071/384] cabana(DBCFile): interleave msg and signal comments (#31899) This matches the behaviour of CANdb++ --- tools/cabana/dbc/dbcfile.cc | 8 ++++---- tools/cabana/tests/test_cabana.cc | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/tools/cabana/dbc/dbcfile.cc b/tools/cabana/dbc/dbcfile.cc index fbbb54fd58..69ca5b6309 100644 --- a/tools/cabana/dbc/dbcfile.cc +++ b/tools/cabana/dbc/dbcfile.cc @@ -191,12 +191,12 @@ void DBCFile::parse(const QString &content) { } QString DBCFile::generateDBC() { - QString dbc_string, signal_comment, message_comment, val_desc; + QString dbc_string, comment, val_desc; for (const auto &[address, m] : msgs) { const QString transmitter = m.transmitter.isEmpty() ? DEFAULT_NODE_NAME : m.transmitter; dbc_string += QString("BO_ %1 %2: %3 %4\n").arg(address).arg(m.name).arg(m.size).arg(transmitter); if (!m.comment.isEmpty()) { - message_comment += QString("CM_ BO_ %1 \"%2\";\n").arg(address).arg(m.comment); + comment += QString("CM_ BO_ %1 \"%2\";\n").arg(address).arg(m.comment); } for (auto sig : m.getSignals()) { QString multiplexer_indicator; @@ -219,7 +219,7 @@ QString DBCFile::generateDBC() { .arg(sig->unit) .arg(sig->receiver_name.isEmpty() ? DEFAULT_NODE_NAME : sig->receiver_name); if (!sig->comment.isEmpty()) { - signal_comment += QString("CM_ SG_ %1 %2 \"%3\";\n").arg(address).arg(sig->name).arg(sig->comment); + comment += QString("CM_ SG_ %1 %2 \"%3\";\n").arg(address).arg(sig->name).arg(sig->comment); } if (!sig->val_desc.empty()) { QStringList text; @@ -231,5 +231,5 @@ QString DBCFile::generateDBC() { } dbc_string += "\n"; } - return dbc_string + message_comment + signal_comment + val_desc; + return dbc_string + comment + val_desc; } diff --git a/tools/cabana/tests/test_cabana.cc b/tools/cabana/tests/test_cabana.cc index bf7550be0b..8b09fdac34 100644 --- a/tools/cabana/tests/test_cabana.cc +++ b/tools/cabana/tests/test_cabana.cc @@ -28,6 +28,23 @@ TEST_CASE("DBCFile::generateDBC") { } } +TEST_CASE("DBCFile::generateDBC - comment order") { + // Ensure that message comments are followed by signal comments and in the correct order + auto content = R"(BO_ 160 message_1: 8 EON + SG_ signal_1 : 0|12@1+ (1,0) [0|4095] "unit" XXX + +BO_ 162 message_2: 8 EON + SG_ signal_2 : 0|12@1+ (1,0) [0|4095] "unit" XXX + +CM_ BO_ 160 "message comment"; +CM_ SG_ 160 signal_1 "signal comment"; +CM_ BO_ 162 "message comment"; +CM_ SG_ 162 signal_2 "signal comment"; +)"; + DBCFile dbc("", content); + REQUIRE(dbc.generateDBC() == content); +} + TEST_CASE("parse_dbc") { QString content = R"( BO_ 160 message_1: 8 EON From 0b92f4e9ee59b9de7ef0895d6d35e06027d3891c Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Sun, 17 Mar 2024 19:53:57 -0400 Subject: [PATCH 072/384] more car info -> car docs (#31885) --- .github/workflows/selfdrive_tests.yaml | 4 +-- scripts/count_cars.py | 4 +-- selfdrive/car/CARS_template.md | 6 ++-- selfdrive/car/__init__.py | 2 +- selfdrive/car/docs.py | 36 +++++++++---------- selfdrive/car/ford/values.py | 14 ++++---- selfdrive/car/nissan/values.py | 2 +- selfdrive/car/tests/test_docs.py | 20 +++++------ .../{dump_car_info.py => dump_car_docs.py} | 8 ++--- selfdrive/debug/print_docs_diff.py | 34 +++++++++--------- .../examples/subaru_fuzzy_fingerprint.ipynb | 8 ++--- 11 files changed, 69 insertions(+), 69 deletions(-) rename selfdrive/debug/{dump_car_info.py => dump_car_docs.py} (64%) diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index ce7dd7413c..bfd2b82dc8 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -340,7 +340,7 @@ jobs: - uses: ./.github/workflows/setup-with-retry - name: Get base car info run: | - ${{ env.RUN }} "scons -j$(nproc) && python selfdrive/debug/dump_car_info.py --path /tmp/openpilot_cache/base_car_info" + ${{ env.RUN }} "scons -j$(nproc) && python selfdrive/debug/dump_car_docs.py --path /tmp/openpilot_cache/base_car_docs" sudo chown -R $USER:$USER ${{ github.workspace }} - uses: actions/checkout@v4 with: @@ -352,7 +352,7 @@ jobs: run: | cd current ${{ env.RUN }} "scons -j$(nproc)" - output=$(${{ env.RUN }} "python selfdrive/debug/print_docs_diff.py --path /tmp/openpilot_cache/base_car_info") + output=$(${{ env.RUN }} "python selfdrive/debug/print_docs_diff.py --path /tmp/openpilot_cache/base_car_docs") output="${output//$'\n'/'%0A'}" echo "::set-output name=diff::$output" - name: Find comment diff --git a/scripts/count_cars.py b/scripts/count_cars.py index 8c0892bb82..28057ddb04 100755 --- a/scripts/count_cars.py +++ b/scripts/count_cars.py @@ -2,10 +2,10 @@ from collections import Counter from pprint import pprint -from openpilot.selfdrive.car.docs import get_all_car_info +from openpilot.selfdrive.car.docs import get_all_car_docs if __name__ == "__main__": - cars = get_all_car_info() + cars = get_all_car_docs() make_count = Counter(l.make for l in cars) print("\n", "*" * 20, len(cars), "total", "*" * 20, "\n") pprint(make_count) diff --git a/selfdrive/car/CARS_template.md b/selfdrive/car/CARS_template.md index 73ddb02899..9f9f6c2638 100644 --- a/selfdrive/car/CARS_template.md +++ b/selfdrive/car/CARS_template.md @@ -12,12 +12,12 @@ A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. -# {{all_car_info | length}} Supported Cars +# {{all_car_docs | length}} Supported Cars |{{Column | map(attribute='value') | join('|') | replace(hardware_col_name, wide_hardware_col_name)}}| |---|---|---|{% for _ in range((Column | length) - 3) %}{{':---:|'}}{% endfor +%} -{% for car_info in all_car_info %} -|{% for column in Column %}{{car_info.get_column(column, star_icon, video_icon, footnote_tag)}}|{% endfor %} +{% for car_docs in all_car_docs %} +|{% for column in Column %}{{car_docs.get_column(column, star_icon, video_icon, footnote_tag)}}|{% endfor %} {% endfor %} diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 3c6d8b7996..106aedd2c6 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -262,7 +262,7 @@ class CarSpecs: @dataclass(order=True) class PlatformConfig(Freezable): platform_str: str - car_info: list[CarDocs] + car_docs: list[CarDocs] specs: CarSpecs dbc_dict: DbcDict diff --git a/selfdrive/car/docs.py b/selfdrive/car/docs.py index 4d0a1f45b2..7bf6a6ad22 100755 --- a/selfdrive/car/docs.py +++ b/selfdrive/car/docs.py @@ -25,43 +25,43 @@ CARS_MD_OUT = os.path.join(BASEDIR, "docs", "CARS.md") CARS_MD_TEMPLATE = os.path.join(BASEDIR, "selfdrive", "car", "CARS_template.md") -def get_all_car_info() -> list[CarDocs]: - all_car_info: list[CarDocs] = [] +def get_all_car_docs() -> list[CarDocs]: + all_car_docs: list[CarDocs] = [] footnotes = get_all_footnotes() for model, platform in PLATFORMS.items(): - car_info = platform.config.car_info + car_docs = platform.config.car_docs # If available, uses experimental longitudinal limits for the docs CP = interfaces[model][0].get_params(platform, fingerprint=gen_empty_fingerprint(), car_fw=[car.CarParams.CarFw(ecu="unknown")], experimental_long=True, docs=True) - if CP.dashcamOnly or not len(car_info): + if CP.dashcamOnly or not len(car_docs): continue # A platform can include multiple car models - for _car_info in car_info: - if not hasattr(_car_info, "row"): - _car_info.init_make(CP) - _car_info.init(CP, footnotes) - all_car_info.append(_car_info) + for _car_docs in car_docs: + if not hasattr(_car_docs, "row"): + _car_docs.init_make(CP) + _car_docs.init(CP, footnotes) + all_car_docs.append(_car_docs) # Sort cars by make and model + year - sorted_cars: list[CarDocs] = natsorted(all_car_info, key=lambda car: car.name.lower()) + sorted_cars: list[CarDocs] = natsorted(all_car_docs, key=lambda car: car.name.lower()) return sorted_cars -def group_by_make(all_car_info: list[CarDocs]) -> dict[str, list[CarDocs]]: - sorted_car_info = defaultdict(list) - for car_info in all_car_info: - sorted_car_info[car_info.make].append(car_info) - return dict(sorted_car_info) +def group_by_make(all_car_docs: list[CarDocs]) -> dict[str, list[CarDocs]]: + sorted_car_docs = defaultdict(list) + for car_docs in all_car_docs: + sorted_car_docs[car_docs.make].append(car_docs) + return dict(sorted_car_docs) -def generate_cars_md(all_car_info: list[CarDocs], template_fn: str) -> str: +def generate_cars_md(all_car_docs: list[CarDocs], template_fn: str) -> str: with open(template_fn) as f: template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True) footnotes = [fn.value.text for fn in get_all_footnotes()] - cars_md: str = template.render(all_car_info=all_car_info, PartType=PartType, + cars_md: str = template.render(all_car_docs=all_car_docs, PartType=PartType, group_by_make=group_by_make, footnotes=footnotes, Column=Column) return cars_md @@ -76,5 +76,5 @@ if __name__ == "__main__": args = parser.parse_args() with open(args.out, 'w') as f: - f.write(generate_cars_md(get_all_car_info(), args.template)) + f.write(generate_cars_md(get_all_car_docs(), args.template)) print(f"Generated and written to {args.out}") diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 917f50d6fd..eeafc47ae2 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -77,13 +77,13 @@ class FordPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', RADAR.DELPHI_MRR)) def init(self): - for car_info in list(self.car_info): - if car_info.hybrid: - name = f"{car_info.make} {car_info.model} Hybrid {car_info.years}" - self.car_info.append(replace(copy.deepcopy(car_info), name=name)) - if car_info.plug_in_hybrid: - name = f"{car_info.make} {car_info.model} Plug-in Hybrid {car_info.years}" - self.car_info.append(replace(copy.deepcopy(car_info), name=name)) + for car_docs in list(self.car_docs): + if car_docs.hybrid: + name = f"{car_docs.make} {car_docs.model} Hybrid {car_docs.years}" + self.car_docs.append(replace(copy.deepcopy(car_docs), name=name)) + if car_docs.plug_in_hybrid: + name = f"{car_docs.make} {car_docs.model} Plug-in Hybrid {car_docs.years}" + self.car_docs.append(replace(copy.deepcopy(car_docs), name=name)) @dataclass diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index f2123cad56..83e9bf0b46 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -50,7 +50,7 @@ class CAR(Platforms): ) # Leaf with ADAS ECU found behind instrument cluster instead of glovebox # Currently the only known difference between them is the inverted seatbelt signal. - LEAF_IC = LEAF.override(platform_str="NISSAN LEAF 2018 Instrument Cluster", car_info=[]) + LEAF_IC = LEAF.override(platform_str="NISSAN LEAF 2018 Instrument Cluster", car_docs=[]) ROGUE = NissanPlaformConfig( "NISSAN ROGUE 2019", [NissanCarDocs("Nissan Rogue 2018-20")], diff --git a/selfdrive/car/tests/test_docs.py b/selfdrive/car/tests/test_docs.py index f64effc437..7f88dba18b 100755 --- a/selfdrive/car/tests/test_docs.py +++ b/selfdrive/car/tests/test_docs.py @@ -6,18 +6,18 @@ import unittest from openpilot.common.basedir import BASEDIR from openpilot.selfdrive.car.car_helpers import interfaces -from openpilot.selfdrive.car.docs import CARS_MD_OUT, CARS_MD_TEMPLATE, generate_cars_md, get_all_car_info +from openpilot.selfdrive.car.docs import CARS_MD_OUT, CARS_MD_TEMPLATE, generate_cars_md, get_all_car_docs from openpilot.selfdrive.car.docs_definitions import Cable, Column, PartType, Star from openpilot.selfdrive.car.honda.values import CAR as HONDA from openpilot.selfdrive.car.values import PLATFORMS -from openpilot.selfdrive.debug.dump_car_info import dump_car_info -from openpilot.selfdrive.debug.print_docs_diff import print_car_info_diff +from openpilot.selfdrive.debug.dump_car_docs import dump_car_docs +from openpilot.selfdrive.debug.print_docs_diff import print_car_docs_diff class TestCarDocs(unittest.TestCase): @classmethod def setUpClass(cls): - cls.all_cars = get_all_car_info() + cls.all_cars = get_all_car_docs() def test_generator(self): generated_cars_md = generate_cars_md(self.all_cars, CARS_MD_TEMPLATE) @@ -29,24 +29,24 @@ class TestCarDocs(unittest.TestCase): def test_docs_diff(self): dump_path = os.path.join(BASEDIR, "selfdrive", "car", "tests", "cars_dump") - dump_car_info(dump_path) - print_car_info_diff(dump_path) + dump_car_docs(dump_path) + print_car_docs_diff(dump_path) os.remove(dump_path) def test_duplicate_years(self): make_model_years = defaultdict(list) for car in self.all_cars: - with self.subTest(car_info_name=car.name): + with self.subTest(car_docs_name=car.name): make_model = (car.make, car.model) for year in car.year_list: self.assertNotIn(year, make_model_years[make_model], f"{car.name}: Duplicate model year") make_model_years[make_model].append(year) - def test_missing_car_info(self): - all_car_info_platforms = [name for name, config in PLATFORMS.items()] + def test_missing_car_docs(self): + all_car_docs_platforms = [name for name, config in PLATFORMS.items()] for platform in sorted(interfaces.keys()): with self.subTest(platform=platform): - self.assertTrue(platform in all_car_info_platforms, f"Platform: {platform} doesn't have a CarDocs entry") + self.assertTrue(platform in all_car_docs_platforms, f"Platform: {platform} doesn't have a CarDocs entry") def test_naming_conventions(self): # Asserts market-standard car naming conventions by brand diff --git a/selfdrive/debug/dump_car_info.py b/selfdrive/debug/dump_car_docs.py similarity index 64% rename from selfdrive/debug/dump_car_info.py rename to selfdrive/debug/dump_car_docs.py index 6af328926b..f09c602cff 100755 --- a/selfdrive/debug/dump_car_info.py +++ b/selfdrive/debug/dump_car_docs.py @@ -2,12 +2,12 @@ import argparse import pickle -from openpilot.selfdrive.car.docs import get_all_car_info +from openpilot.selfdrive.car.docs import get_all_car_docs -def dump_car_info(path): +def dump_car_docs(path): with open(path, 'wb') as f: - pickle.dump(get_all_car_info(), f) + pickle.dump(get_all_car_docs(), f) print(f'Dumping car info to {path}') @@ -15,4 +15,4 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--path", required=True) args = parser.parse_args() - dump_car_info(args.path) + dump_car_docs(args.path) diff --git a/selfdrive/debug/print_docs_diff.py b/selfdrive/debug/print_docs_diff.py index 3d35532496..7ef89a6eca 100755 --- a/selfdrive/debug/print_docs_diff.py +++ b/selfdrive/debug/print_docs_diff.py @@ -4,7 +4,7 @@ from collections import defaultdict import difflib import pickle -from openpilot.selfdrive.car.docs import get_all_car_info +from openpilot.selfdrive.car.docs import get_all_car_docs from openpilot.selfdrive.car.docs_definitions import Column FOOTNOTE_TAG = "{}" @@ -17,7 +17,7 @@ COLUMN_HEADER = "|---|---|---|{}|".format("|".join([":---:"] * (len(Column) - 3) ARROW_SYMBOL = "➡️" -def load_base_car_info(path): +def load_base_car_docs(path): with open(path, "rb") as f: return pickle.load(f) @@ -57,31 +57,31 @@ def format_row(builder): return "|" + "|".join(builder) + "|" -def print_car_info_diff(path): - base_car_info = defaultdict(list) - new_car_info = defaultdict(list) +def print_car_docs_diff(path): + base_car_docs = defaultdict(list) + new_car_docs = defaultdict(list) - for car in load_base_car_info(path): - base_car_info[car.car_fingerprint].append(car) - for car in get_all_car_info(): - new_car_info[car.car_fingerprint].append(car) + for car in load_base_car_docs(path): + base_car_docs[car.car_fingerprint].append(car) + for car in get_all_car_docs(): + new_car_docs[car.car_fingerprint].append(car) # Add new platforms to base cars so we can detect additions and removals in one pass - base_car_info.update({car: [] for car in new_car_info if car not in base_car_info}) + base_car_docs.update({car: [] for car in new_car_docs if car not in base_car_docs}) changes = defaultdict(list) - for base_car_model, base_cars in base_car_info.items(): + for base_car_model, base_cars in base_car_docs.items(): # Match car info changes, and get additions and removals - new_cars = new_car_info[base_car_model] + new_cars = new_car_docs[base_car_model] car_changes, car_additions, car_removals = match_cars(base_cars, new_cars) # Removals - for car_info in car_removals: - changes["removals"].append(format_row([car_info.get_column(column, STAR_ICON, VIDEO_ICON, FOOTNOTE_TAG) for column in Column])) + for car_docs in car_removals: + changes["removals"].append(format_row([car_docs.get_column(column, STAR_ICON, VIDEO_ICON, FOOTNOTE_TAG) for column in Column])) # Additions - for car_info in car_additions: - changes["additions"].append(format_row([car_info.get_column(column, STAR_ICON, VIDEO_ICON, FOOTNOTE_TAG) for column in Column])) + for car_docs in car_additions: + changes["additions"].append(format_row([car_docs.get_column(column, STAR_ICON, VIDEO_ICON, FOOTNOTE_TAG) for column in Column])) for new_car, base_car in car_changes: # Column changes @@ -117,4 +117,4 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--path", required=True) args = parser.parse_args() - print_car_info_diff(args.path) + print_car_docs_diff(args.path) diff --git a/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb b/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb index dd223667d8..9376f6a253 100644 --- a/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb +++ b/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb @@ -146,10 +146,10 @@ ], "source": [ "def test_year_code(platform, year):\n", - " car_info = CAR(platform).config.car_info\n", - " if isinstance(car_info, list):\n", - " car_info = car_info[0]\n", - " years = [int(y) for y in car_info.year_list]\n", + " car_docs = CAR(platform).config.car_docs\n", + " if isinstance(car_docs, list):\n", + " car_docs = car_docs[0]\n", + " years = [int(y) for y in car_docs.year_list]\n", " correct_year = year in years\n", " print(f\"{correct_year=!s: <6} {platform=: <32} {year=: <5} {years=}\")\n", "\n", From b122725a680f7c06a2396941ead1fdfe60143c77 Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Sun, 17 Mar 2024 17:33:47 -0700 Subject: [PATCH 073/384] Remove duplicate TimezoneFinder declaration (#31901) --- system/timed.py | 1 - 1 file changed, 1 deletion(-) diff --git a/system/timed.py b/system/timed.py index 39acb2ba12..ab82f8c72d 100755 --- a/system/timed.py +++ b/system/timed.py @@ -56,7 +56,6 @@ def main() -> NoReturn: """ params = Params() - tf = TimezoneFinder() # Restore timezone from param tz = params.get("Timezone", encoding='utf8') From e79cb0edaf88bde8ebdf1b0ac1b6fb5c6b5122d3 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 18 Mar 2024 12:55:27 +0800 Subject: [PATCH 074/384] replay: fix segfault in `Replay::queueSegment` (#31902) --- tools/replay/replay.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index 9657375be7..70b3f380e1 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -225,7 +225,7 @@ void Replay::queueSegment() { if (cur == segments_.end()) return; auto begin = std::prev(cur, std::min(segment_cache_limit / 2, std::distance(segments_.begin(), cur))); - auto end = std::next(begin, std::min(segment_cache_limit, segments_.size())); + auto end = std::next(begin, std::min(segment_cache_limit, std::distance(begin, segments_.end()))); // load one segment at a time auto it = std::find_if(cur, end, [](auto &it) { return !it.second || !it.second->isLoaded(); }); if (it != end && !it->second) { From e3afa373aa389826ff2a15673561a4191ca9deed Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 17 Mar 2024 22:16:16 -0700 Subject: [PATCH 075/384] Update RELEASES.md --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index 4ec4c4fad5..2af124d4e6 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,6 +1,7 @@ Version 0.9.7 (2024-XX-XX) ======================== * New driving model +* Adjust driving personality with the follow distance button * Support for hybrid variants of supported Ford models Version 0.9.6 (2024-02-27) From fa12a6722868d436f15bea31537df1277bcc4027 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 17 Mar 2024 22:42:49 -0700 Subject: [PATCH 076/384] remove pedal (#31903) * remove pedal * bump panda * fix * update refs --- panda | 2 +- selfdrive/car/__init__.py | 21 --------------- selfdrive/car/honda/carcontroller.py | 20 ++------------- selfdrive/car/honda/carstate.py | 13 ++-------- selfdrive/car/honda/interface.py | 10 ++------ selfdrive/car/tests/routes.py | 2 -- selfdrive/car/tests/test_car_interfaces.py | 4 --- selfdrive/car/toyota/carcontroller.py | 30 +++------------------- selfdrive/car/toyota/carstate.py | 12 ++------- selfdrive/car/toyota/interface.py | 10 +++----- selfdrive/controls/lib/longcontrol.py | 2 -- selfdrive/test/process_replay/migration.py | 2 +- selfdrive/test/process_replay/ref_commit | 2 +- tools/sim/lib/simulated_car.py | 3 +-- 14 files changed, 19 insertions(+), 114 deletions(-) diff --git a/panda b/panda index 895a7001c9..aa1a355536 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 895a7001c9d21ac7c4ace65debe70dfaee017443 +Subproject commit aa1a35553667db2825cee392e6b082966238343c diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 106aedd2c6..45da5a8b92 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -179,27 +179,6 @@ def crc8_pedal(data): return crc -def create_gas_interceptor_command(packer, gas_amount, idx): - # Common gas pedal msg generator - enable = gas_amount > 0.001 - - values = { - "ENABLE": enable, - "COUNTER_PEDAL": idx & 0xF, - } - - if enable: - values["GAS_COMMAND"] = gas_amount * 255. - values["GAS_COMMAND2"] = gas_amount * 255. - - dat = packer.make_can_msg("GAS_COMMAND", 0, values)[2] - - checksum = crc8_pedal(dat[:-1]) - values["CHECKSUM_PEDAL"] = checksum - - return packer.make_can_msg("GAS_COMMAND", 0, values) - - def make_can_msg(addr, dat, bus): return [addr, 0, dat, bus] diff --git a/selfdrive/car/honda/carcontroller.py b/selfdrive/car/honda/carcontroller.py index 00cc54dcb3..6fe8c27585 100644 --- a/selfdrive/car/honda/carcontroller.py +++ b/selfdrive/car/honda/carcontroller.py @@ -4,7 +4,6 @@ from cereal import car from openpilot.common.numpy_fast import clip, interp from openpilot.common.realtime import DT_CTRL from opendbc.can.packer import CANPacker -from openpilot.selfdrive.car import create_gas_interceptor_command 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 @@ -183,7 +182,7 @@ class CarController(CarControllerBase): 0.5] # The Honda ODYSSEY seems to have different PCM_ACCEL # msgs, is it other cars too? - if self.CP.enableGasInterceptor or not CC.longActive: + if not CC.longActive: pcm_speed = 0.0 pcm_accel = int(0.0) elif self.CP.carFingerprint in HONDA_NIDEC_ALT_PCM_ACCEL: @@ -235,19 +234,6 @@ class CarController(CarControllerBase): self.apply_brake_last = apply_brake self.brake = apply_brake / self.params.NIDEC_BRAKE_MAX - if self.CP.enableGasInterceptor: - # way too aggressive at low speed without this - gas_mult = interp(CS.out.vEgo, [0., 10.], [0.4, 1.0]) - # send exactly zero if apply_gas is zero. Interceptor will send the max between read value and apply_gas. - # This prevents unexpected pedal range rescaling - # Sending non-zero gas when OP is not enabled will cause the PCM not to respond to throttle as expected - # when you do enable. - if CC.longActive: - self.gas = clip(gas_mult * (gas - brake + wind_brake * 3 / 4), 0., 1.) - else: - self.gas = 0.0 - can_sends.append(create_gas_interceptor_command(self.packer, self.gas, self.frame // 2)) - # Send dashboard UI commands. if self.frame % 10 == 0: hud = HUDData(int(pcm_accel), int(round(hud_v_cruise)), hud_control.leadVisible, @@ -256,9 +242,7 @@ class CarController(CarControllerBase): if self.CP.openpilotLongitudinalControl and self.CP.carFingerprint not in HONDA_BOSCH: self.speed = pcm_speed - - if not self.CP.enableGasInterceptor: - self.gas = pcm_accel / self.params.NIDEC_GAS_MAX + self.gas = pcm_accel / self.params.NIDEC_GAS_MAX new_actuators = actuators.copy() new_actuators.speed = self.speed diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py index d429da33fb..976511f113 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -72,10 +72,6 @@ def get_can_messages(CP, gearbox_msg): else: messages.append(("DOORS_STATUS", 3)) - # add gas interceptor reading if we are using it - if CP.enableGasInterceptor: - messages.append(("GAS_SENSOR", 50)) - if CP.carFingerprint in HONDA_BOSCH_RADARLESS: messages.append(("CRUISE_FAULT_STATUS", 50)) elif CP.openpilotLongitudinalControl: @@ -191,13 +187,8 @@ class CarState(CarStateBase): gear = int(cp.vl[self.gearbox_msg]["GEAR_SHIFTER"]) ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear, None)) - if self.CP.enableGasInterceptor: - # Same threshold as panda, equivalent to 1e-5 with previous DBC scaling - ret.gas = (cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS"] + cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS2"]) // 2 - ret.gasPressed = ret.gas > 492 - else: - ret.gas = cp.vl["POWERTRAIN_DATA"]["PEDAL_GAS"] - ret.gasPressed = ret.gas > 1e-5 + ret.gas = cp.vl["POWERTRAIN_DATA"]["PEDAL_GAS"] + ret.gasPressed = ret.gas > 1e-5 ret.steeringTorque = cp.vl["STEER_STATUS"]["STEER_TORQUE_SENSOR"] ret.steeringTorqueEps = cp.vl["STEER_MOTOR_TORQUE"]["MOTOR_TORQUE"] diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index d316626a94..812b60d479 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -24,8 +24,6 @@ class CarInterface(CarInterfaceBase): def get_pid_accel_limits(CP, current_speed, cruise_speed): if CP.carFingerprint in HONDA_BOSCH: return CarControllerParams.BOSCH_ACCEL_MIN, CarControllerParams.BOSCH_ACCEL_MAX - elif CP.enableGasInterceptor: - return CarControllerParams.NIDEC_ACCEL_MIN, CarControllerParams.NIDEC_ACCEL_MAX else: # NIDECs don't allow acceleration near cruise_speed, # so limit limits of pid to prevent windup @@ -50,10 +48,9 @@ class CarInterface(CarInterfaceBase): ret.pcmCruise = not ret.openpilotLongitudinalControl else: ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hondaNidec)] - ret.enableGasInterceptor = 0x201 in fingerprint[CAN.pt] ret.openpilotLongitudinalControl = True - ret.pcmCruise = not ret.enableGasInterceptor + ret.pcmCruise = True if candidate == CAR.CRV_5G: ret.enableBsm = 0x12f8bfa7 in fingerprint[CAN.radar] @@ -209,16 +206,13 @@ class CarInterface(CarInterfaceBase): if ret.openpilotLongitudinalControl and candidate in HONDA_BOSCH: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_BOSCH_LONG - if ret.enableGasInterceptor and candidate not in HONDA_BOSCH: - ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_GAS_INTERCEPTOR - if candidate in HONDA_BOSCH_RADARLESS: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_RADARLESS # min speed to enable ACC. if car can do stop and go, then set enabling speed # to a negative value, so it won't matter. Otherwise, add 0.5 mph margin to not # conflict with PCM acc - ret.autoResumeSng = candidate in (HONDA_BOSCH | {CAR.CIVIC}) or ret.enableGasInterceptor + ret.autoResumeSng = candidate in (HONDA_BOSCH | {CAR.CIVIC}) ret.minEnableSpeed = -1. if ret.autoResumeSng else 25.5 * CV.MPH_TO_MS ret.steerActuatorDelay = 0.1 diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 265f052b16..48ae36ffcc 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -293,8 +293,6 @@ routes = [ CarTestRoute("66c1699b7697267d/2024-03-03--13-09-53", TESLA.MODELS_RAVEN), # Segments that test specific issues - # Controls mismatch due to interceptor threshold - CarTestRoute("cfb32f0fb91b173b|2022-04-06--14-54-45", HONDA.CIVIC, segment=21), # Controls mismatch due to standstill threshold CarTestRoute("bec2dcfde6a64235|2022-04-08--14-21-32", HONDA.CRV_HYBRID, segment=22), ] diff --git a/selfdrive/car/tests/test_car_interfaces.py b/selfdrive/car/tests/test_car_interfaces.py index 02a8d60e3c..72c1e27ab9 100755 --- a/selfdrive/car/tests/test_car_interfaces.py +++ b/selfdrive/car/tests/test_car_interfaces.py @@ -74,10 +74,6 @@ class TestCarInterfaces(unittest.TestCase): self.assertEqual(len(car_params.longitudinalTuning.kiV), len(car_params.longitudinalTuning.kiBP)) self.assertEqual(len(car_params.longitudinalTuning.deadzoneV), len(car_params.longitudinalTuning.deadzoneBP)) - # If we're using the interceptor for gasPressed, we should be commanding gas with it - if car_params.enableGasInterceptor: - self.assertTrue(car_params.openpilotLongitudinalControl) - # Lateral sanity checks if car_params.steerControlType != car.CarParams.SteerControlType.angle: tune = car_params.lateralTuning diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index 71a595996d..2bb3fc3c34 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -1,11 +1,10 @@ from cereal import car -from openpilot.common.numpy_fast import clip, interp -from openpilot.selfdrive.car import apply_meas_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance, \ - create_gas_interceptor_command, make_can_msg +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.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, \ - MIN_ACC_SPEED, PEDAL_TRANSITION, CarControllerParams, ToyotaFlags, \ + CarControllerParams, ToyotaFlags, \ UNSUPPORTED_DSU_CAR from opendbc.can.packer import CANPacker @@ -101,21 +100,6 @@ class CarController(CarControllerBase): lta_active, self.frame // 2, torque_wind_down)) # *** gas and brake *** - if self.CP.enableGasInterceptor and CC.longActive: - MAX_INTERCEPTOR_GAS = 0.5 - # RAV4 has very sensitive gas pedal - if self.CP.carFingerprint in (CAR.RAV4, CAR.RAV4H, CAR.HIGHLANDER): - PEDAL_SCALE = interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_TRANSITION], [0.15, 0.3, 0.0]) - elif self.CP.carFingerprint in (CAR.COROLLA,): - PEDAL_SCALE = interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_TRANSITION], [0.3, 0.4, 0.0]) - else: - PEDAL_SCALE = interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_TRANSITION], [0.4, 0.5, 0.0]) - # offset for creep and windbrake - pedal_offset = interp(CS.out.vEgo, [0.0, 2.3, MIN_ACC_SPEED + PEDAL_TRANSITION], [-.4, 0.0, 0.2]) - pedal_command = PEDAL_SCALE * (actuators.accel + pedal_offset) - interceptor_gas_cmd = clip(pedal_command, 0., MAX_INTERCEPTOR_GAS) - else: - interceptor_gas_cmd = 0. pcm_accel_cmd = clip(actuators.accel, self.params.ACCEL_MIN, self.params.ACCEL_MAX) # TODO: probably can delete this. CS.pcm_acc_status uses a different signal @@ -124,7 +108,7 @@ class CarController(CarControllerBase): pcm_cancel_cmd = 1 # on entering standstill, send standstill request - if CS.out.standstill and not self.last_standstill and (self.CP.carFingerprint not in NO_STOP_TIMER_CAR or self.CP.enableGasInterceptor): + if CS.out.standstill and not self.last_standstill and (self.CP.carFingerprint not in NO_STOP_TIMER_CAR): self.standstill_req = True if CS.pcm_acc_status != 8: # pcm entered standstill or it's disabled @@ -158,12 +142,6 @@ class CarController(CarControllerBase): else: can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, False, lead, CS.acc_type, False, self.distance_button)) - if self.frame % 2 == 0 and self.CP.enableGasInterceptor and self.CP.openpilotLongitudinalControl: - # send exactly zero if gas cmd is zero. Interceptor will send the max between read value and gas cmd. - # This prevents unexpected pedal range rescaling - can_sends.append(create_gas_interceptor_command(self.packer, interceptor_gas_cmd, self.frame // 2)) - self.gas = interceptor_gas_cmd - # *** hud ui *** if self.CP.carFingerprint != CAR.PRIUS_V: # ui mesg is at 1Hz but we send asap if: diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 5d99467f25..8a20c57196 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -59,12 +59,8 @@ class CarState(CarStateBase): ret.brakePressed = cp.vl["BRAKE_MODULE"]["BRAKE_PRESSED"] != 0 ret.brakeHoldActive = cp.vl["ESP_CONTROL"]["BRAKE_HOLD_ACTIVE"] == 1 - if self.CP.enableGasInterceptor: - ret.gas = (cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS"] + cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS2"]) // 2 - ret.gasPressed = ret.gas > 805 - else: - # TODO: find a common gas pedal percentage signal - ret.gasPressed = cp.vl["PCM_CRUISE"]["GAS_RELEASED"] == 0 + + ret.gasPressed = cp.vl["PCM_CRUISE"]["GAS_RELEASED"] == 0 ret.wheelSpeeds = self.get_wheel_speeds( cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_FL"], @@ -208,10 +204,6 @@ class CarState(CarStateBase): else: messages.append(("PCM_CRUISE_2", 33)) - # add gas interceptor reading if we are using it - if CP.enableGasInterceptor: - messages.append(("GAS_SENSOR", 50)) - if CP.enableBsm: messages.append(("BSM", 1)) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 7ad9feed3d..3683e7d049 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -133,22 +133,18 @@ class CarInterface(CarInterfaceBase): # - TSS-P DSU-less cars w/ CAN filter installed (no radar parser yet) ret.openpilotLongitudinalControl = use_sdsu or ret.enableDsu or candidate in (TSS2_CAR - RADAR_ACC_CAR) or bool(ret.flags & ToyotaFlags.DISABLE_RADAR.value) ret.autoResumeSng = ret.openpilotLongitudinalControl and candidate in NO_STOP_TIMER_CAR - ret.enableGasInterceptor = 0x201 in fingerprint[0] and ret.openpilotLongitudinalControl if not ret.openpilotLongitudinalControl: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_TOYOTA_STOCK_LONGITUDINAL - if ret.enableGasInterceptor: - ret.safetyConfigs[0].safetyParam |= Panda.FLAG_TOYOTA_GAS_INTERCEPTOR - # min speed to enable ACC. if car can do stop and go, then set enabling speed # to a negative value, so it won't matter. - ret.minEnableSpeed = -1. if (stop_and_go or ret.enableGasInterceptor) else MIN_ACC_SPEED + ret.minEnableSpeed = -1. if stop_and_go else MIN_ACC_SPEED tune = ret.longitudinalTuning tune.deadzoneBP = [0., 9.] tune.deadzoneV = [.0, .15] - if candidate in TSS2_CAR or ret.enableGasInterceptor: + if candidate in TSS2_CAR: tune.kpBP = [0., 5., 20.] tune.kpV = [1.3, 1.0, 0.7] tune.kiBP = [0., 5., 12., 20., 27.] @@ -188,7 +184,7 @@ class CarInterface(CarInterfaceBase): events.add(EventName.vehicleSensorsInvalid) if self.CP.openpilotLongitudinalControl: - if ret.cruiseState.standstill and not ret.brakePressed and not self.CP.enableGasInterceptor: + if ret.cruiseState.standstill and not ret.brakePressed: events.add(EventName.resumeRequired) if self.CS.low_speed_lockout: events.add(EventName.lowSpeedLockout) diff --git a/selfdrive/controls/lib/longcontrol.py b/selfdrive/controls/lib/longcontrol.py index ee65c4a69e..2dd3390bb0 100644 --- a/selfdrive/controls/lib/longcontrol.py +++ b/selfdrive/controls/lib/longcontrol.py @@ -10,8 +10,6 @@ LongCtrlState = car.CarControl.Actuators.LongControlState def long_control_state_trans(CP, active, long_control_state, v_ego, v_target, v_target_1sec, brake_pressed, cruise_standstill): - # Ignore cruise standstill if car has a gas interceptor - cruise_standstill = cruise_standstill and not CP.enableGasInterceptor accelerating = v_target_1sec > v_target planned_stop = (v_target < CP.vEgoStopping and v_target_1sec < CP.vEgoStopping and diff --git a/selfdrive/test/process_replay/migration.py b/selfdrive/test/process_replay/migration.py index afcf705ff9..099513a753 100644 --- a/selfdrive/test/process_replay/migration.py +++ b/selfdrive/test/process_replay/migration.py @@ -73,7 +73,7 @@ def migrate_pandaStates(lr): # TODO: safety param migration should be handled automatically safety_param_migration = { "TOYOTA PRIUS 2017": EPS_SCALE["TOYOTA PRIUS 2017"] | Panda.FLAG_TOYOTA_STOCK_LONGITUDINAL, - "TOYOTA RAV4 2017": EPS_SCALE["TOYOTA RAV4 2017"] | Panda.FLAG_TOYOTA_ALT_BRAKE | Panda.FLAG_TOYOTA_GAS_INTERCEPTOR, + "TOYOTA RAV4 2017": EPS_SCALE["TOYOTA RAV4 2017"] | Panda.FLAG_TOYOTA_ALT_BRAKE, "KIA EV6 2022": Panda.FLAG_HYUNDAI_EV_GAS | Panda.FLAG_HYUNDAI_CANFD_HDA2, } diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index cb904630df..dd3d530f70 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -d544804a4fb54c0f160682b8f14af316a8383cd8 \ No newline at end of file +e29856a02cca7ab76461b2cc0acd25826a894667 \ No newline at end of file diff --git a/tools/sim/lib/simulated_car.py b/tools/sim/lib/simulated_car.py index f6319dd819..9148d0ddb2 100644 --- a/tools/sim/lib/simulated_car.py +++ b/tools/sim/lib/simulated_car.py @@ -6,7 +6,6 @@ from openpilot.common.params import Params from openpilot.selfdrive.boardd.boardd_api_impl import can_list_to_can_capnp from openpilot.selfdrive.car import crc8_pedal from openpilot.tools.sim.lib.common import SimulatorState -from panda.python import Panda class SimulatedCar: @@ -116,7 +115,7 @@ class SimulatedCar: 'controlsAllowed': True, 'safetyModel': 'hondaNidec', 'alternativeExperience': self.sm["carParams"].alternativeExperience, - 'safetyParam': Panda.FLAG_HONDA_GAS_INTERCEPTOR + 'safetyParam': 0, } self.pm.send('pandaStates', dat) From aca566bd6a7c1eb094361cb046635e7ee55dcbcc Mon Sep 17 00:00:00 2001 From: YassineYousfi Date: Mon, 18 Mar 2024 09:08:41 -0700 Subject: [PATCH 077/384] bump panda (#31908) --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index aa1a355536..567dbfe6d8 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit aa1a35553667db2825cee392e6b082966238343c +Subproject commit 567dbfe6d86ddda6d803da371942603c6dbe36c8 From 881b38d061e6ae516a6069e216725a228591ddf6 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 18 Mar 2024 09:56:37 -0700 Subject: [PATCH 078/384] [bot] Update Python packages and pre-commit hooks (#31906) Update Python packages and pre-commit hooks Co-authored-by: jnewb1 --- .pre-commit-config.yaml | 2 +- poetry.lock | 2775 ++++++++++++++++++++------------------- 2 files changed, 1398 insertions(+), 1379 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 55e6b1e282..1d152fee2a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: - -L bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints - --builtins clear,rare,informal,usage,code,names,en-GB_to_en-US - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.2 + rev: v0.3.3 hooks: - id: ruff exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' diff --git a/poetry.lock b/poetry.lock index e8ea5e80fe..c2e0baad9c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -112,34 +112,34 @@ ifaddr = ">=0.2.0" [[package]] name = "aiortc" -version = "1.7.0" +version = "1.8.0" description = "An implementation of WebRTC and ORTC" optional = false python-versions = ">=3.8" files = [ - {file = "aiortc-1.7.0-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aba47eac61ee7fb7e89876f40e4132aa66a13ed2a730dff003342e57219f34c0"}, - {file = "aiortc-1.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:169abaaa0c11a1695942b3eeea9d9032ea4992c6e84958c1b31c6ba22fcf4b0e"}, - {file = "aiortc-1.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5323a347d02d53989e61944eead19e550d930afbb872dd0fb51b3d065aaa833"}, - {file = "aiortc-1.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71c18762ebfeb239352705672e598c57f0e56e5c1b7955dba27651c801c56ea2"}, - {file = "aiortc-1.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:817526c2e429a1ef1226ca9cdb4ff3c5d03857eb31de0f5a00433dc4cb5569f3"}, - {file = "aiortc-1.7.0-cp38-abi3-win32.whl", hash = "sha256:a63c4da5c4a9d96ef6e3948c1f4675e02b0b908605eff4cea8b5e2fa5a34da4e"}, - {file = "aiortc-1.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:e60f19f810a552690bf6e969429c624df39af2b5079ee0d95fb75d110b978e20"}, - {file = "aiortc-1.7.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7407d7065cbc649adf866927c007d84f94eeb3fcaa65f44eb94def8c2c5bbca"}, - {file = "aiortc-1.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35e1dce2697762841dd3cc5a6e23ef8a0d96207e3fd33b834b5a8686748f6143"}, - {file = "aiortc-1.7.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f77cc2d757d7c3c37c6157cce36fe13fc161c5cb5aea62759c8b0d3e6d7f45f9"}, - {file = "aiortc-1.7.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80465daa66f89e4fd22b6afd3a6ae71ffd506343cf30025dbc36eb5453f95330"}, - {file = "aiortc-1.7.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8fcf352df6fabad32fd337dc51b629060de80d06987a8544c3c842ecc04254f8"}, - {file = "aiortc-1.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b1427673e3ef8889dbd1c4f05d3d2aa7895cbfdc985532d54892ad6f96fc08c"}, - {file = "aiortc-1.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec2d018bd01c7532188be5842e11de252a1346156880ff3387d4f879c9f163d2"}, - {file = "aiortc-1.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f21e0024c0c7b07fec87e1ffcc30b6dbd57d1b822324d9c0128731388a82f08"}, - {file = "aiortc-1.7.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd267c338bd6578b46fb8f664418f9a48ad5d1582895eb029b4c5087e105fc89"}, - {file = "aiortc-1.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:919b6edbc1e462cb00e313d44368798066c3ebe81525ec6fb6008e0cad572c97"}, - {file = "aiortc-1.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:573314501d4aa2ef5e8826abe7e675742c92d25908f5f6b48ea2f5fababdfb4b"}, - {file = "aiortc-1.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:791f525577033572ee937853159cff2c63121d1e30d9c93df4ef3a4c94eec5ec"}, - {file = "aiortc-1.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52e945b2ba536e4e78c106e6c923f73b1838bf0c35592d729ea9b3ba6791b108"}, - {file = "aiortc-1.7.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89a8aef4067c68ccbc97872d506b9b80d5ed39e0cc41a46d641b66c518e00240"}, - {file = "aiortc-1.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0b7248716706c52e3bc1f21a89a1a9ca205e95a74c0b4aa4b2863d2162fd2552"}, - {file = "aiortc-1.7.0.tar.gz", hash = "sha256:4fd900797b419a9189443b7c95a2ce4bf5aa0d9542d8d19edfabf30aa5fbc296"}, + {file = "aiortc-1.8.0-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ac0bc48c9f98a744f6696be287b0403648deb3e20bd7f8fa91eb841e1c6c4e8d"}, + {file = "aiortc-1.8.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:639afa23b7d5c6f7d4f3f7af5fadb9cc67c82d56e17840b4433d2e5f73958bb5"}, + {file = "aiortc-1.8.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:173dcfa6f0e989f65eb9d38f151d8834677df0f696f9f4ad925ee9795e914eaf"}, + {file = "aiortc-1.8.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b453def215c246486747e8ba5c1307a538071d6bfbb2a4e74ebfef583771a429"}, + {file = "aiortc-1.8.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22efeb53dab9eb58a1a6c2dcdeb72ae526de0a2b30334fc40782341df92a657d"}, + {file = "aiortc-1.8.0-cp38-abi3-win32.whl", hash = "sha256:4ec0c5c284c3345a9d994253ced4ad909acf9e375271a7ff01db165b09890ce8"}, + {file = "aiortc-1.8.0-cp38-abi3-win_amd64.whl", hash = "sha256:76454c55a59441a76f6ab7cd1218454389520d6a3cc9b0d13d428f6a3f2ebbcc"}, + {file = "aiortc-1.8.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b0eb1342595e386befcad56cd0f91cd5cd16daa7612ffc5c8abf7e5b58e529f5"}, + {file = "aiortc-1.8.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cbbdf78ac55e05d838fe4de326ed095ca6df1cd10d571958d2ef8f23792203b"}, + {file = "aiortc-1.8.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bb565acb623474d8052926f2ee768dbf1f87a71d271df78482319c0bec7c817"}, + {file = "aiortc-1.8.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd50def722eb6b999ebc831eca7bea79019d2eda71dc79f4219a9ab19d65c961"}, + {file = "aiortc-1.8.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4054f42f9ef875c67e38c0e86532e85e7ba528957052bc3d99e7c7caf273c456"}, + {file = "aiortc-1.8.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ef40f132262a670169121b888a448e1973e892f1ed8a5f5980ab05a12ee78a32"}, + {file = "aiortc-1.8.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53d9f999104a2438c0c23f2cbc991c5e15e46c0fe71476d60c222b62e4c5a70"}, + {file = "aiortc-1.8.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a1ef2e0d657aaca42106558c7c8d6e84c7088d0b70bc1fe3f93c555c242e38"}, + {file = "aiortc-1.8.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:454012e08c9ef5027c2543d4e97b6f1323ce027ec395202478a7e431b2519c5b"}, + {file = "aiortc-1.8.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09dd2fad7a52f8fc66c86cdd2dd4d281b9815afd996e41301dd2706ccd57438a"}, + {file = "aiortc-1.8.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d669b635bbd8cf76fce63d3ceb83da5b219cea8bae4b566233f68618e69446cb"}, + {file = "aiortc-1.8.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ccc4da8821e7ecdd2179bc5eb7fd5f12e50db8fc6affdbc8baa55f3f14dd377"}, + {file = "aiortc-1.8.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29ba65bcb4c4cd1b25109d1e7ee5cf303654b757a3b7b59a28e162953e5f6c36"}, + {file = "aiortc-1.8.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1be4571e70e15b443f5b9ae651e24ac9dafb8b9abc1cdeb14e5f4bf028639944"}, + {file = "aiortc-1.8.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2e20fe3cb4a8b6db4f5e8f625ff1eb9dafc67b7c0c9a0cb9969b646570aebd34"}, + {file = "aiortc-1.8.0.tar.gz", hash = "sha256:2363c08d1d2cb3aaed563c1fb256f5dae9f3ba75b70ad5e5df6d448504122591"}, ] [package.dependencies] @@ -751,63 +751,63 @@ test = ["pytest", "pytest-timeout"] [[package]] name = "coverage" -version = "7.4.3" +version = "7.4.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6"}, - {file = "coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4"}, - {file = "coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524"}, - {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d"}, - {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb"}, - {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0"}, - {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc"}, - {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2"}, - {file = "coverage-7.4.3-cp310-cp310-win32.whl", hash = "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94"}, - {file = "coverage-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0"}, - {file = "coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47"}, - {file = "coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113"}, - {file = "coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe"}, - {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc"}, - {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3"}, - {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba"}, - {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079"}, - {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840"}, - {file = "coverage-7.4.3-cp311-cp311-win32.whl", hash = "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3"}, - {file = "coverage-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e"}, - {file = "coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10"}, - {file = "coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328"}, - {file = "coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30"}, - {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7"}, - {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e"}, - {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003"}, - {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d"}, - {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a"}, - {file = "coverage-7.4.3-cp312-cp312-win32.whl", hash = "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352"}, - {file = "coverage-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914"}, - {file = "coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454"}, - {file = "coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e"}, - {file = "coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2"}, - {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e"}, - {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6"}, - {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c"}, - {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0"}, - {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1"}, - {file = "coverage-7.4.3-cp38-cp38-win32.whl", hash = "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f"}, - {file = "coverage-7.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9"}, - {file = "coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f"}, - {file = "coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c"}, - {file = "coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e"}, - {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765"}, - {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee"}, - {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501"}, - {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f"}, - {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45"}, - {file = "coverage-7.4.3-cp39-cp39-win32.whl", hash = "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9"}, - {file = "coverage-7.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa"}, - {file = "coverage-7.4.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51"}, - {file = "coverage-7.4.3.tar.gz", hash = "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.extras] @@ -1108,13 +1108,13 @@ test = ["fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] [[package]] name = "flaky" -version = "3.8.0" +version = "3.8.1" description = "Plugin for pytest that automatically reruns flaky tests." optional = false python-versions = ">=3.5" files = [ - {file = "flaky-3.8.0-py2.py3-none-any.whl", hash = "sha256:06152dc0582c18e2cc3d241feece008c074b17e1292658cb39ff8464ae19bd89"}, - {file = "flaky-3.8.0.tar.gz", hash = "sha256:3b4b9f5c15829c919c8e05b15582fa1c9c7f20a303581dd5d0bc56a66441389c"}, + {file = "flaky-3.8.1-py2.py3-none-any.whl", hash = "sha256:194ccf4f0d3a22b2de7130f4b62e45e977ac1b5ccad74d4d48f3005dcc38815e"}, + {file = "flaky-3.8.1.tar.gz", hash = "sha256:47204a81ec905f3d5acfbd61daeabcada8f9d4031616d9bcb0618461729699f5"}, ] [[package]] @@ -1130,53 +1130,53 @@ files = [ [[package]] name = "fonttools" -version = "4.49.0" +version = "4.50.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d970ecca0aac90d399e458f0b7a8a597e08f95de021f17785fb68e2dc0b99717"}, - {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac9a745b7609f489faa65e1dc842168c18530874a5f5b742ac3dd79e26bca8bc"}, - {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba0e00620ca28d4ca11fc700806fd69144b463aa3275e1b36e56c7c09915559"}, - {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdee3ab220283057e7840d5fb768ad4c2ebe65bdba6f75d5d7bf47f4e0ed7d29"}, - {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ce7033cb61f2bb65d8849658d3786188afd80f53dad8366a7232654804529532"}, - {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:07bc5ea02bb7bc3aa40a1eb0481ce20e8d9b9642a9536cde0218290dd6085828"}, - {file = "fonttools-4.49.0-cp310-cp310-win32.whl", hash = "sha256:86eef6aab7fd7c6c8545f3ebd00fd1d6729ca1f63b0cb4d621bccb7d1d1c852b"}, - {file = "fonttools-4.49.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fac1b7eebfce75ea663e860e7c5b4a8831b858c17acd68263bc156125201abf"}, - {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e"}, - {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83a0d9336de2cba86d886507dd6e0153df333ac787377325a39a2797ec529814"}, - {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36c8865bdb5cfeec88f5028e7e592370a0657b676c6f1d84a2108e0564f90e22"}, - {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942"}, - {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8fb022d799b96df3eaa27263e9eea306bd3d437cc9aa981820850281a02b6c9a"}, - {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33c584c0ef7dc54f5dd4f84082eabd8d09d1871a3d8ca2986b0c0c98165f8e86"}, - {file = "fonttools-4.49.0-cp311-cp311-win32.whl", hash = "sha256:cbe61b158deb09cffdd8540dc4a948d6e8f4d5b4f3bf5cd7db09bd6a61fee64e"}, - {file = "fonttools-4.49.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6"}, - {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d647a0e697e5daa98c87993726da8281c7233d9d4ffe410812a4896c7c57c075"}, - {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f3bbe672df03563d1f3a691ae531f2e31f84061724c319652039e5a70927167e"}, - {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bebd91041dda0d511b0d303180ed36e31f4f54b106b1259b69fade68413aa7ff"}, - {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4145f91531fd43c50f9eb893faa08399816bb0b13c425667c48475c9f3a2b9b5"}, - {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea329dafb9670ffbdf4dbc3b0e5c264104abcd8441d56de77f06967f032943cb"}, - {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c076a9e548521ecc13d944b1d261ff3d7825048c338722a4bd126d22316087b7"}, - {file = "fonttools-4.49.0-cp312-cp312-win32.whl", hash = "sha256:b607ea1e96768d13be26d2b400d10d3ebd1456343eb5eaddd2f47d1c4bd00880"}, - {file = "fonttools-4.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:a974c49a981e187381b9cc2c07c6b902d0079b88ff01aed34695ec5360767034"}, - {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b85ec0bdd7bdaa5c1946398cbb541e90a6dfc51df76dfa88e0aaa41b335940cb"}, - {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af20acbe198a8a790618ee42db192eb128afcdcc4e96d99993aca0b60d1faeb4"}, - {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d418b1fee41a1d14931f7ab4b92dc0bc323b490e41d7a333eec82c9f1780c75"}, - {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44a52b8e6244b6548851b03b2b377a9702b88ddc21dcaf56a15a0393d425cb9"}, - {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7c7125068e04a70739dad11857a4d47626f2b0bd54de39e8622e89701836eabd"}, - {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29e89d0e1a7f18bc30f197cfadcbef5a13d99806447c7e245f5667579a808036"}, - {file = "fonttools-4.49.0-cp38-cp38-win32.whl", hash = "sha256:9d95fa0d22bf4f12d2fb7b07a46070cdfc19ef5a7b1c98bc172bfab5bf0d6844"}, - {file = "fonttools-4.49.0-cp38-cp38-win_amd64.whl", hash = "sha256:768947008b4dc552d02772e5ebd49e71430a466e2373008ce905f953afea755a"}, - {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:08877e355d3dde1c11973bb58d4acad1981e6d1140711230a4bfb40b2b937ccc"}, - {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fdb54b076f25d6b0f0298dc706acee5052de20c83530fa165b60d1f2e9cbe3cb"}, - {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0af65c720520710cc01c293f9c70bd69684365c6015cc3671db2b7d807fe51f2"}, - {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f255ce8ed7556658f6d23f6afd22a6d9bbc3edb9b96c96682124dc487e1bf42"}, - {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d00af0884c0e65f60dfaf9340e26658836b935052fdd0439952ae42e44fdd2be"}, - {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:263832fae27481d48dfafcc43174644b6706639661e242902ceb30553557e16c"}, - {file = "fonttools-4.49.0-cp39-cp39-win32.whl", hash = "sha256:0404faea044577a01bb82d47a8fa4bc7a54067fa7e324785dd65d200d6dd1133"}, - {file = "fonttools-4.49.0-cp39-cp39-win_amd64.whl", hash = "sha256:b050d362df50fc6e38ae3954d8c29bf2da52be384649ee8245fdb5186b620836"}, - {file = "fonttools-4.49.0-py3-none-any.whl", hash = "sha256:af281525e5dd7fa0b39fb1667b8d5ca0e2a9079967e14c4bfe90fd1cd13e0f18"}, - {file = "fonttools-4.49.0.tar.gz", hash = "sha256:ebf46e7f01b7af7861310417d7c49591a85d99146fc23a5ba82fdb28af156321"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effd303fb422f8ce06543a36ca69148471144c534cc25f30e5be752bc4f46736"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7913992ab836f621d06aabac118fc258b9947a775a607e1a737eb3a91c360335"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0a1c5bd2f63da4043b63888534b52c5a1fd7ae187c8ffc64cbb7ae475b9dab"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40fc98540fa5360e7ecf2c56ddf3c6e7dd04929543618fd7b5cc76e66390562"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fff65fbb7afe137bac3113827855e0204482727bddd00a806034ab0d3951d0d"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1aeae3dd2ee719074a9372c89ad94f7c581903306d76befdaca2a559f802472"}, + {file = "fonttools-4.50.0-cp310-cp310-win32.whl", hash = "sha256:e9623afa319405da33b43c85cceb0585a6f5d3a1d7c604daf4f7e1dd55c03d1f"}, + {file = "fonttools-4.50.0-cp310-cp310-win_amd64.whl", hash = "sha256:778c5f43e7e654ef7fe0605e80894930bc3a7772e2f496238e57218610140f54"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3dfb102e7f63b78c832e4539969167ffcc0375b013080e6472350965a5fe8048"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e58fe34cb379ba3d01d5d319d67dd3ce7ca9a47ad044ea2b22635cd2d1247fc"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c673ab40d15a442a4e6eb09bf007c1dda47c84ac1e2eecbdf359adacb799c24"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b3ac35cdcd1a4c90c23a5200212c1bb74fa05833cc7c14291d7043a52ca2aaa"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8844e7a2c5f7ecf977e82eb6b3014f025c8b454e046d941ece05b768be5847ae"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f849bd3c5c2249b49c98eca5aaebb920d2bfd92b3c69e84ca9bddf133e9f83f0"}, + {file = "fonttools-4.50.0-cp311-cp311-win32.whl", hash = "sha256:39293ff231b36b035575e81c14626dfc14407a20de5262f9596c2cbb199c3625"}, + {file = "fonttools-4.50.0-cp311-cp311-win_amd64.whl", hash = "sha256:c33d5023523b44d3481624f840c8646656a1def7630ca562f222eb3ead16c438"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b4a886a6dbe60100ba1cd24de962f8cd18139bd32808da80de1fa9f9f27bf1dc"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b2ca1837bfbe5eafa11313dbc7edada79052709a1fffa10cea691210af4aa1fa"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0493dd97ac8977e48ffc1476b932b37c847cbb87fd68673dee5182004906828"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77844e2f1b0889120b6c222fc49b2b75c3d88b930615e98893b899b9352a27ea"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3566bfb8c55ed9100afe1ba6f0f12265cd63a1387b9661eb6031a1578a28bad1"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:35e10ddbc129cf61775d58a14f2d44121178d89874d32cae1eac722e687d9019"}, + {file = "fonttools-4.50.0-cp312-cp312-win32.whl", hash = "sha256:cc8140baf9fa8f9b903f2b393a6c413a220fa990264b215bf48484f3d0bf8710"}, + {file = "fonttools-4.50.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ccc85fd96373ab73c59833b824d7a73846670a0cb1f3afbaee2b2c426a8f931"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e270a406219af37581d96c810172001ec536e29e5593aa40d4c01cca3e145aa6"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac2463de667233372e9e1c7e9de3d914b708437ef52a3199fdbf5a60184f190c"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47abd6669195abe87c22750dbcd366dc3a0648f1b7c93c2baa97429c4dc1506e"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:074841375e2e3d559aecc86e1224caf78e8b8417bb391e7d2506412538f21adc"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0743fd2191ad7ab43d78cd747215b12033ddee24fa1e088605a3efe80d6984de"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3d7080cce7be5ed65bee3496f09f79a82865a514863197ff4d4d177389e981b0"}, + {file = "fonttools-4.50.0-cp38-cp38-win32.whl", hash = "sha256:a467ba4e2eadc1d5cc1a11d355abb945f680473fbe30d15617e104c81f483045"}, + {file = "fonttools-4.50.0-cp38-cp38-win_amd64.whl", hash = "sha256:f77e048f805e00870659d6318fd89ef28ca4ee16a22b4c5e1905b735495fc422"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b6245eafd553c4e9a0708e93be51392bd2288c773523892fbd616d33fd2fda59"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a4062cc7e8de26f1603323ef3ae2171c9d29c8a9f5e067d555a2813cd5c7a7e0"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34692850dfd64ba06af61e5791a441f664cb7d21e7b544e8f385718430e8f8e4"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678dd95f26a67e02c50dcb5bf250f95231d455642afbc65a3b0bcdacd4e4dd38"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f2ce7b0b295fe64ac0a85aef46a0f2614995774bd7bc643b85679c0283287f9"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d346f4dc2221bfb7ab652d1e37d327578434ce559baf7113b0f55768437fe6a0"}, + {file = "fonttools-4.50.0-cp39-cp39-win32.whl", hash = "sha256:a51eeaf52ba3afd70bf489be20e52fdfafe6c03d652b02477c6ce23c995222f4"}, + {file = "fonttools-4.50.0-cp39-cp39-win_amd64.whl", hash = "sha256:8639be40d583e5d9da67795aa3eeeda0488fb577a1d42ae11a5036f18fb16d93"}, + {file = "fonttools-4.50.0-py3-none-any.whl", hash = "sha256:48fa36da06247aa8282766cfd63efff1bb24e55f020f29a335939ed3844d20d3"}, + {file = "fonttools-4.50.0.tar.gz", hash = "sha256:fa5cf61058c7dbb104c2ac4e782bf1b2016a8cf2f69de6e4dd6a865d2c969bb5"}, ] [package.extras] @@ -3115,22 +3115,22 @@ files = [ [[package]] name = "protobuf" -version = "4.25.3" +version = "5.26.0" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, - {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, - {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, - {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, - {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, - {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, - {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, - {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, - {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, + {file = "protobuf-5.26.0-cp310-abi3-win32.whl", hash = "sha256:f9ecc8eb6f18037e0cbf43256db0325d4723f429bca7ef5cd358b7c29d65f628"}, + {file = "protobuf-5.26.0-cp310-abi3-win_amd64.whl", hash = "sha256:dfd29f6eb34107dccf289a93d44fb6b131e68888d090b784b691775ac84e8213"}, + {file = "protobuf-5.26.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:7e47c57303466c867374a17b2b5e99c5a7c8b72a94118e2f28efb599f19b4069"}, + {file = "protobuf-5.26.0-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e184175276edc222e2d5e314a72521e10049938a9a4961fe4bea9b25d073c03f"}, + {file = "protobuf-5.26.0-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:6ee9d1aa02f951c5ce10bf8c6cfb7604133773038e33f913183c8b5201350600"}, + {file = "protobuf-5.26.0-cp38-cp38-win32.whl", hash = "sha256:2c334550e1cb4efac5c8a3987384bf13a4334abaf5ab59e40479e7b70ecd6b19"}, + {file = "protobuf-5.26.0-cp38-cp38-win_amd64.whl", hash = "sha256:8eef61a90631c21b06b4f492a27e199a269827f046de3bb68b61aa84fcf50905"}, + {file = "protobuf-5.26.0-cp39-cp39-win32.whl", hash = "sha256:ca825f4eecb8c342d2ec581e6a5ad1ad1a47bededaecd768e0d3451ae4aaac2b"}, + {file = "protobuf-5.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:efd4f5894c50bd76cbcfdd668cd941021333861ed0f441c78a83d8254a01cc9f"}, + {file = "protobuf-5.26.0-py3-none-any.whl", hash = "sha256:a49b6c5359bf34fb7bf965bf21abfab4476e4527d822ab5289ee3bf73f291159"}, + {file = "protobuf-5.26.0.tar.gz", hash = "sha256:82f5870d74c99addfe4152777bdf8168244b9cf0ac65f8eccf045ddfa9d80d9b"}, ] [[package]] @@ -3496,2741 +3496,2762 @@ files = [ [[package]] name = "pyobjc" -version = "10.1" +version = "10.2" description = "Python<->ObjC Interoperability Module" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-10.1-py3-none-any.whl", hash = "sha256:2687ff02217e7b2aba52c6b948bccea864a8f034af6c90528564d496b343c418"}, - {file = "pyobjc-10.1.tar.gz", hash = "sha256:f54baff4c40d53c3fb3812816ebd130d3186805936628cc1f212f95979af5b98"}, -] - -[package.dependencies] -pyobjc-core = "10.1" -pyobjc-framework-Accessibility = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-Accounts = {version = "10.1", markers = "platform_release >= \"12.0\""} -pyobjc-framework-AddressBook = "10.1" -pyobjc-framework-AdServices = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-AdSupport = {version = "10.1", markers = "platform_release >= \"18.0\""} -pyobjc-framework-AppleScriptKit = "10.1" -pyobjc-framework-AppleScriptObjC = {version = "10.1", markers = "platform_release >= \"10.0\""} -pyobjc-framework-ApplicationServices = "10.1" -pyobjc-framework-AppTrackingTransparency = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-AudioVideoBridging = {version = "10.1", markers = "platform_release >= \"12.0\""} -pyobjc-framework-AuthenticationServices = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-AutomaticAssessmentConfiguration = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-Automator = "10.1" -pyobjc-framework-AVFoundation = {version = "10.1", markers = "platform_release >= \"11.0\""} -pyobjc-framework-AVKit = {version = "10.1", markers = "platform_release >= \"13.0\""} -pyobjc-framework-AVRouting = {version = "10.1", markers = "platform_release >= \"22.0\""} -pyobjc-framework-BackgroundAssets = {version = "10.1", markers = "platform_release >= \"22.0\""} -pyobjc-framework-BusinessChat = {version = "10.1", markers = "platform_release >= \"18.0\""} -pyobjc-framework-CalendarStore = {version = "10.1", markers = "platform_release >= \"9.0\""} -pyobjc-framework-CallKit = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-CFNetwork = "10.1" -pyobjc-framework-Cinematic = {version = "10.1", markers = "platform_release >= \"23.0\""} -pyobjc-framework-ClassKit = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-CloudKit = {version = "10.1", markers = "platform_release >= \"14.0\""} -pyobjc-framework-Cocoa = "10.1" -pyobjc-framework-Collaboration = {version = "10.1", markers = "platform_release >= \"9.0\""} -pyobjc-framework-ColorSync = {version = "10.1", markers = "platform_release >= \"17.0\""} -pyobjc-framework-Contacts = {version = "10.1", markers = "platform_release >= \"15.0\""} -pyobjc-framework-ContactsUI = {version = "10.1", markers = "platform_release >= \"15.0\""} -pyobjc-framework-CoreAudio = "10.1" -pyobjc-framework-CoreAudioKit = "10.1" -pyobjc-framework-CoreBluetooth = {version = "10.1", markers = "platform_release >= \"14.0\""} -pyobjc-framework-CoreData = "10.1" -pyobjc-framework-CoreHaptics = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-CoreLocation = {version = "10.1", markers = "platform_release >= \"10.0\""} -pyobjc-framework-CoreMedia = {version = "10.1", markers = "platform_release >= \"11.0\""} -pyobjc-framework-CoreMediaIO = {version = "10.1", markers = "platform_release >= \"11.0\""} -pyobjc-framework-CoreMIDI = "10.1" -pyobjc-framework-CoreML = {version = "10.1", markers = "platform_release >= \"17.0\""} -pyobjc-framework-CoreMotion = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-CoreServices = "10.1" -pyobjc-framework-CoreSpotlight = {version = "10.1", markers = "platform_release >= \"17.0\""} -pyobjc-framework-CoreText = "10.1" -pyobjc-framework-CoreWLAN = {version = "10.1", markers = "platform_release >= \"10.0\""} -pyobjc-framework-CryptoTokenKit = {version = "10.1", markers = "platform_release >= \"14.0\""} -pyobjc-framework-DataDetection = {version = "10.1", markers = "platform_release >= \"21.0\""} -pyobjc-framework-DeviceCheck = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-DictionaryServices = {version = "10.1", markers = "platform_release >= \"9.0\""} -pyobjc-framework-DiscRecording = "10.1" -pyobjc-framework-DiscRecordingUI = "10.1" -pyobjc-framework-DiskArbitration = "10.1" -pyobjc-framework-DVDPlayback = "10.1" -pyobjc-framework-EventKit = {version = "10.1", markers = "platform_release >= \"12.0\""} -pyobjc-framework-ExceptionHandling = "10.1" -pyobjc-framework-ExecutionPolicy = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-ExtensionKit = {version = "10.1", markers = "platform_release >= \"22.0\""} -pyobjc-framework-ExternalAccessory = {version = "10.1", markers = "platform_release >= \"17.0\""} -pyobjc-framework-FileProvider = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-FileProviderUI = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-FinderSync = {version = "10.1", markers = "platform_release >= \"14.0\""} -pyobjc-framework-FSEvents = {version = "10.1", markers = "platform_release >= \"9.0\""} -pyobjc-framework-GameCenter = {version = "10.1", markers = "platform_release >= \"12.0\""} -pyobjc-framework-GameController = {version = "10.1", markers = "platform_release >= \"13.0\""} -pyobjc-framework-GameKit = {version = "10.1", markers = "platform_release >= \"12.0\""} -pyobjc-framework-GameplayKit = {version = "10.1", markers = "platform_release >= \"15.0\""} -pyobjc-framework-HealthKit = {version = "10.1", markers = "platform_release >= \"22.0\""} -pyobjc-framework-ImageCaptureCore = {version = "10.1", markers = "platform_release >= \"10.0\""} -pyobjc-framework-InputMethodKit = {version = "10.1", markers = "platform_release >= \"9.0\""} -pyobjc-framework-InstallerPlugins = "10.1" -pyobjc-framework-InstantMessage = {version = "10.1", markers = "platform_release >= \"9.0\""} -pyobjc-framework-Intents = {version = "10.1", markers = "platform_release >= \"16.0\""} -pyobjc-framework-IntentsUI = {version = "10.1", markers = "platform_release >= \"21.0\""} -pyobjc-framework-IOBluetooth = "10.1" -pyobjc-framework-IOBluetoothUI = "10.1" -pyobjc-framework-IOSurface = {version = "10.1", markers = "platform_release >= \"10.0\""} -pyobjc-framework-iTunesLibrary = {version = "10.1", markers = "platform_release >= \"10.0\""} -pyobjc-framework-KernelManagement = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-LatentSemanticMapping = "10.1" -pyobjc-framework-LaunchServices = "10.1" -pyobjc-framework-libdispatch = {version = "10.1", markers = "platform_release >= \"12.0\""} -pyobjc-framework-libxpc = {version = "10.1", markers = "platform_release >= \"12.0\""} -pyobjc-framework-LinkPresentation = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-LocalAuthentication = {version = "10.1", markers = "platform_release >= \"14.0\""} -pyobjc-framework-LocalAuthenticationEmbeddedUI = {version = "10.1", markers = "platform_release >= \"21.0\""} -pyobjc-framework-MailKit = {version = "10.1", markers = "platform_release >= \"21.0\""} -pyobjc-framework-MapKit = {version = "10.1", markers = "platform_release >= \"13.0\""} -pyobjc-framework-MediaAccessibility = {version = "10.1", markers = "platform_release >= \"13.0\""} -pyobjc-framework-MediaLibrary = {version = "10.1", markers = "platform_release >= \"13.0\""} -pyobjc-framework-MediaPlayer = {version = "10.1", markers = "platform_release >= \"16.0\""} -pyobjc-framework-MediaToolbox = {version = "10.1", markers = "platform_release >= \"13.0\""} -pyobjc-framework-Metal = {version = "10.1", markers = "platform_release >= \"15.0\""} -pyobjc-framework-MetalFX = {version = "10.1", markers = "platform_release >= \"22.0\""} -pyobjc-framework-MetalKit = {version = "10.1", markers = "platform_release >= \"15.0\""} -pyobjc-framework-MetalPerformanceShaders = {version = "10.1", markers = "platform_release >= \"17.0\""} -pyobjc-framework-MetalPerformanceShadersGraph = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-MetricKit = {version = "10.1", markers = "platform_release >= \"21.0\""} -pyobjc-framework-MLCompute = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-ModelIO = {version = "10.1", markers = "platform_release >= \"15.0\""} -pyobjc-framework-MultipeerConnectivity = {version = "10.1", markers = "platform_release >= \"14.0\""} -pyobjc-framework-NaturalLanguage = {version = "10.1", markers = "platform_release >= \"18.0\""} -pyobjc-framework-NetFS = {version = "10.1", markers = "platform_release >= \"10.0\""} -pyobjc-framework-Network = {version = "10.1", markers = "platform_release >= \"18.0\""} -pyobjc-framework-NetworkExtension = {version = "10.1", markers = "platform_release >= \"15.0\""} -pyobjc-framework-NotificationCenter = {version = "10.1", markers = "platform_release >= \"14.0\""} -pyobjc-framework-OpenDirectory = {version = "10.1", markers = "platform_release >= \"10.0\""} -pyobjc-framework-OSAKit = "10.1" -pyobjc-framework-OSLog = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-PassKit = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-PencilKit = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-PHASE = {version = "10.1", markers = "platform_release >= \"21.0\""} -pyobjc-framework-Photos = {version = "10.1", markers = "platform_release >= \"15.0\""} -pyobjc-framework-PhotosUI = {version = "10.1", markers = "platform_release >= \"15.0\""} -pyobjc-framework-PreferencePanes = "10.1" -pyobjc-framework-PubSub = {version = "10.1", markers = "platform_release >= \"9.0\" and platform_release < \"18.0\""} -pyobjc-framework-PushKit = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-Quartz = "10.1" -pyobjc-framework-QuickLookThumbnailing = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-ReplayKit = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-SafariServices = {version = "10.1", markers = "platform_release >= \"16.0\""} -pyobjc-framework-SafetyKit = {version = "10.1", markers = "platform_release >= \"22.0\""} -pyobjc-framework-SceneKit = {version = "10.1", markers = "platform_release >= \"11.0\""} -pyobjc-framework-ScreenCaptureKit = {version = "10.1", markers = "platform_release >= \"21.4\""} -pyobjc-framework-ScreenSaver = "10.1" -pyobjc-framework-ScreenTime = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-ScriptingBridge = {version = "10.1", markers = "platform_release >= \"9.0\""} -pyobjc-framework-SearchKit = "10.1" -pyobjc-framework-Security = "10.1" -pyobjc-framework-SecurityFoundation = "10.1" -pyobjc-framework-SecurityInterface = "10.1" -pyobjc-framework-SensitiveContentAnalysis = {version = "10.1", markers = "platform_release >= \"23.0\""} -pyobjc-framework-ServiceManagement = {version = "10.1", markers = "platform_release >= \"10.0\""} -pyobjc-framework-SharedWithYou = {version = "10.1", markers = "platform_release >= \"22.0\""} -pyobjc-framework-SharedWithYouCore = {version = "10.1", markers = "platform_release >= \"22.0\""} -pyobjc-framework-ShazamKit = {version = "10.1", markers = "platform_release >= \"21.0\""} -pyobjc-framework-Social = {version = "10.1", markers = "platform_release >= \"12.0\""} -pyobjc-framework-SoundAnalysis = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-Speech = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-SpriteKit = {version = "10.1", markers = "platform_release >= \"13.0\""} -pyobjc-framework-StoreKit = {version = "10.1", markers = "platform_release >= \"11.0\""} -pyobjc-framework-Symbols = {version = "10.1", markers = "platform_release >= \"23.0\""} -pyobjc-framework-SyncServices = "10.1" -pyobjc-framework-SystemConfiguration = "10.1" -pyobjc-framework-SystemExtensions = {version = "10.1", markers = "platform_release >= \"19.0\""} -pyobjc-framework-ThreadNetwork = {version = "10.1", markers = "platform_release >= \"22.0\""} -pyobjc-framework-UniformTypeIdentifiers = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-UserNotifications = {version = "10.1", markers = "platform_release >= \"18.0\""} -pyobjc-framework-UserNotificationsUI = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-VideoSubscriberAccount = {version = "10.1", markers = "platform_release >= \"18.0\""} -pyobjc-framework-VideoToolbox = {version = "10.1", markers = "platform_release >= \"12.0\""} -pyobjc-framework-Virtualization = {version = "10.1", markers = "platform_release >= \"20.0\""} -pyobjc-framework-Vision = {version = "10.1", markers = "platform_release >= \"17.0\""} -pyobjc-framework-WebKit = "10.1" + {file = "pyobjc-10.2-py3-none-any.whl", hash = "sha256:976c8f8af49a91195307b3efbc2d63517be63aae2b4b3689dcff4f317669c23a"}, + {file = "pyobjc-10.2.tar.gz", hash = "sha256:bfea9891750ce3af6439ee102e8e417917f1a7ed7fc4f54b5da9d7457fbb7fc6"}, +] + +[package.dependencies] +pyobjc-core = "10.2" +pyobjc-framework-Accessibility = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-Accounts = {version = "10.2", markers = "platform_release >= \"12.0\""} +pyobjc-framework-AddressBook = "10.2" +pyobjc-framework-AdServices = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-AdSupport = {version = "10.2", markers = "platform_release >= \"18.0\""} +pyobjc-framework-AppleScriptKit = "10.2" +pyobjc-framework-AppleScriptObjC = {version = "10.2", markers = "platform_release >= \"10.0\""} +pyobjc-framework-ApplicationServices = "10.2" +pyobjc-framework-AppTrackingTransparency = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-AudioVideoBridging = {version = "10.2", markers = "platform_release >= \"12.0\""} +pyobjc-framework-AuthenticationServices = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-AutomaticAssessmentConfiguration = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-Automator = "10.2" +pyobjc-framework-AVFoundation = {version = "10.2", markers = "platform_release >= \"11.0\""} +pyobjc-framework-AVKit = {version = "10.2", markers = "platform_release >= \"13.0\""} +pyobjc-framework-AVRouting = {version = "10.2", markers = "platform_release >= \"22.0\""} +pyobjc-framework-BackgroundAssets = {version = "10.2", markers = "platform_release >= \"22.0\""} +pyobjc-framework-BrowserEngineKit = {version = "10.2", markers = "platform_release >= \"23.4\""} +pyobjc-framework-BusinessChat = {version = "10.2", markers = "platform_release >= \"18.0\""} +pyobjc-framework-CalendarStore = {version = "10.2", markers = "platform_release >= \"9.0\""} +pyobjc-framework-CallKit = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-CFNetwork = "10.2" +pyobjc-framework-Cinematic = {version = "10.2", markers = "platform_release >= \"23.0\""} +pyobjc-framework-ClassKit = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-CloudKit = {version = "10.2", markers = "platform_release >= \"14.0\""} +pyobjc-framework-Cocoa = "10.2" +pyobjc-framework-Collaboration = {version = "10.2", markers = "platform_release >= \"9.0\""} +pyobjc-framework-ColorSync = {version = "10.2", markers = "platform_release >= \"17.0\""} +pyobjc-framework-Contacts = {version = "10.2", markers = "platform_release >= \"15.0\""} +pyobjc-framework-ContactsUI = {version = "10.2", markers = "platform_release >= \"15.0\""} +pyobjc-framework-CoreAudio = "10.2" +pyobjc-framework-CoreAudioKit = "10.2" +pyobjc-framework-CoreBluetooth = {version = "10.2", markers = "platform_release >= \"14.0\""} +pyobjc-framework-CoreData = "10.2" +pyobjc-framework-CoreHaptics = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-CoreLocation = {version = "10.2", markers = "platform_release >= \"10.0\""} +pyobjc-framework-CoreMedia = {version = "10.2", markers = "platform_release >= \"11.0\""} +pyobjc-framework-CoreMediaIO = {version = "10.2", markers = "platform_release >= \"11.0\""} +pyobjc-framework-CoreMIDI = "10.2" +pyobjc-framework-CoreML = {version = "10.2", markers = "platform_release >= \"17.0\""} +pyobjc-framework-CoreMotion = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-CoreServices = "10.2" +pyobjc-framework-CoreSpotlight = {version = "10.2", markers = "platform_release >= \"17.0\""} +pyobjc-framework-CoreText = "10.2" +pyobjc-framework-CoreWLAN = {version = "10.2", markers = "platform_release >= \"10.0\""} +pyobjc-framework-CryptoTokenKit = {version = "10.2", markers = "platform_release >= \"14.0\""} +pyobjc-framework-DataDetection = {version = "10.2", markers = "platform_release >= \"21.0\""} +pyobjc-framework-DeviceCheck = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-DictionaryServices = {version = "10.2", markers = "platform_release >= \"9.0\""} +pyobjc-framework-DiscRecording = "10.2" +pyobjc-framework-DiscRecordingUI = "10.2" +pyobjc-framework-DiskArbitration = "10.2" +pyobjc-framework-DVDPlayback = "10.2" +pyobjc-framework-EventKit = {version = "10.2", markers = "platform_release >= \"12.0\""} +pyobjc-framework-ExceptionHandling = "10.2" +pyobjc-framework-ExecutionPolicy = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-ExtensionKit = {version = "10.2", markers = "platform_release >= \"22.0\""} +pyobjc-framework-ExternalAccessory = {version = "10.2", markers = "platform_release >= \"17.0\""} +pyobjc-framework-FileProvider = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-FileProviderUI = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-FinderSync = {version = "10.2", markers = "platform_release >= \"14.0\""} +pyobjc-framework-FSEvents = {version = "10.2", markers = "platform_release >= \"9.0\""} +pyobjc-framework-GameCenter = {version = "10.2", markers = "platform_release >= \"12.0\""} +pyobjc-framework-GameController = {version = "10.2", markers = "platform_release >= \"13.0\""} +pyobjc-framework-GameKit = {version = "10.2", markers = "platform_release >= \"12.0\""} +pyobjc-framework-GameplayKit = {version = "10.2", markers = "platform_release >= \"15.0\""} +pyobjc-framework-HealthKit = {version = "10.2", markers = "platform_release >= \"22.0\""} +pyobjc-framework-ImageCaptureCore = {version = "10.2", markers = "platform_release >= \"10.0\""} +pyobjc-framework-InputMethodKit = {version = "10.2", markers = "platform_release >= \"9.0\""} +pyobjc-framework-InstallerPlugins = "10.2" +pyobjc-framework-InstantMessage = {version = "10.2", markers = "platform_release >= \"9.0\""} +pyobjc-framework-Intents = {version = "10.2", markers = "platform_release >= \"16.0\""} +pyobjc-framework-IntentsUI = {version = "10.2", markers = "platform_release >= \"21.0\""} +pyobjc-framework-IOBluetooth = "10.2" +pyobjc-framework-IOBluetoothUI = "10.2" +pyobjc-framework-IOSurface = {version = "10.2", markers = "platform_release >= \"10.0\""} +pyobjc-framework-iTunesLibrary = {version = "10.2", markers = "platform_release >= \"10.0\""} +pyobjc-framework-KernelManagement = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-LatentSemanticMapping = "10.2" +pyobjc-framework-LaunchServices = "10.2" +pyobjc-framework-libdispatch = {version = "10.2", markers = "platform_release >= \"12.0\""} +pyobjc-framework-libxpc = {version = "10.2", markers = "platform_release >= \"12.0\""} +pyobjc-framework-LinkPresentation = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-LocalAuthentication = {version = "10.2", markers = "platform_release >= \"14.0\""} +pyobjc-framework-LocalAuthenticationEmbeddedUI = {version = "10.2", markers = "platform_release >= \"21.0\""} +pyobjc-framework-MailKit = {version = "10.2", markers = "platform_release >= \"21.0\""} +pyobjc-framework-MapKit = {version = "10.2", markers = "platform_release >= \"13.0\""} +pyobjc-framework-MediaAccessibility = {version = "10.2", markers = "platform_release >= \"13.0\""} +pyobjc-framework-MediaLibrary = {version = "10.2", markers = "platform_release >= \"13.0\""} +pyobjc-framework-MediaPlayer = {version = "10.2", markers = "platform_release >= \"16.0\""} +pyobjc-framework-MediaToolbox = {version = "10.2", markers = "platform_release >= \"13.0\""} +pyobjc-framework-Metal = {version = "10.2", markers = "platform_release >= \"15.0\""} +pyobjc-framework-MetalFX = {version = "10.2", markers = "platform_release >= \"22.0\""} +pyobjc-framework-MetalKit = {version = "10.2", markers = "platform_release >= \"15.0\""} +pyobjc-framework-MetalPerformanceShaders = {version = "10.2", markers = "platform_release >= \"17.0\""} +pyobjc-framework-MetalPerformanceShadersGraph = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-MetricKit = {version = "10.2", markers = "platform_release >= \"21.0\""} +pyobjc-framework-MLCompute = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-ModelIO = {version = "10.2", markers = "platform_release >= \"15.0\""} +pyobjc-framework-MultipeerConnectivity = {version = "10.2", markers = "platform_release >= \"14.0\""} +pyobjc-framework-NaturalLanguage = {version = "10.2", markers = "platform_release >= \"18.0\""} +pyobjc-framework-NetFS = {version = "10.2", markers = "platform_release >= \"10.0\""} +pyobjc-framework-Network = {version = "10.2", markers = "platform_release >= \"18.0\""} +pyobjc-framework-NetworkExtension = {version = "10.2", markers = "platform_release >= \"15.0\""} +pyobjc-framework-NotificationCenter = {version = "10.2", markers = "platform_release >= \"14.0\""} +pyobjc-framework-OpenDirectory = {version = "10.2", markers = "platform_release >= \"10.0\""} +pyobjc-framework-OSAKit = "10.2" +pyobjc-framework-OSLog = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-PassKit = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-PencilKit = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-PHASE = {version = "10.2", markers = "platform_release >= \"21.0\""} +pyobjc-framework-Photos = {version = "10.2", markers = "platform_release >= \"15.0\""} +pyobjc-framework-PhotosUI = {version = "10.2", markers = "platform_release >= \"15.0\""} +pyobjc-framework-PreferencePanes = "10.2" +pyobjc-framework-PubSub = {version = "10.2", markers = "platform_release >= \"9.0\" and platform_release < \"18.0\""} +pyobjc-framework-PushKit = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-Quartz = "10.2" +pyobjc-framework-QuickLookThumbnailing = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-ReplayKit = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-SafariServices = {version = "10.2", markers = "platform_release >= \"16.0\""} +pyobjc-framework-SafetyKit = {version = "10.2", markers = "platform_release >= \"22.0\""} +pyobjc-framework-SceneKit = {version = "10.2", markers = "platform_release >= \"11.0\""} +pyobjc-framework-ScreenCaptureKit = {version = "10.2", markers = "platform_release >= \"21.4\""} +pyobjc-framework-ScreenSaver = "10.2" +pyobjc-framework-ScreenTime = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-ScriptingBridge = {version = "10.2", markers = "platform_release >= \"9.0\""} +pyobjc-framework-SearchKit = "10.2" +pyobjc-framework-Security = "10.2" +pyobjc-framework-SecurityFoundation = "10.2" +pyobjc-framework-SecurityInterface = "10.2" +pyobjc-framework-SensitiveContentAnalysis = {version = "10.2", markers = "platform_release >= \"23.0\""} +pyobjc-framework-ServiceManagement = {version = "10.2", markers = "platform_release >= \"10.0\""} +pyobjc-framework-SharedWithYou = {version = "10.2", markers = "platform_release >= \"22.0\""} +pyobjc-framework-SharedWithYouCore = {version = "10.2", markers = "platform_release >= \"22.0\""} +pyobjc-framework-ShazamKit = {version = "10.2", markers = "platform_release >= \"21.0\""} +pyobjc-framework-Social = {version = "10.2", markers = "platform_release >= \"12.0\""} +pyobjc-framework-SoundAnalysis = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-Speech = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-SpriteKit = {version = "10.2", markers = "platform_release >= \"13.0\""} +pyobjc-framework-StoreKit = {version = "10.2", markers = "platform_release >= \"11.0\""} +pyobjc-framework-Symbols = {version = "10.2", markers = "platform_release >= \"23.0\""} +pyobjc-framework-SyncServices = "10.2" +pyobjc-framework-SystemConfiguration = "10.2" +pyobjc-framework-SystemExtensions = {version = "10.2", markers = "platform_release >= \"19.0\""} +pyobjc-framework-ThreadNetwork = {version = "10.2", markers = "platform_release >= \"22.0\""} +pyobjc-framework-UniformTypeIdentifiers = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-UserNotifications = {version = "10.2", markers = "platform_release >= \"18.0\""} +pyobjc-framework-UserNotificationsUI = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-VideoSubscriberAccount = {version = "10.2", markers = "platform_release >= \"18.0\""} +pyobjc-framework-VideoToolbox = {version = "10.2", markers = "platform_release >= \"12.0\""} +pyobjc-framework-Virtualization = {version = "10.2", markers = "platform_release >= \"20.0\""} +pyobjc-framework-Vision = {version = "10.2", markers = "platform_release >= \"17.0\""} +pyobjc-framework-WebKit = "10.2" [package.extras] -allbindings = ["pyobjc-core (==10.1)", "pyobjc-framework-AVFoundation (==10.1)", "pyobjc-framework-AVKit (==10.1)", "pyobjc-framework-AVRouting (==10.1)", "pyobjc-framework-Accessibility (==10.1)", "pyobjc-framework-Accounts (==10.1)", "pyobjc-framework-AdServices (==10.1)", "pyobjc-framework-AdSupport (==10.1)", "pyobjc-framework-AddressBook (==10.1)", "pyobjc-framework-AppTrackingTransparency (==10.1)", "pyobjc-framework-AppleScriptKit (==10.1)", "pyobjc-framework-AppleScriptObjC (==10.1)", "pyobjc-framework-ApplicationServices (==10.1)", "pyobjc-framework-AudioVideoBridging (==10.1)", "pyobjc-framework-AuthenticationServices (==10.1)", "pyobjc-framework-AutomaticAssessmentConfiguration (==10.1)", "pyobjc-framework-Automator (==10.1)", "pyobjc-framework-BackgroundAssets (==10.1)", "pyobjc-framework-BusinessChat (==10.1)", "pyobjc-framework-CFNetwork (==10.1)", "pyobjc-framework-CalendarStore (==10.1)", "pyobjc-framework-CallKit (==10.1)", "pyobjc-framework-Cinematic (==10.1)", "pyobjc-framework-ClassKit (==10.1)", "pyobjc-framework-CloudKit (==10.1)", "pyobjc-framework-Cocoa (==10.1)", "pyobjc-framework-Collaboration (==10.1)", "pyobjc-framework-ColorSync (==10.1)", "pyobjc-framework-Contacts (==10.1)", "pyobjc-framework-ContactsUI (==10.1)", "pyobjc-framework-CoreAudio (==10.1)", "pyobjc-framework-CoreAudioKit (==10.1)", "pyobjc-framework-CoreBluetooth (==10.1)", "pyobjc-framework-CoreData (==10.1)", "pyobjc-framework-CoreHaptics (==10.1)", "pyobjc-framework-CoreLocation (==10.1)", "pyobjc-framework-CoreMIDI (==10.1)", "pyobjc-framework-CoreML (==10.1)", "pyobjc-framework-CoreMedia (==10.1)", "pyobjc-framework-CoreMediaIO (==10.1)", "pyobjc-framework-CoreMotion (==10.1)", "pyobjc-framework-CoreServices (==10.1)", "pyobjc-framework-CoreSpotlight (==10.1)", "pyobjc-framework-CoreText (==10.1)", "pyobjc-framework-CoreWLAN (==10.1)", "pyobjc-framework-CryptoTokenKit (==10.1)", "pyobjc-framework-DVDPlayback (==10.1)", "pyobjc-framework-DataDetection (==10.1)", "pyobjc-framework-DeviceCheck (==10.1)", "pyobjc-framework-DictionaryServices (==10.1)", "pyobjc-framework-DiscRecording (==10.1)", "pyobjc-framework-DiscRecordingUI (==10.1)", "pyobjc-framework-DiskArbitration (==10.1)", "pyobjc-framework-EventKit (==10.1)", "pyobjc-framework-ExceptionHandling (==10.1)", "pyobjc-framework-ExecutionPolicy (==10.1)", "pyobjc-framework-ExtensionKit (==10.1)", "pyobjc-framework-ExternalAccessory (==10.1)", "pyobjc-framework-FSEvents (==10.1)", "pyobjc-framework-FileProvider (==10.1)", "pyobjc-framework-FileProviderUI (==10.1)", "pyobjc-framework-FinderSync (==10.1)", "pyobjc-framework-GameCenter (==10.1)", "pyobjc-framework-GameController (==10.1)", "pyobjc-framework-GameKit (==10.1)", "pyobjc-framework-GameplayKit (==10.1)", "pyobjc-framework-HealthKit (==10.1)", "pyobjc-framework-IOBluetooth (==10.1)", "pyobjc-framework-IOBluetoothUI (==10.1)", "pyobjc-framework-IOSurface (==10.1)", "pyobjc-framework-ImageCaptureCore (==10.1)", "pyobjc-framework-InputMethodKit (==10.1)", "pyobjc-framework-InstallerPlugins (==10.1)", "pyobjc-framework-InstantMessage (==10.1)", "pyobjc-framework-Intents (==10.1)", "pyobjc-framework-IntentsUI (==10.1)", "pyobjc-framework-KernelManagement (==10.1)", "pyobjc-framework-LatentSemanticMapping (==10.1)", "pyobjc-framework-LaunchServices (==10.1)", "pyobjc-framework-LinkPresentation (==10.1)", "pyobjc-framework-LocalAuthentication (==10.1)", "pyobjc-framework-LocalAuthenticationEmbeddedUI (==10.1)", "pyobjc-framework-MLCompute (==10.1)", "pyobjc-framework-MailKit (==10.1)", "pyobjc-framework-MapKit (==10.1)", "pyobjc-framework-MediaAccessibility (==10.1)", "pyobjc-framework-MediaLibrary (==10.1)", "pyobjc-framework-MediaPlayer (==10.1)", "pyobjc-framework-MediaToolbox (==10.1)", "pyobjc-framework-Metal (==10.1)", "pyobjc-framework-MetalFX (==10.1)", "pyobjc-framework-MetalKit (==10.1)", "pyobjc-framework-MetalPerformanceShaders (==10.1)", "pyobjc-framework-MetalPerformanceShadersGraph (==10.1)", "pyobjc-framework-MetricKit (==10.1)", "pyobjc-framework-ModelIO (==10.1)", "pyobjc-framework-MultipeerConnectivity (==10.1)", "pyobjc-framework-NaturalLanguage (==10.1)", "pyobjc-framework-NetFS (==10.1)", "pyobjc-framework-Network (==10.1)", "pyobjc-framework-NetworkExtension (==10.1)", "pyobjc-framework-NotificationCenter (==10.1)", "pyobjc-framework-OSAKit (==10.1)", "pyobjc-framework-OSLog (==10.1)", "pyobjc-framework-OpenDirectory (==10.1)", "pyobjc-framework-PHASE (==10.1)", "pyobjc-framework-PassKit (==10.1)", "pyobjc-framework-PencilKit (==10.1)", "pyobjc-framework-Photos (==10.1)", "pyobjc-framework-PhotosUI (==10.1)", "pyobjc-framework-PreferencePanes (==10.1)", "pyobjc-framework-PubSub (==10.1)", "pyobjc-framework-PushKit (==10.1)", "pyobjc-framework-Quartz (==10.1)", "pyobjc-framework-QuickLookThumbnailing (==10.1)", "pyobjc-framework-ReplayKit (==10.1)", "pyobjc-framework-SafariServices (==10.1)", "pyobjc-framework-SafetyKit (==10.1)", "pyobjc-framework-SceneKit (==10.1)", "pyobjc-framework-ScreenCaptureKit (==10.1)", "pyobjc-framework-ScreenSaver (==10.1)", "pyobjc-framework-ScreenTime (==10.1)", "pyobjc-framework-ScriptingBridge (==10.1)", "pyobjc-framework-SearchKit (==10.1)", "pyobjc-framework-Security (==10.1)", "pyobjc-framework-SecurityFoundation (==10.1)", "pyobjc-framework-SecurityInterface (==10.1)", "pyobjc-framework-SensitiveContentAnalysis (==10.1)", "pyobjc-framework-ServiceManagement (==10.1)", "pyobjc-framework-SharedWithYou (==10.1)", "pyobjc-framework-SharedWithYouCore (==10.1)", "pyobjc-framework-ShazamKit (==10.1)", "pyobjc-framework-Social (==10.1)", "pyobjc-framework-SoundAnalysis (==10.1)", "pyobjc-framework-Speech (==10.1)", "pyobjc-framework-SpriteKit (==10.1)", "pyobjc-framework-StoreKit (==10.1)", "pyobjc-framework-Symbols (==10.1)", "pyobjc-framework-SyncServices (==10.1)", "pyobjc-framework-SystemConfiguration (==10.1)", "pyobjc-framework-SystemExtensions (==10.1)", "pyobjc-framework-ThreadNetwork (==10.1)", "pyobjc-framework-UniformTypeIdentifiers (==10.1)", "pyobjc-framework-UserNotifications (==10.1)", "pyobjc-framework-UserNotificationsUI (==10.1)", "pyobjc-framework-VideoSubscriberAccount (==10.1)", "pyobjc-framework-VideoToolbox (==10.1)", "pyobjc-framework-Virtualization (==10.1)", "pyobjc-framework-Vision (==10.1)", "pyobjc-framework-WebKit (==10.1)", "pyobjc-framework-iTunesLibrary (==10.1)", "pyobjc-framework-libdispatch (==10.1)", "pyobjc-framework-libxpc (==10.1)"] +allbindings = ["pyobjc-core (==10.2)", "pyobjc-framework-AVFoundation (==10.2)", "pyobjc-framework-AVKit (==10.2)", "pyobjc-framework-AVRouting (==10.2)", "pyobjc-framework-Accessibility (==10.2)", "pyobjc-framework-Accounts (==10.2)", "pyobjc-framework-AdServices (==10.2)", "pyobjc-framework-AdSupport (==10.2)", "pyobjc-framework-AddressBook (==10.2)", "pyobjc-framework-AppTrackingTransparency (==10.2)", "pyobjc-framework-AppleScriptKit (==10.2)", "pyobjc-framework-AppleScriptObjC (==10.2)", "pyobjc-framework-ApplicationServices (==10.2)", "pyobjc-framework-AudioVideoBridging (==10.2)", "pyobjc-framework-AuthenticationServices (==10.2)", "pyobjc-framework-AutomaticAssessmentConfiguration (==10.2)", "pyobjc-framework-Automator (==10.2)", "pyobjc-framework-BackgroundAssets (==10.2)", "pyobjc-framework-BrowserEngineKit (==10.2)", "pyobjc-framework-BusinessChat (==10.2)", "pyobjc-framework-CFNetwork (==10.2)", "pyobjc-framework-CalendarStore (==10.2)", "pyobjc-framework-CallKit (==10.2)", "pyobjc-framework-Cinematic (==10.2)", "pyobjc-framework-ClassKit (==10.2)", "pyobjc-framework-CloudKit (==10.2)", "pyobjc-framework-Cocoa (==10.2)", "pyobjc-framework-Collaboration (==10.2)", "pyobjc-framework-ColorSync (==10.2)", "pyobjc-framework-Contacts (==10.2)", "pyobjc-framework-ContactsUI (==10.2)", "pyobjc-framework-CoreAudio (==10.2)", "pyobjc-framework-CoreAudioKit (==10.2)", "pyobjc-framework-CoreBluetooth (==10.2)", "pyobjc-framework-CoreData (==10.2)", "pyobjc-framework-CoreHaptics (==10.2)", "pyobjc-framework-CoreLocation (==10.2)", "pyobjc-framework-CoreMIDI (==10.2)", "pyobjc-framework-CoreML (==10.2)", "pyobjc-framework-CoreMedia (==10.2)", "pyobjc-framework-CoreMediaIO (==10.2)", "pyobjc-framework-CoreMotion (==10.2)", "pyobjc-framework-CoreServices (==10.2)", "pyobjc-framework-CoreSpotlight (==10.2)", "pyobjc-framework-CoreText (==10.2)", "pyobjc-framework-CoreWLAN (==10.2)", "pyobjc-framework-CryptoTokenKit (==10.2)", "pyobjc-framework-DVDPlayback (==10.2)", "pyobjc-framework-DataDetection (==10.2)", "pyobjc-framework-DeviceCheck (==10.2)", "pyobjc-framework-DictionaryServices (==10.2)", "pyobjc-framework-DiscRecording (==10.2)", "pyobjc-framework-DiscRecordingUI (==10.2)", "pyobjc-framework-DiskArbitration (==10.2)", "pyobjc-framework-EventKit (==10.2)", "pyobjc-framework-ExceptionHandling (==10.2)", "pyobjc-framework-ExecutionPolicy (==10.2)", "pyobjc-framework-ExtensionKit (==10.2)", "pyobjc-framework-ExternalAccessory (==10.2)", "pyobjc-framework-FSEvents (==10.2)", "pyobjc-framework-FileProvider (==10.2)", "pyobjc-framework-FileProviderUI (==10.2)", "pyobjc-framework-FinderSync (==10.2)", "pyobjc-framework-GameCenter (==10.2)", "pyobjc-framework-GameController (==10.2)", "pyobjc-framework-GameKit (==10.2)", "pyobjc-framework-GameplayKit (==10.2)", "pyobjc-framework-HealthKit (==10.2)", "pyobjc-framework-IOBluetooth (==10.2)", "pyobjc-framework-IOBluetoothUI (==10.2)", "pyobjc-framework-IOSurface (==10.2)", "pyobjc-framework-ImageCaptureCore (==10.2)", "pyobjc-framework-InputMethodKit (==10.2)", "pyobjc-framework-InstallerPlugins (==10.2)", "pyobjc-framework-InstantMessage (==10.2)", "pyobjc-framework-Intents (==10.2)", "pyobjc-framework-IntentsUI (==10.2)", "pyobjc-framework-KernelManagement (==10.2)", "pyobjc-framework-LatentSemanticMapping (==10.2)", "pyobjc-framework-LaunchServices (==10.2)", "pyobjc-framework-LinkPresentation (==10.2)", "pyobjc-framework-LocalAuthentication (==10.2)", "pyobjc-framework-LocalAuthenticationEmbeddedUI (==10.2)", "pyobjc-framework-MLCompute (==10.2)", "pyobjc-framework-MailKit (==10.2)", "pyobjc-framework-MapKit (==10.2)", "pyobjc-framework-MediaAccessibility (==10.2)", "pyobjc-framework-MediaLibrary (==10.2)", "pyobjc-framework-MediaPlayer (==10.2)", "pyobjc-framework-MediaToolbox (==10.2)", "pyobjc-framework-Metal (==10.2)", "pyobjc-framework-MetalFX (==10.2)", "pyobjc-framework-MetalKit (==10.2)", "pyobjc-framework-MetalPerformanceShaders (==10.2)", "pyobjc-framework-MetalPerformanceShadersGraph (==10.2)", "pyobjc-framework-MetricKit (==10.2)", "pyobjc-framework-ModelIO (==10.2)", "pyobjc-framework-MultipeerConnectivity (==10.2)", "pyobjc-framework-NaturalLanguage (==10.2)", "pyobjc-framework-NetFS (==10.2)", "pyobjc-framework-Network (==10.2)", "pyobjc-framework-NetworkExtension (==10.2)", "pyobjc-framework-NotificationCenter (==10.2)", "pyobjc-framework-OSAKit (==10.2)", "pyobjc-framework-OSLog (==10.2)", "pyobjc-framework-OpenDirectory (==10.2)", "pyobjc-framework-PHASE (==10.2)", "pyobjc-framework-PassKit (==10.2)", "pyobjc-framework-PencilKit (==10.2)", "pyobjc-framework-Photos (==10.2)", "pyobjc-framework-PhotosUI (==10.2)", "pyobjc-framework-PreferencePanes (==10.2)", "pyobjc-framework-PubSub (==10.2)", "pyobjc-framework-PushKit (==10.2)", "pyobjc-framework-Quartz (==10.2)", "pyobjc-framework-QuickLookThumbnailing (==10.2)", "pyobjc-framework-ReplayKit (==10.2)", "pyobjc-framework-SafariServices (==10.2)", "pyobjc-framework-SafetyKit (==10.2)", "pyobjc-framework-SceneKit (==10.2)", "pyobjc-framework-ScreenCaptureKit (==10.2)", "pyobjc-framework-ScreenSaver (==10.2)", "pyobjc-framework-ScreenTime (==10.2)", "pyobjc-framework-ScriptingBridge (==10.2)", "pyobjc-framework-SearchKit (==10.2)", "pyobjc-framework-Security (==10.2)", "pyobjc-framework-SecurityFoundation (==10.2)", "pyobjc-framework-SecurityInterface (==10.2)", "pyobjc-framework-SensitiveContentAnalysis (==10.2)", "pyobjc-framework-ServiceManagement (==10.2)", "pyobjc-framework-SharedWithYou (==10.2)", "pyobjc-framework-SharedWithYouCore (==10.2)", "pyobjc-framework-ShazamKit (==10.2)", "pyobjc-framework-Social (==10.2)", "pyobjc-framework-SoundAnalysis (==10.2)", "pyobjc-framework-Speech (==10.2)", "pyobjc-framework-SpriteKit (==10.2)", "pyobjc-framework-StoreKit (==10.2)", "pyobjc-framework-Symbols (==10.2)", "pyobjc-framework-SyncServices (==10.2)", "pyobjc-framework-SystemConfiguration (==10.2)", "pyobjc-framework-SystemExtensions (==10.2)", "pyobjc-framework-ThreadNetwork (==10.2)", "pyobjc-framework-UniformTypeIdentifiers (==10.2)", "pyobjc-framework-UserNotifications (==10.2)", "pyobjc-framework-UserNotificationsUI (==10.2)", "pyobjc-framework-VideoSubscriberAccount (==10.2)", "pyobjc-framework-VideoToolbox (==10.2)", "pyobjc-framework-Virtualization (==10.2)", "pyobjc-framework-Vision (==10.2)", "pyobjc-framework-WebKit (==10.2)", "pyobjc-framework-iTunesLibrary (==10.2)", "pyobjc-framework-libdispatch (==10.2)", "pyobjc-framework-libxpc (==10.2)"] [[package]] name = "pyobjc-core" -version = "10.1" +version = "10.2" description = "Python<->ObjC Interoperability Module" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-core-10.1.tar.gz", hash = "sha256:1844f1c8e282839e6fdcb9a9722396c1c12fb1e9331eb68828a26f28a3b2b2b1"}, - {file = "pyobjc_core-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2a72a88222539ad07b5c8be411edc52ff9147d7cef311a2c849869d7bb9603fd"}, - {file = "pyobjc_core-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fe1b9987b7b0437685fb529832876c2a8463500114960d4e76bb8ae96b6bf208"}, - {file = "pyobjc_core-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9f628779c345d3abd0e20048fb0e256d894c22254577a81a6dcfdb92c3647682"}, - {file = "pyobjc_core-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25a9e5a2de19238787d24cfa7def6b7fbb94bbe89c0e3109f71c1cb108e8ab44"}, - {file = "pyobjc_core-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:2d43205d3a784aa87055b84c0ec0dfa76498e5f18d1ad16bdc58a3dcf5a7d5d0"}, - {file = "pyobjc_core-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0aa9799b5996a893944999a2f1afcf1de119cab3551c169ad9f54d12e1d38c99"}, + {file = "pyobjc-core-10.2.tar.gz", hash = "sha256:0153206e15d0e0d7abd53ee8a7fbaf5606602a032e177a028fc8589516a8771c"}, + {file = "pyobjc_core-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b8eab50ce7f17017a0f1d68c3b7e88bb1bb033415fdff62b8e0a9ee4ab72f242"}, + {file = "pyobjc_core-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f2115971463073426ab926416e17e5c16de5b90d1a1f2a2d8724637eb1c21308"}, + {file = "pyobjc_core-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a70546246177c23acb323c9324330e37638f1a0a3d13664abcba3bb75e43012c"}, + {file = "pyobjc_core-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a9b5a215080d13bd7526031d21d5eb27a410780878d863f486053a0eba7ca9a5"}, + {file = "pyobjc_core-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:eb1ab700a44bcc4ceb125091dfaae0b998b767b49990df5fdc83eb58158d8e3f"}, + {file = "pyobjc_core-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a7163aff9c47d654f835f80361c1b112886ec754800d34e75d1e02ff52c3d7"}, ] [[package]] name = "pyobjc-framework-accessibility" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Accessibility on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Accessibility-10.1.tar.gz", hash = "sha256:70b812cf2b04b57a520c3fde9df4184c2783795fb355b416a8058114e52ad24a"}, - {file = "pyobjc_framework_Accessibility-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ef8524f2b67240fb3c3f7928f2d73e9050a8b80e18db8336e7ba4d4ba1d368df"}, - {file = "pyobjc_framework_Accessibility-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:d351d7799b197524a200c54bebe450e87f9c52812f6162811b7e84823e8946df"}, - {file = "pyobjc_framework_Accessibility-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:1dc4e0acedaa0232103714dd2daa3244a628426bee6e933078c89e8eb86b7961"}, + {file = "pyobjc-framework-Accessibility-10.2.tar.gz", hash = "sha256:275c9ac0df1350bf751dbddc81d98f7702cf03ad66e0271876cef9aa70ca5c24"}, + {file = "pyobjc_framework_Accessibility-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c801ad06fadc17f281102408d8a98a844739b3496b9799e2cef2b630a8bec312"}, + {file = "pyobjc_framework_Accessibility-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:861c6f7683c1bd769df85e677905a051f17f01a99a59cbba63b68c2f4bf46066"}, + {file = "pyobjc_framework_Accessibility-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:7e0a716b0cc89fbfb68d4ac0eba4bbd9c50a092255efa2794c4bb93b27b05b98"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-accounts" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Accounts on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Accounts-10.1.tar.gz", hash = "sha256:cb436af5b60f1d6a8a59f94d84ea6decba663598d5624fce29a0babf6fad0a89"}, - {file = "pyobjc_framework_Accounts-10.1-py2.py3-none-any.whl", hash = "sha256:30da31a76f2cfd0a4021eff4d4ff69e0a70b2f293290372f5909ae267d15a010"}, + {file = "pyobjc-framework-Accounts-10.2.tar.gz", hash = "sha256:40c8d7299b58b2300db0a6189a7c7056d38385e58700cb40137a744bb03708b7"}, + {file = "pyobjc_framework_Accounts-10.2-py2.py3-none-any.whl", hash = "sha256:9616c8c27f08baadfeea7c27fb1efac043e0785fbbbfbe05f20021402ac5295f"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-addressbook" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AddressBook on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AddressBook-10.1.tar.gz", hash = "sha256:9b8e01da07703990f0e745945b01cc75c59ade41913edbd6824194e21522efff"}, - {file = "pyobjc_framework_AddressBook-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2c6cb2278161ed55fba8b47515ff777a95265e484c51ad7a1c952747d8a411ee"}, - {file = "pyobjc_framework_AddressBook-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:10236b9112c8e5d83526804ca734a5f176bba435c2451c4b43c1247e76d9f73d"}, - {file = "pyobjc_framework_AddressBook-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e4305cf6366fa2e01040f490360283f572103be0a45d190774869915c2707c54"}, + {file = "pyobjc-framework-AddressBook-10.2.tar.gz", hash = "sha256:d6969fcbde1d78ec9fa0ebcefc2f453090e35d7590c4b4baf62174e060de6bce"}, + {file = "pyobjc_framework_AddressBook-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:6558b05e9d40a7f40650cddde9b71cb6fb536edf891985c977d4abc626f07a63"}, + {file = "pyobjc_framework_AddressBook-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c57347c04b11310f980e3d6cadc84ebc701d2216853108f9b708c03b0d295a59"}, + {file = "pyobjc_framework_AddressBook-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ba6eff580e4764dc9616b73cf4794cd44b4389b98f95696bac0bb5190f6a1211"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-adservices" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AdServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AdServices-10.1.tar.gz", hash = "sha256:54d2dd3084374213e31760bae9df1e6e9da3b3f1cc04787dae3ad53f8fc12f69"}, - {file = "pyobjc_framework_AdServices-10.1-py2.py3-none-any.whl", hash = "sha256:79ec6eb744635b72ffd0bdd5e55cb5ec57603633716861bbf40b236d8dba0dfd"}, + {file = "pyobjc-framework-AdServices-10.2.tar.gz", hash = "sha256:76eafba018c819c1770f88daa68d25fc5f06dc93a9f5e369d329d0f341dec3af"}, + {file = "pyobjc_framework_AdServices-10.2-py2.py3-none-any.whl", hash = "sha256:b03fcd460b632fc1b3fd8275060255e518933d1d0da06d6eda9b128b4e2999ec"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-adsupport" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AdSupport on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AdSupport-10.1.tar.gz", hash = "sha256:df6b2d1cc1202905dcf6bcdbf35121acc45c346a57b1048f5f4d1ea15bc29c9c"}, - {file = "pyobjc_framework_AdSupport-10.1-py2.py3-none-any.whl", hash = "sha256:d61f2e44f6c2ed5c33b6520754ef8ea22470f8ac3154912aa44bee4fb792255c"}, + {file = "pyobjc-framework-AdSupport-10.2.tar.gz", hash = "sha256:1eb76dc039d081e6d25b4fd334a3987bd9f73527a17844c421bcc8289dd16968"}, + {file = "pyobjc_framework_AdSupport-10.2-py2.py3-none-any.whl", hash = "sha256:4883ac30f1d78d764b57aacb46af78018f2302b9f7e8f4e1fccb25c3cb44ab74"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-applescriptkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AppleScriptKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AppleScriptKit-10.1.tar.gz", hash = "sha256:e41cd0037cbe0af4ffecc42339d1b6255f2539dfb6dedf4f2ae00ac1a260eecf"}, - {file = "pyobjc_framework_AppleScriptKit-10.1-py2.py3-none-any.whl", hash = "sha256:b88bc8ae9e000d382c3e1d72b3c4f39499323fbe88cc84af259925448c187387"}, + {file = "pyobjc-framework-AppleScriptKit-10.2.tar.gz", hash = "sha256:871452c17b15ce33337cd7ebd293fe31daef9f02f16ebb649efc36165cfb02da"}, + {file = "pyobjc_framework_AppleScriptKit-10.2-py2.py3-none-any.whl", hash = "sha256:15af7d97f017563ff3771127a2b7c515496aa6083497415cbe8c27dd5811c50f"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-applescriptobjc" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AppleScriptObjC on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AppleScriptObjC-10.1.tar.gz", hash = "sha256:cfcec31b25a4c201188936347697ff3eb1f79885a43af26559a572391c50cdf9"}, - {file = "pyobjc_framework_AppleScriptObjC-10.1-py2.py3-none-any.whl", hash = "sha256:500ed0e39bf2a4f2413d8d6dc398bb58f233ca3670f6946aa5c6d14d1b563465"}, + {file = "pyobjc-framework-AppleScriptObjC-10.2.tar.gz", hash = "sha256:71f90e41be6beb392a833d915d3af13d10526bfb29bf35cb9af1578b5ec52566"}, + {file = "pyobjc_framework_AppleScriptObjC-10.2-py2.py3-none-any.whl", hash = "sha256:41156fcc36acc3ca7bd0a62af47af4ab8089330c6072db6047b91b52f815f049"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-applicationservices" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ApplicationServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ApplicationServices-10.1.tar.gz", hash = "sha256:bb780eabadad0fbf36a128041dccfd71e30bbeb6b110852d37fd5c98f4a2ec04"}, - {file = "pyobjc_framework_ApplicationServices-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a74a0922b48ad5ac4e402a1ac5dda5d6ee0d177870b7e244be61bc95d639ba85"}, - {file = "pyobjc_framework_ApplicationServices-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff352c33cad3f7bf8dd9b955ebb5db02d451d88eb04478d83edf0edd0cc8bf5d"}, - {file = "pyobjc_framework_ApplicationServices-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6d0706d5d9436298c8d619a1bb5be11a1f4ff9f4733797a393c6a706568de110"}, - {file = "pyobjc_framework_ApplicationServices-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:95bd111583c3bf20656393c2a056a457b0cf08c76c0ab27cfcaedf92f707e8a9"}, - {file = "pyobjc_framework_ApplicationServices-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:90a2350ddae3d9fb7b2e35e3b672b64854edae497fda8d7d4d798679c8280fed"}, - {file = "pyobjc_framework_ApplicationServices-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8bc830ac60b73a4cab24d1b1fdd8b044f25fe02e0af63a92cd96c43a51808c96"}, + {file = "pyobjc-framework-ApplicationServices-10.2.tar.gz", hash = "sha256:f83d6ed3320afb6648be6defafe0f05bac00d0281fc84ee4766ff977309b659f"}, + {file = "pyobjc_framework_ApplicationServices-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2aebfed888f9bcb4f11d93f9ef9a76d561e92848dcb6011da5d5e9d3593371be"}, + {file = "pyobjc_framework_ApplicationServices-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:edfd3153e64ee9573bcff7ccaa1fbbbd6964658f187464c461ad34f24552bc85"}, + {file = "pyobjc_framework_ApplicationServices-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d2c89b246c19a041221ff36e9121c92e86a4422016f809a40f5ce3d647882d9"}, + {file = "pyobjc_framework_ApplicationServices-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee1e69947f31aad5fdec44921ce37f7f921faf50a0ceb27ed40b6d54f4b15d0e"}, + {file = "pyobjc_framework_ApplicationServices-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:101f5b09d71e55bd39e6e91f0787433805d422622336b72fde969a7c54528045"}, + {file = "pyobjc_framework_ApplicationServices-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a3ef00c9aea09c5ef5840b8749d0753249869bc30e124145b763cd0b4b81155"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreText = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreText = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-apptrackingtransparency" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AppTrackingTransparency on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AppTrackingTransparency-10.1.tar.gz", hash = "sha256:7d75a1d2c07b4d60e79c014b509f7a217b8e43ffb856b05aac5e12dfb03aa662"}, - {file = "pyobjc_framework_AppTrackingTransparency-10.1-py2.py3-none-any.whl", hash = "sha256:5dee7e163a6b325315410ca4929f1e07162403fc0f62d7d6a8dd504b544e1626"}, + {file = "pyobjc-framework-AppTrackingTransparency-10.2.tar.gz", hash = "sha256:2eb7276fc70c676562e33c3f7b2fe254175236f968516c63cc8507f325ac56db"}, + {file = "pyobjc_framework_AppTrackingTransparency-10.2-py2.py3-none-any.whl", hash = "sha256:de140b6b6ca1df928d13d986b093f19b8be0c9ab7c42f4121bdbf58f5c69df48"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-audiovideobridging" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AudioVideoBridging on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AudioVideoBridging-10.1.tar.gz", hash = "sha256:73d049a9d203541c12a672af37676c8dddf68217a3e9212510544cb457e77db0"}, - {file = "pyobjc_framework_AudioVideoBridging-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:574ead9349db4d37ec6db865cf71d8fdf74d5b4d4b577aa5c56c77a5c17f4fff"}, - {file = "pyobjc_framework_AudioVideoBridging-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e9ea894545e5ed1fa9b772dcea876bdb16dac9300e021a81f8b92ec8ed876efb"}, - {file = "pyobjc_framework_AudioVideoBridging-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:be025276db7bf431361f908c45af631c5c97a138069127ca43e679640fd2b935"}, - {file = "pyobjc_framework_AudioVideoBridging-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8d470904288e9ea7a9fb758cb704cbbebaec941c1e11d358c5260f117cbcad6"}, - {file = "pyobjc_framework_AudioVideoBridging-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a4ad2cb237ffaa3868eed2ed8869488cb44a8a85a63b2dfe6421be2cb5cbde9e"}, - {file = "pyobjc_framework_AudioVideoBridging-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:41e9ed25b14b30e5eb488a8278fd86cb0973a5677698b534a18c4917b7ec9f9d"}, + {file = "pyobjc-framework-AudioVideoBridging-10.2.tar.gz", hash = "sha256:94d77284aae3a151124aa170074c2902537f540debb076376d49f5ee54fb9ce1"}, + {file = "pyobjc_framework_AudioVideoBridging-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:180e0d1862ba7748a8e4dff0bfeb5dc162bc4d7b0c0888a333f11dbf2569af74"}, + {file = "pyobjc_framework_AudioVideoBridging-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1d68f51143e8da14940ea54edd1236e5cd229dcbc83350551945df285b482704"}, + {file = "pyobjc_framework_AudioVideoBridging-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e0bd4ed2f8a16795b1b46ea9bed746995044f2cd6afb808018ac9c1549dc60b4"}, + {file = "pyobjc_framework_AudioVideoBridging-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2300d1c9ac22cfa8ef80a86dcdf3bc0be1cfa26a61c560f976fbcd0abfb4f13c"}, + {file = "pyobjc_framework_AudioVideoBridging-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a5d48b8192385ef2e0bea47c7b65ca1e0d06d1bdc4a7da59f3d1df3932c5f11c"}, + {file = "pyobjc_framework_AudioVideoBridging-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3883a0f76187a120ad1478f674be245d2949d1bae436d697786ad4086d878b18"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-authenticationservices" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AuthenticationServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AuthenticationServices-10.1.tar.gz", hash = "sha256:2d686019564f18390ac16d3b225c6c8fead03d929e8cee16942fc532599e15be"}, - {file = "pyobjc_framework_AuthenticationServices-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:364b4f94171c78d5da9172fdf30ef71958da010d923f6fc8f673f8d2e3c8e9ef"}, - {file = "pyobjc_framework_AuthenticationServices-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:09636bd6614d440e0475ba05beba42aa79a73c4fe310e9e79dea4821e57685ae"}, - {file = "pyobjc_framework_AuthenticationServices-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:dd03dc0c4ad5c40a688ceca813b5c05ae99b72e6201a5a700d1d2722eee8fba3"}, + {file = "pyobjc-framework-AuthenticationServices-10.2.tar.gz", hash = "sha256:1be0f05458c4ebfc3e018cb59b4a8bd9022c42b18fea449b0fbf5def0b5f7ef7"}, + {file = "pyobjc_framework_AuthenticationServices-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c797abcd8fb1d9f0f48849093fcbf480814256fca9f1a835445f551a369541e2"}, + {file = "pyobjc_framework_AuthenticationServices-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cf172a06ffab3faa98a95041ce5205ec6c516b59513390d48cfafe17ff4add08"}, + {file = "pyobjc_framework_AuthenticationServices-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:3d6b81342caa28dbdc44c3f32820958e0b3865bd3e5bac7ba5ce9efc293e0d75"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-automaticassessmentconfiguration" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AutomaticAssessmentConfiguration on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AutomaticAssessmentConfiguration-10.1.tar.gz", hash = "sha256:c8f32f5586f7d7f9fd12343714c7439a1dfad5b5393f403aee440b5f91ef9f7d"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf009cddaa8d62eedaeb4878cc7acab80f4e9bb0bd83a5dff79590bab08b81ce"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c0ea6fa98e07a9cbcd90b7482022be5e1dc99e3170dcf2d4937ab17c5c2879dd"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4d47b95c515781fa5553443f38782f5e9b1aa7c1938449bcbb2377776441c54c"}, + {file = "pyobjc-framework-AutomaticAssessmentConfiguration-10.2.tar.gz", hash = "sha256:ead3f75200ad74dd013b4a6372054b84b2adeacdac656ca31e763e42fb76cf7b"}, + {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f4a60e1f1dae0d8d9223cb09c945aeb5688c09b3dffa9c6e9457981b05902874"}, + {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1ca34d71b7def8bf4e820e0ee64cae0d732309c6ddc126699a5bbd0c5719dc48"}, + {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:cb3242e2943768e02208c13b4eef47068f0e1ff8ad5572fabfaef7964737daaa"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-automator" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Automator on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Automator-10.1.tar.gz", hash = "sha256:0e95fc90a2930d108d38b61b4365f3678edd5aa25d26598fe39924c890813e80"}, - {file = "pyobjc_framework_Automator-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5c46ca5a97f6193432ad5195f6dfc261d66f70aea8371aa04f5c0ef85eb959f9"}, - {file = "pyobjc_framework_Automator-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e16540ca8f432de665997566e1cf1b43e8c7bea90a3460ab0aaccdb51bdac13c"}, - {file = "pyobjc_framework_Automator-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:0a8b26890e1b0728c7150cd81dfb7c3d091752e71550a5a8db27c703915b7f40"}, + {file = "pyobjc-framework-Automator-10.2.tar.gz", hash = "sha256:fb753e5bd40bfe720fa9e60e2ea5a1777b4c92082ffeba42b4055cdd56cb022d"}, + {file = "pyobjc_framework_Automator-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:0034f9e64c3e77b8e1adc54170868954af67b50457b768982de705d8cd170792"}, + {file = "pyobjc_framework_Automator-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e3b66af8ecd2effca8d51b512518137173b026ab13c30dbdac3d0d7ee059fc48"}, + {file = "pyobjc_framework_Automator-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d7f26be322fee0476125bfb2658a08db81b705ce0e8880e91c627562419a9821"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-avfoundation" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AVFoundation on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AVFoundation-10.1.tar.gz", hash = "sha256:07e065c6904fbd6afc434a79888461cdd4097b4153dd592dcbe9c8bef01ee701"}, - {file = "pyobjc_framework_AVFoundation-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3475f2a5c18cab80a23266470bc7014a88c8e1e8894e96f9f75e960b82679723"}, - {file = "pyobjc_framework_AVFoundation-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fad5c9190d633f51193a62c4354f2fb7be3511c31a0c58f17e351bb30bfadad3"}, - {file = "pyobjc_framework_AVFoundation-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:6ee76be15a6ad7caf9db71c682fb677d29df6c1bb2972ed2f21283f1b3e99f45"}, + {file = "pyobjc-framework-AVFoundation-10.2.tar.gz", hash = "sha256:4d394014f2477c0c6a596dbb01ef5d92944058d0e0d954ce6121a676ae9395ce"}, + {file = "pyobjc_framework_AVFoundation-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5f20c11a8870d7d58f0e4f20f918e45e922520aa5c9dbee61dc59ca4bc4bd26d"}, + {file = "pyobjc_framework_AVFoundation-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:283355d1f96c184e5f5f479870eb3bf510747307697616737bbc5d224af3abcb"}, + {file = "pyobjc_framework_AVFoundation-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a63a4e26c088023b0b1cb29d7da2c2246aa8eca2b56767fe1cc36a18c6fb650b"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreAudio = ">=10.1" -pyobjc-framework-CoreMedia = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreAudio = ">=10.2" +pyobjc-framework-CoreMedia = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-avkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AVKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AVKit-10.1.tar.gz", hash = "sha256:15779995d4bb3b231a09d9032cf42e8f2681e4271ee677076a08c60a1b45fac7"}, - {file = "pyobjc_framework_AVKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e73da23397f0d9397a5f78223b06a49873d11cce71f06d486316a006220b587"}, - {file = "pyobjc_framework_AVKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2ea71aa0c9230c37da6dab710b237ea67ea16a5ed2cd5f6123a562c8c6b6fa20"}, - {file = "pyobjc_framework_AVKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:3c00b4448d0480e92d7a0dfe62d92d42554ddb45c7183c256931e47dafca1dce"}, + {file = "pyobjc-framework-AVKit-10.2.tar.gz", hash = "sha256:6497a5109a29235a7fd8bddcb6d79bd495ccd9373b41e84ca3f012a642e5b880"}, + {file = "pyobjc_framework_AVKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:480766be9da6bb1a6272a4f13f6a327ec952fe1cd41eb0e7c3a07abb07a3491f"}, + {file = "pyobjc_framework_AVKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c9cfdc9ef8f7c9abe53841e8e548b2671f0a425ce9e0e4961314f5d080401e68"}, + {file = "pyobjc_framework_AVKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ff811fc88fb9d676a4892adea21a1a82384777af53153c74bb829501721f3374"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-avrouting" -version = "10.1" +version = "10.2" description = "Wrappers for the framework AVRouting on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-AVRouting-10.1.tar.gz", hash = "sha256:148fc29d0d5e73fb23ed64edede3f74d902ec41b7a7869435816a7a1b37aa038"}, - {file = "pyobjc_framework_AVRouting-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2a2d6524ac870a0b022beb33f0a9ec8870dfb62524d778b7cb54b7946705a3ac"}, - {file = "pyobjc_framework_AVRouting-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:643412674490719dc05c3e4c010e464d50b51e834428e97739510f513ecc008d"}, - {file = "pyobjc_framework_AVRouting-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:103e99db20099331afe637d4bcc39ec7c5d8fe3edefa2dd0a865d6f5d15b0f65"}, + {file = "pyobjc-framework-AVRouting-10.2.tar.gz", hash = "sha256:133d646cf36cfa329c2b3a060c7b81368a95bfbb24f30e2bae2804be65b93ec9"}, + {file = "pyobjc_framework_AVRouting-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:1f72c23e92981311e218a04f3cfcd0ef4c3a93058af6e0042c7cf835320300cc"}, + {file = "pyobjc_framework_AVRouting-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a91d65fda866e64bd249c0f11017d0d9f569b3e9d6d159c38e64e1b144a04d85"}, + {file = "pyobjc_framework_AVRouting-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:3357ed6b9bf583ded7eee4531ac1854c6e1cdfe91a278f2dec18593d2381d488"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-backgroundassets" -version = "10.1" +version = "10.2" description = "Wrappers for the framework BackgroundAssets on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-BackgroundAssets-10.1.tar.gz", hash = "sha256:0a770f77f7fe6d715cf02e95a5efb70895ee19736cf0fa0ecbb3c320f4fa3430"}, - {file = "pyobjc_framework_BackgroundAssets-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:82bfc758b8c542e0b155a922e0dc901fdcd6b6a7574f4575725cfadb8d248825"}, - {file = "pyobjc_framework_BackgroundAssets-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a4f6e2dea9f2cb507e94e0c3c621e2e6af613770a8595ff17aedb34dc2fa56b4"}, - {file = "pyobjc_framework_BackgroundAssets-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4dfe00a649dd7c7aee0f25daf96c8c35438ed69ec324bcad81d5a87110759a72"}, + {file = "pyobjc-framework-BackgroundAssets-10.2.tar.gz", hash = "sha256:97ad7b0c693e406950c0c4af2edc9320eac9aef7fdf33274903f526b4682fcb7"}, + {file = "pyobjc_framework_BackgroundAssets-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a71de388248ed05eda85abc440dbe3f04ff39567745785df25b1d5316b2aa9f1"}, + {file = "pyobjc_framework_BackgroundAssets-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:476a7fc80a4083405c82b0bb0d8551cccd10f998a2a9d35c8eab76c82915d25e"}, + {file = "pyobjc_framework_BackgroundAssets-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:9c8721ea4695f1cd5f1f7d6b2a70b3e2b9cefe484289b7427cfda5d23b48e7b6"}, +] + +[package.dependencies] +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" + +[[package]] +name = "pyobjc-framework-browserenginekit" +version = "10.2" +description = "Wrappers for the framework BrowserEngineKit on macOS" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyobjc-framework-BrowserEngineKit-10.2.tar.gz", hash = "sha256:a47648e62d3482d39179ffe51543322817dd7a639cef9dcd555dfcc7d6a6497f"}, + {file = "pyobjc_framework_BrowserEngineKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:98563b461e2c96ad387abe1885e91f7bc0686868b39c273774e087bbf1b500ac"}, + {file = "pyobjc_framework_BrowserEngineKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5eb3d8f9e198aaeb01a4a85aa739624942c39b626400d232271d632f1ee30e09"}, + {file = "pyobjc_framework_BrowserEngineKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:6824c528e10da1b560d83f55e258232b8916d49d12a578dd00d3ec4e702d3011"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreAudio = ">=10.2" +pyobjc-framework-CoreMedia = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-businesschat" -version = "10.1" +version = "10.2" description = "Wrappers for the framework BusinessChat on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-BusinessChat-10.1.tar.gz", hash = "sha256:f361139464532d84bb29d520f2b045a4a63e960d07a0dd574c6c15dd67f890ed"}, - {file = "pyobjc_framework_BusinessChat-10.1-py2.py3-none-any.whl", hash = "sha256:60df5660a9a90a461c68a6cb49326c25e81f3412e951e84be7ccc98b62eb5404"}, + {file = "pyobjc-framework-BusinessChat-10.2.tar.gz", hash = "sha256:44ecf240da59ce36f2d75d1ed9f58e05f2df46b9b1989ee0cc184a46c779fb4e"}, + {file = "pyobjc_framework_BusinessChat-10.2-py2.py3-none-any.whl", hash = "sha256:aa51d4d0b3b3eb050242e0d0e48b29e020ccfeb82a39c0d3a2289512734f53e4"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-calendarstore" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CalendarStore on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CalendarStore-10.1.tar.gz", hash = "sha256:6274d7eb94353813aefca236276c5b6dc6445a48fff39e832478db17c47e34c1"}, - {file = "pyobjc_framework_CalendarStore-10.1-py2.py3-none-any.whl", hash = "sha256:cbd8ec495d9b13cc986b018d8740e25a4e18a25732ee19de1311f0c30ab53120"}, + {file = "pyobjc-framework-CalendarStore-10.2.tar.gz", hash = "sha256:131c14faa227a251d7254afd9c00fef203361dd76224d9700ba5e99682e191d8"}, + {file = "pyobjc_framework_CalendarStore-10.2-py2.py3-none-any.whl", hash = "sha256:e289236df651953a41be8ee4ce548f477a6ab8e90aa8bbd73f46ad29032ff13f"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-callkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CallKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CallKit-10.1.tar.gz", hash = "sha256:9a5165f35e31d98b7d1539c9b979cabd01064926903389fc558cbc71bf86ddd4"}, - {file = "pyobjc_framework_CallKit-10.1-py2.py3-none-any.whl", hash = "sha256:f82e791b2dbae4adfcc596949975573309a0127ba02d4c35743501f6665ec610"}, + {file = "pyobjc-framework-CallKit-10.2.tar.gz", hash = "sha256:45cd81a5b6b0107ba56e26d8e54e852b8a15b3487b7291b5818e10e94beee6d0"}, + {file = "pyobjc_framework_CallKit-10.2-py2.py3-none-any.whl", hash = "sha256:f3f26c877743a340718e0647ccee4604f9d87aa8ad5c3268c794d94f6f9246ee"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-cfnetwork" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CFNetwork on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CFNetwork-10.1.tar.gz", hash = "sha256:898fa3ec863b9d72b3262135e1b0a24bc73879b65c69a2a7b213fe840e2a11de"}, - {file = "pyobjc_framework_CFNetwork-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:82f6fa09d67e25ef1cd92596b25328a6c295341c40a572e899c9e858ce949a1d"}, - {file = "pyobjc_framework_CFNetwork-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c598f18e50480a92df3c69c22cd1752844eb487176ada5e1c1b80670fb05e4eb"}, - {file = "pyobjc_framework_CFNetwork-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:90697ae10c7fb83d81f25d3800f33846329121bedefd495b45d47a0f0d996a73"}, + {file = "pyobjc-framework-CFNetwork-10.2.tar.gz", hash = "sha256:18ebd22c645b5b77c1df6d973a91cc035ddd4666346912b2a0c847803c23f4d4"}, + {file = "pyobjc_framework_CFNetwork-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:6050428c99505e09db1fe5d0eafaaca4ead407ffaaab8a5c1e5ec09e7ad31053"}, + {file = "pyobjc_framework_CFNetwork-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f7a305d7f94a11dd32d3ab9159cde1f9655f107282373841668624b124935af8"}, + {file = "pyobjc_framework_CFNetwork-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:41a211b934afebbc9dd9ce76cb5c2862244a699a41badb660ab46c198414c4cb"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-cinematic" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Cinematic on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Cinematic-10.1.tar.gz", hash = "sha256:a1210338de5a739b00304555ce15b70b36deebdbd3c6940f8e9531253219edce"}, - {file = "pyobjc_framework_Cinematic-10.1-py2.py3-none-any.whl", hash = "sha256:73408d3bfd9b08389eb6787b0b5df4fe9c351c936fa9b1f95a9c723951e9a988"}, + {file = "pyobjc-framework-Cinematic-10.2.tar.gz", hash = "sha256:514effad241be5c8df4ef870683fa1387909970a7f7d8bbf343c06e840931854"}, + {file = "pyobjc_framework_Cinematic-10.2-py2.py3-none-any.whl", hash = "sha256:962af237b284605ecd30d584d2d7fb75fda40e429327578de5d651644d0316da"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-AVFoundation = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreMedia = ">=10.1" -pyobjc-framework-Metal = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-AVFoundation = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreMedia = ">=10.2" +pyobjc-framework-Metal = ">=10.2" [[package]] name = "pyobjc-framework-classkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ClassKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ClassKit-10.1.tar.gz", hash = "sha256:baf79b1296662525d0fa486d4488720cceebe63595765cfeade61aeb78a4216f"}, - {file = "pyobjc_framework_ClassKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:502949573701363947bf64f7ac9dedab7247037c0e53c7db080c871f3ca52aa8"}, - {file = "pyobjc_framework_ClassKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e6d7c2e8b87b285ce21582c602be23960349e23111c8d02bcc3b9192090b437e"}, - {file = "pyobjc_framework_ClassKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5ac34c1d491e15f81df83b406a281d3176fff8476e053bb8476cad7e4fa102e7"}, + {file = "pyobjc-framework-ClassKit-10.2.tar.gz", hash = "sha256:252e47e3284491e48000d4d87948b31e396aaa78eaf2447ba03a71f4b97cb989"}, + {file = "pyobjc_framework_ClassKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:9d5f69e7bba660ca989e699d4b38a93db7ee3f8cff45e67a23fb852ac3caab49"}, + {file = "pyobjc_framework_ClassKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e1acc7231ef030125eaf7302f324909c56ba1c58ff91f4e160b6632938db64df"}, + {file = "pyobjc_framework_ClassKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:87158ca3d7cd78c50af353c23f32e1e8eb0adec47dc15fa4e4d777017d308b80"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-cloudkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CloudKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CloudKit-10.1.tar.gz", hash = "sha256:8f0109f29ac6554c22cc21c06f6fd0a23e3e49556b0ab2532eb1d69ac2a7cd96"}, - {file = "pyobjc_framework_CloudKit-10.1-py2.py3-none-any.whl", hash = "sha256:ffdedaaa8384a64df6b30d45c834dffa002a63b8e74578012b6261780f31c28c"}, + {file = "pyobjc-framework-CloudKit-10.2.tar.gz", hash = "sha256:497a0dda5f5a9aafc795e1941ef3e3662c2f3240096ce68893d0d5de6d54a474"}, + {file = "pyobjc_framework_CloudKit-10.2-py2.py3-none-any.whl", hash = "sha256:32bd77c2b9109113b2321feb6ed6d754af99df6569d953371f1547123be80467"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Accounts = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreData = ">=10.1" -pyobjc-framework-CoreLocation = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Accounts = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreData = ">=10.2" +pyobjc-framework-CoreLocation = ">=10.2" [[package]] name = "pyobjc-framework-cocoa" -version = "10.1" +version = "10.2" description = "Wrappers for the Cocoa frameworks on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Cocoa-10.1.tar.gz", hash = "sha256:8faaf1292a112e488b777d0c19862d993f3f384f3927dc6eca0d8d2221906a14"}, - {file = "pyobjc_framework_Cocoa-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e82c2e20b89811d92a7e6e487b6980f360b7c142e2576e90f0e7569caf8202b"}, - {file = "pyobjc_framework_Cocoa-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0860a9beb7e5c72a1f575679a6d1428a398fa19ad710fb116df899972912e304"}, - {file = "pyobjc_framework_Cocoa-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:34b791ea740e1afce211f19334e45469fea9a48d8fce5072e146199fd19ff49f"}, - {file = "pyobjc_framework_Cocoa-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1398c1a9bebad1a0f2549980e20f4aade00c341b9bac56b4493095a65917d34a"}, - {file = "pyobjc_framework_Cocoa-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:22be21226e223d26c9e77645564225787f2b12a750dd17c7ad99c36f428eda14"}, - {file = "pyobjc_framework_Cocoa-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0280561f4fb98a864bd23f2c480d907b0edbffe1048654f5dfab160cea8198e6"}, + {file = "pyobjc-framework-Cocoa-10.2.tar.gz", hash = "sha256:6383141379636b13855dca1b39c032752862b829f93a49d7ddb35046abfdc035"}, + {file = "pyobjc_framework_Cocoa-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9227b4f271fda2250f5a88cbc686ff30ae02c0f923bb7854bb47972397496b2"}, + {file = "pyobjc_framework_Cocoa-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6a6042b7703bdc33b7491959c715c1e810a3f8c7a560c94b36e00ef321480797"}, + {file = "pyobjc_framework_Cocoa-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:18886d5013cd7dc7ecd6e0df5134c767569b5247fc10a5e293c72ee3937b217b"}, + {file = "pyobjc_framework_Cocoa-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ecf01400ee698d2e0ff4c907bcf9608d9d710e97203fbb97b37d208507a9362"}, + {file = "pyobjc_framework_Cocoa-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:0def036a7b24e3ae37a244c77bec96b7c9c8384bf6bb4d33369f0a0c8807a70d"}, + {file = "pyobjc_framework_Cocoa-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5f47ecc393bc1019c4b47e8653207188df784ac006ad54d8c2eb528906ff7013"}, ] [package.dependencies] -pyobjc-core = ">=10.1" +pyobjc-core = ">=10.2" [[package]] name = "pyobjc-framework-collaboration" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Collaboration on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Collaboration-10.1.tar.gz", hash = "sha256:e85c6bd8b74b1707f66847ed71de077565d5e9fe6e7ed4db3cdafc2408723da5"}, - {file = "pyobjc_framework_Collaboration-10.1-py2.py3-none-any.whl", hash = "sha256:9a2137aaed1ad71bf6c92c7c275253c2dc6f0062af9d2d8a1590d00bf30c1ecb"}, + {file = "pyobjc-framework-Collaboration-10.2.tar.gz", hash = "sha256:32e3a7fe8447f38fd3be5ea1fe9c1e52efef3889f4bd5781dffa3c5fa044fe20"}, + {file = "pyobjc_framework_Collaboration-10.2-py2.py3-none-any.whl", hash = "sha256:239a0505d702d49b5c3f0a3524531f9be63d599ea2cd3cbb5953147b34dbdcc1"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-colorsync" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ColorSync on Mac OS X" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ColorSync-10.1.tar.gz", hash = "sha256:2c6ee65dfca6bc41f0e9dffaf1adebc78a7fb5cee63740b092ade226710c1c32"}, - {file = "pyobjc_framework_ColorSync-10.1-py2.py3-none-any.whl", hash = "sha256:58596365b270453c3ce10bb168383c615321fa377a983eba3021f664c98f852a"}, + {file = "pyobjc-framework-ColorSync-10.2.tar.gz", hash = "sha256:108105c281b375dff7d226fcc3f860621a4880dcbab711660b74dc458a506231"}, + {file = "pyobjc_framework_ColorSync-10.2-py2.py3-none-any.whl", hash = "sha256:2fcc68eb6fa6300d34b95b1da1cc8d244f6999aed4b83099a3323d32e0349f98"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-contacts" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Contacts on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Contacts-10.1.tar.gz", hash = "sha256:949d61ff7f4f07956949f8945ad627ffa89cce3d10af9442591e519791a25cc4"}, - {file = "pyobjc_framework_Contacts-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b10c068b5a79fcb0240ea4cd1048162277f36567a84333a0bd0168f851168f99"}, - {file = "pyobjc_framework_Contacts-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a3bb6fb24deae41a0879ac321e6401b43e5fbedba0a75ced67b2048a4852c3ff"}, - {file = "pyobjc_framework_Contacts-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:16556f06202b1b4fd9da8e3186b6140b582a4032437cdab2f5f8b32b24f3e3ed"}, + {file = "pyobjc-framework-Contacts-10.2.tar.gz", hash = "sha256:5a9de975f41c7dac3c219b4c60cd08b8ba385685db7997c8622f19e0a43e6857"}, + {file = "pyobjc_framework_Contacts-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5ff801009c9346927b7efc82434ac14a0c2798bd018daf1e7d8aad74484b490"}, + {file = "pyobjc_framework_Contacts-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:52dd5e4b4574b2438420a56867ca2069e29414087dc27ad03e7c46d536f1e641"}, + {file = "pyobjc_framework_Contacts-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:8a387c47e90c74a3e6f4bc81187f1fde18a020bb1d08067497a0c35f462299f9"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-contactsui" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ContactsUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ContactsUI-10.1.tar.gz", hash = "sha256:0b97e4c5599ab269f53597dd8f47a45599434c833e72185d5d3a257413a6faf4"}, - {file = "pyobjc_framework_ContactsUI-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5c70ff6b07e48331f25138bc159f7215d9b5d6825da844fec26ba403aad53f52"}, - {file = "pyobjc_framework_ContactsUI-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:876c1280fcb13c89a5fd89e7c3ace04bfd3c3b418cb64b6579dcbee1e9156377"}, - {file = "pyobjc_framework_ContactsUI-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a5ee22f1e893eb79633ed425972e50c5ec9b0a1d20cf6fbf21bf68d1bbfec436"}, + {file = "pyobjc-framework-ContactsUI-10.2.tar.gz", hash = "sha256:2dd5f1993c36caf13527de0890c6c49c08a339e58bc3b3fa303d5a04b672b418"}, + {file = "pyobjc_framework_ContactsUI-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c8af8b52853ba2a09664dad40255613f01089c9bc77e5316b29d27c65603863c"}, + {file = "pyobjc_framework_ContactsUI-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:47a8fd0aa5cb680b0ba0f1fdd37f56525729e5ed998df2a312e9f81feea8fbb0"}, + {file = "pyobjc_framework_ContactsUI-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:0575650e6e5985950bcd424da0b50e981ea5e6819d1c6fbccb075585e424e121"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Contacts = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Contacts = ">=10.2" [[package]] name = "pyobjc-framework-coreaudio" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreAudio on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreAudio-10.1.tar.gz", hash = "sha256:713ca82fc363ea6cf373d2db0b183f39058bcadceb8229d9e8839b783104f8e2"}, - {file = "pyobjc_framework_CoreAudio-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9348f613a1f35bbeb7d1d899e2ee3876881cd0433e59f584f30ba96e179d960a"}, - {file = "pyobjc_framework_CoreAudio-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0192dddd2f99db51cdb0959e80f29f9f531ba8bd0421e06ae9212f34a05c48a"}, - {file = "pyobjc_framework_CoreAudio-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b1a4612ce87dfcca3c939ec5885d4578955f5ff4d017f95d4459d5fb3bdc8970"}, - {file = "pyobjc_framework_CoreAudio-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:678d2b916850daf7fe38a95af0f73b4dd39b463ea87ec36fe287d81d050c31f7"}, - {file = "pyobjc_framework_CoreAudio-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:807fa54de91d53ff64537e50aa123c5b262952c57eea6928ecb3d526078229c2"}, - {file = "pyobjc_framework_CoreAudio-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:db149cabae1b91ea437536e1741b6e7573a71ec2aae4274318172936a5ac7190"}, + {file = "pyobjc-framework-CoreAudio-10.2.tar.gz", hash = "sha256:5e97ae7a65be85aee83aef004b31146c5fbf28325d870362959f7312b303fb67"}, + {file = "pyobjc_framework_CoreAudio-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:65ce01a9963692d9cf94aef36d8e342eb2e75b855a2f362f9cbcef9f3782a690"}, + {file = "pyobjc_framework_CoreAudio-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:22b5017ed340f9d3137baacb5f0c2354266017a4ed21890a795a0667788fc0cd"}, + {file = "pyobjc_framework_CoreAudio-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32608ce881b5e6a7cb332c2732762fa93829ac495c5344c33e8e8b72a2431b23"}, + {file = "pyobjc_framework_CoreAudio-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5182342257be1cdaa64bc38045cd81aca5b60bb86a9444194adbff58706ce91"}, + {file = "pyobjc_framework_CoreAudio-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:94ec138f95801019ec7f3e7010ad6f2c575aea69d2428aa9f5b159bf0355034a"}, + {file = "pyobjc_framework_CoreAudio-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:04ad3dddff27cb65d31a432aa1aa6290ff5d82a54bc5825da44ed7d80bcdb925"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-coreaudiokit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreAudioKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreAudioKit-10.1.tar.gz", hash = "sha256:85472aaee6360940f679a5e068b5a21160f8cee676d9fd0937b43b39c447d78e"}, - {file = "pyobjc_framework_CoreAudioKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:bde3012be239328fdc928d0ff9da9f4627e6ab4832e05faaa0c0ea4e11078d14"}, - {file = "pyobjc_framework_CoreAudioKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:43e9643ce390e36c64dca98a1bbcb0c2c282c527d31eb52aa2b7a18e2f7c97d1"}, - {file = "pyobjc_framework_CoreAudioKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:65bb2c5870b1739703fce056cdc4daddcdcf644c1ddcb590e4b88b5ed2fc45a4"}, + {file = "pyobjc-framework-CoreAudioKit-10.2.tar.gz", hash = "sha256:38dfafba8eddb655aac352a967c0e713a90e10a4dd40d4ea1abbb4db01c5d33f"}, + {file = "pyobjc_framework_CoreAudioKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:aede4cd58a67008b014757178a01b984ee585cc055133a9eb8f10b310d764de8"}, + {file = "pyobjc_framework_CoreAudioKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:4fb992025df80b8799fbd1605b0dd4b4b3f6b467c375a16da1b286f6ac2e2854"}, + {file = "pyobjc_framework_CoreAudioKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:28f17803e5eaf35a73caa327cbd0c857efbfdea57307637a60ff8309834b7a95"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreAudio = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreAudio = ">=10.2" [[package]] name = "pyobjc-framework-corebluetooth" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreBluetooth on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreBluetooth-10.1.tar.gz", hash = "sha256:81f50fcd9ee24332f1ad85798d489cfc05be739fcc1389caa6d682e034215efd"}, - {file = "pyobjc_framework_CoreBluetooth-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:145540ae4f35992774e559840a778554f3d3d29b359ff6d7f450c954cacccf0f"}, - {file = "pyobjc_framework_CoreBluetooth-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1ef97e8479895048fa96d5afa2f88139a8432158d6b0fb80ad1db03666c1d4ad"}, - {file = "pyobjc_framework_CoreBluetooth-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e8bce7f425caa55a87b7519eff03eaa7d08ff5e5e09e9318706d3f5087b63b08"}, + {file = "pyobjc-framework-CoreBluetooth-10.2.tar.gz", hash = "sha256:fb69d2c61082935b2b12827c1ba4bb22146eb3d251695fa1d58bbd5835260729"}, + {file = "pyobjc_framework_CoreBluetooth-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:6e118f08ae08289195841e0066389632206b68a8377ac384b30ac0c7e262b779"}, + {file = "pyobjc_framework_CoreBluetooth-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:411de4f937264b5e2935be25b78362c58118e2ab9f6a7af4d4d005813c458354"}, + {file = "pyobjc_framework_CoreBluetooth-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:81da4426a492089f9dd9ca50814766101f97574675782f7be7ce1a63197d497a"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-coredata" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreData on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreData-10.1.tar.gz", hash = "sha256:01dfbf2bfdaa4e0aa3e636025dc868ddb62aedf710890e6af94106278f1659aa"}, - {file = "pyobjc_framework_CoreData-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ff280c893c6d472168696fa0732690809af2694167081b5db87395c25cdf6e27"}, - {file = "pyobjc_framework_CoreData-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c51d8e4723ed113684d0ddd4240900a937682859a9e75d830f35783098f04e95"}, - {file = "pyobjc_framework_CoreData-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a8a8d509ff17f65f4cec7fb35d77a21937f2c8232b5ce357e783cbf971616ad9"}, + {file = "pyobjc-framework-CoreData-10.2.tar.gz", hash = "sha256:0260bbf8f4ce6071749686fdc079618b3bd2b07976db7db4c864ecc62316bb3b"}, + {file = "pyobjc_framework_CoreData-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:41a22fe04544ba35e82232d89ad751b452c2314f07df6c72129a5ad6c3e4cbec"}, + {file = "pyobjc_framework_CoreData-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c29c6dce8ce155e15e960b9c542618516923c3ef55a50bf98ec95e60afe0aa3d"}, + {file = "pyobjc_framework_CoreData-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:cd7c419d9067ce9a9f83f6abd3c072caeb3aa20091f779881375067f7c1c417b"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-corehaptics" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreHaptics on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreHaptics-10.1.tar.gz", hash = "sha256:87c1913078963b2d7dba231839566f831f47499c4c029f8beaa46209630e75e1"}, - {file = "pyobjc_framework_CoreHaptics-10.1-py2.py3-none-any.whl", hash = "sha256:ae6143c041b0846a58199826c0094cfb2fb9080f139c93e6b63f51a6b2766552"}, + {file = "pyobjc-framework-CoreHaptics-10.2.tar.gz", hash = "sha256:7b98bd70b63506aef63401a6e03f67391d7582f39fbe8aa7bb7258dd66ab0e55"}, + {file = "pyobjc_framework_CoreHaptics-10.2-py2.py3-none-any.whl", hash = "sha256:c67fae4b543fc070cece622cfe5803796016a36d1020812428e0f22e5f5674aa"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-corelocation" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreLocation on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreLocation-10.1.tar.gz", hash = "sha256:f43637443c4386233c52b0af3131a545968229543f7b0050764298cac1604fd8"}, - {file = "pyobjc_framework_CoreLocation-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:66bad050f37966526017763e5a8c424e257a0974cfbe0c8875fa149bdc1d41c2"}, - {file = "pyobjc_framework_CoreLocation-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:eaa4ff8e3cc388f045a6c15f3ee5a950860164f6fb5a13aed29e37b6cb481607"}, - {file = "pyobjc_framework_CoreLocation-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f4dcf52c4934e99b20056f2ebc8398c9f8f8a61ceac0e5de1e2bb719b0f844c2"}, + {file = "pyobjc-framework-CoreLocation-10.2.tar.gz", hash = "sha256:59497cc210023479e03191495c880e61fb6f44ad6c435ed1c8dd8def39f3aada"}, + {file = "pyobjc_framework_CoreLocation-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c2e02352a4dfbc090cebc9c0d3716470031e584d4d33f22d97307f04c23ef01f"}, + {file = "pyobjc_framework_CoreLocation-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f7eda101abb366be52d2fd85e15c79fdf0b9f64de9aab87dc0577653375595de"}, + {file = "pyobjc_framework_CoreLocation-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:8f67af17b8267aa2a066684b518e66bbe7fee9651b779e372d6286d65914df82"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-coremedia" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreMedia on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreMedia-10.1.tar.gz", hash = "sha256:8210d03ff9533d5cef3244515c1aa4bb54abaeb93dfc20be6d87e3a6b3377b36"}, - {file = "pyobjc_framework_CoreMedia-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7bd43d614f0427732ce1690e0640f1d7a40a73dd90142ac08c5dab2ba0d49e8d"}, - {file = "pyobjc_framework_CoreMedia-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5c1f849ce7de96da6fc81dc8975ecf04444c7179129976b3fe064d9f85a91082"}, - {file = "pyobjc_framework_CoreMedia-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab9e44e0d3ce584a119c3b3d539de9d228b635cb98bf60f1e1a221f8aa20681e"}, - {file = "pyobjc_framework_CoreMedia-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fffc355c038dfaa83f7d7c01497fb20590f9090421564b275cd8fd12e8e10e8e"}, - {file = "pyobjc_framework_CoreMedia-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:e4e9221c5a4c0b7ff7484eb8a21e06be0cafc1c95b9bcc27a57c139b64692dbe"}, - {file = "pyobjc_framework_CoreMedia-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b61e986b686d4e928208c26a4a2163210e101fcec56eeb61d62b969802eaa8ca"}, + {file = "pyobjc-framework-CoreMedia-10.2.tar.gz", hash = "sha256:d726d86636217eaa135e5626d05c7eb0f9b4529ce1ed504e08069fe1e0421483"}, + {file = "pyobjc_framework_CoreMedia-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0c91037fd4f9995021be9e849f1d7ac74579291d0130ad6898e3cb1940f870e1"}, + {file = "pyobjc_framework_CoreMedia-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63ed4f6dbe33e5f3d5293a78674329cb516a256df34ef92e7c1fefacdb5c32db"}, + {file = "pyobjc_framework_CoreMedia-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7fa13166a14d384bb6442e5f635310dd075c2a4b3b3bd67ac63b1e2e1fd2d65e"}, + {file = "pyobjc_framework_CoreMedia-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd7da9da1fad7168a63466d5c267dea8bce706808557baa960b6a931010dca48"}, + {file = "pyobjc_framework_CoreMedia-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:c48c7f0c3709a900cd11002018950a72626af39a096d1001bb9a871574db794f"}, + {file = "pyobjc_framework_CoreMedia-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d3e86d03c6d7909058b8f1b8e54d9b5d93679049c7980eb0a5d930a5a63410e0"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-coremediaio" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreMediaIO on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreMediaIO-10.1.tar.gz", hash = "sha256:c07177c58c88b6de229f88f3b88b4d97bfc59d2406f751b5aff6bed5cac4d938"}, - {file = "pyobjc_framework_CoreMediaIO-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d44781e21632f3af8eab86194b2fe32ce235b6c6a03ff87f09e0ba034a1e7a73"}, - {file = "pyobjc_framework_CoreMediaIO-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c97bd803a17204a2ec2d9f22c14176009067359efe80b9df69e8ec197783091c"}, - {file = "pyobjc_framework_CoreMediaIO-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d137b0eef1533af244c70ab02f1ed5716dcc8739b0ba6b6c703d36a61d9bab2e"}, + {file = "pyobjc-framework-CoreMediaIO-10.2.tar.gz", hash = "sha256:12f9fd93e610e61258f1acb023b868ed196e9444c69e38dfd314f8c256d07c9e"}, + {file = "pyobjc_framework_CoreMediaIO-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4ede4da59fa2a611b4a9d5a532e0c09731f448186af6cc957ab733b388f86d5b"}, + {file = "pyobjc_framework_CoreMediaIO-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:184854c2ebc3d12466ad39e640b5f3d2bdb3792d8675c83f499bb48b078d3d91"}, + {file = "pyobjc_framework_CoreMediaIO-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:aa9418277d16a1d5c0b576ad8a35f8e239d3461da60bb296df310090147331f7"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-coremidi" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreMIDI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreMIDI-10.1.tar.gz", hash = "sha256:e2e407dcb9d5ed53e0a8ed4622429a56c9770c26e2e4455dcb76a6620a12eba6"}, - {file = "pyobjc_framework_CoreMIDI-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b632773bea0c943a1f733166aece7560f32237a42706124d1f001b10620c4bcc"}, - {file = "pyobjc_framework_CoreMIDI-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:065cf89ee58b01700780fbbed0c00e1c5f5f383ac3d54f31642ee6d59e3c03c2"}, - {file = "pyobjc_framework_CoreMIDI-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:8984ad04837efc8bc7cbf1d48ff3433eb7fea1d298ed8b72344ec1641826df48"}, + {file = "pyobjc-framework-CoreMIDI-10.2.tar.gz", hash = "sha256:8168cb1e57e5dbc31648cd68d9afe3306cd2751de03275ef5f7f9b6483f17c07"}, + {file = "pyobjc_framework_CoreMIDI-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:809a79fbf384df94884dfddcab4dad3e68eba9e85591f7b55d24f4af2fb8db94"}, + {file = "pyobjc_framework_CoreMIDI-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a48176d5f49f9e893f5a7ac86f7cd7ee63b66dc7941ef74c04876f87a1ae3475"}, + {file = "pyobjc_framework_CoreMIDI-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:cce95647865c7f374d3c9cf853a3a8a44ae06fda6fa2e65fc7ad6450dc60e50f"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-coreml" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreML on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreML-10.1.tar.gz", hash = "sha256:4cda220d5ad5b677a95d4d29256b076b411b692b64219c2dcb81c702fc34d57d"}, - {file = "pyobjc_framework_CoreML-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:fb85e653a0f7984fff908890b7988d9d5ac42ff92b213cd9371bb255982ee787"}, - {file = "pyobjc_framework_CoreML-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a361d35c75e749a975330f7647084a58c2166f076ecc5573491542b96bc84c28"}, - {file = "pyobjc_framework_CoreML-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4c3b43da4afb279b02bbb6a57a3c5fb4d24ad6d48ef40c20efcda783e41077d2"}, + {file = "pyobjc-framework-CoreML-10.2.tar.gz", hash = "sha256:a1d7743a91160d096ccd3f5f5d824dafdd6b99d0c4342e8c18852333c9b3318e"}, + {file = "pyobjc_framework_CoreML-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ab99248b8ace0bebb11d15eb4094d8017093ebf76dadf828e324cacc9f1866f1"}, + {file = "pyobjc_framework_CoreML-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:074b81c0e0e4177d33b2da8267d377fb7842b47eb7b977bb07d674b9b05c32b5"}, + {file = "pyobjc_framework_CoreML-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:baedffd5ab34dc0294c2c30ad1b5bcff175957f51f107b1f9f8b20f80e15cc9c"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-coremotion" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreMotion on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreMotion-10.1.tar.gz", hash = "sha256:907a2f6da592f61d49f06559b34fc5addd8c0f2b85f9f277c5e4ea5d95247b67"}, - {file = "pyobjc_framework_CoreMotion-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:630487c14e22c0c05ddc33a149db673d8a28a876b59a78ed672f1a4825ebf40e"}, - {file = "pyobjc_framework_CoreMotion-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2219096ceb41aea91819df747c08059885f94ca14c66a078d3161ba49c1cb56e"}, - {file = "pyobjc_framework_CoreMotion-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:de694971994df2791047c2a1039556ea54683fd09cdc30c23ee5891c63414232"}, - {file = "pyobjc_framework_CoreMotion-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81b138a672519ecbea8a2f2392a7f015f3d7caf150368f83b3b278cb60743e8c"}, - {file = "pyobjc_framework_CoreMotion-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:b6cbbee7d26ef1837e382566316cb5d5fae6bca10418437608ebc312f396f898"}, - {file = "pyobjc_framework_CoreMotion-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9968b07199532b1c4ff56d1d6a6195e8ce8bc2beabbf55dc53193f473b3741f9"}, + {file = "pyobjc-framework-CoreMotion-10.2.tar.gz", hash = "sha256:1e1827f2f811ada123dd42809bc86f04a4c1ae3cec619ccf0f05a9387412bec1"}, + {file = "pyobjc_framework_CoreMotion-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:804abc6b22db933e7fb7ba3e60b30f4c60e8921f8bb5790c3612375f7b4a6f03"}, + {file = "pyobjc_framework_CoreMotion-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:76d5a2ed1cba375e3c423887bd93bbaab849c7a961156c5cead8e1429c26c24d"}, + {file = "pyobjc_framework_CoreMotion-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c0a8022dca1404795e93cd7317bca9f8ad601f3ecec7bed71312d80adad296e4"}, + {file = "pyobjc_framework_CoreMotion-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b727d5301ec386b8aa94de69a9257a412a4edbd69ca394d76b83d9f2bec6bc96"}, + {file = "pyobjc_framework_CoreMotion-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:7e4571a08475428a8171a237284036a990011f212497f141222d281fa7e2ca5c"}, + {file = "pyobjc_framework_CoreMotion-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bef81c52af0d1be75b3bd7514d5f9ef7c6e868f385f0dd8c28ad62e5d3faeeb6"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-coreservices" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreServices-10.1.tar.gz", hash = "sha256:43d507f2b3d84a5aab808c3f67bf21fb6a7d1367d506e2e9877bf1cac9bad2eb"}, - {file = "pyobjc_framework_CoreServices-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:73162798c506f6d767e2684d7c739907c96a5547045d42e01bee47639130b848"}, - {file = "pyobjc_framework_CoreServices-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:eba7abba8f5ba194a5ef1ffeb5f9d3c0daa751e07ef0d3662e35e27e75a24d73"}, - {file = "pyobjc_framework_CoreServices-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:924bca5a67e9046e8c6146dbc1301fe22c2a1bd49bef92358fd6330ef19cfa65"}, + {file = "pyobjc-framework-CoreServices-10.2.tar.gz", hash = "sha256:90fa09e68e840fdd229b33354f4b2e55e9f95a221fcc30612f4bd92cdc530518"}, + {file = "pyobjc_framework_CoreServices-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2b0c6142490c7099c5be0a2fa10b1816e4280bc04ac4e5a4a9af17a9c2006482"}, + {file = "pyobjc_framework_CoreServices-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c2c05674d9d142abc62fcc8e39c8484bdcdfd3ad8a17f009b8aa7c631e227571"}, + {file = "pyobjc_framework_CoreServices-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f87ad202d896e596b31c98a9d0378b2e6d2e6732a2dfc7b82ceae4c70863364d"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-FSEvents = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-FSEvents = ">=10.2" [[package]] name = "pyobjc-framework-corespotlight" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreSpotlight on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreSpotlight-10.1.tar.gz", hash = "sha256:b50e13d55d90b88800c2cc2955c000ea6b1de6481ff6e0092c7b7bf94fceea69"}, - {file = "pyobjc_framework_CoreSpotlight-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:421e18ded971c212fd3f2878658c209c81d1f8859eb62dd6a965abcb19a4ce5a"}, - {file = "pyobjc_framework_CoreSpotlight-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c775e0d42ee21f7d6b9374b01df1a0d4ece0b765e99c7011cb2ea74a2c2ef275"}, - {file = "pyobjc_framework_CoreSpotlight-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:7dc11f607429e21c2aee18f950cdde141a414c874369dbb66920930802cfd0fa"}, + {file = "pyobjc-framework-CoreSpotlight-10.2.tar.gz", hash = "sha256:bc4ac490953db29f6a58bc6fca6f819f8a810d0bb15d5f067451b3a8cad1cb50"}, + {file = "pyobjc_framework_CoreSpotlight-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f69dc88ddfa116262009b15ac302b880aef2dad878bf472cbf574f4473f4b059"}, + {file = "pyobjc_framework_CoreSpotlight-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:09912188648e658a0f579bbfd2cf6765afb8e0f466ee666e24019cc9931b6bc5"}, + {file = "pyobjc_framework_CoreSpotlight-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:75ba49ee4bfdbf4df733bc8c508b4417f47c442a56b83ffe5527e76e1c5bad67"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-coretext" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreText on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreText-10.1.tar.gz", hash = "sha256:b6a112e2ae8720be42af19e0fe9b866b43d7e9196726caa366d61d18294e6248"}, - {file = "pyobjc_framework_CoreText-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6ea2920c126a8a39e8a13b6de731b78b391300cec242812c9fbcf65a66ae40cf"}, - {file = "pyobjc_framework_CoreText-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:37b203d832dd82bd9566c72eea815eb89f00f128a4c9a2f352843914da4effec"}, - {file = "pyobjc_framework_CoreText-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:083700483b18f337b0c43bdfaafc43467846f8555075669d4962d460d9d6cd00"}, - {file = "pyobjc_framework_CoreText-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:59472cd1a33e83803fa62b3db20ac0e899f5ed706d22704ea81129d3f49ff0c7"}, - {file = "pyobjc_framework_CoreText-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:cc1a63ca2c6921768b1c794ce60e2a278e0177731aa4bf8f620fdde857e4835e"}, - {file = "pyobjc_framework_CoreText-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fbbdde4ce747bcad45c2aded36167ad00fead309a265d89ab22289c221038e57"}, + {file = "pyobjc-framework-CoreText-10.2.tar.gz", hash = "sha256:59ef8ca8d88bb53ce9980dda0b8094daa3e2dabe355847365ba965ff0b49f961"}, + {file = "pyobjc_framework_CoreText-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:44052f752f42b62d342fa8aced5d1b8928831e70830eccddc594726d40500d5c"}, + {file = "pyobjc_framework_CoreText-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0bc278f509a3fd3eea89124d81e77de11af10167c0df0d0cc15a369f060465a0"}, + {file = "pyobjc_framework_CoreText-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7b819119dc859e49c0ce9040ae09d6a3bd66658003793f486ef5a21e46a2d34f"}, + {file = "pyobjc_framework_CoreText-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2719c57ff08af6e4fdcddd0fa5eda56113808a1690c3325f1c6926740817f9a1"}, + {file = "pyobjc_framework_CoreText-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:8239ce92f9496587a60fc1bfd4994136832bad99405bb45572f92d960cbe746e"}, + {file = "pyobjc_framework_CoreText-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:80a1d207fcdb2999841daa430c83d760ac1a3f2f65c605949fc5ff789425b1f6"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-corewlan" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CoreWLAN on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CoreWLAN-10.1.tar.gz", hash = "sha256:a4316e992521878fb75ccff6bd633ee9c9a9bf72d5e2741e8804b43e8eeef8ac"}, - {file = "pyobjc_framework_CoreWLAN-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:e5374ebd6e258d6cdaa9fdeb21c10830c50fc1c00eaa91b2293833b0182479f7"}, - {file = "pyobjc_framework_CoreWLAN-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:57cb3fbb69500df92a111655c129b0f658ec16e14e57b08b9c1ef400f33f3bb5"}, - {file = "pyobjc_framework_CoreWLAN-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:eb2360b20ab14a0f6cc7d06dc7bf2b0832d0c95892d9f364e03c6ecf77dfc328"}, + {file = "pyobjc-framework-CoreWLAN-10.2.tar.gz", hash = "sha256:f47dcf735145eb2f817db5c2134321a7cfb9274a634161ff3069617fd2afff42"}, + {file = "pyobjc_framework_CoreWLAN-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8dc102d7d08437b5421856ae8aac32e3e9846e546c1742e4d57343abd694688f"}, + {file = "pyobjc_framework_CoreWLAN-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:85bcf84fd38a2e949760dda3201f13f8bef73b341a623f6736834b7420386f16"}, + {file = "pyobjc_framework_CoreWLAN-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ada346a6da1075e16bf5f022ccad488632fe6de972d2d925616add87e3eb9fad"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-cryptotokenkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework CryptoTokenKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-CryptoTokenKit-10.1.tar.gz", hash = "sha256:ad8fb3c4f314cc5f35cd26a5e3fdd68dd71ea0f7b063f31cffb9d78050ce76f0"}, - {file = "pyobjc_framework_CryptoTokenKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:e691877b2e96c8f257873943147315561cda79b63c911afa8d0103d6b351a88f"}, - {file = "pyobjc_framework_CryptoTokenKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5a4ce0650ad70eedadc46091d61878e28a4cf491d1c2e8da32feab2f661a4ee5"}, - {file = "pyobjc_framework_CryptoTokenKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c0013c7795d208547d9f92c0539bc7fec09ca049d791458b62c177585552abc4"}, + {file = "pyobjc-framework-CryptoTokenKit-10.2.tar.gz", hash = "sha256:c0adfde2d53da7df1f8827bdf0cbf4419590151dd1041711ab2f66a32bd986f5"}, + {file = "pyobjc_framework_CryptoTokenKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:89264d38ca58e8b5a586a3c13260d490ee2cdc9c1498211a804cec67f7659cd7"}, + {file = "pyobjc_framework_CryptoTokenKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e13d92966273420a154cde6694b4bc7dd3dc7679e93d651534dcf2b0c5246546"}, + {file = "pyobjc_framework_CryptoTokenKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a56af323d597332090a0787c00d16c40152c62cb278d951a59723006cd3e10de"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-datadetection" -version = "10.1" +version = "10.2" description = "Wrappers for the framework DataDetection on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-DataDetection-10.1.tar.gz", hash = "sha256:f81d1ca971aa8034faeb6e457144df0832f870d7e19905886593bafe4cbfe21f"}, - {file = "pyobjc_framework_DataDetection-10.1-py2.py3-none-any.whl", hash = "sha256:f23fa282297ed385c9df384a0765e4f9743b8916de8a58137f981ab0425b80f5"}, + {file = "pyobjc-framework-DataDetection-10.2.tar.gz", hash = "sha256:9532bb697b96ec4ffc04310550bf21c45c8494fc07d8067fc41cbfd94c8ba27d"}, + {file = "pyobjc_framework_DataDetection-10.2-py2.py3-none-any.whl", hash = "sha256:4435ebaa3b3fa3de855690469fefd2d8a3568f702f51540707efaf4363ec94aa"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-devicecheck" -version = "10.1" +version = "10.2" description = "Wrappers for the framework DeviceCheck on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-DeviceCheck-10.1.tar.gz", hash = "sha256:f89e3acd15ec48134f95bf027778ca1d7e3088b9c2204e48f8c6e3bdcb28cf82"}, - {file = "pyobjc_framework_DeviceCheck-10.1-py2.py3-none-any.whl", hash = "sha256:31d5a83d85a4d95e238f432ac66cbf110a7b70afa82fd230ab4b911a5e2b9cb4"}, + {file = "pyobjc-framework-DeviceCheck-10.2.tar.gz", hash = "sha256:f620ede18e12dd36d92f24d1a68278821bcf7aeaea6577993fbfb328c118569d"}, + {file = "pyobjc_framework_DeviceCheck-10.2-py2.py3-none-any.whl", hash = "sha256:c9c87ae40af41c4c296af40317018732bba85e589111f5286b2f136f022c8ecd"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-dictionaryservices" -version = "10.1" +version = "10.2" description = "Wrappers for the framework DictionaryServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-DictionaryServices-10.1.tar.gz", hash = "sha256:03b3b19a9b911beb3bdc8809f5d02356a497a75dbefa0f355825ec610c050a3e"}, - {file = "pyobjc_framework_DictionaryServices-10.1-py2.py3-none-any.whl", hash = "sha256:7ace031cc3df1fa9a4eb663ff55eee0a4c7c8c34653aa1529988d579d273150b"}, + {file = "pyobjc-framework-DictionaryServices-10.2.tar.gz", hash = "sha256:858b4edce36dfbb0f906f17c6aac1aae06350d508cf0b295949113ebf383bfb4"}, + {file = "pyobjc_framework_DictionaryServices-10.2-py2.py3-none-any.whl", hash = "sha256:39b577b35c52a033cbac030df1fdcd16fb109144e8c59cb2044a13fcd803ab49"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-CoreServices = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-CoreServices = ">=10.2" [[package]] name = "pyobjc-framework-discrecording" -version = "10.1" +version = "10.2" description = "Wrappers for the framework DiscRecording on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-DiscRecording-10.1.tar.gz", hash = "sha256:321c69b6494c57d75d4a0ecf5d90ceac3800441bf877eac8196ab25dcf15ebde"}, - {file = "pyobjc_framework_DiscRecording-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:581141bd645436d009cc6b42ca6255322de9a3a36052e7dcf497e90959c7bc77"}, - {file = "pyobjc_framework_DiscRecording-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2c4144c4d1d7bf7ad537c6159cefb490876b7eff62ec95d4af7bc857813b95cd"}, - {file = "pyobjc_framework_DiscRecording-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:1c52f7ace5936edbe160aa4d6cb456a49e7bc1a43a5e34572d48cd65dee22d1e"}, + {file = "pyobjc-framework-DiscRecording-10.2.tar.gz", hash = "sha256:9670018a0970553882feb10e066585ad791c502539712f4117bad4a6647c79b3"}, + {file = "pyobjc_framework_DiscRecording-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:cbf0d9904a24bece47a71b56f87090a769e96338c0acb3f33385c3e584ed1c96"}, + {file = "pyobjc_framework_DiscRecording-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0a7d9980ab9f59903d60d09172de4085028bbb97a63112f78b9cca0051a73639"}, + {file = "pyobjc_framework_DiscRecording-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:8a6512d0b7e61064ca167ca0a9c95a3f49f8fa7216fe5e1d77eab01ce56a9414"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-discrecordingui" -version = "10.1" +version = "10.2" description = "Wrappers for the framework DiscRecordingUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-DiscRecordingUI-10.1.tar.gz", hash = "sha256:2a44278b19738e8d4f2180433df37b59a0b645d9ddc0f3c3a6c81e506afc1953"}, - {file = "pyobjc_framework_DiscRecordingUI-10.1-py2.py3-none-any.whl", hash = "sha256:684925119e4c8f8ea43cfede1a3e39f785b5aa94a48f1aa7a98fd4cdc4c1d2e3"}, + {file = "pyobjc-framework-DiscRecordingUI-10.2.tar.gz", hash = "sha256:afda9756a8f9e8ce1f83930eca3b1a263a29f48c1618269457f4aba63fc1644f"}, + {file = "pyobjc_framework_DiscRecordingUI-10.2-py2.py3-none-any.whl", hash = "sha256:e0423c548851cd9eb4ad7e9e085da4db2cde2420e1f3e05d46e649498edf97d8"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-DiscRecording = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-DiscRecording = ">=10.2" [[package]] name = "pyobjc-framework-diskarbitration" -version = "10.1" +version = "10.2" description = "Wrappers for the framework DiskArbitration on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-DiskArbitration-10.1.tar.gz", hash = "sha256:c3ab3dc91375dabaf4d3470e01358e4acfecf6b425abf9ad95a26a7a56398f56"}, - {file = "pyobjc_framework_DiskArbitration-10.1-py2.py3-none-any.whl", hash = "sha256:a3bd1883b60aa1d8cff3bc18957f81ed14e5d0406d18a4a9095539ddf51dd72e"}, + {file = "pyobjc-framework-DiskArbitration-10.2.tar.gz", hash = "sha256:25b74db4f39a7128599e153533db0f88c680ad55f366c5ab6a6d7dede96eeb57"}, + {file = "pyobjc_framework_DiskArbitration-10.2-py2.py3-none-any.whl", hash = "sha256:dd14eb448865ca4c49e15a543f748f1ef6501ea0044eaa2cf04860547205c84f"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-dvdplayback" -version = "10.1" +version = "10.2" description = "Wrappers for the framework DVDPlayback on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-DVDPlayback-10.1.tar.gz", hash = "sha256:2af92907a50a47c44a8dd1521217a564ad9a3dd9e9056f0a76b13275d380bee1"}, - {file = "pyobjc_framework_DVDPlayback-10.1-py2.py3-none-any.whl", hash = "sha256:bcbfb832a3f04e47aef03606a21fd58458bc28e25e1a444e7a9388bfee2f9dd3"}, + {file = "pyobjc-framework-DVDPlayback-10.2.tar.gz", hash = "sha256:0869a6e8da1c2d93713699785b4f0bbe5dd1b2820a0ff4a6adf06227b1bb96ac"}, + {file = "pyobjc_framework_DVDPlayback-10.2-py2.py3-none-any.whl", hash = "sha256:f3fb90eb3d616290d2ab652214ce682130cd19d1fd3205def6ab0ba295535dd9"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-eventkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Accounts on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-EventKit-10.1.tar.gz", hash = "sha256:53473df48000b39dec276e3b8ead88b153c66cf0fdc07b016f759b42f0b2ec50"}, - {file = "pyobjc_framework_EventKit-10.1-py2.py3-none-any.whl", hash = "sha256:3265ef0bfab38508c50febfa922b4abf6ebc55a44f105d499e19231c225a027c"}, + {file = "pyobjc-framework-EventKit-10.2.tar.gz", hash = "sha256:13c8262344f06096514d1e72d3c026fa4002d917846ce81217d4258acd861324"}, + {file = "pyobjc_framework_EventKit-10.2-py2.py3-none-any.whl", hash = "sha256:c9afa63fc2924281fdf1ef6c86cc2ba01b7b84a8545a826ddd89e4abd7077e81"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-exceptionhandling" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ExceptionHandling on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ExceptionHandling-10.1.tar.gz", hash = "sha256:ac75ac230249d6f26f750beb406c133a49d4a284e7ee62ba1139e9d9bc5ec44d"}, - {file = "pyobjc_framework_ExceptionHandling-10.1-py2.py3-none-any.whl", hash = "sha256:b8eb9142f141361982e498610bfd33803acb4f471f80b5cd9df8d382142449e9"}, + {file = "pyobjc-framework-ExceptionHandling-10.2.tar.gz", hash = "sha256:cf4cd143c24504d66ef9d4e67b4b88e2ac892716e6ead2aa9585a7d39278d943"}, + {file = "pyobjc_framework_ExceptionHandling-10.2-py2.py3-none-any.whl", hash = "sha256:fd7dfc197c29ccf187718dbb0b1dcd966a8c04ee6549ee9472959912e76a0609"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-executionpolicy" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ExecutionPolicy on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ExecutionPolicy-10.1.tar.gz", hash = "sha256:5ab7da37722b468a5e230354fa45a6a96e545c6c2aab5a76029e2227b1bae326"}, - {file = "pyobjc_framework_ExecutionPolicy-10.1-py2.py3-none-any.whl", hash = "sha256:556aa28220438b64e6f75f539f133616a343abe3e2565f0d016091f4dc4a9c3d"}, + {file = "pyobjc-framework-ExecutionPolicy-10.2.tar.gz", hash = "sha256:8976c35a58c2e51d6574123ecfcd58459bbdb32b3992716119a3c001d3cc2bcf"}, + {file = "pyobjc_framework_ExecutionPolicy-10.2-py2.py3-none-any.whl", hash = "sha256:4d95d55f82a15286035bb5bc01b339d6c36103a1cbf7d6a3d7a9feac71663626"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-extensionkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ExtensionKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ExtensionKit-10.1.tar.gz", hash = "sha256:4f0a5256149502eeb1b4e1af1455de629a3c3326aaf4d766937212e56355ad58"}, - {file = "pyobjc_framework_ExtensionKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:82eece8d6d807bafb5cf8a220c58f2b42b350a0bc9131cb0cdfd29e90294858d"}, - {file = "pyobjc_framework_ExtensionKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9936cfe8a17c09457aa10c21f90f77151328596bd72b55fd9b6c3e78a11384"}, - {file = "pyobjc_framework_ExtensionKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:94cdc24e19ed554bc1d8e9d11139839033b26997f5b29a381ed4be8633ad2569"}, + {file = "pyobjc-framework-ExtensionKit-10.2.tar.gz", hash = "sha256:343c17ec1696947cde6764b32f741d00d7424a620cdbaa91d9bcf47025b77718"}, + {file = "pyobjc_framework_ExtensionKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:69981d3a0f7146b57b16f1132c114419a2b89fa201677c7e240f861bc7e56670"}, + {file = "pyobjc_framework_ExtensionKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:30fa27de3f97436c867ca3e89d8e95f141337a9377f71be3c8a036795b5557fb"}, + {file = "pyobjc_framework_ExtensionKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:09e1402c9fd7c6fcacd662caa2198d79342b812665980fd9a66e906743bddf69"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-externalaccessory" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ExternalAccessory on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ExternalAccessory-10.1.tar.gz", hash = "sha256:1c206f2e27aedb0258a3cf425ed89cbea0657521829f061362b4fca586e033a8"}, - {file = "pyobjc_framework_ExternalAccessory-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:519c36e63011a797f1747306132957168eed53456e801973c38c52b06b265a0e"}, - {file = "pyobjc_framework_ExternalAccessory-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8c54367b52cc74231df057c9bbf722896d98efd91f6d6a7415e0ca7227f311b9"}, - {file = "pyobjc_framework_ExternalAccessory-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:64facb48377840e72e459f9ae88d482d0d17a1726733b2d79205de4e4449eb89"}, + {file = "pyobjc-framework-ExternalAccessory-10.2.tar.gz", hash = "sha256:e62af0029b2fd7e07c17a4abe52b20495dba05cba45d7e901acbd43ad19c4cc3"}, + {file = "pyobjc_framework_ExternalAccessory-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b279672b05f0f8a11201a5ed8754bcea5b8d3e6226ec16c6b59127e2c6e25259"}, + {file = "pyobjc_framework_ExternalAccessory-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5fbe16bb4831a30659cba6a53b77dca94b72ff12bfd318c76f118f39557427c5"}, + {file = "pyobjc_framework_ExternalAccessory-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f446ce468a369650c4c49947bb7329c58c68cd44aee801506e60be1f26cd6265"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-fileprovider" -version = "10.1" +version = "10.2" description = "Wrappers for the framework FileProvider on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-FileProvider-10.1.tar.gz", hash = "sha256:617811be28bd5d9b0cc87389073ade7593f89ee342a5d6d5ce619912748d8e00"}, - {file = "pyobjc_framework_FileProvider-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9e98efd27f69c8275dc8220dfb2bb41a486400c1fb839940cd298b8d1e44adca"}, - {file = "pyobjc_framework_FileProvider-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7046144d86b94707fea6d8bb00b2850f99e0ebaef136ee2b3db884516b585529"}, - {file = "pyobjc_framework_FileProvider-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2f4c816b87237ab2ddfb0314296e5824411cec11f9c1b5919f8b4e8c02069ff1"}, - {file = "pyobjc_framework_FileProvider-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8476daf2c291f6bc1c9f4a26f4492236a2e427774fd02a03c561c667e9ec0931"}, - {file = "pyobjc_framework_FileProvider-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:de3dcbe70943b3bf057f634be4003fdcc112e3d7296f1631be1bf20f494db212"}, - {file = "pyobjc_framework_FileProvider-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a53ebe7e4a6ef24cf3ade1c936a96a1cb0c40dd7639899e3e238e050d4813417"}, + {file = "pyobjc-framework-FileProvider-10.2.tar.gz", hash = "sha256:1accc2965c59395152d04b2f4a096cb4a5364bca8094695ce2b60d2f794bff74"}, + {file = "pyobjc_framework_FileProvider-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e69d294b0ac9fdcafb28fbb1b9770e1e851cc5467dc0ae1d7b182882ce16d1d"}, + {file = "pyobjc_framework_FileProvider-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1d5cc02d43f2c6851934c8208cd4a66ad007daf0db673f72d1938677c90b1208"}, + {file = "pyobjc_framework_FileProvider-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0ae00a293e3ac511cc9eb54ee05b67583ea35d490b47f23f448a3da6652c189b"}, + {file = "pyobjc_framework_FileProvider-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fab7da3c7961e77b09f34cb71a876205ea8d73f9d10d5db78080f7282dd5066f"}, + {file = "pyobjc_framework_FileProvider-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:5d2b581c8cb1c15304676f5a77c42e430aaad886ac92d8b2d4e5cec57cb86be3"}, + {file = "pyobjc_framework_FileProvider-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c471c0d27d9d6a7bba3d06f679f14ac8d719ed3660d9a8e6788a31e1521e71d"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-fileproviderui" -version = "10.1" +version = "10.2" description = "Wrappers for the framework FileProviderUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-FileProviderUI-10.1.tar.gz", hash = "sha256:e8f40b41f63d51401fb2aa5881dbf57ef6eacaa6c4d95f3dd1d9eb1b392a2d84"}, - {file = "pyobjc_framework_FileProviderUI-10.1-py2.py3-none-any.whl", hash = "sha256:ef85cead617c3e9b851589505503d201197bbc0ee27117a77243a1a4e99fad7d"}, + {file = "pyobjc-framework-FileProviderUI-10.2.tar.gz", hash = "sha256:a22204c1fad818e4c8d94ecb544fec59387e01a0074cbe2ca6e58de1a12c157e"}, + {file = "pyobjc_framework_FileProviderUI-10.2-py2.py3-none-any.whl", hash = "sha256:5fac2067c09a23a436708e05d71faf65d64f4c36b45ad254617720b1a682aad6"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-FileProvider = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-FileProvider = ">=10.2" [[package]] name = "pyobjc-framework-findersync" -version = "10.1" +version = "10.2" description = "Wrappers for the framework FinderSync on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-FinderSync-10.1.tar.gz", hash = "sha256:5b1fb13c10d0f9bf8bccdacd0ecd894d79376747bd13aca5a410f65306bcbc29"}, - {file = "pyobjc_framework_FinderSync-10.1-py2.py3-none-any.whl", hash = "sha256:e5a5ff1e7d55edb5208ce04868fcf2f92611053476fbbf8f48daa3064d56deb5"}, + {file = "pyobjc-framework-FinderSync-10.2.tar.gz", hash = "sha256:5ecbe9bf7fe77f28204fbe358ee541fdd2786fc076a631c4f11b74377d60ea05"}, + {file = "pyobjc_framework_FinderSync-10.2-py2.py3-none-any.whl", hash = "sha256:11d569492efe74a52883e6086038ca9d5a712a08db828f3ca43c03e756013801"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-fsevents" -version = "10.1" +version = "10.2" description = "Wrappers for the framework FSEvents on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-FSEvents-10.1.tar.gz", hash = "sha256:f5dee8cfbd878006814db264c5f70aeb1a43c06620e98f628ca6c0008beb1b1d"}, - {file = "pyobjc_framework_FSEvents-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3c2bf6ffd49fd21df73a39e61b81d7c6651e1063f72b62b2218c6ab4bf91dc02"}, - {file = "pyobjc_framework_FSEvents-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e57dccf14720c0789811580cb99e325353259cc96514e2622ca512e70f392c2"}, - {file = "pyobjc_framework_FSEvents-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f026f417b25f804c6994d49af0743177ca7119d5d9e885a80d71c624e12a5d47"}, + {file = "pyobjc-framework-FSEvents-10.2.tar.gz", hash = "sha256:3a75f38bb1d5d2cf6a0d3e92801b3510f32e96cf6443d81b9dd92a84d72eff0a"}, + {file = "pyobjc_framework_FSEvents-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:129f9654ab9074eff29ccb8dd09625e3740058744a38f9776d0349387f518715"}, + {file = "pyobjc_framework_FSEvents-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c71699f24482d99ee8f6b7a8d36c4c294655c670d8cbd0f3c6f146a2fda6283c"}, + {file = "pyobjc_framework_FSEvents-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a0ff7bb8c1a357181345ff3a90b7f808cd55c4757df60c723541f0f469323190"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-gamecenter" -version = "10.1" +version = "10.2" description = "Wrappers for the framework GameCenter on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-GameCenter-10.1.tar.gz", hash = "sha256:0d124b3f18bb1b3e134268c99bf92c29791e8c62a97095c1fb1eb912ebe495e0"}, - {file = "pyobjc_framework_GameCenter-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5d6cf2405e5107c8befcb61a5339c0766fbab9448a2c4e8f5dd4401a7ef380ab"}, - {file = "pyobjc_framework_GameCenter-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8ede397f1ca31022e7507cb1cf801617094e407300ee29c19415fd32f64fa758"}, - {file = "pyobjc_framework_GameCenter-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:db4e36a573e91715d8ed5250f6784fe5b03c8b2e769b97f8cf836eb7111c3777"}, + {file = "pyobjc-framework-GameCenter-10.2.tar.gz", hash = "sha256:43341b428cad2e50710cb974728924280e520e04ae9f750bc7beda5006457ae3"}, + {file = "pyobjc_framework_GameCenter-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f14ad00713519b508f4c956a8212bff01f6b6279b2a76e87d99a18262e61dfda"}, + {file = "pyobjc_framework_GameCenter-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b52932e90c6b6d90ce8c895b0ac878dc4e639d493724a5789fc990e1efec3d05"}, + {file = "pyobjc_framework_GameCenter-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:dc9de1b3d0db1921fb197ad964226ebc271744aee0cc792f9fe66afaf92b24f0"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-gamecontroller" -version = "10.1" +version = "10.2" description = "Wrappers for the framework GameController on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-GameController-10.1.tar.gz", hash = "sha256:50a17fdd151f31b3a5eae9ae811f6f48680316a5c2686413b9a607c25b6be4bc"}, - {file = "pyobjc_framework_GameController-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ec7e84c2dbc90065db8d0293c29e34d95b4fa14beeb3fb3c818fa3bcdf24d89a"}, - {file = "pyobjc_framework_GameController-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:672d99f849b803c6c6b8e89445e2c446379ae23f1f0f7e355a2a94f91d591fea"}, - {file = "pyobjc_framework_GameController-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c56232fc2f0e95901e66534d18a008857c59363078ac75fedb2d18dcbd5dda63"}, + {file = "pyobjc-framework-GameController-10.2.tar.gz", hash = "sha256:81ad502346904995ec04b0580bab94ab32ca847fad06bca88cdf2ec6222b80ae"}, + {file = "pyobjc_framework_GameController-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:47e6dfcf10353a17adcfa7649d0f5d0cba4d4dc3ce3a66826d873574ae2afcb1"}, + {file = "pyobjc_framework_GameController-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8ef6fcb5308c1c31d1de3969165a13750b74f52c80249b722383307fc558edff"}, + {file = "pyobjc_framework_GameController-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:89a7aac243b0347c3ef10fc2bcedcb1b2ae9eb14daabccb3f3cfe1cf12c7e572"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-gamekit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework GameKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-GameKit-10.1.tar.gz", hash = "sha256:6fa87a29556cdaf78c86851fc61edb6d384f1a7370a75a66bdd208ed1250899f"}, - {file = "pyobjc_framework_GameKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:bb00618d256f67b6f784b49db78bde80677a2004af4558266009de30e8804660"}, - {file = "pyobjc_framework_GameKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:38bcce65b781c5967eb7985b551ca015cda89903d18f29eab74518a52f626fec"}, - {file = "pyobjc_framework_GameKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:773e6f645731dac7c2b6e55ec7ecd92928b070f7a33b4c5ce33a3a52565ecd49"}, + {file = "pyobjc-framework-GameKit-10.2.tar.gz", hash = "sha256:0ef877db88e8888ecf682b09b9fb1ee6b879f23d521ce3a738a1b0fb2b885974"}, + {file = "pyobjc_framework_GameKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c23025087bec023a37fe0c84fcdc592cdc100d9187b49250446587f09571dbeb"}, + {file = "pyobjc_framework_GameKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6867159762db0a72046abe42df8dff080620c2f9cdf20927445eec28f3f04124"}, + {file = "pyobjc_framework_GameKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e7d91d28c4c8d240f0fbab80f84545efbeeb5a42db4c6fbd4ccb1f3face88c9c"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-gameplaykit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework GameplayKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-GameplayKit-10.1.tar.gz", hash = "sha256:12a5d1dc59668df155436250476af029b1765ca68e7a1e2d440158e7130232a3"}, - {file = "pyobjc_framework_GameplayKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f877d2c449aea09187856540b3d5a3e6a98573673a09af6163b1217040d93e5f"}, - {file = "pyobjc_framework_GameplayKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:86e320c79707ab7a3de2f23d0d32bd151b685865f43d13fb58daa2963b4da5cc"}, - {file = "pyobjc_framework_GameplayKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:93a1e62c2875d7705d1aa70115f646258ecffc4d4702ed940a5214dc0ea580f5"}, + {file = "pyobjc-framework-GameplayKit-10.2.tar.gz", hash = "sha256:068ee6f3586f4033d25ed3b0451eab8f388b2970be1dfbe39be01accca7a9b2e"}, + {file = "pyobjc_framework_GameplayKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c9e87b8221a74599c813640b823f3a2546aa6076b04087f26fd3ecc8c78cbe01"}, + {file = "pyobjc_framework_GameplayKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a1f81c969347d63a1200818ae12350ad39353e85842f34040b9d997e55f7ec89"}, + {file = "pyobjc_framework_GameplayKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f438c4b98e1d00dec84fedc8796761063e99814f913151441bc7147ac8b23068"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-SpriteKit = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-SpriteKit = ">=10.2" [[package]] name = "pyobjc-framework-healthkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework HealthKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-HealthKit-10.1.tar.gz", hash = "sha256:9479c467514c506f9083889f11da6b8f34d705f716ffe9cbbb5a3157000d24de"}, - {file = "pyobjc_framework_HealthKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b32171f6d4ee6fa37718f5b299c6b866a4ae395ff8764ccc040b9d1263a3e74f"}, - {file = "pyobjc_framework_HealthKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a628c777c02df6c5dbbc5f26576f52239dab79ac1afe5ca53d40d561d55adb52"}, - {file = "pyobjc_framework_HealthKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4d44c5ace78dce1f0c76b96010d9446b90a9474946a25bfb33d373a152e22524"}, + {file = "pyobjc-framework-HealthKit-10.2.tar.gz", hash = "sha256:abcc4e6bd0e11eace7257887958b6cc5332f8aad4efa6b94e930425016540789"}, + {file = "pyobjc_framework_HealthKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:093687705413b88efe47097f09c7be84b6ccbb7ec0f9b943b4ad19fe9fbdc01c"}, + {file = "pyobjc_framework_HealthKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1fb83b08ed28b9adc9a8a2379dbf5f7515e01009160a86847e1a5f71b491a49c"}, + {file = "pyobjc_framework_HealthKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b84d3857c54076a63feea7072ecf98d925f68f96413ca40164d04b2fd865a4dc"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-imagecapturecore" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ImageCaptureCore on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ImageCaptureCore-10.1.tar.gz", hash = "sha256:29b85ee9af77bba7e1ea9191bf84edad39d07681b9bd267c8f5057db3b0cdd64"}, - {file = "pyobjc_framework_ImageCaptureCore-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d8d2dbc09aed984f7d92e7b835e87608d356f5f4b6dd03e84258963391791ae5"}, - {file = "pyobjc_framework_ImageCaptureCore-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5eef95798d340000ddfb9c59c9468b75bb4cd389d311fd27078c3f4a4a3af29a"}, - {file = "pyobjc_framework_ImageCaptureCore-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:832cbe0d957935553183586556d2036cfcc9aae593defe71e6a0726e5c63abf6"}, + {file = "pyobjc-framework-ImageCaptureCore-10.2.tar.gz", hash = "sha256:68f1f96982282e786c9c387c177c3b14202d560d68000136562eba1ed3f45a6e"}, + {file = "pyobjc_framework_ImageCaptureCore-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:69c19e235de32bc707a622fd2865fa53f6e7692b52851d559ea0c23664ee7665"}, + {file = "pyobjc_framework_ImageCaptureCore-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3bdbae9adf6456b4b4e2847135e5da214516545638dd715f01573ec6b6324af6"}, + {file = "pyobjc_framework_ImageCaptureCore-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:46b90bc950646b69b416949bb50ee7d2189b42b7aa77692e01d7c1b4062ddc19"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-inputmethodkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework InputMethodKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-InputMethodKit-10.1.tar.gz", hash = "sha256:b995f43a8859016474098c894c966718afe9fbcc18996ce3c6bebfc6a64cfad7"}, - {file = "pyobjc_framework_InputMethodKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5288d12d1a2a6da9261c0cadbee03f31c80a0a3bb77645b4e7c2836864f54533"}, - {file = "pyobjc_framework_InputMethodKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e04ac004ac848492242fda193e63322abce87ecdef081f1b7268cac7f2af8ad"}, - {file = "pyobjc_framework_InputMethodKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:538d5955a8ab3a9c7a7286c72dba87634ba0babe7cd0a4cec335100df8789c01"}, + {file = "pyobjc-framework-InputMethodKit-10.2.tar.gz", hash = "sha256:294cf2c50cdbb4cdc8f06946924a01faf45a7356ef86652d73c1f310fc1ce99f"}, + {file = "pyobjc_framework_InputMethodKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f8bcb156dcd1dc77826f720ff70f9a12c72ad45e97d4faa7ca88e85fc2d7843a"}, + {file = "pyobjc_framework_InputMethodKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:d96a18dd92dc19f631ed50c524355ab29f79975e081f516ad3cea2d902a277e7"}, + {file = "pyobjc_framework_InputMethodKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:fdea1320a3cf6e409ab8f602b90b167110f7ca58f44f95a52f188c6f59f08753"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-installerplugins" -version = "10.1" +version = "10.2" description = "Wrappers for the framework InstallerPlugins on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-InstallerPlugins-10.1.tar.gz", hash = "sha256:4c9f8b46d43f1277aad3bea648f84754e9f48251a6fb385ad8119c1b44dffe9b"}, - {file = "pyobjc_framework_InstallerPlugins-10.1-py2.py3-none-any.whl", hash = "sha256:195e7d559421bf36479b085bf74d56f8549fff715596fc21e0e0c95989a3149a"}, + {file = "pyobjc-framework-InstallerPlugins-10.2.tar.gz", hash = "sha256:001e9ec6489e49fc22bbec1ef050518213292e8d56239ed004f98ed038b164e2"}, + {file = "pyobjc_framework_InstallerPlugins-10.2-py2.py3-none-any.whl", hash = "sha256:754b8fdf462b6e568f30249255af50f9bd3ac90edacfe6e02d0fe77f276c049b"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-instantmessage" -version = "10.1" +version = "10.2" description = "Wrappers for the framework InstantMessage on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-InstantMessage-10.1.tar.gz", hash = "sha256:8e8e7e2c64a3a6b0aa67cace58f7cea1971bb93de57be40b7ba285e305fab0b5"}, - {file = "pyobjc_framework_InstantMessage-10.1-py2.py3-none-any.whl", hash = "sha256:c03a9a99faaa14ff0a477114b691d628117422a15995523deb25ff2d1d07a36d"}, + {file = "pyobjc-framework-InstantMessage-10.2.tar.gz", hash = "sha256:4aa7627697fa57120594477f1f287bc41836ec7a4107215d3060c26416cf72c9"}, + {file = "pyobjc_framework_InstantMessage-10.2-py2.py3-none-any.whl", hash = "sha256:65db5cb1f163700a6cb915506f8f7ae2f28d8d3f6464f7b122b0535b1694859a"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-intents" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Intents on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Intents-10.1.tar.gz", hash = "sha256:85a84a5912b8d8a876767ca8fa220dc24bf1c075ed81b58c386d25c835cec804"}, - {file = "pyobjc_framework_Intents-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:64a3cef4af536de1153937d99a4cb8d0568ca20ee5c74458dca4f270b01a3c1a"}, - {file = "pyobjc_framework_Intents-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:89f49f82245d4facb329dd65434a602506246e6585f544ab78b0ab4bd151f4f7"}, - {file = "pyobjc_framework_Intents-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:bc6f93d151c4474150b6c76fe43067d2d0d06446851d66df3bb9968682a2d225"}, + {file = "pyobjc-framework-Intents-10.2.tar.gz", hash = "sha256:ec27d5d19212fcec180ff04e2bc617fee0a018e2eaf29b2590c5512da167aa6a"}, + {file = "pyobjc_framework_Intents-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:6a4e2ba2b5319c15ceeabdfd06f258789174e7e31011a24eab489d685066ed69"}, + {file = "pyobjc_framework_Intents-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9a3c08ec0dd199305989786e6e3c68d27f40b9eae3050bbf0207f053190f3513"}, + {file = "pyobjc_framework_Intents-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:3dc9233522564ea8850a02961398a591446e0a0a0e63cd42cf7820daa0242f6a"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-intentsui" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Intents on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-IntentsUI-10.1.tar.gz", hash = "sha256:01948fbd8f956a79d3c2e27f75bc9954ad12cb4113982f58654122cfa8095ebb"}, - {file = "pyobjc_framework_IntentsUI-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e829659751ff47e3b85980075897ddebbf62d5644478c1bb2ff1dcdc116b8897"}, - {file = "pyobjc_framework_IntentsUI-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0d6ac451433ec0602c661b32216cd3c44b1c99b9f41781b3af79b7941118552"}, - {file = "pyobjc_framework_IntentsUI-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1806e6189cf09c0b031594ad445da1a93c30c399298c6fce2369a49bac7eade4"}, - {file = "pyobjc_framework_IntentsUI-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:33518f549b6c501d7c6c36542154ae5d2255d7223804470e14cd76b325676a48"}, - {file = "pyobjc_framework_IntentsUI-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:91498d3cf4098fe412ea66c01b080919906dd23d53653d49addc7a26c50e570f"}, - {file = "pyobjc_framework_IntentsUI-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c73626bfad3f098eed4a446cee90154dec39d9a9c0775532980c5266bc91a4c"}, + {file = "pyobjc-framework-IntentsUI-10.2.tar.gz", hash = "sha256:4b9ca6f868b6cb7945ef4c285e73d220433efc35dfcad6b4a356bfce55e96c09"}, + {file = "pyobjc_framework_IntentsUI-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ec579d0f25cba0e1225f7690f52ed092bef5e01962fbe83ffbb70ec39861674"}, + {file = "pyobjc_framework_IntentsUI-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:91331fec42522596500bd0a580c633b7b84831c6316b2ec7458425d60b37da9e"}, + {file = "pyobjc_framework_IntentsUI-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:81f9d337473b3cb51f2aa4aa98156d6e294778d24fe011f41f0123b2676d824c"}, + {file = "pyobjc_framework_IntentsUI-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1c52fa06e8d65a003e384afcc1322051f2fbbfeac2c91ab852b407c552fd5652"}, + {file = "pyobjc_framework_IntentsUI-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:c514ecef1277ff00c07f78f7890e3a6cbe3c8fe44184f2f6da1a7b4b32851605"}, + {file = "pyobjc_framework_IntentsUI-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:22c40c11d5de5a866a5db2b4ba57e9663e79180c323928709eced30c5c03ac81"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Intents = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Intents = ">=10.2" [[package]] name = "pyobjc-framework-iobluetooth" -version = "10.1" +version = "10.2" description = "Wrappers for the framework IOBluetooth on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-IOBluetooth-10.1.tar.gz", hash = "sha256:9a30554f1c9229ba120b2626d420fb44059e4aa7013c11f36ab9637dc3aba21f"}, - {file = "pyobjc_framework_IOBluetooth-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5fd71294464b9d891d3a7ebb674bcc462feb6fbdf33ebd08c1411ef104460f7f"}, - {file = "pyobjc_framework_IOBluetooth-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:88e44f1bb3495c3104d9b0a73b2155e4326366c5f08a6e31ef431ab17f342b24"}, - {file = "pyobjc_framework_IOBluetooth-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:15c1a049e1431996188352784defe54a37181da38a7e5a378fcda77fdc007aea"}, + {file = "pyobjc-framework-IOBluetooth-10.2.tar.gz", hash = "sha256:8c4d6a82d0f550c84dce72188369adb9347ad6ee1c8adef996ee1a8c376c51ee"}, + {file = "pyobjc_framework_IOBluetooth-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:15e8a35431740d3e4ee484d4af01afef0b6b8aee2bdfe7b6dbe6cf7c7cc563fa"}, + {file = "pyobjc_framework_IOBluetooth-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:03ee5ecc3a2d2f6a0b4de9b36bc1c56f820624e8176abca0014c9ef3c86b0cd0"}, + {file = "pyobjc_framework_IOBluetooth-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b91c0b370047b386e9b333ba3c12ac121089fa94291c721e8b1ad6945b5763dd"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-iobluetoothui" -version = "10.1" +version = "10.2" description = "Wrappers for the framework IOBluetoothUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-IOBluetoothUI-10.1.tar.gz", hash = "sha256:979c0d9638c0f31e62afe90d8089e61a912d08e0db893a47d3e423b9b23e0db2"}, - {file = "pyobjc_framework_IOBluetoothUI-10.1-py2.py3-none-any.whl", hash = "sha256:809eeb98ce71d0d4a7538fb77f14d1e7cd2c2b91c10605fb8c0d69dbac205de5"}, + {file = "pyobjc-framework-IOBluetoothUI-10.2.tar.gz", hash = "sha256:ed9f4cb62eeda769b3f530ce396fd332f82441c5d22b9cf7b58058670c262d10"}, + {file = "pyobjc_framework_IOBluetoothUI-10.2-py2.py3-none-any.whl", hash = "sha256:f833efa3b1636f7a6cf8b5b2d25fc566757c2c7c06ee7945023aeb992493d96e"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-IOBluetooth = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-IOBluetooth = ">=10.2" [[package]] name = "pyobjc-framework-iosurface" -version = "10.1" +version = "10.2" description = "Wrappers for the framework IOSurface on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-IOSurface-10.1.tar.gz", hash = "sha256:e41c635c5e259019df243da8910675db10480a36d0c316539a8ab3fa0d941000"}, - {file = "pyobjc_framework_IOSurface-10.1-py2.py3-none-any.whl", hash = "sha256:46239320148b82c1f2364d5468999b48fa9c94fc404aff6c5451d23896ece694"}, + {file = "pyobjc-framework-IOSurface-10.2.tar.gz", hash = "sha256:f1412c2f029aa1d60add57abefe63ea4116b990892ef7530ae27a974efafdb42"}, + {file = "pyobjc_framework_IOSurface-10.2-py2.py3-none-any.whl", hash = "sha256:b571335a2150e865828d3e52e2a742531499c88dd85215c14d07e68e9bed70a7"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-ituneslibrary" -version = "10.1" +version = "10.2" description = "Wrappers for the framework iTunesLibrary on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-iTunesLibrary-10.1.tar.gz", hash = "sha256:18766b2fb016d33cde8ec2c81b05ddfb77d65cb8c92e16864d0c288edd02e812"}, - {file = "pyobjc_framework_iTunesLibrary-10.1-py2.py3-none-any.whl", hash = "sha256:043a2ede182f41a3ca70be50bf95f18641e2945f0077797ff2bb42a3e1984e37"}, + {file = "pyobjc-framework-iTunesLibrary-10.2.tar.gz", hash = "sha256:c60d1dc9eabb28b036b766b89ea7d18198e21deb8925fc5a5753777c905ecddf"}, + {file = "pyobjc_framework_iTunesLibrary-10.2-py2.py3-none-any.whl", hash = "sha256:4e6cf6073a902f77e0b0c33d2d52e3ab3f0c869cb339b7685b5e7f079df8ef4e"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-kernelmanagement" -version = "10.1" +version = "10.2" description = "Wrappers for the framework KernelManagement on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-KernelManagement-10.1.tar.gz", hash = "sha256:da8ac0e6a2de33b823e07ce0462a64340cfebd04f24426b1022374933bbd8d0a"}, - {file = "pyobjc_framework_KernelManagement-10.1-py2.py3-none-any.whl", hash = "sha256:923ff2bbab35a92b9becd9762348f6f690fa463ef07a0e5c4a2b8eb1d3e096af"}, + {file = "pyobjc-framework-KernelManagement-10.2.tar.gz", hash = "sha256:effd1d3230c8a3b8628e7fd315f0aac10fbf1ea99f2ed923999cb1ab787c317a"}, + {file = "pyobjc_framework_KernelManagement-10.2-py2.py3-none-any.whl", hash = "sha256:d8dca9dc1f756bfa894a32f56857ecefb4d188aec590433ee302529261dffb68"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-latentsemanticmapping" -version = "10.1" +version = "10.2" description = "Wrappers for the framework LatentSemanticMapping on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-LatentSemanticMapping-10.1.tar.gz", hash = "sha256:46e95532c71083d1e63bcfa4b89a56fcf860288f8fb04fc0313e4c40685d1916"}, - {file = "pyobjc_framework_LatentSemanticMapping-10.1-py2.py3-none-any.whl", hash = "sha256:f0b14a1a2a6d6b25b902a2cc5949f0145926f0b0a3132d17210b1a580dc7f0f5"}, + {file = "pyobjc-framework-LatentSemanticMapping-10.2.tar.gz", hash = "sha256:eb3ddd5e04c39b0151a64bd356f7de3c66062257e3802e8abea7a882e972ff21"}, + {file = "pyobjc_framework_LatentSemanticMapping-10.2-py2.py3-none-any.whl", hash = "sha256:dadd4352b9af681dd85d04712a6cf1d2c574acbf0b8178c35f42231ec8c5a6d1"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-launchservices" -version = "10.1" +version = "10.2" description = "Wrappers for the framework LaunchServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-LaunchServices-10.1.tar.gz", hash = "sha256:c0ef72f7cee77556c81e620ae8c511e73bdea4f644a233c8a5e3a333f5cd3d7d"}, - {file = "pyobjc_framework_LaunchServices-10.1-py2.py3-none-any.whl", hash = "sha256:b792a863427a2c59c884952737041e25ef05bdb541471ce94fb26a05b48abbbc"}, + {file = "pyobjc-framework-LaunchServices-10.2.tar.gz", hash = "sha256:d9f78d702dea13a363de8a7c1c382e1ca872993980c164781cb2758ee49353d2"}, + {file = "pyobjc_framework_LaunchServices-10.2-py2.py3-none-any.whl", hash = "sha256:15b7c96e3059550c218ed5cb5de11dddc7aae21c67c0808b130a5d49b8f4cc0f"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-CoreServices = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-CoreServices = ">=10.2" [[package]] name = "pyobjc-framework-libdispatch" -version = "10.1" +version = "10.2" description = "Wrappers for libdispatch on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-libdispatch-10.1.tar.gz", hash = "sha256:444ca20e348cbdd2963523b89661d67743a6c87a57caf9e5d546665baf384a5b"}, - {file = "pyobjc_framework_libdispatch-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da0fa1e63b7e72010c69341bcd2f523ade827c7f30e0ef5c901a2536f43a1262"}, - {file = "pyobjc_framework_libdispatch-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bd72ff7f399079eaf8135503c3658b3ce967076a9e3fdcd155c8a589134e476a"}, - {file = "pyobjc_framework_libdispatch-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ec061cba47247a5fd5788c3b9d5eba30936df3328f91fea63a565d09c53a0a02"}, - {file = "pyobjc_framework_libdispatch-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c71c8c9dca56b0e89ac7c4aff4b53bc74f64a2290e48c31cc77d87771c5203bd"}, - {file = "pyobjc_framework_libdispatch-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:b24a76fe2de4422685323e4f533b7bfd11a27edf06094c0f730f3f243f94a8bd"}, - {file = "pyobjc_framework_libdispatch-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:606954514e5747b05f9c608614f1affa44512888d18805452fade5d9b7938c14"}, + {file = "pyobjc-framework-libdispatch-10.2.tar.gz", hash = "sha256:ae17602efbe628fa0432bcf436ee8137d2239a70669faefad420cd527e3ad567"}, + {file = "pyobjc_framework_libdispatch-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:955d3e3e5ee74f6707ab06cc76ad3fae27e78c180dea13f1b85e2659f9135889"}, + {file = "pyobjc_framework_libdispatch-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:011736d708067d9b21a4722bae0ed776cbf84c8625fc81648de26228ca093f6b"}, + {file = "pyobjc_framework_libdispatch-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:28c2a2ab2b4d2930f7c7865ad96c1157ad50ac93c58ffff64d889f769917a280"}, + {file = "pyobjc_framework_libdispatch-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6cb0879e1f6773ad0bbeb82d495ad0d76d8c24b196a314ac9a6eab8eed1736e0"}, + {file = "pyobjc_framework_libdispatch-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:aa921cd469a1c2e20d8ba9118989fe4e827cbb98e947fd11ae0392f36db3afcc"}, + {file = "pyobjc_framework_libdispatch-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f3d57d24f81878d1b5dcb00a13f85465ede5b91589394f4f1b9dcf312f3bd99"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-libxpc" -version = "10.1" +version = "10.2" description = "Wrappers for xpc on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-libxpc-10.1.tar.gz", hash = "sha256:8e768bb3052b30ef3938c41c9b9a52ad9d454c105d2011f5247f9ffb151e3702"}, - {file = "pyobjc_framework_libxpc-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5a3efe43b370fdc4d166ddfd8d1f74b5c3ae5f9b273e5738253c3d9a2bebf27"}, - {file = "pyobjc_framework_libxpc-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dc16190cbcaf8639f4783058ec63b1aa5d03e3586311f171177b9275ed5725d8"}, - {file = "pyobjc_framework_libxpc-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3f0756945995da4cb503dc9ca31b0633b7044722b08348a240ebe6f594d43c0c"}, - {file = "pyobjc_framework_libxpc-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d5a7f06f437c6a23c469299a3a15b62f8b4661563499b0f04d9fe8ea5e75a95"}, - {file = "pyobjc_framework_libxpc-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:9341237ffaedb3169037a666564615fefd921e190e6ec3e951dc75384169a320"}, - {file = "pyobjc_framework_libxpc-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:57eaa7242ef4afe3e8d1fbe48f259613322549353250400c8d508afff251dde4"}, + {file = "pyobjc-framework-libxpc-10.2.tar.gz", hash = "sha256:04deac1f9dbd1c19c10d175846017f8e8e51d2b52a2674482638d6b289e883a6"}, + {file = "pyobjc_framework_libxpc-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b57089f792d51ad687c9933dd2d3669cd5e6f84d1f9213738ecc5833dba9aa8c"}, + {file = "pyobjc_framework_libxpc-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e31cb4f7fdb76defc53fe0b56c3f1db953c1dcf3519093835527f270c37315c3"}, + {file = "pyobjc_framework_libxpc-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:978cc2a9cc668e0c4aef13af81cec6129e7b98877b44c952232c0083a8fd352e"}, + {file = "pyobjc_framework_libxpc-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5dd057a556398b48982fdae84f8e08ee9b69b6e5918b6782bd842ef9ad97820d"}, + {file = "pyobjc_framework_libxpc-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:df394dc08eab33430f565a2252906f27cd4f7c41fd431f75b4ae35d3a76f4eab"}, + {file = "pyobjc_framework_libxpc-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fd3608a32ebe65253c24b7590ad96977135aa847dd188e4c2168f0da9e74e47"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-linkpresentation" -version = "10.1" +version = "10.2" description = "Wrappers for the framework LinkPresentation on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-LinkPresentation-10.1.tar.gz", hash = "sha256:d35f9436f6a72c0877479083118f57a42c0d01879df41ee832378bebef37e93c"}, - {file = "pyobjc_framework_LinkPresentation-10.1-py2.py3-none-any.whl", hash = "sha256:077c28c038b1aac0e5cd158cbf8b80863627f1254f0a1884440fabf95d46d62f"}, + {file = "pyobjc-framework-LinkPresentation-10.2.tar.gz", hash = "sha256:4ccae5f593b58dfe9cb422645e0ccf5adab906ec008d3e20eb710cd62bbb4717"}, + {file = "pyobjc_framework_LinkPresentation-10.2-py2.py3-none-any.whl", hash = "sha256:1cada96d3eb03e51e1bbb7e7c10b9c08c80fd098132541b4e992234fe43cfa37"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-localauthentication" -version = "10.1" +version = "10.2" description = "Wrappers for the framework LocalAuthentication on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-LocalAuthentication-10.1.tar.gz", hash = "sha256:e2b06bf7af1b6f8ba08bd59e1a3616732d801284362dd5482181b0b1488eca2d"}, - {file = "pyobjc_framework_LocalAuthentication-10.1-py2.py3-none-any.whl", hash = "sha256:3df6ac268f79f28e5b5e76b4fd6e095bdc9a200e1908f24cc33e805fa789f716"}, + {file = "pyobjc-framework-LocalAuthentication-10.2.tar.gz", hash = "sha256:26e899e8b4a90632958eb323abbc06d7b55c64d894d4530a9cc92d49dc115a7e"}, + {file = "pyobjc_framework_LocalAuthentication-10.2-py2.py3-none-any.whl", hash = "sha256:442f6cae70300f29c9133ed7f2e01c294976b9aae55fe180c64983d5dee62254"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Security = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Security = ">=10.2" [[package]] name = "pyobjc-framework-localauthenticationembeddedui" -version = "10.1" +version = "10.2" description = "Wrappers for the framework LocalAuthenticationEmbeddedUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-LocalAuthenticationEmbeddedUI-10.1.tar.gz", hash = "sha256:5a201e26c7710f8e8a6507dbb861baa545dc5abcbe0f3f6a19b2e270562c7bec"}, - {file = "pyobjc_framework_LocalAuthenticationEmbeddedUI-10.1-py2.py3-none-any.whl", hash = "sha256:a8e8101ca74441a862ffb8e2309fe382789c759d0951fb7b7b4e46652b4cb068"}, + {file = "pyobjc-framework-LocalAuthenticationEmbeddedUI-10.2.tar.gz", hash = "sha256:52acdef34ea38d1381a95de15b19c9543a607aeff11db603371d0224917a8830"}, + {file = "pyobjc_framework_LocalAuthenticationEmbeddedUI-10.2-py2.py3-none-any.whl", hash = "sha256:eafbbc321082ff012cdb14e38abae7ced94c6d962cb64af43d6d515da976e175"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-LocalAuthentication = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-LocalAuthentication = ">=10.2" [[package]] name = "pyobjc-framework-mailkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MailKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MailKit-10.1.tar.gz", hash = "sha256:a4589b13361a49ff0b3e9be43cd6f935a35acfc7a9f0da8b5db64283401da181"}, - {file = "pyobjc_framework_MailKit-10.1-py2.py3-none-any.whl", hash = "sha256:498d743e56d876d6d128970e6c0674470d9a4bcf9c021f0b115aa0c6ade1f5ae"}, + {file = "pyobjc-framework-MailKit-10.2.tar.gz", hash = "sha256:8d8fceff5498df0cfa630b7088814f8daa8a25794a36d4b57cfde8c2c14cdc70"}, + {file = "pyobjc_framework_MailKit-10.2-py2.py3-none-any.whl", hash = "sha256:d8bc9e6649e7e500d2d4d4ab288304846d9bfa06952ebeee621fe095dc2f51eb"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-mapkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MapKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MapKit-10.1.tar.gz", hash = "sha256:4e5b295ce1e94ed38888a0c4e3a5a92004e63e6d2ba9a86b5a277bbe658ddf05"}, - {file = "pyobjc_framework_MapKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:7628e7d8e4181f06fc3138b7426593d09fe3d49a056e7e3d5853f7bbcc62b240"}, - {file = "pyobjc_framework_MapKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:d5d78c56b2806148f7b4a2975e580bc039f1898ca8953041405683ba6c22f19b"}, - {file = "pyobjc_framework_MapKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b9c942b3a705021561de2a4e1590c58212131c2c7dc721290f68371558a42f35"}, + {file = "pyobjc-framework-MapKit-10.2.tar.gz", hash = "sha256:35dfe7aa5ec9e51abc47d6ceb0f83d3c2b5876258591a568e85e2db8218427c4"}, + {file = "pyobjc_framework_MapKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ce322299b04eef212706185764771041a1220f7a611606e33f95ac355d913238"}, + {file = "pyobjc_framework_MapKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:339a8c8181047fc9eb612eb47c51f017423a6b074e2a4838cd6b06e36af6c160"}, + {file = "pyobjc_framework_MapKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:85a110693198798234d3edbd3b606d9d9c9b4817e4ed70d2b2e18357422783c6"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreLocation = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreLocation = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-mediaaccessibility" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MediaAccessibility on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MediaAccessibility-10.1.tar.gz", hash = "sha256:f487d83f948c12679c1ce06caabaedade1f4aee1f35163f835213c251a4639c7"}, - {file = "pyobjc_framework_MediaAccessibility-10.1-py2.py3-none-any.whl", hash = "sha256:2301cc554396efe449b079f99a0b5812e8e3dc364195dfcd2cc2b8a9c8915f11"}, + {file = "pyobjc-framework-MediaAccessibility-10.2.tar.gz", hash = "sha256:acce0baf11270c9276a219f5a0dfb6d8241e01ac775144bfe3a83e088dcd1308"}, + {file = "pyobjc_framework_MediaAccessibility-10.2-py2.py3-none-any.whl", hash = "sha256:55dbf7519028fadf3ac6cb1ef185156f6df649655075a015cf87cee370255e82"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-medialibrary" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MediaLibrary on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MediaLibrary-10.1.tar.gz", hash = "sha256:cd4815cb270aa2f28acdad8185a4b9d4b76a6177f70e8ed62a610484f4bd44a9"}, - {file = "pyobjc_framework_MediaLibrary-10.1-py2.py3-none-any.whl", hash = "sha256:420d5006c624aaaf583058666fd5900a5619ff1f230e99cdd3acb76c12351a37"}, + {file = "pyobjc-framework-MediaLibrary-10.2.tar.gz", hash = "sha256:b3e1bd3e70f0013bbaccd0b43727a0f16ecf23f7d708ca81b8474faaa1f8e8fc"}, + {file = "pyobjc_framework_MediaLibrary-10.2-py2.py3-none-any.whl", hash = "sha256:98b9687f1399365889529c337d99d7f19edf3a94beb05884cf15a29f4fc178af"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-mediaplayer" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MediaPlayer on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MediaPlayer-10.1.tar.gz", hash = "sha256:394acea4fb61f8c4605494c7c64c52a105760aa2ec7e2c34db484e576ed10ad6"}, - {file = "pyobjc_framework_MediaPlayer-10.1-py2.py3-none-any.whl", hash = "sha256:10e25a8682cd0d1d8fc0041f0a34e8acf785b541d8c1ebe493c2d17caeef5648"}, + {file = "pyobjc-framework-MediaPlayer-10.2.tar.gz", hash = "sha256:4b6d296b084e01fb6e5c782b7b6308077db09f4051f50b0a6c3298ffbd1f1d70"}, + {file = "pyobjc_framework_MediaPlayer-10.2-py2.py3-none-any.whl", hash = "sha256:c501ea19380bfbf6b04fbe909fcfe9a78c5ff2a9b58dae87be259066b1ae3521"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-AVFoundation = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-AVFoundation = ">=10.2" [[package]] name = "pyobjc-framework-mediatoolbox" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MediaToolbox on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MediaToolbox-10.1.tar.gz", hash = "sha256:56906cd90e1f969656db1fecd5874c6345e160044f54596c288fb0ffdb35cdc5"}, - {file = "pyobjc_framework_MediaToolbox-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:23b02872d910481a75db8eeb9c053a16b9a3cff1e030ca29d855ba8291c9501a"}, - {file = "pyobjc_framework_MediaToolbox-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c96557db9540ed18748f47d4cd0b2ba7273acb756bf7e91d8b2a943211850614"}, - {file = "pyobjc_framework_MediaToolbox-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:17ee7f045f39e3f11945bf951dfb4238c695ca49938e8b43c78fe12a8eb05628"}, + {file = "pyobjc-framework-MediaToolbox-10.2.tar.gz", hash = "sha256:614ec0a28c810395274aa1d5348a447f67bae4629a3a8372d14162f38e2fc597"}, + {file = "pyobjc_framework_MediaToolbox-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ca7443bca94dfd9863d5290d2680247b7d577cf031dcfc854c414e5fdd9cdb03"}, + {file = "pyobjc_framework_MediaToolbox-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c34dca15560507286eb9ef045d6234ac1db1e50f22c63397662155a7f01ea9ac"}, + {file = "pyobjc_framework_MediaToolbox-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:696d6cadbb643f98750f5a791663ca264f0a0f4db2aeec7c8cf59c02face1683"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-metal" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Metal on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Metal-10.1.tar.gz", hash = "sha256:bde76fe5d285c9c875d411a7cf6cdd7617559eabf4fb9a588f90762a0634148c"}, - {file = "pyobjc_framework_Metal-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:0701fe5e5aaa5471843fa0d5fe8fe3279313ff83c8bf5230ab6e11f7cba79a78"}, - {file = "pyobjc_framework_Metal-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5f542aaab62b9803e7e644b86dd82718aa9f1bcfc11cb4a666a59f248b3ae2e0"}, - {file = "pyobjc_framework_Metal-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:90ba5118ebf56a152e2404336ad7732dc60f252cd2414d34c9b32c07897f4512"}, + {file = "pyobjc-framework-Metal-10.2.tar.gz", hash = "sha256:652050cf9f5627dba36b31ad134e56c49040d0dcfaf93a7026018ef17330a01e"}, + {file = "pyobjc_framework_Metal-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c68e4025c52e8c8b0fa584abeb058debe49ac3174e8c421408bf873e5951fd02"}, + {file = "pyobjc_framework_Metal-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:49f333f41556f08e28750bb4e09a7053ac55434f4a29a3e228ed4fd9bae8f57d"}, + {file = "pyobjc_framework_Metal-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:0cb39a4f4a70f45f88f79c3641b00b6db0c9b9ed90bee21840a725a8d7c7eaca"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-metalfx" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MetalFX on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MetalFX-10.1.tar.gz", hash = "sha256:64c96595c2489e41d93a1c75d1eace70619d973e5c9e90e7cfca29c934fc5d06"}, - {file = "pyobjc_framework_MetalFX-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3d456581a76fde824a9109f9dfdd3fc4819e81ae27527b23d2855656ed0ab6ed"}, - {file = "pyobjc_framework_MetalFX-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a3fd4384c83c0818484a3a90120131114a0866b2004309cda24ce873e4ff1e50"}, - {file = "pyobjc_framework_MetalFX-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:76a9ef5abf114c1e2d60b1e971619183f87918eafeb0719a281d1475c88592ad"}, + {file = "pyobjc-framework-MetalFX-10.2.tar.gz", hash = "sha256:d98a0fd1f0d2d3ea54efa768e6817a8773566c820ae7a3a23497e1c492e11da7"}, + {file = "pyobjc_framework_MetalFX-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:e7f1b50316db47ffb1e9505726dfe5bf552f32188d21b6ef979078fec9f58077"}, + {file = "pyobjc_framework_MetalFX-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:526687ac36b71b9822613bf552bff99930ee2620414b0b932f5e0d327d62809e"}, + {file = "pyobjc_framework_MetalFX-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a8c78a8f9c3ee59cb5ba96e4db56c3ab8cc78860f9d42ca5732168d8691cb17b"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Metal = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Metal = ">=10.2" [[package]] name = "pyobjc-framework-metalkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MetalKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MetalKit-10.1.tar.gz", hash = "sha256:da0357868824e6ec506ff92d18d729f8462c4c5ca8f26ecc86e8c031d78fa80d"}, - {file = "pyobjc_framework_MetalKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8723c6b009bf0ce7eb77aa7bdc54f1ee6d0450a3bc2f8ce85523170e92a62152"}, - {file = "pyobjc_framework_MetalKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e94303a78a883e3aa53115c4ebb8329989fcf36be353e908252bba3ba3dc807d"}, - {file = "pyobjc_framework_MetalKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:184922a11f273e604f2c5af2e14ce1f4ef2dce0f5c09aadda857c5a5ca6acab1"}, + {file = "pyobjc-framework-MetalKit-10.2.tar.gz", hash = "sha256:42fc61371d49c2b86828d2a668b7badb2418c0ecce7595fce790830607bd8040"}, + {file = "pyobjc_framework_MetalKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:abcdabdad3d9810730c67f493b70139254f7438ebba0149b5dcd848384a08a85"}, + {file = "pyobjc_framework_MetalKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7990b05194919d187a6af8be7fe51007ab666cfdb3512b6fb022da9049d9957d"}, + {file = "pyobjc_framework_MetalKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c26c2e2965ae6547edecbc8e250117401c26f62f9a55e351eca42f2e557721e7"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Metal = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Metal = ">=10.2" [[package]] name = "pyobjc-framework-metalperformanceshaders" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MetalPerformanceShaders on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MetalPerformanceShaders-10.1.tar.gz", hash = "sha256:335a49c69ac95e412c581592a148a32c0fcf434097e50da378f21fe09be13738"}, - {file = "pyobjc_framework_MetalPerformanceShaders-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a410b6dce52f7a2adebdb66891bfc33939ffe24bd75691fc30c1f7539521df86"}, - {file = "pyobjc_framework_MetalPerformanceShaders-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7218e89bccadc451f5ba040d84b049fe8b4a4bf7d9a4fdfb20fe6851e433cd49"}, - {file = "pyobjc_framework_MetalPerformanceShaders-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:9452e07d38c7a199c2eebb1280227285f918b97d3d597940e1e6e6471636b44a"}, + {file = "pyobjc-framework-MetalPerformanceShaders-10.2.tar.gz", hash = "sha256:66e6f671279b1f7edbaed1bea8ab1eb57f617e000c1e871c190b60ad60c1d727"}, + {file = "pyobjc_framework_MetalPerformanceShaders-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a65c201921fffb992955aa143ffcb36be3e7c5aee86334941d3214428f0c7ad8"}, + {file = "pyobjc_framework_MetalPerformanceShaders-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9fd437d0b1a83a3bdc866727ba17a00b49ee239205b2d14b617f5ca4f566c4f7"}, + {file = "pyobjc_framework_MetalPerformanceShaders-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:0f862a65ffc0159e6b9ad46115b8d7ecbce5f56fe920c709b943982d4a70d63c"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Metal = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Metal = ">=10.2" [[package]] name = "pyobjc-framework-metalperformanceshadersgraph" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MetalPerformanceShadersGraph on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MetalPerformanceShadersGraph-10.1.tar.gz", hash = "sha256:f587a0728e5240669d23a649f50bb25c10577f9775ba4f2576b19423575464a0"}, - {file = "pyobjc_framework_MetalPerformanceShadersGraph-10.1-py2.py3-none-any.whl", hash = "sha256:467e84983c5ded8cfaea8cb425872d5069eda8c4cc1f803ca3afaed0e184c763"}, + {file = "pyobjc-framework-MetalPerformanceShadersGraph-10.2.tar.gz", hash = "sha256:4fffad1c37e700fc38b2ca8eb006d7532b3b5cb700580ce7dfd31af35e0fb6e8"}, + {file = "pyobjc_framework_MetalPerformanceShadersGraph-10.2-py2.py3-none-any.whl", hash = "sha256:7fedd831f9fc58708f6b01888abd42a2f08151c86db47280fe47be0f709811bf"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-MetalPerformanceShaders = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-MetalPerformanceShaders = ">=10.2" [[package]] name = "pyobjc-framework-metrickit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MetricKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MetricKit-10.1.tar.gz", hash = "sha256:6887cec4b7aa489ec16af2f77f7c447bc0a0493456fe1c4910d95a5b3e587fcd"}, - {file = "pyobjc_framework_MetricKit-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:02c8775000effbb00f6dde0a493b9ae955e54be4f9e72c4d0f2350d0864b46ac"}, - {file = "pyobjc_framework_MetricKit-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:49f6d9d9c46eb6605799fe0d898945cb62fc5c2d2fea1f7e51950765bbf7b03b"}, - {file = "pyobjc_framework_MetricKit-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6494dac683181dd1ca55b2fc912f693f51483a4e468a3fac05543539a643ca40"}, - {file = "pyobjc_framework_MetricKit-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cb7b318a2e2f4bb841a5427ab53448c827de0f2617123b804c41e6d595581321"}, - {file = "pyobjc_framework_MetricKit-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:5484980ef21e68389ed452f8a4d357f00dabf8711cb5268efe683f758441f23f"}, - {file = "pyobjc_framework_MetricKit-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7dc5a4da156e7f8724969ae329c8bae4fab58c2d7376ae96f62e2d646cc1175c"}, + {file = "pyobjc-framework-MetricKit-10.2.tar.gz", hash = "sha256:14cb02fd8fc338f6f15df5fd14c95419871b768cc8f5f71b1e0e99fde46b4712"}, + {file = "pyobjc_framework_MetricKit-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:585a494a5126c5481afc34ac5bfdc28a1a2b7044d8b0e3427fbd5313e72c59fb"}, + {file = "pyobjc_framework_MetricKit-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b330ccffa45f4ccf2fc23c73112bf3b652515eb025fddeb3e2c81ca25f1a168"}, + {file = "pyobjc_framework_MetricKit-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fc336ff6db376bff4cab0bd7db962aae1ff11f4584026cd5c4d3f66283018ce7"}, + {file = "pyobjc_framework_MetricKit-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1403302d753686b49aa0d6fc0a4c05e6ead18aa1b9de9668322fd0e81c51f"}, + {file = "pyobjc_framework_MetricKit-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:82b01a838203000c262f9f52420b1387850505f0a7b742b29a73cc8c6a9e0c25"}, + {file = "pyobjc_framework_MetricKit-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:79971789bff04540200bd443ec3c6ae13f83eea827d2dab0f33bc9c6e6af9ab0"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-mlcompute" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MLCompute on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MLCompute-10.1.tar.gz", hash = "sha256:02e947ddb90c236acb2cb34f41838e6c78cb070886ddfb98bb71a8f02f991fd6"}, - {file = "pyobjc_framework_MLCompute-10.1-py2.py3-none-any.whl", hash = "sha256:25ed4d3002bd33c039f4ad9bf05b4830d53f67282a8399df7c65bd1430a01183"}, + {file = "pyobjc-framework-MLCompute-10.2.tar.gz", hash = "sha256:6f5bff2317b2ae45c092a94a05e7831d0dc7a002fc68b03648abbac5a2ce33a3"}, + {file = "pyobjc_framework_MLCompute-10.2-py2.py3-none-any.whl", hash = "sha256:a191abf1c6aef061b4eab1aa8d4cf886fd6c98e53f6fedcd738ddd904571b933"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-modelio" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ModelIO on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ModelIO-10.1.tar.gz", hash = "sha256:75fe5405165264a5059c16bfd492593e3becba50811a47dedbfc699ff73d4bfb"}, - {file = "pyobjc_framework_ModelIO-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:6911dfa7821e1b97cf48b593d3ccd6c9f2401ed1715a677df3cdfdfeec7dad14"}, - {file = "pyobjc_framework_ModelIO-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e1a1f3b276999032ff13b1f985ae06a95b5ffc9c53771b10ea3496a70e809d58"}, - {file = "pyobjc_framework_ModelIO-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:8c6d43cca1c952858b2f31cab7b9ef01daae5aa1322240895d2e965cc72230cd"}, + {file = "pyobjc-framework-ModelIO-10.2.tar.gz", hash = "sha256:8ae1444375260a346d1c77838f84e2c04dfabaf2769b2970a3588becb670431e"}, + {file = "pyobjc_framework_ModelIO-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:6d226b059a4c99669ec3dc03c1dde9b0daeba392a198cdb36398394396512a26"}, + {file = "pyobjc_framework_ModelIO-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c2fff57596d54b95507a1c180a6df877e28e561e5e71941619d70ac67d5bec4d"}, + {file = "pyobjc_framework_ModelIO-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e6b119d66cefde55ce63e406c4fd12d626fb017ee88d9e01fdd25434f6ddc831"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-multipeerconnectivity" -version = "10.1" +version = "10.2" description = "Wrappers for the framework MultipeerConnectivity on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-MultipeerConnectivity-10.1.tar.gz", hash = "sha256:ab83e57953bb3f3476c77ed863e1138ab58a0711a77a1a11924b9d22e90f116b"}, - {file = "pyobjc_framework_MultipeerConnectivity-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:e5770351b75484bbb4f6b0f0a20e0a0197a0b192a35228b087bc06f149242b0f"}, - {file = "pyobjc_framework_MultipeerConnectivity-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a06db4ee86ee85bd085659a965f1448b27bf0018f1842ae3fb6ec1c195b5352c"}, - {file = "pyobjc_framework_MultipeerConnectivity-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:becab88974b1669f5ca9c76dddb5591d4ed9acb4176980d763e22d298b6ba83d"}, + {file = "pyobjc-framework-MultipeerConnectivity-10.2.tar.gz", hash = "sha256:e3c1e5f39715621786f4ad5ecffa2cc9445a218e5ab3e94295c16fbcb754ee5a"}, + {file = "pyobjc_framework_MultipeerConnectivity-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ce68b7b5030e95e78bc94e898adb09f1e3f30c738e7140101146c52c64ff5493"}, + {file = "pyobjc_framework_MultipeerConnectivity-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f158aaaabcfd0d1e6d77585ec24797dbedf6bde640675b26dcfb4e2093d3a0ce"}, + {file = "pyobjc_framework_MultipeerConnectivity-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:0e02f9ecdbf2c4aacd5ab8cd019415584bed7fa1656d525c8f841466d6e58993"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-naturallanguage" -version = "10.1" +version = "10.2" description = "Wrappers for the framework NaturalLanguage on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-NaturalLanguage-10.1.tar.gz", hash = "sha256:b017a75d7275606f1732fef891198e916743871ca7663ddbb1ffae7d4d93a855"}, - {file = "pyobjc_framework_NaturalLanguage-10.1-py2.py3-none-any.whl", hash = "sha256:02bb4df955ecf329cf6da77ca6952777e5b2a10aee67452ea6314ec632cbc475"}, + {file = "pyobjc-framework-NaturalLanguage-10.2.tar.gz", hash = "sha256:eba7de67bea4a6a071e04e79c8a4de0547c25a09635fe3d4ee6cd58fb6aeaf65"}, + {file = "pyobjc_framework_NaturalLanguage-10.2-py2.py3-none-any.whl", hash = "sha256:0165735973a720f09bd5a2333f32e16aac52332fb595425480d7a2215472d4fb"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-netfs" -version = "10.1" +version = "10.2" description = "Wrappers for the framework NetFS on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-NetFS-10.1.tar.gz", hash = "sha256:0bd9c58a0939df29729c0ab5c5fe3e7eb7fc066a15bd885ddbbbfc6d6b1524b6"}, - {file = "pyobjc_framework_NetFS-10.1-py2.py3-none-any.whl", hash = "sha256:a317c30a367af22f94858ca73cfe38a0dc4b63d0783f93532cb33780cd98a942"}, + {file = "pyobjc-framework-NetFS-10.2.tar.gz", hash = "sha256:05de46b15d19abecbb9e7d04745ca27dba9ec121f16ea7bafc9dc87a12c0e828"}, + {file = "pyobjc_framework_NetFS-10.2-py2.py3-none-any.whl", hash = "sha256:e7a84497be6114ea2e47776efda640d9d8becaaa07214d712a204b5d446e3d95"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-network" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Network on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Network-10.1.tar.gz", hash = "sha256:39c02fdcac4e487e14296f5d60458b9a0cd58c2a830591a7cfacc0bca191e03f"}, - {file = "pyobjc_framework_Network-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5a31831cd9949efbc82bcea854ea3c22dcb5dc85072f909710cde666efd5cfb6"}, - {file = "pyobjc_framework_Network-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6704cbbf5f50d73208e7c9d92a1212f581280430da2606e07e88669120c82a36"}, - {file = "pyobjc_framework_Network-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:fe52bac9aa16429f7a138aad4cbb1e95a2be5c052c1cfda7e8c4dd16d1147dec"}, + {file = "pyobjc-framework-Network-10.2.tar.gz", hash = "sha256:b39bc26f89cf9fc56cc9c4a99099aef68c388d45b62dc1ec16772ee290b225d4"}, + {file = "pyobjc_framework_Network-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4f465400cd4402b7495a27de4c9099bcc127afa4d1cb587f75b987750c0ea032"}, + {file = "pyobjc_framework_Network-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:39966aa35d17b00973fa85e334b6360311cfd1a097d26d79b5957bc7cd7fad4a"}, + {file = "pyobjc_framework_Network-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5542660d0c7183dc4599bd20763ed3b59772cf17211ca3720a4175f886a8eada"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-networkextension" -version = "10.1" +version = "10.2" description = "Wrappers for the framework NetworkExtension on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-NetworkExtension-10.1.tar.gz", hash = "sha256:f49a3bd117ca40a1ea8ae751aca630f7b7e7d7305aa5dfa969beb07299eb2784"}, - {file = "pyobjc_framework_NetworkExtension-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:bfc5a7b402c8daced465c6b18683930a2ece91e98134cc1801657ad0a9256b1e"}, - {file = "pyobjc_framework_NetworkExtension-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:dfd808295c3b68a2f225410a67645b184187848be86abc2e6ba90db27e5c470f"}, - {file = "pyobjc_framework_NetworkExtension-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a925cfdabb4d882e8b9c3524a729c3b683e7a7ca18e291509625d3e63d3840cb"}, + {file = "pyobjc-framework-NetworkExtension-10.2.tar.gz", hash = "sha256:14f237bd96a822c55374584e99f2d79581b2d60570f34e4863800f934a44b82d"}, + {file = "pyobjc_framework_NetworkExtension-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:280dc76901628b2c9750766bb2424a29de3f1f49b41e5f29634701cfe0ab0524"}, + {file = "pyobjc_framework_NetworkExtension-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ce6cfdff6f65f512137ee382ba04ee2b52e0fb51deacb651e385daf5349d28b7"}, + {file = "pyobjc_framework_NetworkExtension-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ed2cf32a802ec872466c743013ce9ef17757e89e21a49cbeeeffddfaefb89fc4"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-notificationcenter" -version = "10.1" +version = "10.2" description = "Wrappers for the framework NotificationCenter on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-NotificationCenter-10.1.tar.gz", hash = "sha256:697e29da4fdd5899e5db5bda7bdb5afc97f4a6e4d959caf2316aef3b300c5575"}, - {file = "pyobjc_framework_NotificationCenter-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f9078ba52e1cfa77c797a9aed972c182acfcc79cc2eb083c7b06ba76738b5f6d"}, - {file = "pyobjc_framework_NotificationCenter-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:25bf6f521f99ccb057d0df063242d5d28223672525706317134caa887ffd6b07"}, - {file = "pyobjc_framework_NotificationCenter-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:7a6876f4b25023562ddf2558fba5e52d72a7ce3ec41c8e96533779d25e2b7722"}, + {file = "pyobjc-framework-NotificationCenter-10.2.tar.gz", hash = "sha256:3771c7a8b8e839d07c7cb51eef2e83666254bdd88bd873b0ba7e385245cda684"}, + {file = "pyobjc_framework_NotificationCenter-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f982ce1d0916f9ba3322ebbffd9b936b5b9aeb6d8ec21bd2c3c5245c467c1a12"}, + {file = "pyobjc_framework_NotificationCenter-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:dd1d8364d2212a671b2224ab6bf7785ba5b2aae46610ec46ae35d27c4d55cb15"}, + {file = "pyobjc_framework_NotificationCenter-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:1e8aaaef40b6c0deaffd979b3741d1f9de7d804995b7b92fa88ba7839615230e"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-opendirectory" -version = "10.1" +version = "10.2" description = "Wrappers for the framework OpenDirectory on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-OpenDirectory-10.1.tar.gz", hash = "sha256:5d25c254876378966ce58e0de9e3d3594ca25922773d6526235b5e2f2c4103e1"}, - {file = "pyobjc_framework_OpenDirectory-10.1-py2.py3-none-any.whl", hash = "sha256:83601f3b5694b1087616566019c300aa38b2a15b59d215e96c5dae18430e8c96"}, + {file = "pyobjc-framework-OpenDirectory-10.2.tar.gz", hash = "sha256:ecca3346275e1ee7be812e428da7f243e37258d8152708a2baa246001b7f5996"}, + {file = "pyobjc_framework_OpenDirectory-10.2-py2.py3-none-any.whl", hash = "sha256:7996985a746f4cceee72233eb5671983e9ee9c9bce3fa9c2fd03d65e766a4efd"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-osakit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework OSAKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-OSAKit-10.1.tar.gz", hash = "sha256:59ad344fed2ddbc24c5dad3345f596cd6ecb73e4c97a05051e3680709f66a42f"}, - {file = "pyobjc_framework_OSAKit-10.1-py2.py3-none-any.whl", hash = "sha256:af34b4dccc17a772d80c283c9356bdb5a5a300bd54c2557c26671aca4f2f86cb"}, + {file = "pyobjc-framework-OSAKit-10.2.tar.gz", hash = "sha256:6efba4a1733e9ab0bf0e7b4f2eb3e0c84b2a4af1b0b4bbc3a310ae041ccaf92d"}, + {file = "pyobjc_framework_OSAKit-10.2-py2.py3-none-any.whl", hash = "sha256:fbad23e47e31d795a005c18a20d84bff68d90d6dd0f87b6a343e46f87c00034a"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-oslog" -version = "10.1" +version = "10.2" description = "Wrappers for the framework OSLog on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-OSLog-10.1.tar.gz", hash = "sha256:bfce0067351115ae273489768f93692dcda88bd5b54f28bb741c08855c114dfe"}, - {file = "pyobjc_framework_OSLog-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:57b2920c5c9393fb4fe9e1d5d87eabead32ebe821853d06d577bdb5503327a49"}, - {file = "pyobjc_framework_OSLog-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e94a3ce153fe72f7fe463e468d94e3657db54b133aaf5a313fb31b6b52ed60f2"}, - {file = "pyobjc_framework_OSLog-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:09e64565e4a293f3a9d486e1376f2c9651d5cec500b2c2245de9ae0baecfb29e"}, + {file = "pyobjc-framework-OSLog-10.2.tar.gz", hash = "sha256:2377637a0de7dd60f610caab4bcd7efa165d23dba4ac896fd542f1fab2fc588a"}, + {file = "pyobjc_framework_OSLog-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ef1ddc15f98243be9b03f4f4bcb839318333fb135842085ba40499a58c8bd342"}, + {file = "pyobjc_framework_OSLog-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7958957503310ec8df90a0a036ae8a075b90610c0b797769ad117bf635b0caa6"}, + {file = "pyobjc_framework_OSLog-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:67796f02b77c1cc893b3f112f88c58714b1e16a38b59bc52748c25798db71c29"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreMedia = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreMedia = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-passkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework PassKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-PassKit-10.1.tar.gz", hash = "sha256:bc19a46fad004137f207a5a9643d3f9a3602ea3f1d75c57841de986019a3c805"}, - {file = "pyobjc_framework_PassKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:011e2f32bc465b634d171a2500e6a153b479b807a50659cc164883bbeec74e59"}, - {file = "pyobjc_framework_PassKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:791f7d4317164130e8232e75e40ba565633a01bc5777dc3d0ba0a8b5f4aeab92"}, - {file = "pyobjc_framework_PassKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:58115c31a2e8b8a57ca048de408444cc4ba94da386656e0eeeac919b157f03a4"}, + {file = "pyobjc-framework-PassKit-10.2.tar.gz", hash = "sha256:0c879d632f0f0bf586161a7abbbba3dad9ba9894a3edbce06f4160491c2c134c"}, + {file = "pyobjc_framework_PassKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:15891c8c1e23081961d652946d4750fd3cd1308efc953a1c77713394726798a6"}, + {file = "pyobjc_framework_PassKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:d68061729743be30c66f7eb3cb649850ef12a24b1d1896233036a390e7d69aa7"}, + {file = "pyobjc_framework_PassKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:7290369b34be3317463a32c9e78a0ed734db4793414851a9e73295413cf17317"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-pencilkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework PencilKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-PencilKit-10.1.tar.gz", hash = "sha256:712654dc9373014aa5472b10ba269d95f455c722ebb7504caa04dfae209ed63a"}, - {file = "pyobjc_framework_PencilKit-10.1-py2.py3-none-any.whl", hash = "sha256:baf856d274653d74d66099ae81005ddb3923f7128d36d2f87100481cbb8b2b27"}, + {file = "pyobjc-framework-PencilKit-10.2.tar.gz", hash = "sha256:2338ea384b9a9e67a7f34c300a898ccb997bcff9a2a27e5f9bf7642760c016a0"}, + {file = "pyobjc_framework_PencilKit-10.2-py2.py3-none-any.whl", hash = "sha256:d3e605f104548f26c708957ab7939a64147c422c35d45c4ff4c8d01b5c248c4d"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-phase" -version = "10.1" +version = "10.2" description = "Wrappers for the framework PHASE on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-PHASE-10.1.tar.gz", hash = "sha256:b7e0ef3567359a4f8ab3e5f8319f2201e775e3db6d7498409701664568c8c7c6"}, - {file = "pyobjc_framework_PHASE-10.1-py2.py3-none-any.whl", hash = "sha256:329cd6dd040a7ef8091dda9d8e57d9613bc9c8edf3cfd3af549f5cd9d64a0941"}, + {file = "pyobjc-framework-PHASE-10.2.tar.gz", hash = "sha256:047ba5b7a869ed93c3c7af2cf7e3ffc83299038275d47c8229e7c09006785402"}, + {file = "pyobjc_framework_PHASE-10.2-py2.py3-none-any.whl", hash = "sha256:f29cd40e5be860758d8444e761d43f313915e2750b8b03b8a080dd86260f6f91"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-AVFoundation = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-AVFoundation = ">=10.2" [[package]] name = "pyobjc-framework-photos" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Photos on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Photos-10.1.tar.gz", hash = "sha256:eb0e83d01c8eb0652fac8382e68fd9643b7530f6580c2a51846444cae09ec094"}, - {file = "pyobjc_framework_Photos-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d91ead1ec33e05bf9e42b7df3f8fe7e3d4cf2814482f6878060c259453491d65"}, - {file = "pyobjc_framework_Photos-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f8415346689213b30488eb023d699c0512fcddeb7e1e4aa833860c312dddf780"}, - {file = "pyobjc_framework_Photos-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:61174248e07025d4696b6164346b43147250d03ae8378f70a458c0583e003656"}, + {file = "pyobjc-framework-Photos-10.2.tar.gz", hash = "sha256:ba05d1208158e6de6d14782c182991c0d157254be7254b8d3bb0a9a53bf113fb"}, + {file = "pyobjc_framework_Photos-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4f2c2aa73f3ac331a84ee1f7b5e0edc26471776b2de2190640f041e3c1cc8ef3"}, + {file = "pyobjc_framework_Photos-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:17d69ce116a7f7db1d78ed12a8a81bec1b580735ad40611c0037d8c2977b2eb8"}, + {file = "pyobjc_framework_Photos-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e53d0759c26c7eac4ebfc7bd0018dfd7e3be8ab88a042684ee45e9184e0ac90e"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-photosui" -version = "10.1" +version = "10.2" description = "Wrappers for the framework PhotosUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-PhotosUI-10.1.tar.gz", hash = "sha256:4b90755c6c62a0668782cf05d92fca6277485f2cb3473981760c0dc0e40de1d8"}, - {file = "pyobjc_framework_PhotosUI-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:206641f2f7f3169fecc0014b9b93c89b5503841014e911d4686684de137c79f9"}, - {file = "pyobjc_framework_PhotosUI-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:02c1861bcce433294b00f6c614559addc87fcf57aaa1ede2b6dfea50a3795378"}, - {file = "pyobjc_framework_PhotosUI-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:8df716fb2e9994bfc2d716d6930defb3e3911a0337788ef36eea0c2eb0f899ad"}, + {file = "pyobjc-framework-PhotosUI-10.2.tar.gz", hash = "sha256:d0bbcae82b4cc652bb60d3221c557cc19be62ff430575ec8e6d233beb936f73b"}, + {file = "pyobjc_framework_PhotosUI-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a27607419652b45053e0be5ede2780b48e6a8dded2b365ded1732e80dafacea0"}, + {file = "pyobjc_framework_PhotosUI-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7eddf0343fae6c327a3dc941d0d7b216f5d186edb2e511d7c54668f6ff2be701"}, + {file = "pyobjc_framework_PhotosUI-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d6715ac72c7967761c33502f6cd552534ec0f727f009f22a2c273dc12076d52d"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-preferencepanes" -version = "10.1" +version = "10.2" description = "Wrappers for the framework PreferencePanes on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-PreferencePanes-10.1.tar.gz", hash = "sha256:3a26cd8959dac30203410eb432a361caf2a0b8552c74edd3d7406d722ecc1014"}, - {file = "pyobjc_framework_PreferencePanes-10.1-py2.py3-none-any.whl", hash = "sha256:9b16c93d7f684cbe097932c8260a0b6460ad9fc68230648981340b7e3ee7053e"}, + {file = "pyobjc-framework-PreferencePanes-10.2.tar.gz", hash = "sha256:f1fba8727d172a3e9b58d764695702f7752dfb585d0378e588915f3d8363728c"}, + {file = "pyobjc_framework_PreferencePanes-10.2-py2.py3-none-any.whl", hash = "sha256:4da63d42bc2f2de547b6c817236e902ad6155efa05e5305daa38be830b70a19d"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-pubsub" -version = "10.1" +version = "10.2" description = "Wrappers for the framework PubSub on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-PubSub-10.1.tar.gz", hash = "sha256:7992344ae82d9566d300b3d2c92ff9fa9a28e060bd42d0988df351f5fb729156"}, - {file = "pyobjc_framework_PubSub-10.1-py2.py3-none-any.whl", hash = "sha256:af0b1ed0328f06d7d96390a4b95bfb4a790d5b38142825a222923f908dc46db9"}, + {file = "pyobjc-framework-PubSub-10.2.tar.gz", hash = "sha256:68ca9701b29c5e87f7837490cad3dab0b6cd539dfaff3ffe84b1f3f1bf4dc764"}, + {file = "pyobjc_framework_PubSub-10.2-py2.py3-none-any.whl", hash = "sha256:b44f7f87de3f92ce9655344c476672f8f7a912f86ab7a615fec30cebbe7a8827"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-pushkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework PushKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-PushKit-10.1.tar.gz", hash = "sha256:12798ad9ae87f7e78690d2bce2ea46f0714d30dd938f5b288717660120a00795"}, - {file = "pyobjc_framework_PushKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:99edcd057d5cc7e015fe6b464b83f07c843fba878f5b0636ff30cd6377ec2915"}, - {file = "pyobjc_framework_PushKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:986216b9021ed6aff3a528c2b6a3885426e8acac9a744397ede998d2e7a83d06"}, - {file = "pyobjc_framework_PushKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:cf27a49a3b9eadde0bc518b54f7b38fd5d0e1c2203350d1286527b6177afa3c3"}, + {file = "pyobjc-framework-PushKit-10.2.tar.gz", hash = "sha256:e30fc4926a9fcd3427701e48a8908f72e546720e52b1e0f457ba2fa017974917"}, + {file = "pyobjc_framework_PushKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:1015e4473a8eac7eba09902807b8d8edd47c536e3a50a0b3fe7ab7211e454ad8"}, + {file = "pyobjc_framework_PushKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6f68b2630f84dc6d94046f7676d415e5342b2bb3f0368f3b9e81d0c5744c219b"}, + {file = "pyobjc_framework_PushKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5fe75738ea08c05e42460a58acbf0a8af67a3df26ca2a7bddd48d801b00772ed"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-quartz" -version = "10.1" +version = "10.2" description = "Wrappers for the Quartz frameworks on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Quartz-10.1.tar.gz", hash = "sha256:b7439c0a3be9590d261cd2d340ba8dd24a75877b0be3ebce56e022a19cc05738"}, - {file = "pyobjc_framework_Quartz-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:69db14ac9814839471e3cf5a8d81fb5edd1b762739ad806d3cf244836dac0154"}, - {file = "pyobjc_framework_Quartz-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ddcd18e96511e618ce43e288a043e25524c131f5e6d58775db7aaf15553d849"}, - {file = "pyobjc_framework_Quartz-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c4257a2fb5580e5ebe927a66cf36a11749685a4681a30f90e954a3f08894cb62"}, - {file = "pyobjc_framework_Quartz-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28315ca6e04a08ae9e4eaf35b364ee77e081605d5865021018217626097c5e80"}, - {file = "pyobjc_framework_Quartz-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:9cb859a2fd7e15f2de85c16b028148dea06002d1a4142922b3441d3802fab372"}, - {file = "pyobjc_framework_Quartz-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:993c71009e6374e57205e6aeaa577b7af2df245a5d1d2feff0f88ca0fa7b8626"}, + {file = "pyobjc-framework-Quartz-10.2.tar.gz", hash = "sha256:9b947e081f5bd6cd01c99ab5d62c36500d2d6e8d3b87421c1cbb7f9c885555eb"}, + {file = "pyobjc_framework_Quartz-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bc0ab739259a717d9d13a739434991b54eb8963ad7c27f9f6d04d68531fb479b"}, + {file = "pyobjc_framework_Quartz-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a74d00e933c1e1a1820839323dc5cf252bee8bb98e2a298d961f7ae7905ce71"}, + {file = "pyobjc_framework_Quartz-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3e8e33246d966c2bd7f5ee2cf3b431582fa434a6ec2b6dbe580045ebf1f55be5"}, + {file = "pyobjc_framework_Quartz-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c6ca490eff1be0dd8dc7726edde79c97e21ec1afcf55f75962a79e27b4eb2961"}, + {file = "pyobjc_framework_Quartz-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d3d54d9fa50de09ee8994248151def58f30b4738eb20755b0bdd5ee1e1f5883d"}, + {file = "pyobjc_framework_Quartz-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:520c8031b2389110f80070b078dde1968caaecb10921f8070046c26132ac9286"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-quicklookthumbnailing" -version = "10.1" +version = "10.2" description = "Wrappers for the framework QuickLookThumbnailing on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-QuickLookThumbnailing-10.1.tar.gz", hash = "sha256:b6c4ea3701cb18abaffcceb65adc9dcfd6bb28811af7a99148c71e71d538a3a6"}, - {file = "pyobjc_framework_QuickLookThumbnailing-10.1-py2.py3-none-any.whl", hash = "sha256:984e4e92727caa5b2ebbe8c91fcde6acc416f15dd8e7aef94cb3999c4a7028ec"}, + {file = "pyobjc-framework-QuickLookThumbnailing-10.2.tar.gz", hash = "sha256:91497a4dc601c99ccc11ad7976ff729b57f724d9eff071bc24c519940d129dca"}, + {file = "pyobjc_framework_QuickLookThumbnailing-10.2-py2.py3-none-any.whl", hash = "sha256:34349ff0b07b39ecfe5757eb80341a45f9d4426558b93946225f8b4fa2781c4c"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-replaykit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ReplayKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ReplayKit-10.1.tar.gz", hash = "sha256:c74d092afd8da7448e3b96a28d9cde09ad11269b345a5df21ce971c87671e421"}, - {file = "pyobjc_framework_ReplayKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:592cd22d78a92691d3dce98cd526e95fbb692142541a62c99d989c8941ec9f55"}, - {file = "pyobjc_framework_ReplayKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:05358af8daef82de6fa40fb5e04639d0f29d3f22f34b0901d5a224f8d2a7da69"}, - {file = "pyobjc_framework_ReplayKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:771af451363b7c81c920a1290f673501762da6f691f54920d0866028098390dd"}, + {file = "pyobjc-framework-ReplayKit-10.2.tar.gz", hash = "sha256:12544028e59ef25ea5c96ebd451cee70d1833d6b5991d3a1b324c6d81ecfb49e"}, + {file = "pyobjc_framework_ReplayKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4e34b006879ed2e86df044e3dd36482d78e6297c954aeda29f60f4b9006c8114"}, + {file = "pyobjc_framework_ReplayKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a6e7ae17d41a381d379d10bd240e1681fc83664b89495999a4dd8d0f42d4b542"}, + {file = "pyobjc_framework_ReplayKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:3c57b4019563aaae3c37a250d6c064cbcb5c0d3b227b5b4f1e18bf4a1effcf0e"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-safariservices" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SafariServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SafariServices-10.1.tar.gz", hash = "sha256:5a9105d3aea43cd214583acd06609f56ed704ce816cb103916324e8ed8388fce"}, - {file = "pyobjc_framework_SafariServices-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f672434748e7d9b303535969bcb03d99cdbf79162292ad439c0347455f38f1db"}, - {file = "pyobjc_framework_SafariServices-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:64d37455a8bd541bd799604ee9e41120cc7c9c19f26776b6d8e16f1902738b70"}, - {file = "pyobjc_framework_SafariServices-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a5aa2fb6333ec0929f6b9689992b76eb6442e5ef4bad8b5a72c7796f24898868"}, + {file = "pyobjc-framework-SafariServices-10.2.tar.gz", hash = "sha256:723de09afb718b05d03cbbed42f90d36356294b038ca6422c88d50240047b067"}, + {file = "pyobjc_framework_SafariServices-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2cd4b4210bd3c05d74d41e5bf2760e841289927601184f0e6ca3ef85019aa5dd"}, + {file = "pyobjc_framework_SafariServices-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6c8aa0becaa7d4ce0d0d1ada4e14e1eae2bf8e5be7ef49cc1861a41d3a4eeade"}, + {file = "pyobjc_framework_SafariServices-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:aecc109b096b3e995b896bfb97c09ef156600788e2a46c498bb4e2e355faa2bc"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-safetykit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SafetyKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SafetyKit-10.1.tar.gz", hash = "sha256:f1ac7201d32129c9c1a200724a5d3e75c6da8793f9c8a628be206cdebcd548e5"}, - {file = "pyobjc_framework_SafetyKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3499fd9d85c8c93ae7be2949c1b2e91e0f74b9a0d39be9c66440c40195ef4633"}, - {file = "pyobjc_framework_SafetyKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ab7d47dbcdeafb56f0c2c6e1be847e74840038c19fecbbaf883e68cd44511eb9"}, - {file = "pyobjc_framework_SafetyKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5c68ab2994c21bd32540595ec92922b0234e48fbb6998fcb22bacee46286e999"}, + {file = "pyobjc-framework-SafetyKit-10.2.tar.gz", hash = "sha256:b5822cda3b1dc0209fa58027551fa17457763275902c7d42fc23d5b13de9ee67"}, + {file = "pyobjc_framework_SafetyKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:947d42faf40b4ddd71bce75b8b913b7b67e0640fffa508562f4e502ca99426d4"}, + {file = "pyobjc_framework_SafetyKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65feaff614eeacceb8c405030ddd79f8eda2366d2a73f44ea595f48f7969bcf0"}, + {file = "pyobjc_framework_SafetyKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a6c3201dfb649523fa2f7569ca1274d1322527e210ee19d7c2395d0e3d18e0a2"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-scenekit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SceneKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SceneKit-10.1.tar.gz", hash = "sha256:f6565f3dba3bacf6099677ef713f9c95bcb9d8c4ea755c1866d113f95f110fc9"}, - {file = "pyobjc_framework_SceneKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:70d3a7f78238255bf62fab33a3e9ac20e13ec228eafd1aa0ef579b3792e5d9b9"}, - {file = "pyobjc_framework_SceneKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1bbdee819b638530c53271a4f302357cf8c829dbfc6e40b062335c900816bb01"}, - {file = "pyobjc_framework_SceneKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e179e37613814661be86c8316dd92497012cec48bb4febdc3d432ac5e7594a3f"}, + {file = "pyobjc-framework-SceneKit-10.2.tar.gz", hash = "sha256:53d2ffac43684bb7834ae570d3537bd15f2a7711b77cc9e8b7b81f63a697ba03"}, + {file = "pyobjc_framework_SceneKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac80bf8c4cf957add63a0bd2f1811097fb62eafb4fc26192f4087cd7853e85fd"}, + {file = "pyobjc_framework_SceneKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:86c3d23b63b0bb4d8fea370cb08aac778bc3fdb64b639b8b9ea87dacc54fd1cf"}, + {file = "pyobjc_framework_SceneKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:00676f4e11f3069545b07357e51781054ecf4785ed24ea8747515e018db1618c"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-screencapturekit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ScreenCaptureKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ScreenCaptureKit-10.1.tar.gz", hash = "sha256:a00d85c97bf0cdd454d57181c371f372b8549c4edd949e2b66f42782f426f855"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bc05248b9ae9ed4aa474b4e54927216046c284a4c6c27d30db9df659887b7b1d"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98eaec608bd9858a265541b14d6708bcc0b8c8276c2a5b41b80d828c0c2a8c64"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ff8657865f6280a942d175b87933ff0f1b6064e672a7f1efb5e66d864b435c27"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:30615c2a9f0a04cca41afe0cee21e3179f72f055e9cac94fe1e4f31fcccb0919"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:2cbd9957e9823615a494b2fd6815688eb0ad2eed7df007b25e3f7d83261653a9"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a3b732bad05c973844ea3b25ccabf0d41b4c3eec4f7b5d78650337685cb43142"}, + {file = "pyobjc-framework-ScreenCaptureKit-10.2.tar.gz", hash = "sha256:86f64377be94db1b95e77ca53301ed94c0a7a82c0251c9e960bcae24b6a5841b"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e15b0af8a1155b7bc975ccd54192c5feae2706a8e17da6effa4273a3302d4dce"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bdcc687d022b8b6264dca74c1f72897c91528b0c701d76f1466faeead8030a11"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f53caee8edca7868449f2cce60574cedea4299c324fa692c944824a627b7b8a4"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4cdd6add328e2318550df325210c83d1de68774a634d3914da2bfbd1cb7d929f"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:e51c6c632b1c6ff773cfcf7d3e2b349693e06d52259b8c8485cfaa6c6cd602b3"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b63d9dc8635e7a3e59163a4abc13a9014de702729a55d290a22518702f4679fc"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreMedia = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreMedia = ">=10.2" [[package]] name = "pyobjc-framework-screensaver" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ScreenSaver on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ScreenSaver-10.1.tar.gz", hash = "sha256:d1b890c7cae9e5c43582fe834aebcb6a1ecf52467a8ed7a28ba9d873bbf582d5"}, - {file = "pyobjc_framework_ScreenSaver-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b464de6398ef3a700c4ac19ed92b25cf2d30900b574533a659967446fddede3b"}, - {file = "pyobjc_framework_ScreenSaver-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cc8f81b2073920ca84d8e83435b95731e798ad422e0a3d67b09feb208a3920c6"}, - {file = "pyobjc_framework_ScreenSaver-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:96868cd9dc6613144821bb4db50ca68efa3ae8e07c31a626ce02d78b4eeaaeff"}, + {file = "pyobjc-framework-ScreenSaver-10.2.tar.gz", hash = "sha256:00c6a312467abb516fd2f19e3166c4609eed939edc0f2c888ccd8c9f0fdd30f1"}, + {file = "pyobjc_framework_ScreenSaver-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:830b2fc85ff7d48824eb6f12100915c2aa480a1a408b53c30f6b81906dc8b1ea"}, + {file = "pyobjc_framework_ScreenSaver-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1cb8a31bd2a0597727553d0459c91803bf02c52ffb5ac94aa5ad484ddc46d88d"}, + {file = "pyobjc_framework_ScreenSaver-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ca00a5c4cd89450e629962bfafe6a4a25b7bae93eb3fdd3ecb314c6c5755cbcf"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-screentime" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ScreenTime on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ScreenTime-10.1.tar.gz", hash = "sha256:6221e0f5122042b280212a6555f72d94020c2fd62319c4562cdfc7b58960dd07"}, - {file = "pyobjc_framework_ScreenTime-10.1-py2.py3-none-any.whl", hash = "sha256:734e090debb954a890a564869f2af20b55b9f7b7875d360795c9875279d09bd9"}, + {file = "pyobjc-framework-ScreenTime-10.2.tar.gz", hash = "sha256:fd516f0dd7c16f15ab6ed3eeb8180460136f72b7eaa3d6e849d4a462438bfdf2"}, + {file = "pyobjc_framework_ScreenTime-10.2-py2.py3-none-any.whl", hash = "sha256:43afabfd0fd61eed91f11aba3de95091a4f05d7c7e63341f493026e5ff7b90e4"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-scriptingbridge" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ScriptingBridge on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ScriptingBridge-10.1.tar.gz", hash = "sha256:7dce35a25d1f3b125e4b68a07c7f9eaa33fc9f00dde32356d0f7f73eb09429a3"}, - {file = "pyobjc_framework_ScriptingBridge-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:15e60d3783d7611f4d35e6b2905921a01162cfa04eb1a6426135585c84806d19"}, - {file = "pyobjc_framework_ScriptingBridge-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:30c0aac8623d0e96442801219004c32d527d4b4bbbf5c271517d73c5eeae85a3"}, - {file = "pyobjc_framework_ScriptingBridge-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ca0dc8ccb443f5a3ab9afb500d6c730723faf38c5880a243a65b4e44be64fa55"}, + {file = "pyobjc-framework-ScriptingBridge-10.2.tar.gz", hash = "sha256:c02d88b4a4d48d54ce2260f5c7e1757e74cd91281352cdd32492a4c7ee4b0e7c"}, + {file = "pyobjc_framework_ScriptingBridge-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:466ad2d483edadf97dc38629c393902a790141547e145e83f6bd34351d10f4c9"}, + {file = "pyobjc_framework_ScriptingBridge-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1e3e0c19afd0f8189ebee5c57ab2b0c177dddccc9b56811c665ec6848007ac6a"}, + {file = "pyobjc_framework_ScriptingBridge-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:560dff883edd251f1e0bf86dde681c1e19845399720fd2434734c91120eafdd0"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-searchkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SearchKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SearchKit-10.1.tar.gz", hash = "sha256:75234ee6e8490cf792453bf9a9854d7b5f1cebd65e81903d5ce0ecc3e65fc277"}, - {file = "pyobjc_framework_SearchKit-10.1-py2.py3-none-any.whl", hash = "sha256:2e42e7cacb0a7f9b327d1c770e52fe13dfaaac377cb4e413b609e478993552e0"}, + {file = "pyobjc-framework-SearchKit-10.2.tar.gz", hash = "sha256:c1e16457e727c5282b620d20b2d764352947cd4509966475a874f2750a9c5d11"}, + {file = "pyobjc_framework_SearchKit-10.2-py2.py3-none-any.whl", hash = "sha256:ddd9e2f207ae578f04ec2358fdf485f26978d6de4909640b58486a8a9e4e639c"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-CoreServices = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-CoreServices = ">=10.2" [[package]] name = "pyobjc-framework-security" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Security on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Security-10.1.tar.gz", hash = "sha256:33becccea5488a4044792034d8cf4faf1913f8ca9ba912dceeaa54db311bd284"}, - {file = "pyobjc_framework_Security-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:72955f4faf503e6a41076fcaa3ec138eb1cc794f483db77104acf2ee480f8a04"}, - {file = "pyobjc_framework_Security-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b02075026d78feda8c1af9462199c2cde65b87e4adde65b90ca6965f06cb422"}, - {file = "pyobjc_framework_Security-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1d19785d8531a6cdcdbb4c545b560f63306ff947592e7fad27811f87ee64854c"}, - {file = "pyobjc_framework_Security-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:569a9243d4044e3e433335ded891dc357880787df647de8220659f022a03f467"}, - {file = "pyobjc_framework_Security-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d8b8c402c395ac3868727f04e98b2ded675534de1349df8f5813b3c483b50a2c"}, - {file = "pyobjc_framework_Security-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:aaca360a28b6333a8a93b091426daa5ffd22006bbb1122d3d6a78d33177f612a"}, + {file = "pyobjc-framework-Security-10.2.tar.gz", hash = "sha256:20ec8ebb41506037d54b40606590b90f66a89adceeddd9a40674b0c7ea7c8c82"}, + {file = "pyobjc_framework_Security-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5a9c1bf88db62ebe1186dbecb40c6fdf8dab2d614012b5da8e9b90ee3bd8575e"}, + {file = "pyobjc_framework_Security-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9119f8bad7bead85e5b57c8538d319ef19eb5159500a0e3677c11ddbb774a17a"}, + {file = "pyobjc_framework_Security-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:317add1dcbc6866ce2e9389ef5a2a46db82e042aca6e5fad9aa5ce17782493fe"}, + {file = "pyobjc_framework_Security-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:75f061f0d03c3099d01b7818409eb602b882f6a31b4381bbf289f10ce1cf7753"}, + {file = "pyobjc_framework_Security-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d99aeba0e3a7ee95bf5582b06885a5d6f8115ff3a2e47506562514117022f170"}, + {file = "pyobjc_framework_Security-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:186a97497209acdb8d56aa7bbd56ab8021663fff2fb83f0d0e1b4e1f57ac5bbb"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-securityfoundation" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SecurityFoundation on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SecurityFoundation-10.1.tar.gz", hash = "sha256:11def85a7a4ea490fa24df79d01ea137f378534fedf1da248068ddf137f38c7e"}, - {file = "pyobjc_framework_SecurityFoundation-10.1-py2.py3-none-any.whl", hash = "sha256:bbd67737afec25f2e3d41c8c2e7b4a6f9aae4231242e215b82a950eef6432ce0"}, + {file = "pyobjc-framework-SecurityFoundation-10.2.tar.gz", hash = "sha256:ed612afab0f70e24b29f2e2b3a31cfefb1ad17244b5c147e7bcad8dfc7e60bd1"}, + {file = "pyobjc_framework_SecurityFoundation-10.2-py2.py3-none-any.whl", hash = "sha256:296f7f9ff96a35c19e4aef7621a567c0efe584aafd20ac25a2839dd96bf46a04"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Security = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Security = ">=10.2" [[package]] name = "pyobjc-framework-securityinterface" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SecurityInterface on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SecurityInterface-10.1.tar.gz", hash = "sha256:444a0dc7d50390750c28185b6496ee913011ac886d9e634bfc9a0856372d0a94"}, - {file = "pyobjc_framework_SecurityInterface-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c0e52408e25845a960b0fe339c274650fd211f9fee5944c643d9ba16861e45ac"}, - {file = "pyobjc_framework_SecurityInterface-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:bef4a63d31808531f5806006945d1f9b5650221e4adc973302387ab7b2e1b349"}, - {file = "pyobjc_framework_SecurityInterface-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:479e555df16ff7f79bf7622ab3341b0ef176fbd85ef3f7301931a57d2def682f"}, + {file = "pyobjc-framework-SecurityInterface-10.2.tar.gz", hash = "sha256:43930539fed05e74f3c692f5ee7848681e7e65c44387af300447514fe8e23ab6"}, + {file = "pyobjc_framework_SecurityInterface-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:70f2cb61261e84fb366f43a9a44fb19a19188cf650d3cf3f3e6ee3a16a73e62d"}, + {file = "pyobjc_framework_SecurityInterface-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:52a18a18af6d47f7fbdfeef898a038ff3ab7537a694c591ddcf8f895b9e55cce"}, + {file = "pyobjc_framework_SecurityInterface-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b2472e3714cc17b22e5bb0173887aac77c80ccc2188ec2c40d2b906bd2490f6b"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Security = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Security = ">=10.2" [[package]] name = "pyobjc-framework-sensitivecontentanalysis" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SensitiveContentAnalysis on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SensitiveContentAnalysis-10.1.tar.gz", hash = "sha256:435906a3fcc6cba50cd7c5bfd693368c6042c17c5f64bcd560a3761d947425de"}, - {file = "pyobjc_framework_SensitiveContentAnalysis-10.1-py2.py3-none-any.whl", hash = "sha256:472c0fb0f1ad9c370cbc7cf636bb5888cbcf0ee8c9ecb9c5f6de25e2587771e5"}, + {file = "pyobjc-framework-SensitiveContentAnalysis-10.2.tar.gz", hash = "sha256:ef111cb8a85bc86e47954cdb01e3ccb654aba64a3d855f17a0c786361859aef8"}, + {file = "pyobjc_framework_SensitiveContentAnalysis-10.2-py2.py3-none-any.whl", hash = "sha256:3c875856837e217c9eba68e5c2b4f5b862dee1bb64513b463a7af8c3e67e5a50"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-servicemanagement" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ServiceManagement on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ServiceManagement-10.1.tar.gz", hash = "sha256:ebe38b80ed74112fdd356e19165c365f6281baad83818774a0da6d790fd13044"}, - {file = "pyobjc_framework_ServiceManagement-10.1-py2.py3-none-any.whl", hash = "sha256:d05289948558cf4c7fbc101946f6ccadcc33826b2056c14d5494a8ae7f136936"}, + {file = "pyobjc-framework-ServiceManagement-10.2.tar.gz", hash = "sha256:62413cd911932cc16262710a3853061fdae341ed95e1aa0426b4ff0011d18c0c"}, + {file = "pyobjc_framework_ServiceManagement-10.2-py2.py3-none-any.whl", hash = "sha256:e5a1c1746788d0e125cc87cbe0749b2b824fb7a08bc4344c06c9ac6007859187"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-sharedwithyou" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SharedWithYou on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SharedWithYou-10.1.tar.gz", hash = "sha256:bcac8ffa2642589a416c62ff436148586db9c41f92419a0164b1e9d6f6c73e38"}, - {file = "pyobjc_framework_SharedWithYou-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:05fceedcd7b6e8753cb8dc5f09a947686dd454c304965c959bc101cfd7349fcd"}, - {file = "pyobjc_framework_SharedWithYou-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6f4f9fb6d335b54eb0a02b277ca8a2cb87962a579bafdc9df5f94c8af1063ee4"}, - {file = "pyobjc_framework_SharedWithYou-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a1c7c688c15117f1c6ea638e83285ce1b2fbd9d8c76ee405e43b24fa4fea766d"}, + {file = "pyobjc-framework-SharedWithYou-10.2.tar.gz", hash = "sha256:bc13756ef20af488cd3022c036a11a0f7572e1b286e9eb7d31c61a8cb7655c70"}, + {file = "pyobjc_framework_SharedWithYou-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b69169db01c78bef3178b8795fb5e2a9eccfa4c26b7de008e23a5aa6f0c709f0"}, + {file = "pyobjc_framework_SharedWithYou-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e4ec724f103b0904893212d473c68c462f8fbe46a470b0c9f88cb8330969a94e"}, + {file = "pyobjc_framework_SharedWithYou-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:04b477d42a6edd25c187fc61422ce62156fd5d8670b7007ff3f1a10723b1b4b8"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-SharedWithYouCore = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-SharedWithYouCore = ">=10.2" [[package]] name = "pyobjc-framework-sharedwithyoucore" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SharedWithYouCore on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SharedWithYouCore-10.1.tar.gz", hash = "sha256:2b4f62b0df4bd44198f6d3a3aae4d054592261d36fc2af71f9dd81744aa99815"}, - {file = "pyobjc_framework_SharedWithYouCore-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a7f41415a3ca40d4ee18955155a4141e0d2d55e713b513aa567305ae54716cb7"}, - {file = "pyobjc_framework_SharedWithYouCore-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc133f07a71cb828073dc671cb1e8ffa5bde714b376a8eba0a8110ac41927ae9"}, - {file = "pyobjc_framework_SharedWithYouCore-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d7169a2492ed4fd7d45ad0eafbecebffec0b22f08e756f2e251eda62cd5ba42a"}, + {file = "pyobjc-framework-SharedWithYouCore-10.2.tar.gz", hash = "sha256:cc8faa9f549f6c931be33cf99f49b8cde11db52cb542e3797c3a27f98e5e9a2a"}, + {file = "pyobjc_framework_SharedWithYouCore-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:275b50a6b9205b1c0a08632c2ede98293b26df28d6c35bc34714ec9d5a7065d6"}, + {file = "pyobjc_framework_SharedWithYouCore-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:55aaac1bea38e566e70084cbe348b2af0f5cda782c8da54c6bbbd70345a50b27"}, + {file = "pyobjc_framework_SharedWithYouCore-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b118ba79e7bb2fab26369927316b90aa952795976a29e7dc49dcb47a87f7924c"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-shazamkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ShazamKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ShazamKit-10.1.tar.gz", hash = "sha256:d091c5104adda8d54e65463862550e59f86646fdafcdcd234c9a7a2624584f1d"}, - {file = "pyobjc_framework_ShazamKit-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6670ed380dacc6aa86f571a18d9e321bd075da11bf144cba2802b19bb0868a21"}, - {file = "pyobjc_framework_ShazamKit-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d4efd57dac3f50621cc23be38cefbd6c80b4b55f0339312b4f2a340cd6ffde9b"}, - {file = "pyobjc_framework_ShazamKit-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:07e58fc6b70bf961f230044cf46324ab4239864955299957e231ba7cda8fafa9"}, - {file = "pyobjc_framework_ShazamKit-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be2da82d9a58c2605a1a17a88fbc389931b8fd8ad7d60926755b50316fe5e04f"}, - {file = "pyobjc_framework_ShazamKit-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:e500c6794f2b7cea57dea6f64c1fc9e067a14ddb9446e9d7739dcb57683b5a8a"}, - {file = "pyobjc_framework_ShazamKit-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4289a1109148a1a314c6bae9b33e90eca6d18a06a767b431cdff1178024f3310"}, + {file = "pyobjc-framework-ShazamKit-10.2.tar.gz", hash = "sha256:f3359be7a0ffe0084d047b8813dd9e9b5339a0970baecad89cbe85513e838e74"}, + {file = "pyobjc_framework_ShazamKit-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a33d2ad28cc7731e67906eccf324c441383ba741399c88e993b5375e734509ba"}, + {file = "pyobjc_framework_ShazamKit-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13976c21722389e81d9e10ab419dfb0904f48cec639f0932aada0f039d78dac3"}, + {file = "pyobjc_framework_ShazamKit-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:380992e9da3000ebefe45b50f65ed3bf88ba87574c4a6486a29553cfbfc04c22"}, + {file = "pyobjc_framework_ShazamKit-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e8494bfcf6ceb8b59e1bf2678073e00155f6dd2afbec01eaefd2128d3a4f5c76"}, + {file = "pyobjc_framework_ShazamKit-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:71cb7db481c791a52d261b924063431b72c4c288afd14a00cf7106274596a1c3"}, + {file = "pyobjc_framework_ShazamKit-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0a537e1f86f47ddde742fd0491173c669e6cda6b9edddbe72e56a148a40111f8"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-social" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Social on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Social-10.1.tar.gz", hash = "sha256:50757d982c712090e93b6ee4bd97ed3f6acfe7005f981f060433e94b7aca818b"}, - {file = "pyobjc_framework_Social-10.1-py2.py3-none-any.whl", hash = "sha256:81363d9d06c9c8ede16d96ec1d3cdba6deef195ef54cc64618e58c7fc1f574df"}, + {file = "pyobjc-framework-Social-10.2.tar.gz", hash = "sha256:34995cd0c0f6c4adbe7bfa9049463058c7a8676d34d3d5b9de37f87416f22a0a"}, + {file = "pyobjc_framework_Social-10.2-py2.py3-none-any.whl", hash = "sha256:76ed463e3a77c58e5b527c37eb8b2dd60658dd736ba243cfa24b4704580b58c4"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-soundanalysis" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SoundAnalysis on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SoundAnalysis-10.1.tar.gz", hash = "sha256:42e0ae24f11ef8cf097c71e5b2378eaba26f66cb39959fec4ca79812bc0ed417"}, - {file = "pyobjc_framework_SoundAnalysis-10.1-py2.py3-none-any.whl", hash = "sha256:a33bc8a1ecee11387beb9db06aaf9c362f7dc171d60da913277ac482d67beabb"}, + {file = "pyobjc-framework-SoundAnalysis-10.2.tar.gz", hash = "sha256:960434f16a130da4fe5cd86ceac832b7eb17831a1e739472f7636aceea65e018"}, + {file = "pyobjc_framework_SoundAnalysis-10.2-py2.py3-none-any.whl", hash = "sha256:a09b49acca76a3c161b937002e5d034cf32c33d033677a8143d446eb53ca941d"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-speech" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Speech on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Speech-10.1.tar.gz", hash = "sha256:a9eddebd4e4bcdb9c165129bea510c5e9f1353528a8211cc38c22711792bf30d"}, - {file = "pyobjc_framework_Speech-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:0cc26aca43d738d25f615def32eb8ce27675fc616584c009e57f6b82dec75cc5"}, - {file = "pyobjc_framework_Speech-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9a448c58149f5bbf0128f2c6492ea281b51f50bdc4f0ecd52bea43c80f7e2063"}, - {file = "pyobjc_framework_Speech-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:76a528fc587c8eb86cdba61bf6b94ddb7e3fb38a41f1a46217e2ce7fc21d6c26"}, + {file = "pyobjc-framework-Speech-10.2.tar.gz", hash = "sha256:4cb3445ff31a3f8d50492d420941723e07967b4fc4fc46c336403d8ca245c086"}, + {file = "pyobjc_framework_Speech-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:175195f945d89d2382c0f6052b798ef3ee41384b8bfa4954c16add126dc181f6"}, + {file = "pyobjc_framework_Speech-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c65cbda4b8d357b80d41695b1b505a759d3be8b63bca9dd7675053876878577"}, + {file = "pyobjc_framework_Speech-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b139f64cc3636f1cfdc78a4071068d34e9ea70283201fd7a821e41d5bbbcf306"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-spritekit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SpriteKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SpriteKit-10.1.tar.gz", hash = "sha256:998be1d6c7fd5cc66bd54bae37c45cf3394df7bc689b5d0c813f0449c8eee53f"}, - {file = "pyobjc_framework_SpriteKit-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:23f6657e48f7d8cb434bcf6a76b2c336eb29be69ade933f88299465a0c83cb3b"}, - {file = "pyobjc_framework_SpriteKit-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b5556d8469b20fe35a0ec5f9e493c30ebc531bce3be4e48fc99cb87338ba5cfb"}, - {file = "pyobjc_framework_SpriteKit-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa51855f7bfed3dc1bcda95b140d71c4dc1e21c3480216df19f6fddc7dc7ce39"}, - {file = "pyobjc_framework_SpriteKit-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2210920a4f9a39dc3bea9287e012cdfb740a0748faa6ab13bf8a58d07da913cc"}, - {file = "pyobjc_framework_SpriteKit-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:66df1436d17bf0c17432d2d66ebeef8efee012240297e5aabc1118b014947375"}, - {file = "pyobjc_framework_SpriteKit-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5564ed8648afba01f9877062204ed03d3fef8a980b6b4155c69d3662e4732947"}, + {file = "pyobjc-framework-SpriteKit-10.2.tar.gz", hash = "sha256:31b3e639a617c456574df8f3ce18275eff613cf49e98ea8df974cda05d13a7fc"}, + {file = "pyobjc_framework_SpriteKit-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7b312677a70a7fe684af8726a39837e935fd6660f0271246885934f60d773506"}, + {file = "pyobjc_framework_SpriteKit-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8e015451fa701c7d9b383a95315809208145790d8e68a542def9fb10d6c2ce2"}, + {file = "pyobjc_framework_SpriteKit-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:803138edacb0c5bbc40bfeb964c70521259a7fb9c0dd31a79824b36be3942f59"}, + {file = "pyobjc_framework_SpriteKit-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ae44f20076286dd0d600f9b4c8c31f144abe1f44dbd37ca96ecdba98732bfb4a"}, + {file = "pyobjc_framework_SpriteKit-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:9f5b65ac9fd0a40e28673a15c6c7785208402c02422a1e150f713b2c82681b51"}, + {file = "pyobjc_framework_SpriteKit-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a8f2e140ad818d6891f654369853f9439d0f280302bf5750c28df8a4fcc019ec"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-storekit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework StoreKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-StoreKit-10.1.tar.gz", hash = "sha256:4e91d77d1b9745eca6730ddf6cde964e2bd956fafad303591f671ebd1d4de64b"}, - {file = "pyobjc_framework_StoreKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:456641cbe97eab4bb68dccec6f8bf3bc435adaa0b2ae6a7a4a3da0adc84a9405"}, - {file = "pyobjc_framework_StoreKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:356966d260bd1e19c7cdba7551b3e477078d3d4b0df04b7f38013dd044913727"}, - {file = "pyobjc_framework_StoreKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:652657006d3c8fefcdbb662f8f33ef6ee8e01ba30a0b4d6e2fcd2e4046951766"}, + {file = "pyobjc-framework-StoreKit-10.2.tar.gz", hash = "sha256:44cf0b5fe605b9e5dc6aed2ae9e09d807d04d5f2eaf78afb8c04e3f109a0d680"}, + {file = "pyobjc_framework_StoreKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f9e511ebf2d954f10999c2a46e5ecffee0235e0c35eda24c8fcfdb433768935d"}, + {file = "pyobjc_framework_StoreKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e22a701666a787d4df9f45bf1507cf41e45357b22c55ad79c608b24a506981e1"}, + {file = "pyobjc_framework_StoreKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:44c0a65bd39e64e276d8a7b991d93b59b149b3b886cadddb6a38253d48b123e5"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-symbols" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Symbols on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Symbols-10.1.tar.gz", hash = "sha256:63f5345fa90b31ea017c01ffd39e6e0289ef0258c6af7941263083d2289f5d3d"}, - {file = "pyobjc_framework_Symbols-10.1-py2.py3-none-any.whl", hash = "sha256:88b48102ba33ac3d8bc5c047cc892ab21e8e102c3b25b4186b77c5d1f5c1bc40"}, + {file = "pyobjc-framework-Symbols-10.2.tar.gz", hash = "sha256:b1874e79fdcaf65deaadda35a3c9dbd24eb92d7dc8aa4db5d7f14f2b06d8a312"}, + {file = "pyobjc_framework_Symbols-10.2-py2.py3-none-any.whl", hash = "sha256:3b5fa1e162acb04eab092e0e1dbe686e2fb61cf648850953e15314edb56fb05f"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-syncservices" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SyncServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SyncServices-10.1.tar.gz", hash = "sha256:644d394b84468fa6178b5aa609771252ca416ca2be2bac5501222b3c5151846d"}, - {file = "pyobjc_framework_SyncServices-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:edf7d5de135ec44b8ecf260265cb7bd9bf938d3fcc2204282aea674a86918c60"}, - {file = "pyobjc_framework_SyncServices-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:53ef6096359d182952fdb40734f17302edf35757578c0c52314f703322d855cb"}, - {file = "pyobjc_framework_SyncServices-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b9d7ec3f784fc89847ad136bb3d67d159310a2e072a724d4ffddccf0ee5dec2b"}, + {file = "pyobjc-framework-SyncServices-10.2.tar.gz", hash = "sha256:1c76073484924201336e6aab40f10358573bc640a92ed4066b8062c748957576"}, + {file = "pyobjc_framework_SyncServices-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf40e4194bd42bb447212037876ca3e90e0e5a7aa21e59a6987f300209a83fb7"}, + {file = "pyobjc_framework_SyncServices-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:4e438c0cf74aecb95c2a86db9c39236fee3edf0a91814255e2aff18bf24e7e82"}, + {file = "pyobjc_framework_SyncServices-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:dffc9ddf9235176c1f1575095beae97d6d2ffa9cffe9c195f815c46f69070787"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreData = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreData = ">=10.2" [[package]] name = "pyobjc-framework-systemconfiguration" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SystemConfiguration on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SystemConfiguration-10.1.tar.gz", hash = "sha256:7e125872d4b54c8d04f15d83e7f7f706c18bd87960b3873c797e6a71b95030b0"}, - {file = "pyobjc_framework_SystemConfiguration-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ab80e4272937643de8569a711e5adee8afca2bf071b6cfc6b7fc4143010d258"}, - {file = "pyobjc_framework_SystemConfiguration-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:431c32557bde3dad18fb245bf1e5ce80963f28caa4d2691b5a82e6db2b5efc2f"}, - {file = "pyobjc_framework_SystemConfiguration-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:7e8ae510b11ceca8800bc7b4b0c7735cf26de803771199d6c2d8f24fbb5467df"}, + {file = "pyobjc-framework-SystemConfiguration-10.2.tar.gz", hash = "sha256:e9ec946ca56514a68e28040c55c79ba105c9a70b56698635767250e629c37e49"}, + {file = "pyobjc_framework_SystemConfiguration-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d25ff4b8525f087fc004ece9518b38d365ef6bbc06e4c0f847d70cb72ca961df"}, + {file = "pyobjc_framework_SystemConfiguration-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2fc0a9d1c1c6a5d5b9d9289ee8e5de0d4ef8cb4c9bc03e8a33513217580a307b"}, + {file = "pyobjc_framework_SystemConfiguration-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d33ebea6881c2e4b9ddd03f8def7495dc884b7e53fe3d6e1340d9f9cc7441878"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-systemextensions" -version = "10.1" +version = "10.2" description = "Wrappers for the framework SystemExtensions on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-SystemExtensions-10.1.tar.gz", hash = "sha256:3eb7ad8f1a6901294b02cd6d6581bd6960a48fcfd82475f5970d1c909f12670d"}, - {file = "pyobjc_framework_SystemExtensions-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8dc306dd07f9ff071759bb2237b7f7fddd0d2624966bdb0801dc5a70b026f431"}, - {file = "pyobjc_framework_SystemExtensions-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c76c6d7dbf253abe11ebfa83bbbfa7f2fc4c700db052771075c26dabbd5ee1e9"}, - {file = "pyobjc_framework_SystemExtensions-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:2586323fbe9382edebd7ca5dfe50b432c842b7ef45ef26444edcb7238bcf006f"}, + {file = "pyobjc-framework-SystemExtensions-10.2.tar.gz", hash = "sha256:883c41cb257fb2b5baadafa4213dc0f0fffc97edb35ebaf6ed95a185a786eb85"}, + {file = "pyobjc_framework_SystemExtensions-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8a85c71121abe33a83742b84d046684e30e5400c5d2bbb4bca4322c4e9d5506b"}, + {file = "pyobjc_framework_SystemExtensions-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3374105ebc3992e8898b46ba85e860ac1f2f24985c640834bf2b9da26a8f40a7"}, + {file = "pyobjc_framework_SystemExtensions-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5b699c94a05a7253d803fb75b6ea5c67d2c59eb906deceb7f3d0a44f42b5d7a8"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-threadnetwork" -version = "10.1" +version = "10.2" description = "Wrappers for the framework ThreadNetwork on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-ThreadNetwork-10.1.tar.gz", hash = "sha256:72694dce8b10937f4d8fef67d14e15fa65ba590dec8298df439fd0cc953a83fa"}, - {file = "pyobjc_framework_ThreadNetwork-10.1-py2.py3-none-any.whl", hash = "sha256:720d4a14619598431a22be2a720bf877f996d65cee430b96c5d7ec833b676b68"}, + {file = "pyobjc-framework-ThreadNetwork-10.2.tar.gz", hash = "sha256:864ebabdb187cef16e1fba0f5439a73b1ed9a4e66b888f7954b12150c323c0f8"}, + {file = "pyobjc_framework_ThreadNetwork-10.2-py2.py3-none-any.whl", hash = "sha256:f7ad31b4a67f9ed00097a21c7bbd48ffa4ce2c22174a52ac508beedf7cb2aa9e"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-uniformtypeidentifiers" -version = "10.1" +version = "10.2" description = "Wrappers for the framework UniformTypeIdentifiers on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-UniformTypeIdentifiers-10.1.tar.gz", hash = "sha256:e8a6e8d4c3c6d8213d18fab44704055a5fca91e0a74891b4f1bfe6574cd51d97"}, - {file = "pyobjc_framework_UniformTypeIdentifiers-10.1-py2.py3-none-any.whl", hash = "sha256:4c867b298956d74398d2b6354bd932dc109431d9726c8ea2fc9c83e6946a2a7d"}, + {file = "pyobjc-framework-UniformTypeIdentifiers-10.2.tar.gz", hash = "sha256:4d3e7add89766fe7abc6fd6e29387e92d7b38343b37d365607c9d287c5e758f6"}, + {file = "pyobjc_framework_UniformTypeIdentifiers-10.2-py2.py3-none-any.whl", hash = "sha256:25b72005063a88c5e67bf91d1355973f4bbf3dd7c1b3fb8eb00503020a837b33"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-usernotifications" -version = "10.1" +version = "10.2" description = "Wrappers for the framework UserNotifications on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-UserNotifications-10.1.tar.gz", hash = "sha256:eca638b04b60d5d8f5efecafc1fd021a1b55d4a6d1ebd22e65771eddb3dd478f"}, - {file = "pyobjc_framework_UserNotifications-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a44b89659eae1015da9148fc24f931108ff7a05ba61509bfab34af50806beb0c"}, - {file = "pyobjc_framework_UserNotifications-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:00aa84f29bcbe8f302d20c96ef51fb48af519d83e0b72d22bd075ea1af86629f"}, - {file = "pyobjc_framework_UserNotifications-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:fe9170b5c4da8e75288ada553cc821b9e3fc1279eb56fa9e3d4278b35a26c5ce"}, + {file = "pyobjc-framework-UserNotifications-10.2.tar.gz", hash = "sha256:3a1b7d77c95dff109f904451525752ece3c38f38cfa0825fd01735388c2b0264"}, + {file = "pyobjc_framework_UserNotifications-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f4ce290d1874d8b4ec36b2fae9181fa230e6ce0dced3aeb0fd0d88b7cda6a75a"}, + {file = "pyobjc_framework_UserNotifications-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8bc0c9599d7bbf35bb79eb661d537d6ea506859d2f1332ae2ee34b140bd937ef"}, + {file = "pyobjc_framework_UserNotifications-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:12d1ea6683af36813e3bdbdb065c28d71d01dfed7ea4deedeb3585e55179cbbb"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-usernotificationsui" -version = "10.1" +version = "10.2" description = "Wrappers for the framework UserNotificationsUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-UserNotificationsUI-10.1.tar.gz", hash = "sha256:09df08f47a7e605642a6c6846e365cab8b8631a7f87b41a65c35c52e484b9f8a"}, - {file = "pyobjc_framework_UserNotificationsUI-10.1-py2.py3-none-any.whl", hash = "sha256:6640c6d04f459b6927096696dac98ce5fcb702a507a757d6d1b909b341bb8a0d"}, + {file = "pyobjc-framework-UserNotificationsUI-10.2.tar.gz", hash = "sha256:f476d4a9f5b0746beda3d06ed6eb8a1b072372e644c707e675f4e11703528a81"}, + {file = "pyobjc_framework_UserNotificationsUI-10.2-py2.py3-none-any.whl", hash = "sha256:b0909b11655a7ae14e54ba6f80f1c6d34d46de5e8b565d0a51c22f87604ad3d3"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-UserNotifications = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-UserNotifications = ">=10.2" [[package]] name = "pyobjc-framework-videosubscriberaccount" -version = "10.1" +version = "10.2" description = "Wrappers for the framework VideoSubscriberAccount on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-VideoSubscriberAccount-10.1.tar.gz", hash = "sha256:6410c68ea37a4ba4667b8c71fbfd3c011bf6ecdb9f1d6adf3c9a35584b7c8804"}, - {file = "pyobjc_framework_VideoSubscriberAccount-10.1-py2.py3-none-any.whl", hash = "sha256:f32716070f849989e3ff052effb54f951b89a538208651426848d9d924ac1625"}, + {file = "pyobjc-framework-VideoSubscriberAccount-10.2.tar.gz", hash = "sha256:26ea7fe843ba316eea90c488ed3ff46651b94b51b6e3bd87db2ff93f9fa8e496"}, + {file = "pyobjc_framework_VideoSubscriberAccount-10.2-py2.py3-none-any.whl", hash = "sha256:300c9f419821aab400ab9798bed9fc659984f19eb8577934e6faae0428b89096"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-videotoolbox" -version = "10.1" +version = "10.2" description = "Wrappers for the framework VideoToolbox on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-VideoToolbox-10.1.tar.gz", hash = "sha256:56c9d4b74965fe79f050884ffa560ff71ffe709c24923d3d0b34459fb626eb11"}, - {file = "pyobjc_framework_VideoToolbox-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a4115690b8ed4266e52a4d200c870e68dd03119993280020a1a4d6a9d4764fcf"}, - {file = "pyobjc_framework_VideoToolbox-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:64874d253c2996216c6d56e03e848cf845c3f0eac84d06ba97d83871dbf19490"}, - {file = "pyobjc_framework_VideoToolbox-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:977b2981532442c4c99fff75ffcc2b5a4b0f8108abcabdafcda2addf8b2ffa21"}, + {file = "pyobjc-framework-VideoToolbox-10.2.tar.gz", hash = "sha256:347259a8e920dbc3dd1fada5ab0d829485cef3165166fa65f78c23ada4f9b80a"}, + {file = "pyobjc_framework_VideoToolbox-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb8147d673defdb02526b80b1584369f94b94721016950bb12425b2309b92c88"}, + {file = "pyobjc_framework_VideoToolbox-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6527180eede44301c21790baa7e1a5f5429893e3995e61640f3941c3b6fb08f9"}, + {file = "pyobjc_framework_VideoToolbox-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:de55d7629a9659439901a16d6074e9fc9b229e93a555097a1c92e0df6cfb5cdb"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreMedia = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreMedia = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-virtualization" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Virtualization on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Virtualization-10.1.tar.gz", hash = "sha256:48f2484a7627caa246f55daf203927f10600e615e620a2d9ca22e483ed0bb9b4"}, - {file = "pyobjc_framework_Virtualization-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a434c40038c0c1acd31805795f28f959ea231252dc3ab34ed5a268c21227682c"}, - {file = "pyobjc_framework_Virtualization-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8ad3e40ec5970e881f92af337354be68c1f2512690545a2da826684daeaa3535"}, - {file = "pyobjc_framework_Virtualization-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:2aba907617075394718bc8883c650197e21b2ea0d284ca51811229386114040a"}, + {file = "pyobjc-framework-Virtualization-10.2.tar.gz", hash = "sha256:49eb8d0ec3017c2194620f0698e95ccf20b8b706c73ab3b1b50902c57f0f86ff"}, + {file = "pyobjc_framework_Virtualization-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:492daa384cf3117749ff35127f81313bd1ea9bbd09385c2a882b82ca4ca0797e"}, + {file = "pyobjc_framework_Virtualization-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1bea91b57d419d91e76865f9621ba4762793e05f7a694cefe73206f3a19b4eda"}, + {file = "pyobjc_framework_Virtualization-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c1198bcd31e4711c6a0c6816c77483361217a1ed2f0ad69608f9ba5633efc144"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyobjc-framework-vision" -version = "10.1" +version = "10.2" description = "Wrappers for the framework Vision on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Vision-10.1.tar.gz", hash = "sha256:ff50fb7577be8d8862a076a6cde5ebdc9ef07d9045e2158faaf0f04b5b051208"}, - {file = "pyobjc_framework_Vision-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c6330d8b22f75f1e7d9a5456f3e2c7299d05d575b2e9b2f1e50230b18f17abed"}, - {file = "pyobjc_framework_Vision-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:91b4d740b6943f6b228915ece2e027555f28ccf49c8d063a580b8f9e5af56fd0"}, - {file = "pyobjc_framework_Vision-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:bb2d7334b4b725c5e5346a8cce2a0064259a09e90ec189b0c776304d5fc01e49"}, + {file = "pyobjc-framework-Vision-10.2.tar.gz", hash = "sha256:722e0a6da64738b5fc3c763a102445cad5892c0af94597637e89455099da397e"}, + {file = "pyobjc_framework_Vision-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:42b7383c317c2076edcb44f7ad8ed4a6e675250a3fd20e87eef8e0e4233b1b58"}, + {file = "pyobjc_framework_Vision-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5e3adb56fca35d41a4bb113f3eadbe45e9667d8e3edf64908da3d6b130e14a8c"}, + {file = "pyobjc_framework_Vision-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e424d106052112897c8aa882d8334ac984e12509f9a473a285827ba47bfbcc9a"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" -pyobjc-framework-CoreML = ">=10.1" -pyobjc-framework-Quartz = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" +pyobjc-framework-CoreML = ">=10.2" +pyobjc-framework-Quartz = ">=10.2" [[package]] name = "pyobjc-framework-webkit" -version = "10.1" +version = "10.2" description = "Wrappers for the framework WebKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-WebKit-10.1.tar.gz", hash = "sha256:311974b626facee73cab5a7e53da4cc8966cbe60b606ba11fd0f3547e0ba1762"}, - {file = "pyobjc_framework_WebKit-10.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ad9e1bd2fa9885818e1228c60e0d95100df69252f230ea8bb451fae73fcace61"}, - {file = "pyobjc_framework_WebKit-10.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c901fc6977b3298de789002a76a34c353ed38faedfc5ba63ef94a149ec9e5b02"}, - {file = "pyobjc_framework_WebKit-10.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f2d45dfc2c41792a5a983263d5b06c4fe70bf2f24943e2bf3097e4c9449a4516"}, + {file = "pyobjc-framework-WebKit-10.2.tar.gz", hash = "sha256:3717104dbc901a1bd46d97886c5adb6eb32798ff4451c4544e04740e41706083"}, + {file = "pyobjc_framework_WebKit-10.2-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:0d128a9e053b3dfaa71857eba6e6aadfbde88347382e1e58e288b5e410b71226"}, + {file = "pyobjc_framework_WebKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:d20344d55c3cb4aa27314e096f59db5cefa70539112d8c1658f2a2076df58612"}, + {file = "pyobjc_framework_WebKit-10.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f7dcf2e51964406cc2440e556c855d087c4706289c5f53464e8ffb0fba37adda"}, ] [package.dependencies] -pyobjc-core = ">=10.1" -pyobjc-framework-Cocoa = ">=10.1" +pyobjc-core = ">=10.2" +pyobjc-framework-Cocoa = ">=10.2" [[package]] name = "pyopencl" @@ -6926,28 +6947,28 @@ docs = ["furo (==2023.9.10)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx [[package]] name = "ruff" -version = "0.3.2" +version = "0.3.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77f2612752e25f730da7421ca5e3147b213dca4f9a0f7e0b534e9562c5441f01"}, - {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9966b964b2dd1107797be9ca7195002b874424d1d5472097701ae8f43eadef5d"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b83d17ff166aa0659d1e1deaf9f2f14cbe387293a906de09bc4860717eb2e2da"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb875c6cc87b3703aeda85f01c9aebdce3d217aeaca3c2e52e38077383f7268a"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be75e468a6a86426430373d81c041b7605137a28f7014a72d2fc749e47f572aa"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:967978ac2d4506255e2f52afe70dda023fc602b283e97685c8447d036863a302"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1231eacd4510f73222940727ac927bc5d07667a86b0cbe822024dd00343e77e9"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6d613b19e9a8021be2ee1d0e27710208d1603b56f47203d0abbde906929a9b"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8439338a6303585d27b66b4626cbde89bb3e50fa3cae86ce52c1db7449330a7"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:de8b480d8379620cbb5ea466a9e53bb467d2fb07c7eca54a4aa8576483c35d36"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b74c3de9103bd35df2bb05d8b2899bf2dbe4efda6474ea9681280648ec4d237d"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f380be9fc15a99765c9cf316b40b9da1f6ad2ab9639e551703e581a5e6da6745"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0ac06a3759c3ab9ef86bbeca665d31ad3aa9a4b1c17684aadb7e61c10baa0df4"}, - {file = "ruff-0.3.2-py3-none-win32.whl", hash = "sha256:9bd640a8f7dd07a0b6901fcebccedadeb1a705a50350fb86b4003b805c81385a"}, - {file = "ruff-0.3.2-py3-none-win_amd64.whl", hash = "sha256:0c1bdd9920cab5707c26c8b3bf33a064a4ca7842d91a99ec0634fec68f9f4037"}, - {file = "ruff-0.3.2-py3-none-win_arm64.whl", hash = "sha256:5f65103b1d76e0d600cabd577b04179ff592064eaa451a70a81085930e907d0b"}, - {file = "ruff-0.3.2.tar.gz", hash = "sha256:fa78ec9418eb1ca3db392811df3376b46471ae93792a81af2d1cbb0e5dcb5142"}, + {file = "ruff-0.3.3-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:973a0e388b7bc2e9148c7f9be8b8c6ae7471b9be37e1cc732f8f44a6f6d7720d"}, + {file = "ruff-0.3.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cfa60d23269d6e2031129b053fdb4e5a7b0637fc6c9c0586737b962b2f834493"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eca7ff7a47043cf6ce5c7f45f603b09121a7cc047447744b029d1b719278eb5"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7d3f6762217c1da954de24b4a1a70515630d29f71e268ec5000afe81377642d"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b24c19e8598916d9c6f5a5437671f55ee93c212a2c4c569605dc3842b6820386"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5a6cbf216b69c7090f0fe4669501a27326c34e119068c1494f35aaf4cc683778"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352e95ead6964974b234e16ba8a66dad102ec7bf8ac064a23f95371d8b198aab"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d6ab88c81c4040a817aa432484e838aaddf8bfd7ca70e4e615482757acb64f8"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79bca3a03a759cc773fca69e0bdeac8abd1c13c31b798d5bb3c9da4a03144a9f"}, + {file = "ruff-0.3.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2700a804d5336bcffe063fd789ca2c7b02b552d2e323a336700abb8ae9e6a3f8"}, + {file = "ruff-0.3.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fd66469f1a18fdb9d32e22b79f486223052ddf057dc56dea0caaf1a47bdfaf4e"}, + {file = "ruff-0.3.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45817af234605525cdf6317005923bf532514e1ea3d9270acf61ca2440691376"}, + {file = "ruff-0.3.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0da458989ce0159555ef224d5b7c24d3d2e4bf4c300b85467b08c3261c6bc6a8"}, + {file = "ruff-0.3.3-py3-none-win32.whl", hash = "sha256:f2831ec6a580a97f1ea82ea1eda0401c3cdf512cf2045fa3c85e8ef109e87de0"}, + {file = "ruff-0.3.3-py3-none-win_amd64.whl", hash = "sha256:be90bcae57c24d9f9d023b12d627e958eb55f595428bafcb7fec0791ad25ddfc"}, + {file = "ruff-0.3.3-py3-none-win_arm64.whl", hash = "sha256:0171aab5fecdc54383993389710a3d1227f2da124d76a2784a7098e818f92d61"}, + {file = "ruff-0.3.3.tar.gz", hash = "sha256:38671be06f57a2f8aba957d9f701ea889aa5736be806f18c0cd03d6ff0cbca8d"}, ] [[package]] @@ -6994,18 +7015,15 @@ test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", [[package]] name = "scons" -version = "4.6.0.post1" +version = "4.7.0" description = "Open Source next-generation build tool." optional = false python-versions = ">=3.6" files = [ - {file = "SCons-4.6.0.post1-py3-none-any.whl", hash = "sha256:9e0527b7a924e7af2b312c1f8961ef2776847bdc46a4d886af5a75f301da7ce3"}, - {file = "SCons-4.6.0.post1.tar.gz", hash = "sha256:d467a34546f5366a32e4d4419611d0138dd680210f24aa8491ebe9e4b83456cf"}, + {file = "SCons-4.7.0-py3-none-any.whl", hash = "sha256:93308e564966760a63a4c1e016b2cc15d07bb40db67b1c907732da0b9e9f8959"}, + {file = "SCons-4.7.0.tar.gz", hash = "sha256:d8b617f6610a73e46509de70dcf82f76861b79762ff602d546f4e80918ec81f3"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "seaborn" version = "0.13.2" @@ -7029,13 +7047,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.41.0" +version = "1.42.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.41.0.tar.gz", hash = "sha256:4f2d6c43c07925d8cd10dfbd0970ea7cb784f70e79523cca9dbcd72df38e5a46"}, - {file = "sentry_sdk-1.41.0-py2.py3-none-any.whl", hash = "sha256:be4f8f4b29a80b6a3b71f0f31487beb9e296391da20af8504498a328befed53f"}, + {file = "sentry-sdk-1.42.0.tar.gz", hash = "sha256:4a8364b8f7edbf47f95f7163e48334c96100d9c098f0ae6606e2e18183c223e6"}, + {file = "sentry_sdk-1.42.0-py2.py3-none-any.whl", hash = "sha256:a654ee7e497a3f5f6368b36d4f04baeab1fe92b3105f7f6965d6ef0de35a9ba4"}, ] [package.dependencies] @@ -7059,6 +7077,7 @@ grpcio = ["grpcio (>=1.21.1)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] pure-eval = ["asttokens", "executing", "pure-eval"] @@ -7174,18 +7193,18 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "69.1.1" +version = "69.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, - {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, + {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, + {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -7544,23 +7563,23 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "timezonefinder" -version = "6.4.0" +version = "6.5.0" description = "python package for finding the timezone of any point on earth (coordinates) offline" optional = false -python-versions = ">=3.9,<4" +python-versions = ">=3.8,<4" files = [ - {file = "timezonefinder-6.4.0-cp310-cp310-manylinux_2_35_x86_64.whl", hash = "sha256:b4d4cefcdfcd46ffc04858d12cb23b58faca06dad05f68b6b704421be9fc70bc"}, - {file = "timezonefinder-6.4.0.tar.gz", hash = "sha256:7d82ebbc822d5fa012dbfbde510999afce0d7d1482794838e6c4daf6cc327f97"}, + {file = "timezonefinder-6.5.0-cp38-cp38-manylinux_2_35_x86_64.whl", hash = "sha256:3c70e1ea468ecac11272aa0a727450fd7cf43039ae2a2c62f7900a0a42efb6d6"}, + {file = "timezonefinder-6.5.0.tar.gz", hash = "sha256:7afdb1516927e7766deb6da80c8bd66734a44ba3d898038fe73aef1e9cd39bb0"}, ] [package.dependencies] cffi = ">=1.15.1,<2" h3 = ">=3.7.6,<4" -numpy = ">=1.18,<2" +numpy = {version = ">=1.23,<2", markers = "python_version >= \"3.9\""} setuptools = ">=65.5" [package.extras] -numba = ["numba (>=0.59,<1)"] +numba = ["numba (>=0.56,<1)", "numba (>=0.59,<1)"] pytz = ["pytz (>=2022.7.1)"] [[package]] @@ -7815,18 +7834,18 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" From d82fc7f27bd92a5e972416610b53eea3804bcfdc Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 18 Mar 2024 18:02:34 -0500 Subject: [PATCH 079/384] [bot] Fingerprints: add missing FW versions from new users (#31842) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 2 ++ selfdrive/car/subaru/fingerprints.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 219ec3e2b8..aafd7f0519 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -409,6 +409,7 @@ FW_VERSIONS = { b'68527403AD', b'68546047AF', b'68631938AA', + b'68631940AA', b'68631942AA', ], (Ecu.srs, 0x744, None): [ @@ -530,6 +531,7 @@ FW_VERSIONS = { b'68586101AA ', b'68586105AB ', b'68629922AC ', + b'68629925AC ', b'68629926AC ', ], (Ecu.transmission, 0x7e1, None): [ diff --git a/selfdrive/car/subaru/fingerprints.py b/selfdrive/car/subaru/fingerprints.py index 9f6177b4c0..f0ab307274 100644 --- a/selfdrive/car/subaru/fingerprints.py +++ b/selfdrive/car/subaru/fingerprints.py @@ -149,6 +149,7 @@ FW_VERSIONS = { b'\xe3\xf5C\x00\x00', b'\xe3\xf5F\x00\x00', b'\xe3\xf5G\x00\x00', + b'\xe4\xe5\x021\x00', b'\xe4\xe5\x061\x00', b'\xe4\xf5\x02\x00\x00', b'\xe4\xf5\x07\x00\x00', @@ -196,6 +197,7 @@ FW_VERSIONS = { b'\xe6"fp\x07', b'\xf3"f@\x07', b'\xf3"fp\x07', + b'\xf3"fr\x07', ], (Ecu.transmission, 0x7e1, None): [ b'\xe6\xf5\x04\x00\x00', From 2aaaa3f1674d5aa2f0d9c685f8257d2466141d5c Mon Sep 17 00:00:00 2001 From: YassineYousfi Date: Mon, 18 Mar 2024 16:37:15 -0700 Subject: [PATCH 080/384] duck amigo model (#31883) * 026c8008-1728-4549-baf4-ab0436f2927d/700 * update model replay ref * update again --- selfdrive/modeld/models/supercombo.onnx | 4 ++-- selfdrive/test/process_replay/model_replay_ref_commit | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/modeld/models/supercombo.onnx b/selfdrive/modeld/models/supercombo.onnx index 68e39514d9..7991fef662 100644 --- a/selfdrive/modeld/models/supercombo.onnx +++ b/selfdrive/modeld/models/supercombo.onnx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd4b0cc83d5ff275ee77ec430ea686603ad50fd6ad874f599ea6e95b123afc3e -size 48193749 +oid sha256:b4fb2cec9ef759cb1164ee2d27b338338a5a9302f427ad95f9b021361b02e1a2 +size 52263406 diff --git a/selfdrive/test/process_replay/model_replay_ref_commit b/selfdrive/test/process_replay/model_replay_ref_commit index 786c2f2731..85ba5fb840 100644 --- a/selfdrive/test/process_replay/model_replay_ref_commit +++ b/selfdrive/test/process_replay/model_replay_ref_commit @@ -1 +1 @@ -e8b359a82316e6dfce3b6fb0fb9684431bfa0a1b +60b00d102b3aedcc74a91722d1210cc6905b0c8f From 4c424eb4b05836b379469d17aabd7cbef47edf2b Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 18 Mar 2024 22:13:47 -0700 Subject: [PATCH 081/384] won't need this --- release/verify.sh | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100755 release/verify.sh diff --git a/release/verify.sh b/release/verify.sh deleted file mode 100755 index ec5266bd81..0000000000 --- a/release/verify.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -RED="\033[0;31m" -GREEN="\033[0;32m" -CLEAR="\033[0m" - -BRANCHES="devel release3" -for b in $BRANCHES; do - if git diff --quiet origin/$b origin/$b-staging && [ "$(git rev-parse origin/$b)" = "$(git rev-parse origin/$b-staging)" ]; then - printf "%-10s $GREEN ok $CLEAR\n" "$b" - else - printf "%-10s $RED mismatch $CLEAR\n" "$b" - fi -done From 9e1639c3f18e399ece90c0f795933b5c62e043c7 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 19 Mar 2024 13:37:17 +0800 Subject: [PATCH 082/384] cabana: fix the suppress highlight breaks after seeking (#31912) --- tools/cabana/streams/abstractstream.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/cabana/streams/abstractstream.cc b/tools/cabana/streams/abstractstream.cc index 8a20086b5c..afb1ec200c 100644 --- a/tools/cabana/streams/abstractstream.cc +++ b/tools/cabana/streams/abstractstream.cc @@ -127,22 +127,27 @@ const CanData &AbstractStream::lastMessage(const MessageId &id) { // it is thread safe to update data in updateLastMsgsTo. // updateLastMsgsTo is always called in UI thread. void AbstractStream::updateLastMsgsTo(double sec) { - new_msgs_.clear(); - messages_.clear(); - current_sec_ = sec; uint64_t last_ts = (sec + routeStartTime()) * 1e9; + std::unordered_map msgs; + for (const auto &[id, ev] : events_) { auto it = std::upper_bound(ev.begin(), ev.end(), last_ts, CompareCanEvent()); if (it != ev.begin()) { auto prev = std::prev(it); double ts = (*prev)->mono_time / 1e9 - routeStartTime(); - auto &m = messages_[id]; + auto &m = msgs[id]; + // Keep last changes + if (auto old_m = messages_.find(id); old_m != messages_.end()) { + m.last_changes = old_m->second.last_changes; + } m.compute(id, (*prev)->dat, (*prev)->size, ts, getSpeed(), {}); m.count = std::distance(ev.begin(), prev) + 1; } } + new_msgs_.clear(); + messages_ = std::move(msgs); bool id_changed = messages_.size() != last_msgs.size() || std::any_of(messages_.cbegin(), messages_.cend(), [this](const auto &m) { return !last_msgs.count(m.first); }); @@ -183,8 +188,6 @@ void AbstractStream::mergeEvents(const std::vector &events) { lastest_event_ts = all_events_.empty() ? 0 : all_events_.back()->mono_time; } -// CanData - namespace { enum Color { GREYISH_BLUE, CYAN, RED}; From 5a805df3402c8a0661a9b663d88378313b19784e Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Tue, 19 Mar 2024 05:37:45 +0000 Subject: [PATCH 083/384] cabana(DBCFile): preserve original header (#31900) * cabana(DBCFile): preserve original header * add trailing space --- tools/cabana/dbc/dbcfile.cc | 13 ++++++++++++- tools/cabana/dbc/dbcfile.h | 1 + tools/cabana/tests/test_cabana.cc | 20 ++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/tools/cabana/dbc/dbcfile.cc b/tools/cabana/dbc/dbcfile.cc index 69ca5b6309..e7f7fdc6ef 100644 --- a/tools/cabana/dbc/dbcfile.cc +++ b/tools/cabana/dbc/dbcfile.cc @@ -98,10 +98,13 @@ void DBCFile::parse(const QString &content) { QTextStream stream((QString *)&content); cabana::Msg *current_msg = nullptr; int multiplexor_cnt = 0; + bool seen_first = false; while (!stream.atEnd()) { ++line_num; QString raw_line = stream.readLine(); line = raw_line.trimmed(); + + bool seen = true; if (line.startsWith("BO_ ")) { multiplexor_cnt = 0; auto match = bo_regexp.match(line); @@ -182,6 +185,14 @@ void DBCFile::parse(const QString &content) { if (auto s = get_sig(match.captured(1).toUInt(), match.captured(2))) { s->comment = match.captured(3).trimmed(); } + } else { + seen = false; + } + + if (seen) { + seen_first = true; + } else if (!seen_first) { + header += raw_line + "\n"; } } @@ -231,5 +242,5 @@ QString DBCFile::generateDBC() { } dbc_string += "\n"; } - return dbc_string + comment + val_desc; + return header + dbc_string + comment + val_desc; } diff --git a/tools/cabana/dbc/dbcfile.h b/tools/cabana/dbc/dbcfile.h index 551bac4946..29f19a80e4 100644 --- a/tools/cabana/dbc/dbcfile.h +++ b/tools/cabana/dbc/dbcfile.h @@ -34,6 +34,7 @@ public: private: void parse(const QString &content); + QString header; std::map msgs; QString name_; }; diff --git a/tools/cabana/tests/test_cabana.cc b/tools/cabana/tests/test_cabana.cc index 8b09fdac34..98c2de12b6 100644 --- a/tools/cabana/tests/test_cabana.cc +++ b/tools/cabana/tests/test_cabana.cc @@ -45,6 +45,26 @@ CM_ SG_ 162 signal_2 "signal comment"; REQUIRE(dbc.generateDBC() == content); } +TEST_CASE("DBCFile::generateDBC -- preserve original header") { + QString content = R"(VERSION "1.0" + +NS_ : + CM_ + +BS_: + +BU_: EON + +BO_ 160 message_1: 8 EON + SG_ signal_1 : 0|12@1+ (1,0) [0|4095] "unit" XXX + +CM_ BO_ 160 "message comment"; +CM_ SG_ 160 signal_1 "signal comment"; +)"; + DBCFile dbc("", content); + REQUIRE(dbc.generateDBC() == content); +} + TEST_CASE("parse_dbc") { QString content = R"( BO_ 160 message_1: 8 EON From 489528dcae3888311f92075ba9e0f68626725121 Mon Sep 17 00:00:00 2001 From: thenhnn <162156666+thenhnn@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:16:02 +0300 Subject: [PATCH 084/384] PlatformConfig: automatically get platform_str from the enum name (#31868) * get platform_str from the enum name * fix tests * add migration table * remove impossible todo * Add link to PR in MIGRATION table Co-authored-by: Adeeb Shihadeh * Remove useless brand name comments and rename RAM_1500 to RAM_1500_5TH_GEN * rename RAM_HD to RAM_HD_5TH_GEN * rename references to RAM_HD and RAM_1500 * change "mock" to "MOCK" and rename torque data of Nissan Leaf 2018 IC * remove MOCK from fingerprints.py * change hard-coded car model in test_can_fingerprint.py/test_timing * migration * update ref * space * prius --------- Co-authored-by: Adeeb Shihadeh Co-authored-by: justin newberry Co-authored-by: Justin Newberry --- scripts/launch_corolla.sh | 2 +- selfdrive/car/__init__.py | 17 +- selfdrive/car/body/values.py | 1 - selfdrive/car/car_helpers.py | 2 +- selfdrive/car/chrysler/fingerprints.py | 4 +- selfdrive/car/chrysler/interface.py | 4 +- selfdrive/car/chrysler/values.py | 18 +- selfdrive/car/docs_definitions.py | 2 +- selfdrive/car/fingerprints.py | 218 ++++++++++++++++++ selfdrive/car/ford/values.py | 8 - selfdrive/car/gm/values.py | 14 -- selfdrive/car/honda/values.py | 22 -- selfdrive/car/hyundai/values.py | 65 ------ selfdrive/car/mazda/values.py | 6 - selfdrive/car/mock/values.py | 1 - selfdrive/car/nissan/values.py | 6 +- selfdrive/car/subaru/values.py | 15 -- selfdrive/car/tesla/values.py | 3 - selfdrive/car/tests/routes.py | 4 +- selfdrive/car/tests/test_can_fingerprint.py | 2 +- selfdrive/car/tests/test_platform_configs.py | 6 +- .../car/torque_data/neural_ff_weights.json | 2 +- selfdrive/car/torque_data/override.toml | 112 ++++----- selfdrive/car/torque_data/params.toml | 162 ++++++------- selfdrive/car/torque_data/substitute.toml | 150 ++++++------ selfdrive/car/toyota/values.py | 40 +--- selfdrive/car/volkswagen/values.py | 84 +++---- selfdrive/debug/cycle_alerts.py | 2 +- selfdrive/test/helpers.py | 2 +- selfdrive/test/process_replay/migration.py | 8 +- selfdrive/test/process_replay/ref_commit | 2 +- .../test/process_replay/test_processes.py | 2 +- selfdrive/test/process_replay/test_regen.py | 2 +- selfdrive/ui/tests/body.py | 2 +- tools/cabana/dbc/generate_dbc_json.py | 2 +- tools/car_porting/README.md | 4 +- tools/car_porting/auto_fingerprint.py | 2 +- tools/lib/tests/test_comma_car_segments.py | 2 +- tools/sim/launch_openpilot.sh | 2 +- 39 files changed, 511 insertions(+), 491 deletions(-) diff --git a/scripts/launch_corolla.sh b/scripts/launch_corolla.sh index 146fbacf0a..aa0243e600 100755 --- a/scripts/launch_corolla.sh +++ b/scripts/launch_corolla.sh @@ -2,6 +2,6 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -export FINGERPRINT="TOYOTA COROLLA TSS2 2019" +export FINGERPRINT="COROLLA_TSS2" export SKIP_FW_QUERY="1" $DIR/../launch_openpilot.sh diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 45da5a8b92..f7d6140640 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -1,7 +1,7 @@ # functions common among cars from collections import defaultdict, namedtuple from dataclasses import dataclass -from enum import IntFlag, ReprEnum +from enum import IntFlag, ReprEnum, EnumType from dataclasses import replace import capnp @@ -240,7 +240,6 @@ class CarSpecs: @dataclass(order=True) class PlatformConfig(Freezable): - platform_str: str car_docs: list[CarDocs] specs: CarSpecs @@ -248,6 +247,8 @@ class PlatformConfig(Freezable): flags: int = 0 + platform_str: str | None = None + def __hash__(self) -> int: return hash(self.platform_str) @@ -259,10 +260,18 @@ class PlatformConfig(Freezable): def __post_init__(self): self.init() - self.freeze() -class Platforms(str, ReprEnum): +class PlatformsType(EnumType): + def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **kwds): + for key in classdict._member_names.keys(): + cfg: PlatformConfig = classdict[key] + cfg.platform_str = key + cfg.freeze() + return super().__new__(metacls, cls, bases, classdict, boundary=boundary, _simple=_simple, **kwds) + + +class Platforms(str, ReprEnum, metaclass=PlatformsType): config: PlatformConfig def __new__(cls, platform_config: PlatformConfig): diff --git a/selfdrive/car/body/values.py b/selfdrive/car/body/values.py index d1ba0159fb..e570af0f69 100644 --- a/selfdrive/car/body/values.py +++ b/selfdrive/car/body/values.py @@ -21,7 +21,6 @@ class CarControllerParams: class CAR(Platforms): BODY = PlatformConfig( - "COMMA BODY", [CarDocs("comma body", package="All")], CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44), dbc_dict('comma_body', None), diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 32a9dd84bd..f6f3960475 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -204,7 +204,7 @@ def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): if candidate is None: cloudlog.event("car doesn't match any fingerprints", fingerprints=repr(fingerprints), error=True) - candidate = "mock" + candidate = "MOCK" CarInterface, _, _ = interfaces[candidate] CP = CarInterface.get_params(candidate, fingerprints, car_fw, experimental_long_allowed, docs=False) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index aafd7f0519..f3edd8a888 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -363,7 +363,7 @@ FW_VERSIONS = { b'68503664AC', ], }, - CAR.RAM_1500: { + CAR.RAM_1500_5TH_GEN: { (Ecu.combinationMeter, 0x742, None): [ b'68294051AG', b'68294051AI', @@ -567,7 +567,7 @@ FW_VERSIONS = { b'68629936AC', ], }, - CAR.RAM_HD: { + CAR.RAM_HD_5TH_GEN: { (Ecu.combinationMeter, 0x742, None): [ b'68361606AH', b'68437735AC', diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 198bf63b10..e799767f26 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -51,14 +51,14 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kf = 0.00006 # Ram - elif candidate == CAR.RAM_1500: + elif candidate == CAR.RAM_1500_5TH_GEN: ret.steerActuatorDelay = 0.2 ret.wheelbase = 3.88 # Older EPS FW allow steer to zero if any(fw.ecu == 'eps' and b"68" < fw.fwVersion[:4] <= b"6831" for fw in car_fw): ret.minSteerSpeed = 0. - elif candidate == CAR.RAM_HD: + elif candidate == CAR.RAM_HD_5TH_GEN: ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, 1.0, False) diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index dfda1d1aaa..78d5131df5 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -33,27 +33,22 @@ class ChryslerCarSpecs(CarSpecs): class CAR(Platforms): # Chrysler PACIFICA_2017_HYBRID = ChryslerPlatformConfig( - "CHRYSLER PACIFICA HYBRID 2017", [ChryslerCarDocs("Chrysler Pacifica Hybrid 2017")], ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2), ) PACIFICA_2018_HYBRID = ChryslerPlatformConfig( - "CHRYSLER PACIFICA HYBRID 2018", [ChryslerCarDocs("Chrysler Pacifica Hybrid 2018")], PACIFICA_2017_HYBRID.specs, ) PACIFICA_2019_HYBRID = ChryslerPlatformConfig( - "CHRYSLER PACIFICA HYBRID 2019", [ChryslerCarDocs("Chrysler Pacifica Hybrid 2019-23")], PACIFICA_2017_HYBRID.specs, ) PACIFICA_2018 = ChryslerPlatformConfig( - "CHRYSLER PACIFICA 2018", [ChryslerCarDocs("Chrysler Pacifica 2017-18")], PACIFICA_2017_HYBRID.specs, ) PACIFICA_2020 = ChryslerPlatformConfig( - "CHRYSLER PACIFICA 2020", [ ChryslerCarDocs("Chrysler Pacifica 2019-20"), ChryslerCarDocs("Chrysler Pacifica 2021-23", package="All"), @@ -63,33 +58,28 @@ class CAR(Platforms): # Dodge DODGE_DURANGO = ChryslerPlatformConfig( - "DODGE DURANGO 2021", [ChryslerCarDocs("Dodge Durango 2020-21")], PACIFICA_2017_HYBRID.specs, ) # Jeep JEEP_GRAND_CHEROKEE = ChryslerPlatformConfig( # includes 2017 Trailhawk - "JEEP GRAND CHEROKEE V6 2018", [ChryslerCarDocs("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk")], ChryslerCarSpecs(mass=1778., wheelbase=2.71, steerRatio=16.7), ) JEEP_GRAND_CHEROKEE_2019 = ChryslerPlatformConfig( # includes 2020 Trailhawk - "JEEP GRAND CHEROKEE 2019", [ChryslerCarDocs("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4")], JEEP_GRAND_CHEROKEE.specs, ) # Ram - RAM_1500 = ChryslerPlatformConfig( - "RAM 1500 5TH GEN", + RAM_1500_5TH_GEN = ChryslerPlatformConfig( [ChryslerCarDocs("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram]))], ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5), dbc_dict('chrysler_ram_dt_generated', None), ) - RAM_HD = ChryslerPlatformConfig( - "RAM HD 5TH GEN", + RAM_HD_5TH_GEN = ChryslerPlatformConfig( [ ChryslerCarDocs("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), ChryslerCarDocs("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])), @@ -119,8 +109,8 @@ class CarControllerParams: STEER_THRESHOLD = 120 -RAM_DT = {CAR.RAM_1500, } -RAM_HD = {CAR.RAM_HD, } +RAM_DT = {CAR.RAM_1500_5TH_GEN, } +RAM_HD = {CAR.RAM_HD_5TH_GEN, } RAM_CARS = RAM_DT | RAM_HD diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index c9d8dd10a8..02e31fa8e6 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -346,7 +346,7 @@ class CarDocs: return sentence_builder.format(car_model=f"{self.make} {self.model}", alc=alc, acc=acc) else: - if CP.carFingerprint == "COMMA BODY": + if CP.carFingerprint == "BODY": return "The body is a robotics dev kit that can run openpilot. Learn more." else: raise Exception(f"This notCar does not have a detail sentence: {CP.carFingerprint}") diff --git a/selfdrive/car/fingerprints.py b/selfdrive/car/fingerprints.py index eaf9002dcd..31c45876c2 100644 --- a/selfdrive/car/fingerprints.py +++ b/selfdrive/car/fingerprints.py @@ -1,6 +1,14 @@ from openpilot.selfdrive.car.interfaces import get_interface_attr +from openpilot.selfdrive.car.body.values import CAR as BODY +from openpilot.selfdrive.car.chrysler.values import CAR as CHRYSLER +from openpilot.selfdrive.car.ford.values import CAR as FORD +from openpilot.selfdrive.car.gm.values import CAR as GM from openpilot.selfdrive.car.honda.values import CAR as HONDA from openpilot.selfdrive.car.hyundai.values import CAR as HYUNDAI +from openpilot.selfdrive.car.mazda.values import CAR as MAZDA +from openpilot.selfdrive.car.nissan.values import CAR as NISSAN +from openpilot.selfdrive.car.subaru.values import CAR as SUBARU +from openpilot.selfdrive.car.tesla.values import CAR as TESLA from openpilot.selfdrive.car.toyota.values import CAR as TOYOTA from openpilot.selfdrive.car.volkswagen.values import CAR as VW @@ -117,4 +125,214 @@ MIGRATION = { "HYUNDAI TUCSON HYBRID 4TH GEN": HYUNDAI.TUCSON_4TH_GEN, "KIA SPORTAGE HYBRID 5TH GEN": HYUNDAI.KIA_SPORTAGE_5TH_GEN, "KIA SORENTO PLUG-IN HYBRID 4TH GEN": HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, + + # Removal of platform_str, see https://github.com/commaai/openpilot/pull/31868/ + "COMMA BODY": BODY.BODY, + "CHRYSLER PACIFICA HYBRID 2017": CHRYSLER.PACIFICA_2017_HYBRID, + "CHRYSLER PACIFICA HYBRID 2018": CHRYSLER.PACIFICA_2018_HYBRID, + "CHRYSLER PACIFICA HYBRID 2019": CHRYSLER.PACIFICA_2019_HYBRID, + "CHRYSLER PACIFICA 2018": CHRYSLER.PACIFICA_2018, + "CHRYSLER PACIFICA 2020": CHRYSLER.PACIFICA_2020, + "DODGE DURANGO 2021": CHRYSLER.DODGE_DURANGO, + "RAM 1500 5TH GEN": CHRYSLER.RAM_1500_5TH_GEN, + "RAM HD 5TH GEN": CHRYSLER.RAM_HD_5TH_GEN, + "FORD BRONCO SPORT 1ST GEN": FORD.BRONCO_SPORT_MK1, + "FORD ESCAPE 4TH GEN": FORD.ESCAPE_MK4, + "FORD EXPLORER 6TH GEN": FORD.EXPLORER_MK6, + "FORD F-150 14TH GEN": FORD.F_150_MK14, + "FORD F-150 LIGHTNING 1ST GEN": FORD.F_150_LIGHTNING_MK1, + "FORD FOCUS 4TH GEN": FORD.FOCUS_MK4, + "FORD MAVERICK 1ST GEN": FORD.MAVERICK_MK1, + "FORD MUSTANG MACH-E 1ST GEN": FORD.MUSTANG_MACH_E_MK1, + "HOLDEN ASTRA RS-V BK 2017": GM.HOLDEN_ASTRA, + "CHEVROLET VOLT PREMIER 2017": GM.VOLT, + "CADILLAC ATS Premium Performance 2018": GM.CADILLAC_ATS, + "CHEVROLET MALIBU PREMIER 2017": GM.MALIBU, + "GMC ACADIA DENALI 2018": GM.ACADIA, + "BUICK LACROSSE 2017": GM.BUICK_LACROSSE, + "BUICK REGAL ESSENCE 2018": GM.BUICK_REGAL, + "CADILLAC ESCALADE 2017": GM.ESCALADE, + "CADILLAC ESCALADE ESV 2016": GM.ESCALADE_ESV, + "CADILLAC ESCALADE ESV 2019": GM.ESCALADE_ESV_2019, + "CHEVROLET BOLT EUV 2022": GM.BOLT_EUV, + "CHEVROLET SILVERADO 1500 2020": GM.SILVERADO, + "CHEVROLET EQUINOX 2019": GM.EQUINOX, + "CHEVROLET TRAILBLAZER 2021": GM.TRAILBLAZER, + "HONDA ACCORD 2018": HONDA.ACCORD, + "HONDA CIVIC (BOSCH) 2019": HONDA.CIVIC_BOSCH, + "HONDA CIVIC SEDAN 1.6 DIESEL 2019": HONDA.CIVIC_BOSCH_DIESEL, + "HONDA CIVIC 2022": HONDA.CIVIC_2022, + "HONDA CR-V 2017": HONDA.CRV_5G, + "HONDA CR-V HYBRID 2019": HONDA.CRV_HYBRID, + "HONDA HR-V 2023": HONDA.HRV_3G, + "ACURA RDX 2020": HONDA.ACURA_RDX_3G, + "HONDA INSIGHT 2019": HONDA.INSIGHT, + "HONDA E 2020": HONDA.HONDA_E, + "ACURA ILX 2016": HONDA.ACURA_ILX, + "HONDA CR-V 2016": HONDA.CRV, + "HONDA CR-V EU 2016": HONDA.CRV_EU, + "HONDA FIT 2018": HONDA.FIT, + "HONDA FREED 2020": HONDA.FREED, + "HONDA HRV 2019": HONDA.HRV, + "HONDA ODYSSEY 2018": HONDA.ODYSSEY, + "HONDA ODYSSEY CHN 2019": HONDA.ODYSSEY_CHN, + "ACURA RDX 2018": HONDA.ACURA_RDX, + "HONDA PILOT 2017": HONDA.PILOT, + "HONDA RIDGELINE 2017": HONDA.RIDGELINE, + "HONDA CIVIC 2016": HONDA.CIVIC, + "HYUNDAI AZERA 6TH GEN": HYUNDAI.AZERA_6TH_GEN, + "HYUNDAI AZERA HYBRID 6TH GEN": HYUNDAI.AZERA_HEV_6TH_GEN, + "HYUNDAI ELANTRA 2017": HYUNDAI.ELANTRA, + "HYUNDAI I30 N LINE 2019 & GT 2018 DCT": HYUNDAI.ELANTRA_GT_I30, + "HYUNDAI ELANTRA 2021": HYUNDAI.ELANTRA_2021, + "HYUNDAI ELANTRA HYBRID 2021": HYUNDAI.ELANTRA_HEV_2021, + "HYUNDAI GENESIS 2015-2016": HYUNDAI.HYUNDAI_GENESIS, + "HYUNDAI IONIQ HYBRID 2017-2019": HYUNDAI.IONIQ, + "HYUNDAI IONIQ HYBRID 2020-2022": HYUNDAI.IONIQ_HEV_2022, + "HYUNDAI IONIQ ELECTRIC LIMITED 2019": HYUNDAI.IONIQ_EV_LTD, + "HYUNDAI IONIQ ELECTRIC 2020": HYUNDAI.IONIQ_EV_2020, + "HYUNDAI IONIQ PLUG-IN HYBRID 2019": HYUNDAI.IONIQ_PHEV_2019, + "HYUNDAI IONIQ PHEV 2020": HYUNDAI.IONIQ_PHEV, + "HYUNDAI KONA 2020": HYUNDAI.KONA, + "HYUNDAI KONA ELECTRIC 2019": HYUNDAI.KONA_EV, + "HYUNDAI KONA ELECTRIC 2022": HYUNDAI.KONA_EV_2022, + "HYUNDAI KONA ELECTRIC 2ND GEN": HYUNDAI.KONA_EV_2ND_GEN, + "HYUNDAI KONA HYBRID 2020": HYUNDAI.KONA_HEV, + "HYUNDAI SANTA FE 2019": HYUNDAI.SANTA_FE, + "HYUNDAI SANTA FE 2022": HYUNDAI.SANTA_FE_2022, + "HYUNDAI SANTA FE HYBRID 2022": HYUNDAI.SANTA_FE_HEV_2022, + "HYUNDAI SANTA FE PlUG-IN HYBRID 2022": HYUNDAI.SANTA_FE_PHEV_2022, + "HYUNDAI SONATA 2020": HYUNDAI.SONATA, + "HYUNDAI SONATA 2019": HYUNDAI.SONATA_LF, + "HYUNDAI STARIA 4TH GEN": HYUNDAI.STARIA_4TH_GEN, + "HYUNDAI TUCSON 2019": HYUNDAI.TUCSON, + "HYUNDAI PALISADE 2020": HYUNDAI.PALISADE, + "HYUNDAI VELOSTER 2019": HYUNDAI.VELOSTER, + "HYUNDAI SONATA HYBRID 2021": HYUNDAI.SONATA_HYBRID, + "HYUNDAI IONIQ 5 2022": HYUNDAI.IONIQ_5, + "HYUNDAI IONIQ 6 2023": HYUNDAI.IONIQ_6, + "HYUNDAI TUCSON 4TH GEN": HYUNDAI.TUCSON_4TH_GEN, + "HYUNDAI SANTA CRUZ 1ST GEN": HYUNDAI.SANTA_CRUZ_1ST_GEN, + "HYUNDAI CUSTIN 1ST GEN": HYUNDAI.CUSTIN_1ST_GEN, + "KIA FORTE E 2018 & GT 2021": HYUNDAI.KIA_FORTE, + "KIA K5 2021": HYUNDAI.KIA_K5_2021, + "KIA K5 HYBRID 2020": HYUNDAI.KIA_K5_HEV_2020, + "KIA K8 HYBRID 1ST GEN": HYUNDAI.KIA_K8_HEV_1ST_GEN, + "KIA NIRO EV 2020": HYUNDAI.KIA_NIRO_EV, + "KIA NIRO EV 2ND GEN": HYUNDAI.KIA_NIRO_EV_2ND_GEN, + "KIA NIRO HYBRID 2019": HYUNDAI.KIA_NIRO_PHEV, + "KIA NIRO PLUG-IN HYBRID 2022": HYUNDAI.KIA_NIRO_PHEV_2022, + "KIA NIRO HYBRID 2021": HYUNDAI.KIA_NIRO_HEV_2021, + "KIA NIRO HYBRID 2ND GEN": HYUNDAI.KIA_NIRO_HEV_2ND_GEN, + "KIA OPTIMA 4TH GEN": HYUNDAI.KIA_OPTIMA_G4, + "KIA OPTIMA 4TH GEN FACELIFT": HYUNDAI.KIA_OPTIMA_G4_FL, + "KIA OPTIMA HYBRID 2017 & SPORTS 2019": HYUNDAI.KIA_OPTIMA_H, + "KIA OPTIMA HYBRID 4TH GEN FACELIFT": HYUNDAI.KIA_OPTIMA_H_G4_FL, + "KIA SELTOS 2021": HYUNDAI.KIA_SELTOS, + "KIA SPORTAGE 5TH GEN": HYUNDAI.KIA_SPORTAGE_5TH_GEN, + "KIA SORENTO GT LINE 2018": HYUNDAI.KIA_SORENTO, + "KIA SORENTO 4TH GEN": HYUNDAI.KIA_SORENTO_4TH_GEN, + "KIA SORENTO HYBRID 4TH GEN": HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, + "KIA STINGER GT2 2018": HYUNDAI.KIA_STINGER, + "KIA STINGER 2022": HYUNDAI.KIA_STINGER_2022, + "KIA CEED INTRO ED 2019": HYUNDAI.KIA_CEED, + "KIA EV6 2022": HYUNDAI.KIA_EV6, + "KIA CARNIVAL 4TH GEN": HYUNDAI.KIA_CARNIVAL_4TH_GEN, + "GENESIS GV60 ELECTRIC 1ST GEN": HYUNDAI.GENESIS_GV60_EV_1ST_GEN, + "GENESIS G70 2018": HYUNDAI.GENESIS_G70, + "GENESIS G70 2020": HYUNDAI.GENESIS_G70_2020, + "GENESIS GV70 1ST GEN": HYUNDAI.GENESIS_GV70_1ST_GEN, + "GENESIS G80 2017": HYUNDAI.GENESIS_G80, + "GENESIS G90 2017": HYUNDAI.GENESIS_G90, + "GENESIS GV80 2023": HYUNDAI.GENESIS_GV80, + "MAZDA CX-5": MAZDA.CX5, + "MAZDA CX-9": MAZDA.CX9, + "MAZDA 3": MAZDA.MAZDA3, + "MAZDA 6": MAZDA.MAZDA6, + "MAZDA CX-9 2021": MAZDA.CX9_2021, + "MAZDA CX-5 2022": MAZDA.CX5_2022, + "NISSAN X-TRAIL 2017": NISSAN.XTRAIL, + "NISSAN LEAF 2018": NISSAN.LEAF, + "NISSAN ROGUE 2019": NISSAN.ROGUE, + "NISSAN ALTIMA 2020": NISSAN.ALTIMA, + "SUBARU ASCENT LIMITED 2019": SUBARU.ASCENT, + "SUBARU OUTBACK 6TH GEN": SUBARU.OUTBACK, + "SUBARU LEGACY 7TH GEN": SUBARU.LEGACY, + "SUBARU IMPREZA LIMITED 2019": SUBARU.IMPREZA, + "SUBARU IMPREZA SPORT 2020": SUBARU.IMPREZA_2020, + "SUBARU CROSSTREK HYBRID 2020": SUBARU.CROSSTREK_HYBRID, + "SUBARU FORESTER 2019": SUBARU.FORESTER, + "SUBARU FORESTER HYBRID 2020": SUBARU.FORESTER_HYBRID, + "SUBARU FORESTER 2017 - 2018": SUBARU.FORESTER_PREGLOBAL, + "SUBARU LEGACY 2015 - 2018": SUBARU.LEGACY_PREGLOBAL, + "SUBARU OUTBACK 2015 - 2017": SUBARU.OUTBACK_PREGLOBAL, + "SUBARU OUTBACK 2018 - 2019": SUBARU.OUTBACK_PREGLOBAL_2018, + "SUBARU FORESTER 2022": SUBARU.FORESTER_2022, + "SUBARU OUTBACK 7TH GEN": SUBARU.OUTBACK_2023, + "SUBARU ASCENT 2023": SUBARU.ASCENT_2023, + 'TESLA AP1 MODEL S': TESLA.AP1_MODELS, + 'TESLA AP2 MODEL S': TESLA.AP2_MODELS, + 'TESLA MODEL S RAVEN': TESLA.MODELS_RAVEN, + "TOYOTA ALPHARD 2020": TOYOTA.ALPHARD_TSS2, + "TOYOTA AVALON 2016": TOYOTA.AVALON, + "TOYOTA AVALON 2019": TOYOTA.AVALON_2019, + "TOYOTA AVALON 2022": TOYOTA.AVALON_TSS2, + "TOYOTA CAMRY 2018": TOYOTA.CAMRY, + "TOYOTA CAMRY 2021": TOYOTA.CAMRY_TSS2, + "TOYOTA C-HR 2018": TOYOTA.CHR, + "TOYOTA C-HR 2021": TOYOTA.CHR_TSS2, + "TOYOTA COROLLA 2017": TOYOTA.COROLLA, + "TOYOTA COROLLA TSS2 2019": TOYOTA.COROLLA_TSS2, + "TOYOTA HIGHLANDER 2017": TOYOTA.HIGHLANDER, + "TOYOTA HIGHLANDER 2020": TOYOTA.HIGHLANDER_TSS2, + "TOYOTA PRIUS 2017": TOYOTA.PRIUS, + "TOYOTA PRIUS v 2017": TOYOTA.PRIUS_V, + "TOYOTA PRIUS TSS2 2021": TOYOTA.PRIUS_TSS2, + "TOYOTA RAV4 2017": TOYOTA.RAV4, + "TOYOTA RAV4 HYBRID 2017": TOYOTA.RAV4H, + "TOYOTA RAV4 2019": TOYOTA.RAV4_TSS2, + "TOYOTA RAV4 2022": TOYOTA.RAV4_TSS2_2022, + "TOYOTA RAV4 2023": TOYOTA.RAV4_TSS2_2023, + "TOYOTA MIRAI 2021": TOYOTA.MIRAI, + "TOYOTA SIENNA 2018": TOYOTA.SIENNA, + "LEXUS CT HYBRID 2018": TOYOTA.LEXUS_CTH, + "LEXUS ES 2018": TOYOTA.LEXUS_ES, + "LEXUS ES 2019": TOYOTA.LEXUS_ES_TSS2, + "LEXUS IS 2018": TOYOTA.LEXUS_IS, + "LEXUS IS 2023": TOYOTA.LEXUS_IS_TSS2, + "LEXUS NX 2018": TOYOTA.LEXUS_NX, + "LEXUS NX 2020": TOYOTA.LEXUS_NX_TSS2, + "LEXUS LC 2024": TOYOTA.LEXUS_LC_TSS2, + "LEXUS RC 2020": TOYOTA.LEXUS_RC, + "LEXUS RX 2016": TOYOTA.LEXUS_RX, + "LEXUS RX 2020": TOYOTA.LEXUS_RX_TSS2, + "LEXUS GS F 2016": TOYOTA.LEXUS_GS_F, + "VOLKSWAGEN ARTEON 1ST GEN": VW.ARTEON_MK1, + "VOLKSWAGEN ATLAS 1ST GEN": VW.ATLAS_MK1, + "VOLKSWAGEN CADDY 3RD GEN": VW.CADDY_MK3, + "VOLKSWAGEN CRAFTER 2ND GEN": VW.CRAFTER_MK2, + "VOLKSWAGEN GOLF 7TH GEN": VW.GOLF_MK7, + "VOLKSWAGEN JETTA 7TH GEN": VW.JETTA_MK7, + "VOLKSWAGEN PASSAT 8TH GEN": VW.PASSAT_MK8, + "VOLKSWAGEN PASSAT NMS": VW.PASSAT_NMS, + "VOLKSWAGEN POLO 6TH GEN": VW.POLO_MK6, + "VOLKSWAGEN SHARAN 2ND GEN": VW.SHARAN_MK2, + "VOLKSWAGEN TAOS 1ST GEN": VW.TAOS_MK1, + "VOLKSWAGEN T-CROSS 1ST GEN": VW.TCROSS_MK1, + "VOLKSWAGEN TIGUAN 2ND GEN": VW.TIGUAN_MK2, + "VOLKSWAGEN TOURAN 2ND GEN": VW.TOURAN_MK2, + "VOLKSWAGEN TRANSPORTER T6.1": VW.TRANSPORTER_T61, + "VOLKSWAGEN T-ROC 1ST GEN": VW.TROC_MK1, + "AUDI A3 3RD GEN": VW.AUDI_A3_MK3, + "AUDI Q2 1ST GEN": VW.AUDI_Q2_MK1, + "AUDI Q3 2ND GEN": VW.AUDI_Q3_MK2, + "SEAT ATECA 1ST GEN": VW.SEAT_ATECA_MK1, + "SEAT LEON 3RD GEN": VW.SEAT_LEON_MK3, + "SKODA FABIA 4TH GEN": VW.SKODA_FABIA_MK4, + "SKODA KAMIQ 1ST GEN": VW.SKODA_KAMIQ_MK1, + "SKODA KAROQ 1ST GEN": VW.SKODA_KAROQ_MK1, + "SKODA KODIAQ 1ST GEN": VW.SKODA_KODIAQ_MK1, + "SKODA OCTAVIA 3RD GEN": VW.SKODA_OCTAVIA_MK3, + "SKODA SCALA 1ST GEN": VW.SKODA_SCALA_MK1, + "SKODA SUPERB 3RD GEN": VW.SKODA_SUPERB_MK3, } diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index eeafc47ae2..c8b0da3fd3 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -97,12 +97,10 @@ class FordCANFDPlatformConfig(FordPlatformConfig): class CAR(Platforms): BRONCO_SPORT_MK1 = FordPlatformConfig( - "FORD BRONCO SPORT 1ST GEN", [FordCarDocs("Ford Bronco Sport 2021-23")], CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7), ) ESCAPE_MK4 = FordPlatformConfig( - "FORD ESCAPE 4TH GEN", [ FordCarDocs("Ford Escape 2020-22", hybrid=True, plug_in_hybrid=True), FordCarDocs("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering", hybrid=True, plug_in_hybrid=True), @@ -110,7 +108,6 @@ class CAR(Platforms): CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), ) EXPLORER_MK6 = FordPlatformConfig( - "FORD EXPLORER 6TH GEN", [ FordCarDocs("Ford Explorer 2020-23", hybrid=True), # Hybrid: Limited and Platinum only FordCarDocs("Lincoln Aviator 2020-23", "Co-Pilot360 Plus", plug_in_hybrid=True), # Hybrid: Grand Touring only @@ -118,22 +115,18 @@ class CAR(Platforms): CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), ) F_150_MK14 = FordCANFDPlatformConfig( - "FORD F-150 14TH GEN", [FordCarDocs("Ford F-150 2022-23", "Co-Pilot360 Active 2.0", hybrid=True)], CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), ) F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( - "FORD F-150 LIGHTNING 1ST GEN", [FordCarDocs("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0")], CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), ) FOCUS_MK4 = FordPlatformConfig( - "FORD FOCUS 4TH GEN", [FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS], hybrid=True)], # mHEV only CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0), ) MAVERICK_MK1 = FordPlatformConfig( - "FORD MAVERICK 1ST GEN", [ FordCarDocs("Ford Maverick 2022", "LARIAT Luxury", hybrid=True), FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist", hybrid=True), @@ -141,7 +134,6 @@ class CAR(Platforms): CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), ) MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig( - "FORD MUSTANG MACH-E 1ST GEN", [FordCarDocs("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0")], CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio ) diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index ec6453757b..24ec9dfb66 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -91,57 +91,46 @@ class GMPlatformConfig(PlatformConfig): class CAR(Platforms): HOLDEN_ASTRA = GMPlatformConfig( - "HOLDEN ASTRA RS-V BK 2017", [GMCarDocs("Holden Astra 2017")], GMCarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4), ) VOLT = GMPlatformConfig( - "CHEVROLET VOLT PREMIER 2017", [GMCarDocs("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ")], GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469), ) CADILLAC_ATS = GMPlatformConfig( - "CADILLAC ATS Premium Performance 2018", [GMCarDocs("Cadillac ATS Premium Performance 2018")], GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), ) MALIBU = GMPlatformConfig( - "CHEVROLET MALIBU PREMIER 2017", [GMCarDocs("Chevrolet Malibu Premier 2017")], GMCarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4), ) ACADIA = GMPlatformConfig( - "GMC ACADIA DENALI 2018", [GMCarDocs("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo")], GMCarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4), ) BUICK_LACROSSE = GMPlatformConfig( - "BUICK LACROSSE 2017", [GMCarDocs("Buick LaCrosse 2017-19", "Driver Confidence Package 2")], GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), ) BUICK_REGAL = GMPlatformConfig( - "BUICK REGAL ESSENCE 2018", [GMCarDocs("Buick Regal Essence 2018")], GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), ) ESCALADE = GMPlatformConfig( - "CADILLAC ESCALADE 2017", [GMCarDocs("Cadillac Escalade 2017", "Driver Assist Package")], GMCarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3), ) ESCALADE_ESV = GMPlatformConfig( - "CADILLAC ESCALADE ESV 2016", [GMCarDocs("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")], GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0), ) ESCALADE_ESV_2019 = GMPlatformConfig( - "CADILLAC ESCALADE ESV 2019", [GMCarDocs("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")], ESCALADE_ESV.specs, ) BOLT_EUV = GMPlatformConfig( - "CHEVROLET BOLT EUV 2022", [ GMCarDocs("Chevrolet Bolt EUV 2022-23", "Premier or Premier Redline Trim without Super Cruise Package", video_link="https://youtu.be/xvwzGMUA210"), GMCarDocs("Chevrolet Bolt EV 2022-23", "2LT Trim with Adaptive Cruise Control Package"), @@ -149,7 +138,6 @@ class CAR(Platforms): GMCarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), ) SILVERADO = GMPlatformConfig( - "CHEVROLET SILVERADO 1500 2020", [ GMCarDocs("Chevrolet Silverado 1500 2020-21", "Safety Package II"), GMCarDocs("GMC Sierra 1500 2020-21", "Driver Alert Package II", video_link="https://youtu.be/5HbNoBLzRwE"), @@ -157,12 +145,10 @@ class CAR(Platforms): GMCarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3, tireStiffnessFactor=1.0), ) EQUINOX = GMPlatformConfig( - "CHEVROLET EQUINOX 2019", [GMCarDocs("Chevrolet Equinox 2019-22")], GMCarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), ) TRAILBLAZER = GMPlatformConfig( - "CHEVROLET TRAILBLAZER 2021", [GMCarDocs("Chevrolet Trailblazer 2021-22")], GMCarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), ) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 6789667fe6..ef565e89bf 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -116,7 +116,6 @@ class HondaNidecPlatformConfig(PlatformConfig): class CAR(Platforms): # Bosch Cars ACCORD = HondaBoschPlatformConfig( - "HONDA ACCORD 2018", [ HondaCarDocs("Honda Accord 2018-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS), HondaCarDocs("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS), @@ -127,7 +126,6 @@ class CAR(Platforms): dbc_dict('honda_accord_2018_can_generated', None), ) CIVIC_BOSCH = HondaBoschPlatformConfig( - "HONDA CIVIC (BOSCH) 2019", [ HondaCarDocs("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS), @@ -137,13 +135,11 @@ class CAR(Platforms): dbc_dict('honda_civic_hatchback_ex_2017_can_generated', None), ) CIVIC_BOSCH_DIESEL = HondaBoschPlatformConfig( - "HONDA CIVIC SEDAN 1.6 DIESEL 2019", [], # don't show in docs CIVIC_BOSCH.specs, dbc_dict('honda_accord_2018_can_generated', None), ) CIVIC_2022 = HondaBoschPlatformConfig( - "HONDA CIVIC 2022", [ HondaCarDocs("Honda Civic 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), HondaCarDocs("Honda Civic Hatchback 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), @@ -153,7 +149,6 @@ class CAR(Platforms): flags=HondaFlags.BOSCH_RADARLESS, ) CRV_5G = HondaBoschPlatformConfig( - "HONDA CR-V 2017", [HondaCarDocs("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS)], # steerRatio: 12.3 is spec end-to-end CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), @@ -161,34 +156,29 @@ class CAR(Platforms): flags=HondaFlags.BOSCH_ALT_BRAKE, ) CRV_HYBRID = HondaBoschPlatformConfig( - "HONDA CR-V HYBRID 2019", [HondaCarDocs("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS)], # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), dbc_dict('honda_accord_2018_can_generated', None), ) HRV_3G = HondaBoschPlatformConfig( - "HONDA HR-V 2023", [HondaCarDocs("Honda HR-V 2023", "All")], CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41, tireStiffnessFactor=0.5), dbc_dict('honda_civic_ex_2022_can_generated', None), flags=HondaFlags.BOSCH_RADARLESS | HondaFlags.BOSCH_ALT_BRAKE, ) ACURA_RDX_3G = HondaBoschPlatformConfig( - "ACURA RDX 2020", [HondaCarDocs("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), # as spec dbc_dict('acura_rdx_2020_can_generated', None), flags=HondaFlags.BOSCH_ALT_BRAKE, ) INSIGHT = HondaBoschPlatformConfig( - "HONDA INSIGHT 2019", [HondaCarDocs("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39, tireStiffnessFactor=0.82), # as spec dbc_dict('honda_insight_ex_2019_can_generated', None), ) HONDA_E = HondaBoschPlatformConfig( - "HONDA E 2020", [HondaCarDocs("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71, tireStiffnessFactor=0.82), dbc_dict('acura_rdx_2020_can_generated', None), @@ -196,70 +186,60 @@ class CAR(Platforms): # Nidec Cars ACURA_ILX = HondaNidecPlatformConfig( - "ACURA ILX 2016", [HondaCarDocs("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS)], CarSpecs(mass=3095 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=18.61, centerToFrontRatio=0.37, tireStiffnessFactor=0.72), # 15.3 is spec end-to-end dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CRV = HondaNidecPlatformConfig( - "HONDA CR-V 2016", [HondaCarDocs("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41, tireStiffnessFactor=0.444), # as spec dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CRV_EU = HondaNidecPlatformConfig( - "HONDA CR-V EU 2016", [], # Euro version of CRV Touring, don't show in docs CRV.specs, dbc_dict('honda_crv_executive_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) FIT = HondaNidecPlatformConfig( - "HONDA FIT 2018", [HondaCarDocs("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) FREED = HondaNidecPlatformConfig( - "HONDA FREED 2020", [HondaCarDocs("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), # mostly copied from FIT dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) HRV = HondaNidecPlatformConfig( - "HONDA HRV 2019", [HondaCarDocs("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS)], HRV_3G.specs, dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) ODYSSEY = HondaNidecPlatformConfig( - "HONDA ODYSSEY 2018", [HondaCarDocs("Honda Odyssey 2018-20")], CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41, tireStiffnessFactor=0.82), dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_PCM_ACCEL, ) ODYSSEY_CHN = HondaNidecPlatformConfig( - "HONDA ODYSSEY CHN 2019", [], # Chinese version of Odyssey, don't show in docs ODYSSEY.specs, dbc_dict('honda_odyssey_extreme_edition_2018_china_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) ACURA_RDX = HondaNidecPlatformConfig( - "ACURA RDX 2018", [HondaCarDocs("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38, tireStiffnessFactor=0.444), # as spec dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) PILOT = HondaNidecPlatformConfig( - "HONDA PILOT 2017", [ HondaCarDocs("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS), HondaCarDocs("Honda Passport 2019-23", "All", min_steer_speed=12. * CV.MPH_TO_MS), @@ -269,14 +249,12 @@ class CAR(Platforms): flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) RIDGELINE = HondaNidecPlatformConfig( - "HONDA RIDGELINE 2017", [HondaCarDocs("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59, tireStiffnessFactor=0.444), # as spec dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CIVIC = HondaNidecPlatformConfig( - "HONDA CIVIC 2016", [HondaCarDocs("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE")], CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'), diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index d81d9ad510..81587fc68a 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -135,12 +135,10 @@ class HyundaiCanFDPlatformConfig(PlatformConfig): class CAR(Platforms): # Hyundai AZERA_6TH_GEN = HyundaiPlatformConfig( - "HYUNDAI AZERA 6TH GEN", [HyundaiCarDocs("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5), ) AZERA_HEV_6TH_GEN = HyundaiPlatformConfig( - "HYUNDAI AZERA HYBRID 6TH GEN", [ HyundaiCarDocs("Hyundai Azera Hybrid 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), HyundaiCarDocs("Hyundai Azera Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), @@ -149,7 +147,6 @@ class CAR(Platforms): flags=HyundaiFlags.HYBRID, ) ELANTRA = HyundaiPlatformConfig( - "HYUNDAI ELANTRA 2017", [ # TODO: 2017-18 could be Hyundai G HyundaiCarDocs("Hyundai Elantra 2017-18", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b])), @@ -160,7 +157,6 @@ class CAR(Platforms): flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH, ) ELANTRA_GT_I30 = HyundaiPlatformConfig( - "HYUNDAI I30 N LINE 2019 & GT 2018 DCT", [ HyundaiCarDocs("Hyundai Elantra GT 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), HyundaiCarDocs("Hyundai i30 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), @@ -169,20 +165,17 @@ class CAR(Platforms): flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH, ) ELANTRA_2021 = HyundaiPlatformConfig( - "HYUNDAI ELANTRA 2021", [HyundaiCarDocs("Hyundai Elantra 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=2800 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), flags=HyundaiFlags.CHECKSUM_CRC8, ) ELANTRA_HEV_2021 = HyundaiPlatformConfig( - "HYUNDAI ELANTRA HYBRID 2021", [HyundaiCarDocs("Hyundai Elantra Hybrid 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=3017 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) HYUNDAI_GENESIS = HyundaiPlatformConfig( - "HYUNDAI GENESIS 2015-2016", [ # TODO: check 2015 packages HyundaiCarDocs("Hyundai Genesis 2015-16", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])), @@ -192,119 +185,100 @@ class CAR(Platforms): flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.LEGACY, ) IONIQ = HyundaiPlatformConfig( - "HYUNDAI IONIQ HYBRID 2017-2019", [HyundaiCarDocs("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, ) IONIQ_HEV_2022 = HyundaiPlatformConfig( - "HYUNDAI IONIQ HYBRID 2020-2022", [HyundaiCarDocs("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], # TODO: confirm 2020-21 harness, CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, ) IONIQ_EV_LTD = HyundaiPlatformConfig( - "HYUNDAI IONIQ ELECTRIC LIMITED 2019", [HyundaiCarDocs("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY | HyundaiFlags.MIN_STEER_32_MPH, ) IONIQ_EV_2020 = HyundaiPlatformConfig( - "HYUNDAI IONIQ ELECTRIC 2020", [HyundaiCarDocs("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV, ) IONIQ_PHEV_2019 = HyundaiPlatformConfig( - "HYUNDAI IONIQ PLUG-IN HYBRID 2019", [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, ) IONIQ_PHEV = HyundaiPlatformConfig( - "HYUNDAI IONIQ PHEV 2020", [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID, ) KONA = HyundaiPlatformConfig( - "HYUNDAI KONA 2020", [HyundaiCarDocs("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b]))], CarSpecs(mass=1275, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CLUSTER_GEARS, ) KONA_EV = HyundaiPlatformConfig( - "HYUNDAI KONA ELECTRIC 2019", [HyundaiCarDocs("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))], CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV, ) KONA_EV_2022 = HyundaiPlatformConfig( - "HYUNDAI KONA ELECTRIC 2022", [HyundaiCarDocs("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))], CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV, ) KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig( - "HYUNDAI KONA ELECTRIC 2ND GEN", [HyundaiCarDocs("Hyundai Kona Electric (with HDA II, Korea only) 2023", video_link="https://www.youtube.com/watch?v=U2fOCmcQ8hw", car_parts=CarParts.common([CarHarness.hyundai_r]))], CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, ) KONA_HEV = HyundaiPlatformConfig( - "HYUNDAI KONA HYBRID 2020", [HyundaiCarDocs("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages, CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID, ) SANTA_FE = HyundaiPlatformConfig( - "HYUNDAI SANTA FE 2019", [HyundaiCarDocs("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s", car_parts=CarParts.common([CarHarness.hyundai_d]))], CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.766, steerRatio=16.55, tireStiffnessFactor=0.82), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) SANTA_FE_2022 = HyundaiPlatformConfig( - "HYUNDAI SANTA FE 2022", [HyundaiCarDocs("Hyundai Santa Fe 2021-23", "All", video_link="https://youtu.be/VnHzSTygTS4", car_parts=CarParts.common([CarHarness.hyundai_l]))], SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8, ) SANTA_FE_HEV_2022 = HyundaiPlatformConfig( - "HYUNDAI SANTA FE HYBRID 2022", [HyundaiCarDocs("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) SANTA_FE_PHEV_2022 = HyundaiPlatformConfig( - "HYUNDAI SANTA FE PlUG-IN HYBRID 2022", [HyundaiCarDocs("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) SONATA = HyundaiPlatformConfig( - "HYUNDAI SONATA 2020", [HyundaiCarDocs("Hyundai Sonata 2020-23", "All", video_link="https://www.youtube.com/watch?v=ix63r9kE3Fw", car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) SONATA_LF = HyundaiPlatformConfig( - "HYUNDAI SONATA 2019", [HyundaiCarDocs("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, ) STARIA_4TH_GEN = HyundaiCanFDPlatformConfig( - "HYUNDAI STARIA 4TH GEN", [HyundaiCarDocs("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=2205, wheelbase=3.273, steerRatio=11.94), # https://www.hyundai.com/content/dam/hyundai/au/en/models/staria-load/premium-pip-update-2023/spec-sheet/STARIA_Load_Spec-Table_March_2023_v3.1.pdf ) TUCSON = HyundaiPlatformConfig( - "HYUNDAI TUCSON 2019", [ HyundaiCarDocs("Hyundai Tucson 2021", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_l])), HyundaiCarDocs("Hyundai Tucson Diesel 2019", car_parts=CarParts.common([CarHarness.hyundai_l])), @@ -313,7 +287,6 @@ class CAR(Platforms): flags=HyundaiFlags.TCU_GEARS, ) PALISADE = HyundaiPlatformConfig( - "HYUNDAI PALISADE 2020", [ HyundaiCarDocs("Hyundai Palisade 2020-22", "All", video_link="https://youtu.be/TAnDqjF4fDY?t=456", car_parts=CarParts.common([CarHarness.hyundai_h])), HyundaiCarDocs("Kia Telluride 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), @@ -322,19 +295,16 @@ class CAR(Platforms): flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) VELOSTER = HyundaiPlatformConfig( - "HYUNDAI VELOSTER 2019", [HyundaiCarDocs("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS, ) SONATA_HYBRID = HyundaiPlatformConfig( - "HYUNDAI SONATA HYBRID 2021", [HyundaiCarDocs("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], SONATA.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) IONIQ_5 = HyundaiCanFDPlatformConfig( - "HYUNDAI IONIQ 5 2022", [ HyundaiCarDocs("Hyundai Ioniq 5 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), HyundaiCarDocs("Hyundai Ioniq 5 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])), @@ -344,13 +314,11 @@ class CAR(Platforms): flags=HyundaiFlags.EV, ) IONIQ_6 = HyundaiCanFDPlatformConfig( - "HYUNDAI IONIQ 6 2023", [HyundaiCarDocs("Hyundai Ioniq 6 (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))], IONIQ_5.specs, flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, ) TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( - "HYUNDAI TUCSON 4TH GEN", [ HyundaiCarDocs("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Hyundai Tucson 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), @@ -359,13 +327,11 @@ class CAR(Platforms): CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385), ) SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( - "HYUNDAI SANTA CRUZ 1ST GEN", [HyundaiCarDocs("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))], # weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2), ) CUSTIN_1ST_GEN = HyundaiPlatformConfig( - "HYUNDAI CUSTIN 1ST GEN", [HyundaiCarDocs("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner flags=HyundaiFlags.CHECKSUM_CRC8, @@ -373,7 +339,6 @@ class CAR(Platforms): # Kia KIA_FORTE = HyundaiPlatformConfig( - "KIA FORTE E 2018 & GT 2021", [ HyundaiCarDocs("Kia Forte 2019-21", car_parts=CarParts.common([CarHarness.hyundai_g])), HyundaiCarDocs("Kia Forte 2023", car_parts=CarParts.common([CarHarness.hyundai_e])), @@ -381,25 +346,21 @@ class CAR(Platforms): CarSpecs(mass=2878 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5) ) KIA_K5_2021 = HyundaiPlatformConfig( - "KIA K5 2021", [HyundaiCarDocs("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=3381 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), # 2021 Kia K5 Steering Ratio (all trims) flags=HyundaiFlags.CHECKSUM_CRC8, ) KIA_K5_HEV_2020 = HyundaiPlatformConfig( - "KIA K5 HYBRID 2020", [HyundaiCarDocs("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a]))], KIA_K5_2021.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) KIA_K8_HEV_1ST_GEN = HyundaiCanFDPlatformConfig( - "KIA K8 HYBRID 1ST GEN", [HyundaiCarDocs("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q]))], # mass: https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid, steerRatio: guesstimate from K5 platform CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27) ) KIA_NIRO_EV = HyundaiPlatformConfig( - "KIA NIRO EV 2020", [ HyundaiCarDocs("Kia Niro EV 2019", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])), HyundaiCarDocs("Kia Niro EV 2020", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_f])), @@ -410,13 +371,11 @@ class CAR(Platforms): flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV, ) KIA_NIRO_EV_2ND_GEN = HyundaiCanFDPlatformConfig( - "KIA NIRO EV 2ND GEN", [HyundaiCarDocs("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], KIA_NIRO_EV.specs, flags=HyundaiFlags.EV, ) KIA_NIRO_PHEV = HyundaiPlatformConfig( - "KIA NIRO HYBRID 2019", [ HyundaiCarDocs("Kia Niro Hybrid 2018", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), HyundaiCarDocs("Kia Niro Plug-in Hybrid 2018-19", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), @@ -426,7 +385,6 @@ class CAR(Platforms): flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.MIN_STEER_32_MPH, ) KIA_NIRO_PHEV_2022 = HyundaiPlatformConfig( - "KIA NIRO PLUG-IN HYBRID 2022", [ HyundaiCarDocs("Kia Niro Plug-in Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), HyundaiCarDocs("Kia Niro Plug-in Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), @@ -435,7 +393,6 @@ class CAR(Platforms): flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR, ) KIA_NIRO_HEV_2021 = HyundaiPlatformConfig( - "KIA NIRO HYBRID 2021", [ HyundaiCarDocs("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), HyundaiCarDocs("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), @@ -444,44 +401,37 @@ class CAR(Platforms): flags=HyundaiFlags.HYBRID, ) KIA_NIRO_HEV_2ND_GEN = HyundaiCanFDPlatformConfig( - "KIA NIRO HYBRID 2ND GEN", [HyundaiCarDocs("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a]))], KIA_NIRO_EV.specs, ) KIA_OPTIMA_G4 = HyundaiPlatformConfig( - "KIA OPTIMA 4TH GEN", [HyundaiCarDocs("Kia Optima 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_b]))], # TODO: may support 2016, 2018 CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS | HyundaiFlags.MIN_STEER_32_MPH, ) KIA_OPTIMA_G4_FL = HyundaiPlatformConfig( - "KIA OPTIMA 4TH GEN FACELIFT", [HyundaiCarDocs("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g]))], CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, ) # TODO: may support adjacent years. may have a non-zero minimum steering speed KIA_OPTIMA_H = HyundaiPlatformConfig( - "KIA OPTIMA HYBRID 2017 & SPORTS 2019", [HyundaiCarDocs("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, ) KIA_OPTIMA_H_G4_FL = HyundaiPlatformConfig( - "KIA OPTIMA HYBRID 4TH GEN FACELIFT", [HyundaiCarDocs("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, ) KIA_SELTOS = HyundaiPlatformConfig( - "KIA SELTOS 2021", [HyundaiCarDocs("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56), flags=HyundaiFlags.CHECKSUM_CRC8, ) KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig( - "KIA SPORTAGE 5TH GEN", [ HyundaiCarDocs("Kia Sportage 2023-24", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Kia Sportage Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), @@ -490,7 +440,6 @@ class CAR(Platforms): CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6), ) KIA_SORENTO = HyundaiPlatformConfig( - "KIA SORENTO GT LINE 2018", [ HyundaiCarDocs("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", car_parts=CarParts.common([CarHarness.hyundai_e])), @@ -500,13 +449,11 @@ class CAR(Platforms): flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, ) KIA_SORENTO_4TH_GEN = HyundaiCanFDPlatformConfig( - "KIA SORENTO 4TH GEN", [HyundaiCarDocs("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms flags=HyundaiFlags.RADAR_SCC, ) KIA_SORENTO_HEV_4TH_GEN = HyundaiCanFDPlatformConfig( - "KIA SORENTO HYBRID 4TH GEN", [ HyundaiCarDocs("Kia Sorento Hybrid 2021-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), HyundaiCarDocs("Kia Sorento Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), @@ -515,24 +462,20 @@ class CAR(Platforms): flags=HyundaiFlags.RADAR_SCC, ) KIA_STINGER = HyundaiPlatformConfig( - "KIA STINGER GT2 2018", [HyundaiCarDocs("Kia Stinger 2018-20", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1825, wheelbase=2.78, steerRatio=14.4 * 1.15) # 15% higher at the center seems reasonable ) KIA_STINGER_2022 = HyundaiPlatformConfig( - "KIA STINGER 2022", [HyundaiCarDocs("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], KIA_STINGER.specs, ) KIA_CEED = HyundaiPlatformConfig( - "KIA CEED INTRO ED 2019", [HyundaiCarDocs("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY, ) KIA_EV6 = HyundaiCanFDPlatformConfig( - "KIA EV6 2022", [ HyundaiCarDocs("Kia EV6 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_p])), HyundaiCarDocs("Kia EV6 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])), @@ -542,7 +485,6 @@ class CAR(Platforms): flags=HyundaiFlags.EV, ) KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig( - "KIA CARNIVAL 4TH GEN", [ HyundaiCarDocs("Kia Carnival 2022-24", car_parts=CarParts.common([CarHarness.hyundai_a])), HyundaiCarDocs("Kia Carnival (China only) 2023", car_parts=CarParts.common([CarHarness.hyundai_k])) @@ -553,7 +495,6 @@ class CAR(Platforms): # Genesis GENESIS_GV60_EV_1ST_GEN = HyundaiCanFDPlatformConfig( - "GENESIS GV60 ELECTRIC 1ST GEN", [ HyundaiCarDocs("Genesis GV60 (Advanced Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), HyundaiCarDocs("Genesis GV60 (Performance Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), @@ -562,19 +503,16 @@ class CAR(Platforms): flags=HyundaiFlags.EV, ) GENESIS_G70 = HyundaiPlatformConfig( - "GENESIS G70 2018", [HyundaiCarDocs("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56), flags=HyundaiFlags.LEGACY, ) GENESIS_G70_2020 = HyundaiPlatformConfig( - "GENESIS G70 2020", [HyundaiCarDocs("Genesis G70 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9), flags=HyundaiFlags.MANDO_RADAR, ) GENESIS_GV70_1ST_GEN = HyundaiCanFDPlatformConfig( - "GENESIS GV70 1ST GEN", [ HyundaiCarDocs("Genesis GV70 (2.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), HyundaiCarDocs("Genesis GV70 (3.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), @@ -583,18 +521,15 @@ class CAR(Platforms): flags=HyundaiFlags.RADAR_SCC, ) GENESIS_G80 = HyundaiPlatformConfig( - "GENESIS G80 2017", [HyundaiCarDocs("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5), flags=HyundaiFlags.LEGACY, ) GENESIS_G90 = HyundaiPlatformConfig( - "GENESIS G90 2017", [HyundaiCarDocs("Genesis G90 2017-20", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=2200, wheelbase=3.15, steerRatio=12.069), ) GENESIS_GV80 = HyundaiCanFDPlatformConfig( - "GENESIS GV80 2023", [HyundaiCarDocs("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))], CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14), flags=HyundaiFlags.RADAR_SCC, diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index d10b47e2b4..9d8278f951 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -51,32 +51,26 @@ class MazdaPlatformConfig(PlatformConfig): class CAR(Platforms): CX5 = MazdaPlatformConfig( - "MAZDA CX-5", [MazdaCarDocs("Mazda CX-5 2017-21")], MazdaCarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) ) CX9 = MazdaPlatformConfig( - "MAZDA CX-9", [MazdaCarDocs("Mazda CX-9 2016-20")], MazdaCarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) ) MAZDA3 = MazdaPlatformConfig( - "MAZDA 3", [MazdaCarDocs("Mazda 3 2017-18")], MazdaCarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) ) MAZDA6 = MazdaPlatformConfig( - "MAZDA 6", [MazdaCarDocs("Mazda 6 2017-20")], MazdaCarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5) ) CX9_2021 = MazdaPlatformConfig( - "MAZDA CX-9 2021", [MazdaCarDocs("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4")], CX9.specs ) CX5_2022 = MazdaPlatformConfig( - "MAZDA CX-5 2022", [MazdaCarDocs("Mazda CX-5 2022-24")], CX5.specs, ) diff --git a/selfdrive/car/mock/values.py b/selfdrive/car/mock/values.py index 214c6809db..f98aac2ee3 100644 --- a/selfdrive/car/mock/values.py +++ b/selfdrive/car/mock/values.py @@ -3,7 +3,6 @@ from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms class CAR(Platforms): MOCK = PlatformConfig( - 'mock', [], CarSpecs(mass=1700, wheelbase=2.7, steerRatio=13), {} diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index 83e9bf0b46..35503a9306 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -38,26 +38,22 @@ class NissanPlaformConfig(PlatformConfig): class CAR(Platforms): XTRAIL = NissanPlaformConfig( - "NISSAN X-TRAIL 2017", [NissanCarDocs("Nissan X-Trail 2017")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) LEAF = NissanPlaformConfig( - "NISSAN LEAF 2018", [NissanCarDocs("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY")], NissanCarSpecs(mass=1610, wheelbase=2.705), dbc_dict('nissan_leaf_2018_generated', None), ) # Leaf with ADAS ECU found behind instrument cluster instead of glovebox # Currently the only known difference between them is the inverted seatbelt signal. - LEAF_IC = LEAF.override(platform_str="NISSAN LEAF 2018 Instrument Cluster", car_docs=[]) + LEAF_IC = LEAF.override(car_docs=[]) ROGUE = NissanPlaformConfig( - "NISSAN ROGUE 2019", [NissanCarDocs("Nissan Rogue 2018-20")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) ALTIMA = NissanPlaformConfig( - "NISSAN ALTIMA 2020", [NissanCarDocs("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b]))], NissanCarSpecs(mass=1492, wheelbase=2.824) ) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 3a57fde39d..80263c1e94 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -121,22 +121,18 @@ class SubaruGen2PlatformConfig(SubaruPlatformConfig): class CAR(Platforms): # Global platform ASCENT = SubaruPlatformConfig( - "SUBARU ASCENT LIMITED 2019", [SubaruCarDocs("Subaru Ascent 2019-21", "All")], CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5), ) OUTBACK = SubaruGen2PlatformConfig( - "SUBARU OUTBACK 6TH GEN", [SubaruCarDocs("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), ) LEGACY = SubaruGen2PlatformConfig( - "SUBARU LEGACY 7TH GEN", [SubaruCarDocs("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], OUTBACK.specs, ) IMPREZA = SubaruPlatformConfig( - "SUBARU IMPREZA LIMITED 2019", [ SubaruCarDocs("Subaru Impreza 2017-19"), SubaruCarDocs("Subaru Crosstrek 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), @@ -145,7 +141,6 @@ class CAR(Platforms): CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15), ) IMPREZA_2020 = SubaruPlatformConfig( - "SUBARU IMPREZA SPORT 2020", [ SubaruCarDocs("Subaru Impreza 2020-22"), SubaruCarDocs("Subaru Crosstrek 2020-23"), @@ -156,47 +151,40 @@ class CAR(Platforms): ) # TODO: is there an XV and Impreza too? CROSSTREK_HYBRID = SubaruPlatformConfig( - "SUBARU CROSSTREK HYBRID 2020", [SubaruCarDocs("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b]))], CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.HYBRID, ) FORESTER = SubaruPlatformConfig( - "SUBARU FORESTER 2019", [SubaruCarDocs("Subaru Forester 2019-21", "All")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.STEER_RATE_LIMITED, ) FORESTER_HYBRID = SubaruPlatformConfig( - "SUBARU FORESTER HYBRID 2020", [SubaruCarDocs("Subaru Forester Hybrid 2020")], FORESTER.specs, flags=SubaruFlags.HYBRID, ) # Pre-global FORESTER_PREGLOBAL = SubaruPlatformConfig( - "SUBARU FORESTER 2017 - 2018", [SubaruCarDocs("Subaru Forester 2017-18")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), dbc_dict('subaru_forester_2017_generated', None), flags=SubaruFlags.PREGLOBAL, ) LEGACY_PREGLOBAL = SubaruPlatformConfig( - "SUBARU LEGACY 2015 - 2018", [SubaruCarDocs("Subaru Legacy 2015-18")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), dbc_dict('subaru_outback_2015_generated', None), flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL = SubaruPlatformConfig( - "SUBARU OUTBACK 2015 - 2017", [SubaruCarDocs("Subaru Outback 2015-17")], FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2015_generated', None), flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( - "SUBARU OUTBACK 2018 - 2019", [SubaruCarDocs("Subaru Outback 2018-19")], FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2019_generated', None), @@ -204,19 +192,16 @@ class CAR(Platforms): ) # Angle LKAS FORESTER_2022 = SubaruPlatformConfig( - "SUBARU FORESTER 2022", [SubaruCarDocs("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c]))], FORESTER.specs, flags=SubaruFlags.LKAS_ANGLE, ) OUTBACK_2023 = SubaruGen2PlatformConfig( - "SUBARU OUTBACK 7TH GEN", [SubaruCarDocs("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], OUTBACK.specs, flags=SubaruFlags.LKAS_ANGLE, ) ASCENT_2023 = SubaruGen2PlatformConfig( - "SUBARU ASCENT 2023", [SubaruCarDocs("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], ASCENT.specs, flags=SubaruFlags.LKAS_ANGLE, diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index 74f38f2dc0..84dd8c51a3 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -11,19 +11,16 @@ Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values']) class CAR(Platforms): AP1_MODELS = PlatformConfig( - 'TESLA AP1 MODEL S', [CarDocs("Tesla AP1 Model S", "All")], CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0), dbc_dict('tesla_powertrain', 'tesla_radar_bosch_generated', chassis_dbc='tesla_can') ) AP2_MODELS = PlatformConfig( - 'TESLA AP2 MODEL S', [CarDocs("Tesla AP2 Model S", "All")], AP1_MODELS.specs, AP1_MODELS.dbc_dict ) MODELS_RAVEN = PlatformConfig( - 'TESLA MODEL S RAVEN', [CarDocs("Tesla Model S Raven", "All")], AP1_MODELS.specs, dbc_dict('tesla_powertrain', 'tesla_radar_continental_generated', chassis_dbc='tesla_can') diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 48ae36ffcc..9b2cbeeb52 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -44,8 +44,8 @@ routes = [ CarTestRoute("378472f830ee7395|2021-05-28--07-38-43", CHRYSLER.PACIFICA_2018_HYBRID), CarTestRoute("8190c7275a24557b|2020-01-29--08-33-58", CHRYSLER.PACIFICA_2019_HYBRID), CarTestRoute("3d84727705fecd04|2021-05-25--08-38-56", CHRYSLER.PACIFICA_2020), - CarTestRoute("221c253375af4ee9|2022-06-15--18-38-24", CHRYSLER.RAM_1500), - CarTestRoute("8fb5eabf914632ae|2022-08-04--17-28-53", CHRYSLER.RAM_HD, segment=6), + CarTestRoute("221c253375af4ee9|2022-06-15--18-38-24", CHRYSLER.RAM_1500_5TH_GEN), + CarTestRoute("8fb5eabf914632ae|2022-08-04--17-28-53", CHRYSLER.RAM_HD_5TH_GEN, segment=6), CarTestRoute("3379c85aeedc8285|2023-12-07--17-49-39", CHRYSLER.DODGE_DURANGO), CarTestRoute("54827bf84c38b14f|2023-01-25--14-14-11", FORD.BRONCO_SPORT_MK1), diff --git a/selfdrive/car/tests/test_can_fingerprint.py b/selfdrive/car/tests/test_can_fingerprint.py index 63621b459d..e768abd20f 100755 --- a/selfdrive/car/tests/test_can_fingerprint.py +++ b/selfdrive/car/tests/test_can_fingerprint.py @@ -28,7 +28,7 @@ class TestCanFingerprint(unittest.TestCase): def test_timing(self): # just pick any CAN fingerprinting car - car_model = 'CHEVROLET BOLT EUV 2022' + car_model = "BOLT_EUV" fingerprint = FINGERPRINTS[car_model][0] cases = [] diff --git a/selfdrive/car/tests/test_platform_configs.py b/selfdrive/car/tests/test_platform_configs.py index 0b42a2b289..523c331b9e 100755 --- a/selfdrive/car/tests/test_platform_configs.py +++ b/selfdrive/car/tests/test_platform_configs.py @@ -8,14 +8,16 @@ from openpilot.selfdrive.car.values import PLATFORMS class TestPlatformConfigs(unittest.TestCase): def test_configs(self): - for platform in PLATFORMS.values(): + for name, platform in PLATFORMS.items(): with self.subTest(platform=str(platform)): self.assertTrue(platform.config._frozen) - if platform != "mock": + if platform != "MOCK": self.assertIn("pt", platform.config.dbc_dict) self.assertTrue(len(platform.config.platform_str) > 0) + self.assertEqual(name, platform.config.platform_str) + self.assertIsNotNone(platform.config.specs) diff --git a/selfdrive/car/torque_data/neural_ff_weights.json b/selfdrive/car/torque_data/neural_ff_weights.json index c526f07fa2..47d7ced4f9 100644 --- a/selfdrive/car/torque_data/neural_ff_weights.json +++ b/selfdrive/car/torque_data/neural_ff_weights.json @@ -1 +1 @@ -{"CHEVROLET BOLT EUV 2022": {"w_1": [[0.3452189564704895, -0.15614677965641022, -0.04062516987323761, -0.5960758328437805, 0.3211185932159424, 0.31732726097106934, -0.04430829733610153, -0.37327295541763306, -0.14118380844593048, 0.12712529301643372, 0.2641555070877075, -0.3451094627380371, -0.005127656273543835, 0.6185108423233032, 0.03725295141339302, 0.3763789236545563], [-0.0708412230014801, 0.3667356073856354, 0.031383827328681946, 0.1740853488445282, -0.04695861041545868, 0.018055908381938934, 0.009072160348296165, -0.23640218377113342, -0.10362917929887772, 0.022628149017691612, -0.224413201212883, 0.20718418061733246, -0.016947750002145767, -0.3872031271457672, -0.15500062704086304, -0.06375953555107117], [-0.0838046595454216, -0.0242826659232378, -0.07765661180019379, 0.028858814388513565, -0.09516210108995438, 0.008368706330657005, 0.1689300835132599, 0.015036891214549541, -0.15121428668498993, 0.1388195902109146, 0.11486363410949707, 0.0651545450091362, 0.13559958338737488, 0.04300367832183838, -0.13856294751167297, -0.058136988431215286], [-0.006249868310987949, 0.08809533715248108, -0.040690965950489044, 0.02359287068247795, -0.00766348373144865, 0.24816390872001648, -0.17360293865203857, -0.03676899895071983, -0.17564819753170013, 0.18998438119888306, -0.050583917647600174, -0.006488069426268339, 0.10649101436138153, -0.024557121098041534, -0.103276826441288, 0.18448011577129364]], "b_1": [0.2935388386249542, 0.10967712104320526, -0.014007942751049995, 0.211833655834198, 0.33605605363845825, 0.37722209095954895, -0.16615016758441925, 0.3134673535823822, 0.06695777177810669, 0.3425212800502777, 0.3769673705101013, 0.23186539113521576, 0.5770409107208252, -0.05929069593548775, 0.01839117519557476, 0.03828774020075798], "w_2": [[-0.06261160969734192, 0.010185074992477894, -0.06083013117313385, -0.04531499370932579, -0.08979734033346176, 0.3432150185108185, -0.019801849499344826, 0.3010321259498596], [0.19698476791381836, -0.009238275699317455, 0.08842222392559052, -0.09516377002000809, -0.05022778362035751, 0.13626104593276978, -0.052890390157699585, 0.15569131076335907], [0.0724768117070198, -0.09018408507108688, 0.06850195676088333, -0.025572121143341064, 0.0680626779794693, -0.07648195326328278, 0.07993496209383011, -0.059752143919467926], [1.267876386642456, -0.05755887180566788, -0.08429178595542908, 0.021366603672504425, -0.0006479775765910745, -1.4292563199996948, -0.08077696710824966, -1.414825439453125], [0.04535430669784546, 0.06555880606174469, -0.027145234867930412, -0.07661093026399612, -0.05702832341194153, 0.23650476336479187, 0.0024587824009358883, 0.20126521587371826], [0.006042032968252897, 0.042880818247795105, 0.002187949838116765, -0.017126334831118584, -0.08352015167474747, 0.19801731407642365, -0.029196614399552345, 0.23713473975658417], [-0.01644900068640709, -0.04358499124646187, 0.014584392309188843, 0.07155826687812805, -0.09354910999536514, -0.033351872116327286, 0.07138452678918839, -0.04755295440554619], [-1.1012420654296875, -0.03534531593322754, 0.02167935110628605, -0.01116552110761404, -0.08436500281095505, 1.1038788557052612, 0.027903547510504723, 1.0676132440567017], [0.03843916580080986, -0.0952216386795044, 0.039226632565259933, 0.002778085647150874, -0.020275786519050598, -0.07848760485649109, 0.04803166165947914, 0.015538203530013561], [0.018385495990514755, -0.025189843028783798, 0.0036680365446954966, -0.02105865254998207, 0.04808586835861206, 0.1575016975402832, 0.02703506126999855, 0.23039312660694122], [-0.0033881019335240126, -0.10210853815078735, -0.04877309128642082, 0.006989633198827505, 0.046798162162303925, 0.38676899671554565, -0.032304272055625916, 0.2345031052827835], [0.22092825174331665, -0.09642873704433441, 0.04499409720301628, 0.05108088254928589, -0.10191166400909424, 0.12818090617656708, -0.021021494641900063, 0.09440375864505768], [0.1212429478764534, -0.028194155544042587, -0.0981956496834755, 0.08226924389600754, 0.055346839129924774, 0.27067816257476807, -0.09064067900180817, 0.12580905854701996], [-1.6740131378173828, -0.02066155895590782, -0.05924689769744873, 0.06347910314798355, -0.07821853458881378, 1.2807466983795166, 0.04589352011680603, 1.310766577720642], [-0.09893272817134857, -0.04093599319458008, -0.02502273954451084, 0.09490344673395157, -0.0211324505507946, -0.09021010994911194, 0.07936318963766098, -0.03593116253614426], [-0.08490308374166489, -0.015558987855911255, -0.048692114651203156, -0.007421435788273811, -0.040531404316425323, 0.25889304280281067, 0.06012800335884094, 0.27946868538856506]], "b_2": [0.07973937690258026, -0.010446485131978989, -0.003066520905122161, -0.031895797699689865, 0.006032303906977177, 0.24106740951538086, -0.008969511836767197, 0.2872662842273712], "w_3": [[-1.364486813545227, -0.11682678014039993, 0.01764785870909691, 0.03926877677440643], [-0.05695437639951706, 0.05472218990325928, 0.1266128271818161, 0.09950875490903854], [0.11415273696184158, -0.10069356113672256, 0.0864749327301979, -0.043946366757154465], [-0.10138195008039474, -0.040128443390131, -0.08937158435583115, -0.0048376512713730335], [-0.0028251828625798225, -0.04743027314543724, 0.06340016424655914, 0.07277824729681015], [0.49482327699661255, -0.06410001963376999, -0.0999293103814125, -0.14250673353672028], [0.042802367359399796, 0.0015462725423276424, -0.05991362780332565, 0.1022040992975235], [0.3523194193840027, 0.07343732565641403, 0.04157765582203865, -0.12358107417821884]], "b_3": [0.2653026282787323, -0.058485131710767746, -0.0744510293006897, 0.012550175189971924], "w_4": [[0.5988775491714478, 0.09668736904859543], [-0.04360569268465042, 0.06491032242774963], [-0.11868984252214432, -0.09601487964391708], [-0.06554870307445526, -0.14189276099205017]], "b_4": [-0.08148707449436188, -2.8251802921295166], "input_norm_mat": [[-3.0, 3.0], [-3.0, 3.0], [0.0, 40.0], [-3.0, 3.0]], "output_norm_mat": [-1.0, 1.0], "temperature": 100.0}} \ No newline at end of file +{"BOLT_EUV": {"w_1": [[0.3452189564704895, -0.15614677965641022, -0.04062516987323761, -0.5960758328437805, 0.3211185932159424, 0.31732726097106934, -0.04430829733610153, -0.37327295541763306, -0.14118380844593048, 0.12712529301643372, 0.2641555070877075, -0.3451094627380371, -0.005127656273543835, 0.6185108423233032, 0.03725295141339302, 0.3763789236545563], [-0.0708412230014801, 0.3667356073856354, 0.031383827328681946, 0.1740853488445282, -0.04695861041545868, 0.018055908381938934, 0.009072160348296165, -0.23640218377113342, -0.10362917929887772, 0.022628149017691612, -0.224413201212883, 0.20718418061733246, -0.016947750002145767, -0.3872031271457672, -0.15500062704086304, -0.06375953555107117], [-0.0838046595454216, -0.0242826659232378, -0.07765661180019379, 0.028858814388513565, -0.09516210108995438, 0.008368706330657005, 0.1689300835132599, 0.015036891214549541, -0.15121428668498993, 0.1388195902109146, 0.11486363410949707, 0.0651545450091362, 0.13559958338737488, 0.04300367832183838, -0.13856294751167297, -0.058136988431215286], [-0.006249868310987949, 0.08809533715248108, -0.040690965950489044, 0.02359287068247795, -0.00766348373144865, 0.24816390872001648, -0.17360293865203857, -0.03676899895071983, -0.17564819753170013, 0.18998438119888306, -0.050583917647600174, -0.006488069426268339, 0.10649101436138153, -0.024557121098041534, -0.103276826441288, 0.18448011577129364]], "b_1": [0.2935388386249542, 0.10967712104320526, -0.014007942751049995, 0.211833655834198, 0.33605605363845825, 0.37722209095954895, -0.16615016758441925, 0.3134673535823822, 0.06695777177810669, 0.3425212800502777, 0.3769673705101013, 0.23186539113521576, 0.5770409107208252, -0.05929069593548775, 0.01839117519557476, 0.03828774020075798], "w_2": [[-0.06261160969734192, 0.010185074992477894, -0.06083013117313385, -0.04531499370932579, -0.08979734033346176, 0.3432150185108185, -0.019801849499344826, 0.3010321259498596], [0.19698476791381836, -0.009238275699317455, 0.08842222392559052, -0.09516377002000809, -0.05022778362035751, 0.13626104593276978, -0.052890390157699585, 0.15569131076335907], [0.0724768117070198, -0.09018408507108688, 0.06850195676088333, -0.025572121143341064, 0.0680626779794693, -0.07648195326328278, 0.07993496209383011, -0.059752143919467926], [1.267876386642456, -0.05755887180566788, -0.08429178595542908, 0.021366603672504425, -0.0006479775765910745, -1.4292563199996948, -0.08077696710824966, -1.414825439453125], [0.04535430669784546, 0.06555880606174469, -0.027145234867930412, -0.07661093026399612, -0.05702832341194153, 0.23650476336479187, 0.0024587824009358883, 0.20126521587371826], [0.006042032968252897, 0.042880818247795105, 0.002187949838116765, -0.017126334831118584, -0.08352015167474747, 0.19801731407642365, -0.029196614399552345, 0.23713473975658417], [-0.01644900068640709, -0.04358499124646187, 0.014584392309188843, 0.07155826687812805, -0.09354910999536514, -0.033351872116327286, 0.07138452678918839, -0.04755295440554619], [-1.1012420654296875, -0.03534531593322754, 0.02167935110628605, -0.01116552110761404, -0.08436500281095505, 1.1038788557052612, 0.027903547510504723, 1.0676132440567017], [0.03843916580080986, -0.0952216386795044, 0.039226632565259933, 0.002778085647150874, -0.020275786519050598, -0.07848760485649109, 0.04803166165947914, 0.015538203530013561], [0.018385495990514755, -0.025189843028783798, 0.0036680365446954966, -0.02105865254998207, 0.04808586835861206, 0.1575016975402832, 0.02703506126999855, 0.23039312660694122], [-0.0033881019335240126, -0.10210853815078735, -0.04877309128642082, 0.006989633198827505, 0.046798162162303925, 0.38676899671554565, -0.032304272055625916, 0.2345031052827835], [0.22092825174331665, -0.09642873704433441, 0.04499409720301628, 0.05108088254928589, -0.10191166400909424, 0.12818090617656708, -0.021021494641900063, 0.09440375864505768], [0.1212429478764534, -0.028194155544042587, -0.0981956496834755, 0.08226924389600754, 0.055346839129924774, 0.27067816257476807, -0.09064067900180817, 0.12580905854701996], [-1.6740131378173828, -0.02066155895590782, -0.05924689769744873, 0.06347910314798355, -0.07821853458881378, 1.2807466983795166, 0.04589352011680603, 1.310766577720642], [-0.09893272817134857, -0.04093599319458008, -0.02502273954451084, 0.09490344673395157, -0.0211324505507946, -0.09021010994911194, 0.07936318963766098, -0.03593116253614426], [-0.08490308374166489, -0.015558987855911255, -0.048692114651203156, -0.007421435788273811, -0.040531404316425323, 0.25889304280281067, 0.06012800335884094, 0.27946868538856506]], "b_2": [0.07973937690258026, -0.010446485131978989, -0.003066520905122161, -0.031895797699689865, 0.006032303906977177, 0.24106740951538086, -0.008969511836767197, 0.2872662842273712], "w_3": [[-1.364486813545227, -0.11682678014039993, 0.01764785870909691, 0.03926877677440643], [-0.05695437639951706, 0.05472218990325928, 0.1266128271818161, 0.09950875490903854], [0.11415273696184158, -0.10069356113672256, 0.0864749327301979, -0.043946366757154465], [-0.10138195008039474, -0.040128443390131, -0.08937158435583115, -0.0048376512713730335], [-0.0028251828625798225, -0.04743027314543724, 0.06340016424655914, 0.07277824729681015], [0.49482327699661255, -0.06410001963376999, -0.0999293103814125, -0.14250673353672028], [0.042802367359399796, 0.0015462725423276424, -0.05991362780332565, 0.1022040992975235], [0.3523194193840027, 0.07343732565641403, 0.04157765582203865, -0.12358107417821884]], "b_3": [0.2653026282787323, -0.058485131710767746, -0.0744510293006897, 0.012550175189971924], "w_4": [[0.5988775491714478, 0.09668736904859543], [-0.04360569268465042, 0.06491032242774963], [-0.11868984252214432, -0.09601487964391708], [-0.06554870307445526, -0.14189276099205017]], "b_4": [-0.08148707449436188, -2.8251802921295166], "input_norm_mat": [[-3.0, 3.0], [-3.0, 3.0], [0.0, 40.0], [-3.0, 3.0]], "output_norm_mat": [-1.0, 1.0], "temperature": 100.0}} \ No newline at end of file diff --git a/selfdrive/car/torque_data/override.toml b/selfdrive/car/torque_data/override.toml index 3de33b88db..11308fad79 100644 --- a/selfdrive/car/torque_data/override.toml +++ b/selfdrive/car/torque_data/override.toml @@ -1,76 +1,76 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] ### angle control # Nissan appears to have torque -"NISSAN X-TRAIL 2017" = [nan, 1.5, nan] -"NISSAN ALTIMA 2020" = [nan, 1.5, nan] -"NISSAN LEAF 2018 Instrument Cluster" = [nan, 1.5, nan] -"NISSAN LEAF 2018" = [nan, 1.5, nan] -"NISSAN ROGUE 2019" = [nan, 1.5, nan] +"XTRAIL" = [nan, 1.5, nan] +"ALTIMA" = [nan, 1.5, nan] +"LEAF_IC" = [nan, 1.5, nan] +"LEAF" = [nan, 1.5, nan] +"ROGUE" = [nan, 1.5, nan] # New subarus angle based controllers -"SUBARU FORESTER 2022" = [nan, 3.0, nan] -"SUBARU OUTBACK 7TH GEN" = [nan, 3.0, nan] -"SUBARU ASCENT 2023" = [nan, 3.0, nan] +"FORESTER_2022" = [nan, 3.0, nan] +"OUTBACK_2023" = [nan, 3.0, nan] +"ASCENT_2023" = [nan, 3.0, nan] # Toyota LTA also has torque -"TOYOTA RAV4 2023" = [nan, 3.0, nan] +"RAV4_TSS2_2023" = [nan, 3.0, nan] # Tesla has high torque -"TESLA AP1 MODEL S" = [nan, 2.5, nan] -"TESLA AP2 MODEL S" = [nan, 2.5, nan] -"TESLA MODEL S RAVEN" = [nan, 2.5, nan] +"AP1_MODELS" = [nan, 2.5, nan] +"AP2_MODELS" = [nan, 2.5, nan] +"MODELS_RAVEN" = [nan, 2.5, nan] # Guess -"FORD BRONCO SPORT 1ST GEN" = [nan, 1.5, nan] -"FORD ESCAPE 4TH GEN" = [nan, 1.5, nan] -"FORD EXPLORER 6TH GEN" = [nan, 1.5, nan] -"FORD F-150 14TH GEN" = [nan, 1.5, nan] -"FORD FOCUS 4TH GEN" = [nan, 1.5, nan] -"FORD MAVERICK 1ST GEN" = [nan, 1.5, nan] -"FORD F-150 LIGHTNING 1ST GEN" = [nan, 1.5, nan] -"FORD MUSTANG MACH-E 1ST GEN" = [nan, 1.5, nan] +"BRONCO_SPORT_MK1" = [nan, 1.5, nan] +"ESCAPE_MK4" = [nan, 1.5, nan] +"EXPLORER_MK6" = [nan, 1.5, nan] +"F_150_MK14" = [nan, 1.5, nan] +"FOCUS_MK4" = [nan, 1.5, nan] +"MAVERICK_MK1" = [nan, 1.5, nan] +"F_150_LIGHTNING_MK1" = [nan, 1.5, nan] +"MUSTANG_MACH_E_MK1" = [nan, 1.5, nan] ### # No steering wheel -"COMMA BODY" = [nan, 1000, nan] +"BODY" = [nan, 1000, nan] # Totally new cars -"RAM 1500 5TH GEN" = [2.0, 2.0, 0.05] -"RAM HD 5TH GEN" = [1.4, 1.4, 0.05] -"SUBARU OUTBACK 6TH GEN" = [2.0, 2.0, 0.2] -"CADILLAC ESCALADE 2017" = [1.899999976158142, 1.842270016670227, 0.1120000034570694] -"CADILLAC ESCALADE ESV 2019" = [1.15, 1.3, 0.2] -"CHEVROLET BOLT EUV 2022" = [2.0, 2.0, 0.05] -"CHEVROLET SILVERADO 1500 2020" = [1.9, 1.9, 0.112] -"CHEVROLET TRAILBLAZER 2021" = [1.33, 1.9, 0.16] -"CHEVROLET EQUINOX 2019" = [2.5, 2.5, 0.05] -"VOLKSWAGEN CADDY 3RD GEN" = [1.2, 1.2, 0.1] -"VOLKSWAGEN PASSAT NMS" = [2.5, 2.5, 0.1] -"VOLKSWAGEN SHARAN 2ND GEN" = [2.5, 2.5, 0.1] -"HYUNDAI SANTA CRUZ 1ST GEN" = [2.7, 2.7, 0.1] -"KIA SPORTAGE 5TH GEN" = [2.6, 2.6, 0.1] -"GENESIS GV70 1ST GEN" = [2.42, 2.42, 0.1] -"GENESIS GV60 ELECTRIC 1ST GEN" = [2.5, 2.5, 0.1] -"KIA SORENTO 4TH GEN" = [2.5, 2.5, 0.1] -"KIA SORENTO HYBRID 4TH GEN" = [2.5, 2.5, 0.1] -"KIA NIRO HYBRID 2ND GEN" = [2.42, 2.5, 0.12] -"KIA NIRO EV 2ND GEN" = [2.05, 2.5, 0.14] -"GENESIS GV80 2023" = [2.5, 2.5, 0.1] -"KIA CARNIVAL 4TH GEN" = [1.75, 1.75, 0.15] -"GMC ACADIA DENALI 2018" = [1.6, 1.6, 0.2] -"LEXUS IS 2023" = [2.0, 2.0, 0.1] -"HYUNDAI KONA ELECTRIC 2ND GEN" = [2.5, 2.5, 0.1] -"HYUNDAI IONIQ 6 2023" = [2.5, 2.5, 0.1] -"HYUNDAI AZERA 6TH GEN" = [1.8, 1.8, 0.1] -"HYUNDAI AZERA HYBRID 6TH GEN" = [1.8, 1.8, 0.1] -"KIA K8 HYBRID 1ST GEN" = [2.5, 2.5, 0.1] -"HYUNDAI CUSTIN 1ST GEN" = [2.5, 2.5, 0.1] -"LEXUS GS F 2016" = [2.5, 2.5, 0.08] -"HYUNDAI STARIA 4TH GEN" = [1.8, 2.0, 0.15] +"RAM_1500_5TH_GEN" = [2.0, 2.0, 0.05] +"RAM_HD_5TH_GEN" = [1.4, 1.4, 0.05] +"OUTBACK" = [2.0, 2.0, 0.2] +"ESCALADE" = [1.899999976158142, 1.842270016670227, 0.1120000034570694] +"ESCALADE_ESV_2019" = [1.15, 1.3, 0.2] +"BOLT_EUV" = [2.0, 2.0, 0.05] +"SILVERADO" = [1.9, 1.9, 0.112] +"TRAILBLAZER" = [1.33, 1.9, 0.16] +"EQUINOX" = [2.5, 2.5, 0.05] +"CADDY_MK3" = [1.2, 1.2, 0.1] +"PASSAT_NMS" = [2.5, 2.5, 0.1] +"SHARAN_MK2" = [2.5, 2.5, 0.1] +"SANTA_CRUZ_1ST_GEN" = [2.7, 2.7, 0.1] +"KIA_SPORTAGE_5TH_GEN" = [2.6, 2.6, 0.1] +"GENESIS_GV70_1ST_GEN" = [2.42, 2.42, 0.1] +"GENESIS_GV60_EV_1ST_GEN" = [2.5, 2.5, 0.1] +"KIA_SORENTO_4TH_GEN" = [2.5, 2.5, 0.1] +"KIA_SORENTO_HEV_4TH_GEN" = [2.5, 2.5, 0.1] +"KIA_NIRO_HEV_2ND_GEN" = [2.42, 2.5, 0.12] +"KIA_NIRO_EV_2ND_GEN" = [2.05, 2.5, 0.14] +"GENESIS_GV80" = [2.5, 2.5, 0.1] +"KIA_CARNIVAL_4TH_GEN" = [1.75, 1.75, 0.15] +"ACADIA" = [1.6, 1.6, 0.2] +"LEXUS_IS_TSS2" = [2.0, 2.0, 0.1] +"KONA_EV_2ND_GEN" = [2.5, 2.5, 0.1] +"IONIQ_6" = [2.5, 2.5, 0.1] +"AZERA_6TH_GEN" = [1.8, 1.8, 0.1] +"AZERA_HEV_6TH_GEN" = [1.8, 1.8, 0.1] +"KIA_K8_HEV_1ST_GEN" = [2.5, 2.5, 0.1] +"CUSTIN_1ST_GEN" = [2.5, 2.5, 0.1] +"LEXUS_GS_F" = [2.5, 2.5, 0.08] +"STARIA_4TH_GEN" = [1.8, 2.0, 0.15] # Dashcam or fallback configured as ideal car -"mock" = [10.0, 10, 0.0] +"MOCK" = [10.0, 10, 0.0] # Manually checked -"HONDA CIVIC 2022" = [2.5, 1.2, 0.15] -"HONDA HR-V 2023" = [2.5, 1.2, 0.2] +"CIVIC_2022" = [2.5, 1.2, 0.15] +"HRV_3G" = [2.5, 1.2, 0.2] diff --git a/selfdrive/car/torque_data/params.toml b/selfdrive/car/torque_data/params.toml index 142332b220..048c5a1812 100644 --- a/selfdrive/car/torque_data/params.toml +++ b/selfdrive/car/torque_data/params.toml @@ -1,85 +1,85 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] -"ACURA ILX 2016" = [1.524988973896102, 0.519011053086259, 0.34236219253028] -"ACURA RDX 2018" = [0.9987728568686902, 0.5323765166196301, 0.303218805715844] -"ACURA RDX 2020" = [1.4314459806646749, 0.33874701282109954, 0.18048847083897598] -"AUDI A3 3RD GEN" = [1.5122414863077502, 1.7443517531719404, 0.15194151892450905] -"AUDI Q3 2ND GEN" = [1.4439223359448605, 1.2254955789112076, 0.1413798895978097] -"CHEVROLET VOLT PREMIER 2017" = [1.5961527626411784, 1.8422651988094612, 0.1572393918005158] -"CHRYSLER PACIFICA 2018" = [2.07140, 1.3366521181047952, 0.13776367250652022] -"CHRYSLER PACIFICA 2020" = [1.86206, 1.509076559398423, 0.14328246159386085] -"CHRYSLER PACIFICA HYBRID 2017" = [1.79422, 1.06831764583744, 0.116237] -"CHRYSLER PACIFICA HYBRID 2018" = [2.08887, 1.2943025830995154, 0.114818] -"CHRYSLER PACIFICA HYBRID 2019" = [1.90120, 1.1958788168371808, 0.131520] -"GENESIS G70 2018" = [3.8520195946707947, 2.354697063349854, 0.06830285485626221] -"HONDA ACCORD 2018" = [1.6893333799149202, 0.3246749081720698, 0.2120497022936265] -"HONDA CIVIC (BOSCH) 2019" = [1.691708637466905, 0.40132900729454185, 0.25460295304024094] -"HONDA CIVIC 2016" = [1.6528895627785531, 0.4018518740819229, 0.25458812851328544] -"HONDA CR-V 2016" = [0.7667141440182675, 0.5927571534745969, 0.40909087636157127] -"HONDA CR-V 2017" = [2.01323205142022, 0.2700612209345081, 0.2238412881331528] -"HONDA CR-V HYBRID 2019" = [2.072034634644233, 0.7152085160516978, 0.20237105008376083] -"HONDA FIT 2018" = [1.5719981427109775, 0.5712761407108976, 0.110773383324281] -"HONDA HRV 2019" = [2.0661212805710205, 0.7521343418694775, 0.17760375789242094] -"HONDA INSIGHT 2019" = [1.5201671214069354, 0.5660229120683284, 0.25808042580281876] -"HONDA ODYSSEY 2018" = [1.8774809275211801, 0.8394431662987996, 0.2096978613792822] -"HONDA PILOT 2017" = [1.7262026201812795, 0.9470005614967523, 0.21351430733218763] -"HONDA RIDGELINE 2017" = [1.4146525028237624, 0.7356572861629564, 0.23307177552211328] -"HYUNDAI ELANTRA 2021" = [3.169, 2.1259108157250735, 0.0819] -"HYUNDAI GENESIS 2015-2016" = [2.7807965280270794, 2.325, 0.0984484465421171] -"HYUNDAI IONIQ 5 2022" = [3.172929, 2.713050, 0.096019] -"HYUNDAI IONIQ ELECTRIC LIMITED 2019" = [1.7662975472852054, 1.613755614526594, 0.17087579756306276] -"HYUNDAI IONIQ PHEV 2020" = [3.2928700076638537, 2.1193482926455656, 0.12463700961468778] -"HYUNDAI IONIQ PLUG-IN HYBRID 2019" = [2.970807902012267, 1.6312321830002083, 0.1088964990357482] -"HYUNDAI KONA ELECTRIC 2019" = [3.078814714619148, 2.307336938253934, 0.12359762054065548] -"HYUNDAI PALISADE 2020" = [2.544642494803999, 1.8721703683337008, 0.1301424599248651] -"HYUNDAI SANTA FE 2019" = [3.0787027729757632, 2.6173437483495565, 0.1207019341823945] -"HYUNDAI SANTA FE HYBRID 2022" = [3.501877602644835, 2.729064118456137, 0.10384068104538963] -"HYUNDAI SANTA FE PlUG-IN HYBRID 2022" = [1.6953050513611045, 1.5837614296206861, 0.12672855941458458] -"HYUNDAI SONATA 2019" = [2.2200457811703953, 1.2967330275895228, 0.14039920986586393] -"HYUNDAI SONATA 2020" = [2.9638737459977467, 2.1259108157250735, 0.07813665616927593] -"HYUNDAI SONATA HYBRID 2021" = [2.8990264092395734, 2.061410192222139, 0.0899805488717382] -"HYUNDAI TUCSON 4TH GEN" = [2.960174, 2.860284, 0.108745] -"JEEP GRAND CHEROKEE 2019" = [2.30972, 1.289689569171081, 0.117048] -"JEEP GRAND CHEROKEE V6 2018" = [2.27116, 1.4057367824262523, 0.11725947414922003] -"KIA EV6 2022" = [3.2, 2.093457, 0.05] -"KIA K5 2021" = [2.405339728085138, 1.460032270828705, 0.11650989850813716] -"KIA NIRO EV 2020" = [2.9215954981365337, 2.1500583840260044, 0.09236802474810267] -"KIA SORENTO GT LINE 2018" = [2.464854685101844, 1.5335274218367956, 0.12056170567599558] -"KIA STINGER GT2 2018" = [2.7499043387418967, 1.849652021986449, 0.12048334239559202] -"LEXUS ES 2019" = [2.0357564999999997, 1.999082295195227, 0.101533] -"LEXUS NX 2018" = [2.3525924753753613, 1.9731412277641067, 0.15168101064205927] -"LEXUS NX 2020" = [2.4331999786982936, 2.1045680431705414, 0.14099899317761067] -"LEXUS RX 2016" = [1.6430539050086406, 1.181960058934143, 0.19768806040843034] -"LEXUS RX 2020" = [1.5375561442049257, 1.343166476215164, 0.1931062001527557] -"MAZDA CX-9 2021" = [1.7601682915983443, 1.0889677335154337, 0.17713792194297195] -"SKODA SUPERB 3RD GEN" = [1.166437404652981, 1.1686163012668165, 0.12194533036948708] -"SUBARU FORESTER 2019" = [3.6617001649776793, 2.342197172531713, 0.11075960785398745] -"SUBARU IMPREZA LIMITED 2019" = [1.0670704910352047, 0.8234374840709592, 0.20986563268614938] -"SUBARU IMPREZA SPORT 2020" = [2.6068223389108303, 2.134872342760203, 0.15261513193561627] -"TOYOTA AVALON 2016" = [2.5185770183845646, 1.7153346784214922, 0.10603968787111022] -"TOYOTA AVALON 2019" = [1.7036141952825095, 1.239619084240008, 0.08459830394899492] -"TOYOTA AVALON 2022" = [2.3154403649717357, 2.7777922854327124, 0.11453999639164605] -"TOYOTA C-HR 2018" = [1.5591084333664578, 1.271271459066948, 0.20259087058453193] -"TOYOTA C-HR 2021" = [1.7678810166088303, 1.3742176337919942, 0.2319674583741509] -"TOYOTA CAMRY 2018" = [2.0568162685952505, 1.7576185169559122, 0.108878753] -"TOYOTA CAMRY 2021" = [2.3548324999999997, 2.368900128946771, 0.118436] -"TOYOTA COROLLA 2017" = [3.117154369115421, 1.8438132575043773, 0.12289685869250652] -"TOYOTA COROLLA TSS2 2019" = [1.991132339206426, 1.868866242720403, 0.19570063298031432] -"TOYOTA HIGHLANDER 2017" = [1.8108348718624456, 1.6348421600679828, 0.15972686105120398] -"TOYOTA HIGHLANDER 2020" = [1.9617570834136164, 1.8611643317268927, 0.14519673256119725] -"TOYOTA MIRAI 2021" = [2.506899832157829, 1.7417213930750164, 0.20182618449440565] -"TOYOTA PRIUS 2017" = [1.60, 1.5023147650693636, 0.151515] -"TOYOTA PRIUS TSS2 2021" = [1.972600, 1.9104337425537743, 0.170968] -"TOYOTA RAV4 2017" = [2.085695074355425, 2.2142832316984733, 0.13339165270103975] -"TOYOTA RAV4 2019" = [2.279239424615458, 2.087101966779332, 0.13682208413446817] +"ACURA_ILX" = [1.524988973896102, 0.519011053086259, 0.34236219253028] +"ACURA_RDX" = [0.9987728568686902, 0.5323765166196301, 0.303218805715844] +"ACURA_RDX_3G" = [1.4314459806646749, 0.33874701282109954, 0.18048847083897598] +"AUDI_A3_MK3" = [1.5122414863077502, 1.7443517531719404, 0.15194151892450905] +"AUDI_Q3_MK2" = [1.4439223359448605, 1.2254955789112076, 0.1413798895978097] +"VOLT" = [1.5961527626411784, 1.8422651988094612, 0.1572393918005158] +"PACIFICA_2018" = [2.07140, 1.3366521181047952, 0.13776367250652022] +"PACIFICA_2020" = [1.86206, 1.509076559398423, 0.14328246159386085] +"PACIFICA_2017_HYBRID" = [1.79422, 1.06831764583744, 0.116237] +"PACIFICA_2018_HYBRID" = [2.08887, 1.2943025830995154, 0.114818] +"PACIFICA_2019_HYBRID" = [1.90120, 1.1958788168371808, 0.131520] +"GENESIS_G70" = [3.8520195946707947, 2.354697063349854, 0.06830285485626221] +"ACCORD" = [1.6893333799149202, 0.3246749081720698, 0.2120497022936265] +"CIVIC_BOSCH" = [1.691708637466905, 0.40132900729454185, 0.25460295304024094] +"CIVIC" = [1.6528895627785531, 0.4018518740819229, 0.25458812851328544] +"CRV" = [0.7667141440182675, 0.5927571534745969, 0.40909087636157127] +"CRV_5G" = [2.01323205142022, 0.2700612209345081, 0.2238412881331528] +"CRV_HYBRID" = [2.072034634644233, 0.7152085160516978, 0.20237105008376083] +"FIT" = [1.5719981427109775, 0.5712761407108976, 0.110773383324281] +"HRV" = [2.0661212805710205, 0.7521343418694775, 0.17760375789242094] +"INSIGHT" = [1.5201671214069354, 0.5660229120683284, 0.25808042580281876] +"ODYSSEY" = [1.8774809275211801, 0.8394431662987996, 0.2096978613792822] +"PILOT" = [1.7262026201812795, 0.9470005614967523, 0.21351430733218763] +"RIDGELINE" = [1.4146525028237624, 0.7356572861629564, 0.23307177552211328] +"ELANTRA_2021" = [3.169, 2.1259108157250735, 0.0819] +"HYUNDAI_GENESIS" = [2.7807965280270794, 2.325, 0.0984484465421171] +"IONIQ_5" = [3.172929, 2.713050, 0.096019] +"IONIQ_EV_LTD" = [1.7662975472852054, 1.613755614526594, 0.17087579756306276] +"IONIQ_PHEV" = [3.2928700076638537, 2.1193482926455656, 0.12463700961468778] +"IONIQ_PHEV_2019" = [2.970807902012267, 1.6312321830002083, 0.1088964990357482] +"KONA_EV" = [3.078814714619148, 2.307336938253934, 0.12359762054065548] +"PALISADE" = [2.544642494803999, 1.8721703683337008, 0.1301424599248651] +"SANTA_FE" = [3.0787027729757632, 2.6173437483495565, 0.1207019341823945] +"SANTA_FE_HEV_2022" = [3.501877602644835, 2.729064118456137, 0.10384068104538963] +"SANTA_FE_PHEV_2022" = [1.6953050513611045, 1.5837614296206861, 0.12672855941458458] +"SONATA_LF" = [2.2200457811703953, 1.2967330275895228, 0.14039920986586393] +"SONATA" = [2.9638737459977467, 2.1259108157250735, 0.07813665616927593] +"SONATA_HYBRID" = [2.8990264092395734, 2.061410192222139, 0.0899805488717382] +"TUCSON_4TH_GEN" = [2.960174, 2.860284, 0.108745] +"JEEP_GRAND_CHEROKEE_2019" = [2.30972, 1.289689569171081, 0.117048] +"JEEP_GRAND_CHEROKEE" = [2.27116, 1.4057367824262523, 0.11725947414922003] +"KIA_EV6" = [3.2, 2.093457, 0.05] +"KIA_K5_2021" = [2.405339728085138, 1.460032270828705, 0.11650989850813716] +"KIA_NIRO_EV" = [2.9215954981365337, 2.1500583840260044, 0.09236802474810267] +"KIA_SORENTO" = [2.464854685101844, 1.5335274218367956, 0.12056170567599558] +"KIA_STINGER" = [2.7499043387418967, 1.849652021986449, 0.12048334239559202] +"LEXUS_ES_TSS2" = [2.0357564999999997, 1.999082295195227, 0.101533] +"LEXUS_NX" = [2.3525924753753613, 1.9731412277641067, 0.15168101064205927] +"LEXUS_NX_TSS2" = [2.4331999786982936, 2.1045680431705414, 0.14099899317761067] +"LEXUS_RX" = [1.6430539050086406, 1.181960058934143, 0.19768806040843034] +"LEXUS_RX_TSS2" = [1.5375561442049257, 1.343166476215164, 0.1931062001527557] +"CX9_2021" = [1.7601682915983443, 1.0889677335154337, 0.17713792194297195] +"SKODA_SUPERB_MK3" = [1.166437404652981, 1.1686163012668165, 0.12194533036948708] +"FORESTER" = [3.6617001649776793, 2.342197172531713, 0.11075960785398745] +"IMPREZA" = [1.0670704910352047, 0.8234374840709592, 0.20986563268614938] +"IMPREZA_2020" = [2.6068223389108303, 2.134872342760203, 0.15261513193561627] +"AVALON" = [2.5185770183845646, 1.7153346784214922, 0.10603968787111022] +"AVALON_2019" = [1.7036141952825095, 1.239619084240008, 0.08459830394899492] +"AVALON_TSS2" = [2.3154403649717357, 2.7777922854327124, 0.11453999639164605] +"CHR" = [1.5591084333664578, 1.271271459066948, 0.20259087058453193] +"CHR_TSS2" = [1.7678810166088303, 1.3742176337919942, 0.2319674583741509] +"CAMRY" = [2.0568162685952505, 1.7576185169559122, 0.108878753] +"CAMRY_TSS2" = [2.3548324999999997, 2.368900128946771, 0.118436] +"COROLLA" = [3.117154369115421, 1.8438132575043773, 0.12289685869250652] +"COROLLA_TSS2" = [1.991132339206426, 1.868866242720403, 0.19570063298031432] +"HIGHLANDER" = [1.8108348718624456, 1.6348421600679828, 0.15972686105120398] +"HIGHLANDER_TSS2" = [1.9617570834136164, 1.8611643317268927, 0.14519673256119725] +"MIRAI" = [2.506899832157829, 1.7417213930750164, 0.20182618449440565] +"PRIUS" = [1.60, 1.5023147650693636, 0.151515] +"PRIUS_TSS2" = [1.972600, 1.9104337425537743, 0.170968] +"RAV4" = [2.085695074355425, 2.2142832316984733, 0.13339165270103975] +"RAV4_TSS2" = [2.279239424615458, 2.087101966779332, 0.13682208413446817] "TOYOTA RAV4 2019 8965" = [2.3080951748210854, 2.1189367835820603, 0.12942102328134028] "TOYOTA RAV4 2019 x02" = [2.762293266024922, 2.243615865975329, 0.11113568178327986] -"TOYOTA RAV4 HYBRID 2017" = [1.9796257271652042, 1.7503987331707576, 0.14628860048885406] -"TOYOTA RAV4 2022" = [2.241883248393209, 1.9304407208090029, 0.112174] +"RAV4H" = [1.9796257271652042, 1.7503987331707576, 0.14628860048885406] +"RAV4_TSS2_2022" = [2.241883248393209, 1.9304407208090029, 0.112174] "TOYOTA RAV4 2022 x02" = [3.044930631831037, 2.3979189796380918, 0.14023209146703736] -"TOYOTA SIENNA 2018" = [1.689726, 1.3208264576110418, 0.140456] -"VOLKSWAGEN ARTEON 1ST GEN" = [1.45136518053819, 1.3639364049316804, 0.23806361745695032] -"VOLKSWAGEN ATLAS 1ST GEN" = [1.4677006726964945, 1.6733266634075656, 0.12959584092073367] -"VOLKSWAGEN GOLF 7TH GEN" = [1.3750394140491293, 1.5814743077200641, 0.2018321939386586] -"VOLKSWAGEN JETTA 7TH GEN" = [1.2271623034089392, 1.216955117387, 0.19437384688370712] -"VOLKSWAGEN PASSAT 8TH GEN" = [1.3432120736752917, 1.7087275587362314, 0.19444383787326647] -"VOLKSWAGEN TIGUAN 2ND GEN" = [0.9711965500094828, 1.0001565939459098, 0.1465626137072916] +"SIENNA" = [1.689726, 1.3208264576110418, 0.140456] +"ARTEON_MK1" = [1.45136518053819, 1.3639364049316804, 0.23806361745695032] +"ATLAS_MK1" = [1.4677006726964945, 1.6733266634075656, 0.12959584092073367] +"GOLF_MK7" = [1.3750394140491293, 1.5814743077200641, 0.2018321939386586] +"JETTA_MK7" = [1.2271623034089392, 1.216955117387, 0.19437384688370712] +"PASSAT_MK8" = [1.3432120736752917, 1.7087275587362314, 0.19444383787326647] +"TIGUAN_MK2" = [0.9711965500094828, 1.0001565939459098, 0.1465626137072916] diff --git a/selfdrive/car/torque_data/substitute.toml b/selfdrive/car/torque_data/substitute.toml index 6822ef437b..2cf5bf41e5 100644 --- a/selfdrive/car/torque_data/substitute.toml +++ b/selfdrive/car/torque_data/substitute.toml @@ -1,85 +1,85 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] -"MAZDA 3" = "MAZDA CX-9 2021" -"MAZDA 6" = "MAZDA CX-9 2021" -"MAZDA CX-5" = "MAZDA CX-9 2021" -"MAZDA CX-5 2022" = "MAZDA CX-9 2021" -"MAZDA CX-9" = "MAZDA CX-9 2021" +"MAZDA3" = "CX9_2021" +"MAZDA6" = "CX9_2021" +"CX5" = "CX9_2021" +"CX5_2022" = "CX9_2021" +"CX9" = "CX9_2021" -"DODGE DURANGO 2021" = "CHRYSLER PACIFICA 2020" +"DODGE_DURANGO" = "PACIFICA_2020" -"TOYOTA ALPHARD 2020" = "TOYOTA SIENNA 2018" -"TOYOTA PRIUS v 2017" = "TOYOTA PRIUS 2017" -"LEXUS IS 2018" = "LEXUS NX 2018" -"LEXUS CT HYBRID 2018" = "LEXUS NX 2018" -"LEXUS ES 2018" = "TOYOTA CAMRY 2018" -"LEXUS RC 2020" = "LEXUS NX 2020" -"LEXUS LC 2024" = "LEXUS NX 2020" +"ALPHARD_TSS2" = "SIENNA" +"PRIUS_V" = "PRIUS" +"LEXUS_IS" = "LEXUS_NX" +"LEXUS_CTH" = "LEXUS_NX" +"LEXUS_ES" = "CAMRY" +"LEXUS_RC" = "LEXUS_NX_TSS2" +"LEXUS_LC_TSS2" = "LEXUS_NX_TSS2" -"KIA OPTIMA 4TH GEN" = "HYUNDAI SONATA 2020" -"KIA OPTIMA 4TH GEN FACELIFT" = "HYUNDAI SONATA 2020" -"KIA OPTIMA HYBRID 2017 & SPORTS 2019" = "HYUNDAI SONATA 2020" -"KIA OPTIMA HYBRID 4TH GEN FACELIFT" = "HYUNDAI SONATA 2020" -"KIA FORTE E 2018 & GT 2021" = "HYUNDAI SONATA 2020" -"KIA CEED INTRO ED 2019" = "HYUNDAI SONATA 2020" -"KIA SELTOS 2021" = "HYUNDAI SONATA 2020" -"KIA NIRO HYBRID 2019" = "KIA NIRO EV 2020" -"KIA NIRO PLUG-IN HYBRID 2022" = "KIA NIRO EV 2020" -"KIA NIRO HYBRID 2021" = "KIA NIRO EV 2020" -"HYUNDAI VELOSTER 2019" = "HYUNDAI SONATA 2019" -"HYUNDAI KONA 2020" = "HYUNDAI KONA ELECTRIC 2019" -"HYUNDAI KONA HYBRID 2020" = "HYUNDAI KONA ELECTRIC 2019" -"HYUNDAI KONA ELECTRIC 2022" = "HYUNDAI KONA ELECTRIC 2019" -"HYUNDAI IONIQ HYBRID 2017-2019" = "HYUNDAI IONIQ PLUG-IN HYBRID 2019" -"HYUNDAI IONIQ HYBRID 2020-2022" = "HYUNDAI IONIQ PLUG-IN HYBRID 2019" -"HYUNDAI IONIQ ELECTRIC 2020" = "HYUNDAI IONIQ PLUG-IN HYBRID 2019" -"HYUNDAI ELANTRA 2017" = "HYUNDAI SONATA 2019" -"HYUNDAI I30 N LINE 2019 & GT 2018 DCT" = "HYUNDAI SONATA 2019" -"HYUNDAI ELANTRA HYBRID 2021" = "HYUNDAI SONATA 2020" -"HYUNDAI TUCSON 2019" = "HYUNDAI SANTA FE 2019" -"HYUNDAI SANTA FE 2022" = "HYUNDAI SANTA FE HYBRID 2022" -"KIA K5 HYBRID 2020" = "KIA K5 2021" -"KIA STINGER 2022" = "KIA STINGER GT2 2018" -"GENESIS G90 2017" = "GENESIS G70 2018" -"GENESIS G80 2017" = "GENESIS G70 2018" -"GENESIS G70 2020" = "HYUNDAI SONATA 2020" +"KIA_OPTIMA_G4" = "SONATA" +"KIA_OPTIMA_G4_FL" = "SONATA" +"KIA_OPTIMA_H" = "SONATA" +"KIA_OPTIMA_H_G4_FL" = "SONATA" +"KIA_FORTE" = "SONATA" +"KIA_CEED" = "SONATA" +"KIA_SELTOS" = "SONATA" +"KIA_NIRO_PHEV" = "KIA_NIRO_EV" +"KIA_NIRO_PHEV_2022" = "KIA_NIRO_EV" +"KIA_NIRO_HEV_2021" = "KIA_NIRO_EV" +"VELOSTER" = "SONATA_LF" +"KONA" = "KONA_EV" +"KONA_HEV" = "KONA_EV" +"KONA_EV_2022" = "KONA_EV" +"IONIQ" = "IONIQ_PHEV_2019" +"IONIQ_HEV_2022" = "IONIQ_PHEV_2019" +"IONIQ_EV_2020" = "IONIQ_PHEV_2019" +"ELANTRA" = "SONATA_LF" +"ELANTRA_GT_I30" = "SONATA_LF" +"ELANTRA_HEV_2021" = "SONATA" +"TUCSON" = "SANTA_FE" +"SANTA_FE_2022" = "SANTA_FE_HEV_2022" +"KIA_K5_HEV_2020" = "KIA_K5_2021" +"KIA_STINGER_2022" = "KIA_STINGER" +"GENESIS_G90" = "GENESIS_G70" +"GENESIS_G80" = "GENESIS_G70" +"GENESIS_G70_2020" = "SONATA" -"HONDA FREED 2020" = "HONDA ODYSSEY 2018" -"HONDA CR-V EU 2016" = "HONDA CR-V 2016" -"HONDA CIVIC SEDAN 1.6 DIESEL 2019" = "HONDA CIVIC (BOSCH) 2019" -"HONDA E 2020" = "HONDA CIVIC (BOSCH) 2019" -"HONDA ODYSSEY CHN 2019" = "HONDA ODYSSEY 2018" +"FREED" = "ODYSSEY" +"CRV_EU" = "CRV" +"CIVIC_BOSCH_DIESEL" = "CIVIC_BOSCH" +"HONDA_E" = "CIVIC_BOSCH" +"ODYSSEY_CHN" = "ODYSSEY" -"BUICK LACROSSE 2017" = "CHEVROLET VOLT PREMIER 2017" -"BUICK REGAL ESSENCE 2018" = "CHEVROLET VOLT PREMIER 2017" -"CADILLAC ESCALADE ESV 2016" = "CHEVROLET VOLT PREMIER 2017" -"CADILLAC ATS Premium Performance 2018" = "CHEVROLET VOLT PREMIER 2017" -"CHEVROLET MALIBU PREMIER 2017" = "CHEVROLET VOLT PREMIER 2017" -"HOLDEN ASTRA RS-V BK 2017" = "CHEVROLET VOLT PREMIER 2017" +"BUICK_LACROSSE" = "VOLT" +"BUICK_REGAL" = "VOLT" +"ESCALADE_ESV" = "VOLT" +"CADILLAC_ATS" = "VOLT" +"MALIBU" = "VOLT" +"HOLDEN_ASTRA" = "VOLT" -"SKODA FABIA 4TH GEN" = "VOLKSWAGEN GOLF 7TH GEN" -"SKODA OCTAVIA 3RD GEN" = "SKODA SUPERB 3RD GEN" -"SKODA SCALA 1ST GEN" = "SKODA SUPERB 3RD GEN" -"SKODA KODIAQ 1ST GEN" = "SKODA SUPERB 3RD GEN" -"SKODA KAROQ 1ST GEN" = "SKODA SUPERB 3RD GEN" -"SKODA KAMIQ 1ST GEN" = "SKODA SUPERB 3RD GEN" -"VOLKSWAGEN CRAFTER 2ND GEN" = "VOLKSWAGEN TIGUAN 2ND GEN" -"VOLKSWAGEN T-ROC 1ST GEN" = "VOLKSWAGEN TIGUAN 2ND GEN" -"VOLKSWAGEN T-CROSS 1ST GEN" = "VOLKSWAGEN TIGUAN 2ND GEN" -"VOLKSWAGEN TOURAN 2ND GEN" = "VOLKSWAGEN TIGUAN 2ND GEN" -"VOLKSWAGEN TRANSPORTER T6.1" = "VOLKSWAGEN TIGUAN 2ND GEN" -"AUDI Q2 1ST GEN" = "VOLKSWAGEN TIGUAN 2ND GEN" -"VOLKSWAGEN TAOS 1ST GEN" = "VOLKSWAGEN TIGUAN 2ND GEN" -"VOLKSWAGEN POLO 6TH GEN" = "VOLKSWAGEN GOLF 7TH GEN" -"SEAT LEON 3RD GEN" = "VOLKSWAGEN GOLF 7TH GEN" -"SEAT ATECA 1ST GEN" = "VOLKSWAGEN GOLF 7TH GEN" +"SKODA_FABIA_MK4" = "GOLF_MK7" +"SKODA_OCTAVIA_MK3" = "SKODA_SUPERB_MK3" +"SKODA_SCALA_MK1" = "SKODA_SUPERB_MK3" +"SKODA_KODIAQ_MK1" = "SKODA_SUPERB_MK3" +"SKODA_KAROQ_MK1" = "SKODA_SUPERB_MK3" +"SKODA_KAMIQ_MK1" = "SKODA_SUPERB_MK3" +"CRAFTER_MK2" = "TIGUAN_MK2" +"TROC_MK1" = "TIGUAN_MK2" +"TCROSS_MK1" = "TIGUAN_MK2" +"TOURAN_MK2" = "TIGUAN_MK2" +"TRANSPORTER_T61" = "TIGUAN_MK2" +"AUDI_Q2_MK1" = "TIGUAN_MK2" +"TAOS_MK1" = "TIGUAN_MK2" +"POLO_MK6" = "GOLF_MK7" +"SEAT_LEON_MK3" = "GOLF_MK7" +"SEAT_ATECA_MK1" = "GOLF_MK7" -"SUBARU CROSSTREK HYBRID 2020" = "SUBARU IMPREZA SPORT 2020" -"SUBARU FORESTER HYBRID 2020" = "SUBARU IMPREZA SPORT 2020" -"SUBARU LEGACY 7TH GEN" = "SUBARU OUTBACK 6TH GEN" +"CROSSTREK_HYBRID" = "IMPREZA_2020" +"FORESTER_HYBRID" = "IMPREZA_2020" +"LEGACY" = "OUTBACK" # Old subarus don't have much data guessing it's like low torque impreza" -"SUBARU OUTBACK 2018 - 2019" = "SUBARU IMPREZA LIMITED 2019" -"SUBARU OUTBACK 2015 - 2017" = "SUBARU IMPREZA LIMITED 2019" -"SUBARU FORESTER 2017 - 2018" = "SUBARU IMPREZA LIMITED 2019" -"SUBARU LEGACY 2015 - 2018" = "SUBARU IMPREZA LIMITED 2019" -"SUBARU ASCENT LIMITED 2019" = "SUBARU FORESTER 2019" +"OUTBACK_PREGLOBAL_2018" = "IMPREZA" +"OUTBACK_PREGLOBAL" = "IMPREZA" +"FORESTER_PREGLOBAL" = "IMPREZA" +"LEGACY_PREGLOBAL" = "IMPREZA" +"ASCENT" = "FORESTER" diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 9a3e73048a..d8c28d8a8a 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -86,7 +86,6 @@ class ToyotaTSS2PlatformConfig(PlatformConfig): class CAR(Platforms): # Toyota ALPHARD_TSS2 = ToyotaTSS2PlatformConfig( - "TOYOTA ALPHARD 2020", [ ToyotaCarDocs("Toyota Alphard 2019-20"), ToyotaCarDocs("Toyota Alphard Hybrid 2021"), @@ -94,7 +93,6 @@ class CAR(Platforms): CarSpecs(mass=4305. * CV.LB_TO_KG, wheelbase=3.0, steerRatio=14.2, tireStiffnessFactor=0.444), ) AVALON = PlatformConfig( - "TOYOTA AVALON 2016", [ ToyotaCarDocs("Toyota Avalon 2016", "Toyota Safety Sense P"), ToyotaCarDocs("Toyota Avalon 2017-18"), @@ -103,7 +101,6 @@ class CAR(Platforms): dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), ) AVALON_2019 = PlatformConfig( - "TOYOTA AVALON 2019", [ ToyotaCarDocs("Toyota Avalon 2019-21"), ToyotaCarDocs("Toyota Avalon Hybrid 2019-21"), @@ -111,8 +108,7 @@ class CAR(Platforms): AVALON.specs, dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), ) - AVALON_TSS2 = ToyotaTSS2PlatformConfig( - "TOYOTA AVALON 2022", # TSS 2.5 + AVALON_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5 [ ToyotaCarDocs("Toyota Avalon 2022"), ToyotaCarDocs("Toyota Avalon Hybrid 2022"), @@ -120,7 +116,6 @@ class CAR(Platforms): AVALON.specs, ) CAMRY = PlatformConfig( - "TOYOTA CAMRY 2018", [ ToyotaCarDocs("Toyota Camry 2018-20", video_link="https://www.youtube.com/watch?v=fkcjviZY9CM", footnotes=[Footnote.CAMRY]), ToyotaCarDocs("Toyota Camry Hybrid 2018-20", video_link="https://www.youtube.com/watch?v=Q2DYY0AWKgk"), @@ -129,8 +124,7 @@ class CAR(Platforms): dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_DSU, ) - CAMRY_TSS2 = ToyotaTSS2PlatformConfig( - "TOYOTA CAMRY 2021", # TSS 2.5 + CAMRY_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5 [ ToyotaCarDocs("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]), ToyotaCarDocs("Toyota Camry Hybrid 2021-24"), @@ -138,7 +132,6 @@ class CAR(Platforms): CAMRY.specs, ) CHR = PlatformConfig( - "TOYOTA C-HR 2018", [ ToyotaCarDocs("Toyota C-HR 2017-20"), ToyotaCarDocs("Toyota C-HR Hybrid 2017-20"), @@ -148,7 +141,6 @@ class CAR(Platforms): flags=ToyotaFlags.NO_DSU, ) CHR_TSS2 = ToyotaTSS2PlatformConfig( - "TOYOTA C-HR 2021", [ ToyotaCarDocs("Toyota C-HR 2021"), ToyotaCarDocs("Toyota C-HR Hybrid 2021-22"), @@ -157,14 +149,12 @@ class CAR(Platforms): flags=ToyotaFlags.RADAR_ACC, ) COROLLA = PlatformConfig( - "TOYOTA COROLLA 2017", [ToyotaCarDocs("Toyota Corolla 2017-19")], CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) # LSS2 Lexus UX Hybrid is same as a TSS2 Corolla Hybrid COROLLA_TSS2 = ToyotaTSS2PlatformConfig( - "TOYOTA COROLLA TSS2 2019", [ ToyotaCarDocs("Toyota Corolla 2020-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), ToyotaCarDocs("Toyota Corolla Cross (Non-US only) 2020-23", min_enable_speed=7.5), @@ -178,7 +168,6 @@ class CAR(Platforms): CarSpecs(mass=3060. * CV.LB_TO_KG, wheelbase=2.67, steerRatio=13.9, tireStiffnessFactor=0.444), ) HIGHLANDER = PlatformConfig( - "TOYOTA HIGHLANDER 2017", [ ToyotaCarDocs("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo"), ToyotaCarDocs("Toyota Highlander Hybrid 2017-19"), @@ -188,7 +177,6 @@ class CAR(Platforms): flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, ) HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig( - "TOYOTA HIGHLANDER 2020", [ ToyotaCarDocs("Toyota Highlander 2020-23"), ToyotaCarDocs("Toyota Highlander Hybrid 2020-23"), @@ -196,7 +184,6 @@ class CAR(Platforms): HIGHLANDER.specs, ) PRIUS = PlatformConfig( - "TOYOTA PRIUS 2017", [ ToyotaCarDocs("Toyota Prius 2016", "Toyota Safety Sense P", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), ToyotaCarDocs("Toyota Prius 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), @@ -206,14 +193,12 @@ class CAR(Platforms): dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), ) PRIUS_V = PlatformConfig( - "TOYOTA PRIUS v 2017", [ToyotaCarDocs("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED)], CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, ) PRIUS_TSS2 = ToyotaTSS2PlatformConfig( - "TOYOTA PRIUS TSS2 2021", [ ToyotaCarDocs("Toyota Prius 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), ToyotaCarDocs("Toyota Prius Prime 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), @@ -221,7 +206,6 @@ class CAR(Platforms): CarSpecs(mass=3115. * CV.LB_TO_KG, wheelbase=2.70002, steerRatio=13.4, tireStiffnessFactor=0.6371), ) RAV4 = PlatformConfig( - "TOYOTA RAV4 2017", [ ToyotaCarDocs("Toyota RAV4 2016", "Toyota Safety Sense P"), ToyotaCarDocs("Toyota RAV4 2017-18") @@ -230,7 +214,6 @@ class CAR(Platforms): dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) RAV4H = PlatformConfig( - "TOYOTA RAV4 HYBRID 2017", [ ToyotaCarDocs("Toyota RAV4 Hybrid 2016", "Toyota Safety Sense P", video_link="https://youtu.be/LhT5VzJVfNI?t=26"), ToyotaCarDocs("Toyota RAV4 Hybrid 2017-18", video_link="https://youtu.be/LhT5VzJVfNI?t=26") @@ -240,7 +223,6 @@ class CAR(Platforms): flags=ToyotaFlags.NO_STOP_TIMER, ) RAV4_TSS2 = ToyotaTSS2PlatformConfig( - "TOYOTA RAV4 2019", [ ToyotaCarDocs("Toyota RAV4 2019-21", video_link="https://www.youtube.com/watch?v=wJxjDd42gGA"), ToyotaCarDocs("Toyota RAV4 Hybrid 2019-21"), @@ -248,7 +230,6 @@ class CAR(Platforms): CarSpecs(mass=3585. * CV.LB_TO_KG, wheelbase=2.68986, steerRatio=14.3, tireStiffnessFactor=0.7933), ) RAV4_TSS2_2022 = ToyotaTSS2PlatformConfig( - "TOYOTA RAV4 2022", [ ToyotaCarDocs("Toyota RAV4 2022"), ToyotaCarDocs("Toyota RAV4 Hybrid 2022", video_link="https://youtu.be/U0nH9cnrFB0"), @@ -257,7 +238,6 @@ class CAR(Platforms): flags=ToyotaFlags.RADAR_ACC, ) RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig( - "TOYOTA RAV4 2023", [ ToyotaCarDocs("Toyota RAV4 2023-24"), ToyotaCarDocs("Toyota RAV4 Hybrid 2023-24"), @@ -265,13 +245,11 @@ class CAR(Platforms): RAV4_TSS2.specs, flags=ToyotaFlags.RADAR_ACC | ToyotaFlags.ANGLE_CONTROL, ) - MIRAI = ToyotaTSS2PlatformConfig( - "TOYOTA MIRAI 2021", # TSS 2.5 + MIRAI = ToyotaTSS2PlatformConfig( # TSS 2.5 [ToyotaCarDocs("Toyota Mirai 2021")], CarSpecs(mass=4300. * CV.LB_TO_KG, wheelbase=2.91, steerRatio=14.8, tireStiffnessFactor=0.8), ) SIENNA = PlatformConfig( - "TOYOTA SIENNA 2018", [ToyotaCarDocs("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED)], CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), @@ -280,13 +258,11 @@ class CAR(Platforms): # Lexus LEXUS_CTH = PlatformConfig( - "LEXUS CT HYBRID 2018", [ToyotaCarDocs("Lexus CT Hybrid 2017-18", "Lexus Safety System+")], CarSpecs(mass=3108. * CV.LB_TO_KG, wheelbase=2.6, steerRatio=18.6, tireStiffnessFactor=0.517), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) LEXUS_ES = PlatformConfig( - "LEXUS ES 2018", [ ToyotaCarDocs("Lexus ES 2017-18"), ToyotaCarDocs("Lexus ES Hybrid 2017-18"), @@ -295,7 +271,6 @@ class CAR(Platforms): dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) LEXUS_ES_TSS2 = ToyotaTSS2PlatformConfig( - "LEXUS ES 2019", [ ToyotaCarDocs("Lexus ES 2019-24"), ToyotaCarDocs("Lexus ES Hybrid 2019-24", video_link="https://youtu.be/BZ29osRVJeg?t=12"), @@ -303,19 +278,16 @@ class CAR(Platforms): LEXUS_ES.specs, ) LEXUS_IS = PlatformConfig( - "LEXUS IS 2018", [ToyotaCarDocs("Lexus IS 2017-19")], CarSpecs(mass=3736.8 * CV.LB_TO_KG, wheelbase=2.79908, steerRatio=13.3, tireStiffnessFactor=0.444), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.UNSUPPORTED_DSU, ) LEXUS_IS_TSS2 = ToyotaTSS2PlatformConfig( - "LEXUS IS 2023", [ToyotaCarDocs("Lexus IS 2022-23")], LEXUS_IS.specs, ) LEXUS_NX = PlatformConfig( - "LEXUS NX 2018", [ ToyotaCarDocs("Lexus NX 2018-19"), ToyotaCarDocs("Lexus NX Hybrid 2018-19"), @@ -324,7 +296,6 @@ class CAR(Platforms): dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), ) LEXUS_NX_TSS2 = ToyotaTSS2PlatformConfig( - "LEXUS NX 2020", [ ToyotaCarDocs("Lexus NX 2020-21"), ToyotaCarDocs("Lexus NX Hybrid 2020-21"), @@ -332,19 +303,16 @@ class CAR(Platforms): LEXUS_NX.specs, ) LEXUS_LC_TSS2 = ToyotaTSS2PlatformConfig( - "LEXUS LC 2024", [ToyotaCarDocs("Lexus LC 2024")], CarSpecs(mass=4500. * CV.LB_TO_KG, wheelbase=2.87, steerRatio=13.0, tireStiffnessFactor=0.444), ) LEXUS_RC = PlatformConfig( - "LEXUS RC 2020", [ToyotaCarDocs("Lexus RC 2018-20")], LEXUS_IS.specs, dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.UNSUPPORTED_DSU, ) LEXUS_RX = PlatformConfig( - "LEXUS RX 2016", [ ToyotaCarDocs("Lexus RX 2016", "Lexus Safety System+"), ToyotaCarDocs("Lexus RX 2017-19"), @@ -356,7 +324,6 @@ class CAR(Platforms): dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), ) LEXUS_RX_TSS2 = ToyotaTSS2PlatformConfig( - "LEXUS RX 2020", [ ToyotaCarDocs("Lexus RX 2020-22"), ToyotaCarDocs("Lexus RX Hybrid 2020-22"), @@ -364,7 +331,6 @@ class CAR(Platforms): LEXUS_RX.specs, ) LEXUS_GS_F = PlatformConfig( - "LEXUS GS F 2016", [ToyotaCarDocs("Lexus GS F 2016")], CarSpecs(mass=4034. * CV.LB_TO_KG, wheelbase=2.84988, steerRatio=13.3, tireStiffnessFactor=0.444), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 9019d857b8..c8116de579 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -177,8 +177,7 @@ class VWCarDocs(CarDocs): # Exception: SEAT Leon and SEAT Ateca share a chassis code class CAR(Platforms): - ARTEON_MK1 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN ARTEON 1ST GEN", # Chassis AN + ARTEON_MK1 = VolkswagenMQBPlatformConfig( # Chassis AN [ VWCarDocs("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"), VWCarDocs("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), @@ -187,8 +186,7 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1733, wheelbase=2.84), ) - ATLAS_MK1 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN ATLAS 1ST GEN", # Chassis CA + ATLAS_MK1 = VolkswagenMQBPlatformConfig( # Chassis CA [ VWCarDocs("Volkswagen Atlas 2018-23"), VWCarDocs("Volkswagen Atlas Cross Sport 2020-22"), @@ -198,16 +196,14 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=2011, wheelbase=2.98), ) - CADDY_MK3 = VolkswagenPQPlatformConfig( - "VOLKSWAGEN CADDY 3RD GEN", # Chassis 2K + CADDY_MK3 = VolkswagenPQPlatformConfig( # Chassis 2K [ VWCarDocs("Volkswagen Caddy 2019"), VWCarDocs("Volkswagen Caddy Maxi 2019"), ], VolkswagenCarSpecs(mass=1613, wheelbase=2.6, minSteerSpeed=21 * CV.KPH_TO_MS), ) - CRAFTER_MK2 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN CRAFTER 2ND GEN", # Chassis SY/SZ + CRAFTER_MK2 = VolkswagenMQBPlatformConfig( # Chassis SY/SZ [ VWCarDocs("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"), VWCarDocs("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"), @@ -217,8 +213,7 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS), ) - GOLF_MK7 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN GOLF 7TH GEN", # Chassis 5G/AU/BA/BE + GOLF_MK7 = VolkswagenMQBPlatformConfig( # Chassis 5G/AU/BA/BE [ VWCarDocs("Volkswagen e-Golf 2014-20"), VWCarDocs("Volkswagen Golf 2015-20", auto_resume=False), @@ -231,16 +226,14 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1397, wheelbase=2.62), ) - JETTA_MK7 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN JETTA 7TH GEN", # Chassis BU + JETTA_MK7 = VolkswagenMQBPlatformConfig( # Chassis BU [ VWCarDocs("Volkswagen Jetta 2018-24"), VWCarDocs("Volkswagen Jetta GLI 2021-24"), ], VolkswagenCarSpecs(mass=1328, wheelbase=2.71), ) - PASSAT_MK8 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN PASSAT 8TH GEN", # Chassis 3G + PASSAT_MK8 = VolkswagenMQBPlatformConfig( # Chassis 3G [ VWCarDocs("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), VWCarDocs("Volkswagen Passat Alltrack 2015-22"), @@ -248,65 +241,55 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1551, wheelbase=2.79), ) - PASSAT_NMS = VolkswagenPQPlatformConfig( - "VOLKSWAGEN PASSAT NMS", # Chassis A3 + PASSAT_NMS = VolkswagenPQPlatformConfig( # Chassis A3 [VWCarDocs("Volkswagen Passat NMS 2017-22")], VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50*CV.KPH_TO_MS, minEnableSpeed=20*CV.KPH_TO_MS), ) - POLO_MK6 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN POLO 6TH GEN", # Chassis AW + POLO_MK6 = VolkswagenMQBPlatformConfig( # Chassis AW [ VWCarDocs("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), VWCarDocs("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), ], VolkswagenCarSpecs(mass=1230, wheelbase=2.55), ) - SHARAN_MK2 = VolkswagenPQPlatformConfig( - "VOLKSWAGEN SHARAN 2ND GEN", # Chassis 7N + SHARAN_MK2 = VolkswagenPQPlatformConfig( # Chassis 7N [ VWCarDocs("Volkswagen Sharan 2018-22"), VWCarDocs("SEAT Alhambra 2018-20"), ], VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50*CV.KPH_TO_MS), ) - TAOS_MK1 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN TAOS 1ST GEN", # Chassis B2 + TAOS_MK1 = VolkswagenMQBPlatformConfig( # Chassis B2 [VWCarDocs("Volkswagen Taos 2022-23")], VolkswagenCarSpecs(mass=1498, wheelbase=2.69), ) - TCROSS_MK1 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN T-CROSS 1ST GEN", # Chassis C1 + TCROSS_MK1 = VolkswagenMQBPlatformConfig( # Chassis C1 [VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1150, wheelbase=2.60), ) - TIGUAN_MK2 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN TIGUAN 2ND GEN", # Chassis AD/BW + TIGUAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis AD/BW [ VWCarDocs("Volkswagen Tiguan 2018-24"), VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"), ], VolkswagenCarSpecs(mass=1715, wheelbase=2.74), ) - TOURAN_MK2 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN TOURAN 2ND GEN", # Chassis 1T + TOURAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis 1T [VWCarDocs("Volkswagen Touran 2016-23")], VolkswagenCarSpecs(mass=1516, wheelbase=2.79), ) - TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN TRANSPORTER T6.1", # Chassis 7H/7L + TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( # Chassis 7H/7L [ VWCarDocs("Volkswagen Caravelle 2020"), VWCarDocs("Volkswagen California 2021-23"), ], VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0), ) - TROC_MK1 = VolkswagenMQBPlatformConfig( - "VOLKSWAGEN T-ROC 1ST GEN", # Chassis A1 + TROC_MK1 = VolkswagenMQBPlatformConfig( # Chassis A1 [VWCarDocs("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1413, wheelbase=2.63), ) - AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( - "AUDI A3 3RD GEN", # Chassis 8V/FF + AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( # Chassis 8V/FF [ VWCarDocs("Audi A3 2014-19"), VWCarDocs("Audi A3 Sportback e-tron 2017-18"), @@ -315,61 +298,50 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1335, wheelbase=2.61), ) - AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( - "AUDI Q2 1ST GEN", # Chassis GA + AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( # Chassis GA [VWCarDocs("Audi Q2 2018")], VolkswagenCarSpecs(mass=1205, wheelbase=2.61), ) - AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( - "AUDI Q3 2ND GEN", # Chassis 8U/F3/FS + AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( # Chassis 8U/F3/FS [VWCarDocs("Audi Q3 2019-23")], VolkswagenCarSpecs(mass=1623, wheelbase=2.68), ) - SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( - "SEAT ATECA 1ST GEN", # Chassis 5F + SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( # Chassis 5F [VWCarDocs("SEAT Ateca 2018")], VolkswagenCarSpecs(mass=1900, wheelbase=2.64), ) - SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( - "SEAT LEON 3RD GEN", # Chassis 5F + SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( # Chassis 5F [VWCarDocs("SEAT Leon 2014-20")], VolkswagenCarSpecs(mass=1227, wheelbase=2.64), ) - SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( - "SKODA FABIA 4TH GEN", # Chassis PJ + SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( # Chassis PJ [VWCarDocs("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1266, wheelbase=2.56), ) - SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( - "SKODA KAMIQ 1ST GEN", # Chassis NW + SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NW [VWCarDocs("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ])], VolkswagenCarSpecs(mass=1265, wheelbase=2.66), ) - SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( - "SKODA KAROQ 1ST GEN", # Chassis NU + SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NU [VWCarDocs("Škoda Karoq 2019-23")], VolkswagenCarSpecs(mass=1278, wheelbase=2.66), ) - SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( - "SKODA KODIAQ 1ST GEN", # Chassis NS + SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NS [VWCarDocs("Škoda Kodiaq 2017-23")], VolkswagenCarSpecs(mass=1569, wheelbase=2.79), ) - SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( - "SKODA OCTAVIA 3RD GEN", # Chassis NE + SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( # Chassis NE [ VWCarDocs("Škoda Octavia 2015-19"), VWCarDocs("Škoda Octavia RS 2016"), ], VolkswagenCarSpecs(mass=1388, wheelbase=2.68), ) - SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig( - "SKODA SCALA 1ST GEN", # Chassis NW + SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig( # Chassis NW [VWCarDocs("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1192, wheelbase=2.65), ) - SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( - "SKODA SUPERB 3RD GEN", # Chassis 3V/NP + SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( # Chassis 3V/NP [VWCarDocs("Škoda Superb 2015-22")], VolkswagenCarSpecs(mass=1505, wheelbase=2.84), ) diff --git a/selfdrive/debug/cycle_alerts.py b/selfdrive/debug/cycle_alerts.py index 42561f70f0..db845ed58f 100755 --- a/selfdrive/debug/cycle_alerts.py +++ b/selfdrive/debug/cycle_alerts.py @@ -52,7 +52,7 @@ def cycle_alerts(duration=200, is_metric=False): cameras = ['roadCameraState', 'wideRoadCameraState', 'driverCameraState'] CS = car.CarState.new_message() - CP = CarInterface.get_non_essential_params("HONDA CIVIC 2016") + CP = CarInterface.get_non_essential_params("CIVIC") sm = messaging.SubMaster(['deviceState', 'pandaStates', 'roadCameraState', 'modelV2', 'liveCalibration', 'driverMonitoringState', 'longitudinalPlan', 'liveLocationKalman', 'managerState'] + cameras) diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index fe47637bdd..44090cce1a 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -14,7 +14,7 @@ from openpilot.system.version import training_version, terms_version def set_params_enabled(): - os.environ['FINGERPRINT'] = "TOYOTA COROLLA TSS2 2019" + os.environ['FINGERPRINT'] = "COROLLA_TSS2" os.environ['LOGPRINT'] = "debug" params = Params() diff --git a/selfdrive/test/process_replay/migration.py b/selfdrive/test/process_replay/migration.py index 099513a753..e88f62c10c 100644 --- a/selfdrive/test/process_replay/migration.py +++ b/selfdrive/test/process_replay/migration.py @@ -1,6 +1,7 @@ from collections import defaultdict from cereal import messaging +from openpilot.selfdrive.car.fingerprints import MIGRATION from openpilot.selfdrive.test.process_replay.vision_meta import meta_from_encode_index from openpilot.selfdrive.car.toyota.values import EPS_SCALE from openpilot.selfdrive.manager.process_config import managed_processes @@ -72,9 +73,9 @@ def migrate_pandaStates(lr): all_msgs = [] # TODO: safety param migration should be handled automatically safety_param_migration = { - "TOYOTA PRIUS 2017": EPS_SCALE["TOYOTA PRIUS 2017"] | Panda.FLAG_TOYOTA_STOCK_LONGITUDINAL, - "TOYOTA RAV4 2017": EPS_SCALE["TOYOTA RAV4 2017"] | Panda.FLAG_TOYOTA_ALT_BRAKE, - "KIA EV6 2022": Panda.FLAG_HYUNDAI_EV_GAS | Panda.FLAG_HYUNDAI_CANFD_HDA2, + "PRIUS": EPS_SCALE["PRIUS"] | Panda.FLAG_TOYOTA_STOCK_LONGITUDINAL, + "RAV4": EPS_SCALE["RAV4"] | Panda.FLAG_TOYOTA_ALT_BRAKE, + "KIA_EV6": Panda.FLAG_HYUNDAI_EV_GAS | Panda.FLAG_HYUNDAI_CANFD_HDA2, } # Migrate safety param base on carState @@ -185,6 +186,7 @@ def migrate_carParams(lr, old_logtime=False): CP = messaging.new_message('carParams') CP.valid = True CP.carParams = msg.carParams.as_builder() + CP.carParams.carFingerprint = MIGRATION.get(CP.carParams.carFingerprint, CP.carParams.carFingerprint) for car_fw in CP.carParams.carFw: car_fw.brand = CP.carParams.carName if old_logtime: diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index dd3d530f70..cd0876f2af 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -e29856a02cca7ab76461b2cc0acd25826a894667 \ No newline at end of file +9338c27947c1d8c1aa8e74ccc2a646e541f1ca8c \ No newline at end of file diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index 88e46abb06..99f04600a5 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -26,7 +26,7 @@ source_segments = [ ("HONDA", "eb140f119469d9ab|2021-06-12--10-46-24--27"), # HONDA.CIVIC (NIDEC) ("HONDA2", "7d2244f34d1bbcda|2021-06-25--12-25-37--26"), # HONDA.ACCORD (BOSCH) ("CHRYSLER", "4deb27de11bee626|2021-02-20--11-28-55--8"), # CHRYSLER.PACIFICA_2018_HYBRID - ("RAM", "17fc16d840fe9d21|2023-04-26--13-28-44--5"), # CHRYSLER.RAM_1500 + ("RAM", "17fc16d840fe9d21|2023-04-26--13-28-44--5"), # CHRYSLER.RAM_1500_5TH_GEN ("SUBARU", "341dccd5359e3c97|2022-09-12--10-35-33--3"), # SUBARU.OUTBACK ("GM", "0c58b6a25109da2b|2021-02-23--16-35-50--11"), # GM.VOLT ("GM2", "376bf99325883932|2022-10-27--13-41-22--1"), # GM.BOLT_EUV diff --git a/selfdrive/test/process_replay/test_regen.py b/selfdrive/test/process_replay/test_regen.py index 41d67ea376..a0343d7d2d 100755 --- a/selfdrive/test/process_replay/test_regen.py +++ b/selfdrive/test/process_replay/test_regen.py @@ -11,7 +11,7 @@ from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.framereader import FrameReader TESTED_SEGMENTS = [ - ("PRIUS_C2", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA PRIUS 2017: NEO, pandaStateDEPRECATED, no peripheralState, sensorEventsDEPRECATED + ("PRIUS_C2", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.PRIUS: NEO, pandaStateDEPRECATED, no peripheralState, sensorEventsDEPRECATED # Enable these once regen on CI becomes faster or use them for different tests running controlsd in isolation # ("MAZDA_C3", "bd6a637565e91581|2021-10-30--15-14-53--4"), # MAZDA.CX9_2021: TICI, incomplete managerState # ("FORD_C3", "54827bf84c38b14f|2023-01-26--21-59-07--4"), # FORD.BRONCO_SPORT_MK1: TICI diff --git a/selfdrive/ui/tests/body.py b/selfdrive/ui/tests/body.py index c34e717eaf..7e24c2beb7 100755 --- a/selfdrive/ui/tests/body.py +++ b/selfdrive/ui/tests/body.py @@ -8,7 +8,7 @@ if __name__ == "__main__": batt = 1. while True: msg = messaging.new_message('carParams') - msg.carParams.carName = "COMMA BODY" + msg.carParams.carName = "BODY" msg.carParams.notCar = True pm.send('carParams', msg) diff --git a/tools/cabana/dbc/generate_dbc_json.py b/tools/cabana/dbc/generate_dbc_json.py index 5a8ef21d8b..dec1766a7e 100755 --- a/tools/cabana/dbc/generate_dbc_json.py +++ b/tools/cabana/dbc/generate_dbc_json.py @@ -6,7 +6,7 @@ from openpilot.selfdrive.car.values import create_platform_map def generate_dbc_json() -> str: - dbc_map = create_platform_map(lambda platform: platform.config.dbc_dict["pt"] if platform != "mock" else None) + dbc_map = create_platform_map(lambda platform: platform.config.dbc_dict["pt"] if platform != "MOCK" else None) return json.dumps(dict(sorted(dbc_map.items())), indent=2) diff --git a/tools/car_porting/README.md b/tools/car_porting/README.md index 8db17b0976..a32e9f96c9 100644 --- a/tools/car_porting/README.md +++ b/tools/car_porting/README.md @@ -21,8 +21,8 @@ Given a route and platform, automatically inserts FW fingerprints from the platf Example: ```bash -> python tools/car_porting/auto_fingerprint.py '1bbe6bf2d62f58a8|2022-07-14--17-11-43' 'SUBARU OUTBACK 6TH GEN' -Attempting to add fw version for: SUBARU OUTBACK 6TH GEN +> python tools/car_porting/auto_fingerprint.py '1bbe6bf2d62f58a8|2022-07-14--17-11-43' 'OUTBACK' +Attempting to add fw version for: OUTBACK ``` ### [selfdrive/car/tests/test_car_interfaces.py](/selfdrive/car/tests/test_car_interfaces.py) diff --git a/tools/car_porting/auto_fingerprint.py b/tools/car_porting/auto_fingerprint.py index f122c2774e..8b0ae6762d 100755 --- a/tools/car_porting/auto_fingerprint.py +++ b/tools/car_porting/auto_fingerprint.py @@ -46,7 +46,7 @@ if __name__ == "__main__": if len(possible_platforms) != 1: print(f"Unable to auto-determine platform, possible platforms: {possible_platforms}") - if carPlatform != "mock": + if carPlatform != "MOCK": print("Using platform from route") platform = carPlatform else: diff --git a/tools/lib/tests/test_comma_car_segments.py b/tools/lib/tests/test_comma_car_segments.py index b293251583..5c8906f92d 100644 --- a/tools/lib/tests/test_comma_car_segments.py +++ b/tools/lib/tests/test_comma_car_segments.py @@ -19,7 +19,7 @@ class TestCommaCarSegments(unittest.TestCase): def test_download_segment(self): database = get_comma_car_segments_database() - fp = "SUBARU FORESTER 2019" + fp = "FORESTER" segment = database[fp][0] diff --git a/tools/sim/launch_openpilot.sh b/tools/sim/launch_openpilot.sh index 9532537283..06984b690b 100755 --- a/tools/sim/launch_openpilot.sh +++ b/tools/sim/launch_openpilot.sh @@ -4,7 +4,7 @@ export PASSIVE="0" export NOBOARD="1" export SIMULATION="1" export SKIP_FW_QUERY="1" -export FINGERPRINT="HONDA CIVIC 2016" +export FINGERPRINT="CIVIC" export BLOCK="${BLOCK},camerad,loggerd,encoderd,micd,logmessaged" if [[ "$CI" ]]; then From 530bc62baa15937ac93925d5dcf39c6b868dc22a Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 19 Mar 2024 13:16:36 -0500 Subject: [PATCH 085/384] [bot] Fingerprints: add missing FW versions from new users (#31917) --- selfdrive/car/chrysler/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index f3edd8a888..5f3438fd92 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -142,6 +142,7 @@ FW_VERSIONS = { b'68443120AE ', b'68443123AC ', b'68443125AC ', + b'68496650AI ', b'68526752AD ', b'68526752AE ', b'68526754AE ', From d647361fae99b94c31e5071cbb6d81410b68c32e Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 20 Mar 2024 02:46:39 +0800 Subject: [PATCH 086/384] replay: get route datetime from INIT_DATA (#31913) get datetime from INIT_DATA --- tools/cabana/streams/replaystream.h | 2 +- tools/replay/replay.cc | 14 ++++++++++++-- tools/replay/replay.h | 4 +++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/tools/cabana/streams/replaystream.h b/tools/cabana/streams/replaystream.h index b4e4be4db6..d92a2e426b 100644 --- a/tools/cabana/streams/replaystream.h +++ b/tools/cabana/streams/replaystream.h @@ -23,7 +23,7 @@ public: inline QString routeName() const override { return replay->route()->name(); } inline QString carFingerprint() const override { return replay->carFingerprint().c_str(); } double totalSeconds() const override { return replay->totalSeconds(); } - inline QDateTime beginDateTime() const { return replay->route()->datetime(); } + inline QDateTime beginDateTime() const { return replay->routeDateTime(); } inline double routeStartTime() const override { return replay->routeStartTime() / (double)1e9; } inline const Route *route() const { return replay->route(); } inline void setSpeed(float speed) override { replay->setSpeed(speed); } diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index 70b3f380e1..7c8c1ad43f 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -290,12 +290,22 @@ void Replay::mergeSegments(const SegmentMap::iterator &begin, const SegmentMap:: void Replay::startStream(const Segment *cur_segment) { const auto &events = cur_segment->log->events; - // each segment has an INIT_DATA route_start_ts_ = events.front()->mono_time; cur_mono_time_ += route_start_ts_ - 1; + // get datetime from INIT_DATA, fallback to datetime in the route name + route_date_time_ = route()->datetime(); + auto it = std::find_if(events.cbegin(), events.cend(), + [](auto e) { return e->which == cereal::Event::Which::INIT_DATA; }); + if (it != events.cend()) { + uint64_t wall_time = (*it)->event.getInitData().getWallTimeNanos(); + if (wall_time > 0) { + route_date_time_ = QDateTime::fromMSecsSinceEpoch(wall_time / 1e6); + } + } + // write CarParams - auto it = std::find_if(events.begin(), events.end(), [](auto e) { return e->which == cereal::Event::Which::CAR_PARAMS; }); + it = std::find_if(events.begin(), events.end(), [](auto e) { return e->which == cereal::Event::Which::CAR_PARAMS; }); if (it != events.end()) { car_fingerprint_ = (*it)->event.getCarParams().getCarFingerprint(); capnp::MallocMessageBuilder builder; diff --git a/tools/replay/replay.h b/tools/replay/replay.h index 1a74b69c3d..3859b69380 100644 --- a/tools/replay/replay.h +++ b/tools/replay/replay.h @@ -72,7 +72,8 @@ public: inline void removeFlag(REPLAY_FLAGS flag) { flags_ &= ~flag; } inline const Route* route() const { return route_.get(); } inline double currentSeconds() const { return double(cur_mono_time_ - route_start_ts_) / 1e9; } - inline QDateTime currentDateTime() const { return route_->datetime().addSecs(currentSeconds()); } + inline QDateTime routeDateTime() const { return route_date_time_; } + inline QDateTime currentDateTime() const { return route_date_time_.addSecs(currentSeconds()); } inline uint64_t routeStartTime() const { return route_start_ts_; } inline double toSeconds(uint64_t mono_time) const { return (mono_time - route_start_ts_) / 1e9; } inline int totalSeconds() const { return (!segments_.empty()) ? (segments_.rbegin()->first + 1) * 60 : 0; } @@ -121,6 +122,7 @@ protected: std::atomic exit_ = false; bool paused_ = false; bool events_updated_ = false; + QDateTime route_date_time_; uint64_t route_start_ts_ = 0; std::atomic cur_mono_time_ = 0; std::unique_ptr> events_; From 4fbc8a389662f82018eeabd03294cc761b87ce75 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 19 Mar 2024 15:39:09 -0400 Subject: [PATCH 087/384] move git commands to common/git.py (#31921) move git into common/git.py --- common/git.py | 42 +++++++++++++ common/run.py | 13 ++++ common/utils.py | 12 ++++ selfdrive/athena/athenad.py | 3 +- selfdrive/athena/manage_athenad.py | 3 +- selfdrive/controls/controlsd.py | 2 +- selfdrive/controls/lib/events.py | 2 +- selfdrive/manager/manager.py | 5 +- selfdrive/sentry.py | 4 +- selfdrive/test/process_replay/model_replay.py | 2 +- selfdrive/test/process_replay/test_debayer.py | 2 +- .../test/process_replay/test_processes.py | 2 +- selfdrive/tombstoned.py | 2 +- system/version.py | 61 ++----------------- 14 files changed, 86 insertions(+), 69 deletions(-) create mode 100644 common/git.py create mode 100644 common/run.py diff --git a/common/git.py b/common/git.py new file mode 100644 index 0000000000..e15a5051d2 --- /dev/null +++ b/common/git.py @@ -0,0 +1,42 @@ +import subprocess +from openpilot.common.utils import cache +from openpilot.common.run import run_cmd, run_cmd_default + + +@cache +def get_commit(branch: str = "HEAD") -> str: + return run_cmd_default(["git", "rev-parse", branch]) + + +@cache +def get_commit_date(commit: str = "HEAD") -> str: + return run_cmd_default(["git", "show", "--no-patch", "--format='%ct %ci'", commit]) + + +@cache +def get_short_branch() -> str: + return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "HEAD"]) + + +@cache +def get_branch() -> str: + return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]) + + +@cache +def get_origin() -> str: + try: + local_branch = run_cmd(["git", "name-rev", "--name-only", "HEAD"]) + tracking_remote = run_cmd(["git", "config", "branch." + local_branch + ".remote"]) + return run_cmd(["git", "config", "remote." + tracking_remote + ".url"]) + except subprocess.CalledProcessError: # Not on a branch, fallback + return run_cmd_default(["git", "config", "--get", "remote.origin.url"]) + + +@cache +def get_normalized_origin() -> str: + return get_origin() \ + .replace("git@", "", 1) \ + .replace(".git", "", 1) \ + .replace("https://", "", 1) \ + .replace(":", "/", 1) diff --git a/common/run.py b/common/run.py new file mode 100644 index 0000000000..25abe98c41 --- /dev/null +++ b/common/run.py @@ -0,0 +1,13 @@ +import subprocess + + +def run_cmd(cmd: list[str]) -> str: + return subprocess.check_output(cmd, encoding='utf8').strip() + + +def run_cmd_default(cmd: list[str], default: str = "") -> str: + try: + return run_cmd(cmd) + except subprocess.CalledProcessError: + return default + diff --git a/common/utils.py b/common/utils.py index b9de020ee6..e37f2448c5 100644 --- a/common/utils.py +++ b/common/utils.py @@ -1,3 +1,11 @@ +from collections.abc import Callable +from functools import lru_cache +from typing import TypeVar + + +_RT = TypeVar("_RT") + + class Freezable: _frozen: bool = False @@ -9,3 +17,7 @@ class Freezable: if self._frozen: raise Exception("cannot modify frozen object") super().__setattr__(*args, **kwargs) + + +def cache(user_function: Callable[..., _RT], /) -> Callable[..., _RT]: + return lru_cache(maxsize=None)(user_function) diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index 9f901498b7..d228af572c 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -32,12 +32,13 @@ from cereal import log from cereal.services import SERVICE_LIST from openpilot.common.api import Api from openpilot.common.file_helpers import CallbackReader +from openpilot.common.git import get_commit, get_normalized_origin, get_short_branch from openpilot.common.params import Params from openpilot.common.realtime import set_core_affinity from openpilot.system.hardware import HARDWARE, PC from openpilot.system.loggerd.xattr_cache import getxattr, setxattr from openpilot.common.swaglog import cloudlog -from openpilot.system.version import get_commit, get_normalized_origin, get_short_branch, get_version +from openpilot.system.version import get_version from openpilot.system.hardware.hw import Paths diff --git a/selfdrive/athena/manage_athenad.py b/selfdrive/athena/manage_athenad.py index 486e426911..3065bed5c7 100755 --- a/selfdrive/athena/manage_athenad.py +++ b/selfdrive/athena/manage_athenad.py @@ -7,7 +7,8 @@ from openpilot.common.params import Params from openpilot.selfdrive.manager.process import launcher from openpilot.common.swaglog import cloudlog from openpilot.system.hardware import HARDWARE -from openpilot.system.version import get_version, get_normalized_origin, get_short_branch, get_commit, is_dirty +from openpilot.common.git import get_commit, get_normalized_origin, get_short_branch +from openpilot.system.version import get_version, is_dirty ATHENA_MGR_PID_PARAM = "AthenadPid" diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 77bc787078..e6f91130b9 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -12,6 +12,7 @@ from cereal.visionipc import VisionIpcClient, VisionStreamType from openpilot.common.conversions import Conversions as CV +from openpilot.common.git import get_short_branch from openpilot.common.numpy_fast import clip from openpilot.common.params import Params from openpilot.common.realtime import config_realtime_process, Priority, Ratekeeper, DT_CTRL @@ -30,7 +31,6 @@ from openpilot.selfdrive.controls.lib.longcontrol import LongControl from openpilot.selfdrive.controls.lib.vehicle_model import VehicleModel from openpilot.system.hardware import HARDWARE -from openpilot.system.version import get_short_branch SOFT_DISABLE_TIME = 3 # seconds LDW_MIN_SPEED = 31 * CV.MPH_TO_MS diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index c5228ef7f2..c6e9504f35 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -7,9 +7,9 @@ from collections.abc import Callable from cereal import log, car import cereal.messaging as messaging from openpilot.common.conversions import Conversions as CV +from openpilot.common.git import get_short_branch from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.locationd.calibrationd import MIN_SPEED_FILTER -from openpilot.system.version import get_short_branch AlertSize = log.ControlsState.AlertSize AlertStatus = log.ControlsState.AlertStatus diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 24dceaaf08..f30b81861a 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -16,9 +16,10 @@ from openpilot.selfdrive.manager.process import ensure_running from openpilot.selfdrive.manager.process_config import managed_processes from openpilot.selfdrive.athena.registration import register, UNREGISTERED_DONGLE_ID from openpilot.common.swaglog import cloudlog, add_file_handler -from openpilot.system.version import is_dirty, get_commit, get_version, get_origin, get_short_branch, \ +from openpilot.common.git import get_commit, get_origin, get_short_branch, get_commit_date +from openpilot.system.version import is_dirty, get_version, \ get_normalized_origin, terms_version, training_version, \ - is_tested_branch, is_release_branch, get_commit_date + is_tested_branch, is_release_branch diff --git a/selfdrive/sentry.py b/selfdrive/sentry.py index 5b63a9fe2d..889178610f 100644 --- a/selfdrive/sentry.py +++ b/selfdrive/sentry.py @@ -6,9 +6,9 @@ from sentry_sdk.integrations.threading import ThreadingIntegration from openpilot.common.params import Params from openpilot.selfdrive.athena.registration import is_registered_device from openpilot.system.hardware import HARDWARE, PC +from openpilot.common.git import get_commit, get_branch, get_origin from openpilot.common.swaglog import cloudlog -from openpilot.system.version import get_branch, get_commit, get_origin, get_version, \ - is_comma_remote, is_dirty, is_tested_branch +from openpilot.system.version import get_version, is_comma_remote, is_dirty, is_tested_branch class SentryProject(Enum): diff --git a/selfdrive/test/process_replay/model_replay.py b/selfdrive/test/process_replay/model_replay.py index 94895285df..9db05cfc82 100755 --- a/selfdrive/test/process_replay/model_replay.py +++ b/selfdrive/test/process_replay/model_replay.py @@ -6,13 +6,13 @@ from collections import defaultdict from typing import Any import cereal.messaging as messaging +from openpilot.common.git import get_commit from openpilot.common.params import Params from openpilot.system.hardware import PC from openpilot.selfdrive.manager.process_config import managed_processes from openpilot.tools.lib.openpilotci import BASE_URL, get_url from openpilot.selfdrive.test.process_replay.compare_logs import compare_logs, format_diff from openpilot.selfdrive.test.process_replay.process_replay import get_process_config, replay_process -from openpilot.system.version import get_commit from openpilot.tools.lib.framereader import FrameReader from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.helpers import save_log diff --git a/selfdrive/test/process_replay/test_debayer.py b/selfdrive/test/process_replay/test_debayer.py index edf2cbd469..805d73db88 100755 --- a/selfdrive/test/process_replay/test_debayer.py +++ b/selfdrive/test/process_replay/test_debayer.py @@ -9,7 +9,7 @@ import pyopencl as cl # install with `PYOPENCL_CL_PRETEND_VERSION=2.0 pip insta from openpilot.system.hardware import PC, TICI from openpilot.common.basedir import BASEDIR from openpilot.tools.lib.openpilotci import BASE_URL -from openpilot.system.version import get_commit +from openpilot.common.git import get_commit from openpilot.system.camerad.snapshot.snapshot import yuv_to_rgb from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.filereader import FileReader diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index 99f04600a5..ce1daddf42 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -7,11 +7,11 @@ from collections import defaultdict from tqdm import tqdm from typing import Any +from openpilot.common.git import get_commit from openpilot.selfdrive.car.car_helpers import interface_names from openpilot.tools.lib.openpilotci import get_url, upload_file from openpilot.selfdrive.test.process_replay.compare_logs import compare_logs, format_diff from openpilot.selfdrive.test.process_replay.process_replay import CONFIGS, PROC_REPLAY_DIR, FAKEDATA, check_openpilot_enabled, replay_process -from openpilot.system.version import get_commit from openpilot.tools.lib.filereader import FileReader from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.helpers import save_log diff --git a/selfdrive/tombstoned.py b/selfdrive/tombstoned.py index ba3582d130..f1b8c88083 100755 --- a/selfdrive/tombstoned.py +++ b/selfdrive/tombstoned.py @@ -11,8 +11,8 @@ from typing import NoReturn import openpilot.selfdrive.sentry as sentry from openpilot.system.hardware.hw import Paths +from openpilot.common.git import get_commit from openpilot.common.swaglog import cloudlog -from openpilot.system.version import get_commit MAX_SIZE = 1_000_000 * 100 # allow up to 100M MAX_TOMBSTONE_FN_LEN = 62 # 85 - 23 ("/crash/") diff --git a/system/version.py b/system/version.py index 4319ef2140..7452506846 100755 --- a/system/version.py +++ b/system/version.py @@ -1,12 +1,13 @@ #!/usr/bin/env python3 import os import subprocess -from typing import TypeVar -from collections.abc import Callable -from functools import lru_cache + from openpilot.common.basedir import BASEDIR from openpilot.common.swaglog import cloudlog +from openpilot.common.utils import cache +from openpilot.common.git import get_origin, get_branch, get_short_branch, get_normalized_origin, get_commit_date + RELEASE_BRANCHES = ['release3-staging', 'release3', 'nightly'] TESTED_BRANCHES = RELEASE_BRANCHES + ['devel', 'devel-staging'] @@ -14,60 +15,6 @@ TESTED_BRANCHES = RELEASE_BRANCHES + ['devel', 'devel-staging'] training_version: bytes = b"0.2.0" terms_version: bytes = b"2" -_RT = TypeVar("_RT") -def cache(user_function: Callable[..., _RT], /) -> Callable[..., _RT]: - return lru_cache(maxsize=None)(user_function) - - -def run_cmd(cmd: list[str]) -> str: - return subprocess.check_output(cmd, encoding='utf8').strip() - - -def run_cmd_default(cmd: list[str], default: str = "") -> str: - try: - return run_cmd(cmd) - except subprocess.CalledProcessError: - return default - - -@cache -def get_commit(branch: str = "HEAD") -> str: - return run_cmd_default(["git", "rev-parse", branch]) - - -@cache -def get_commit_date(commit: str = "HEAD") -> str: - return run_cmd_default(["git", "show", "--no-patch", "--format='%ct %ci'", commit]) - - -@cache -def get_short_branch() -> str: - return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "HEAD"]) - - -@cache -def get_branch() -> str: - return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]) - - -@cache -def get_origin() -> str: - try: - local_branch = run_cmd(["git", "name-rev", "--name-only", "HEAD"]) - tracking_remote = run_cmd(["git", "config", "branch." + local_branch + ".remote"]) - return run_cmd(["git", "config", "remote." + tracking_remote + ".url"]) - except subprocess.CalledProcessError: # Not on a branch, fallback - return run_cmd_default(["git", "config", "--get", "remote.origin.url"]) - - -@cache -def get_normalized_origin() -> str: - return get_origin() \ - .replace("git@", "", 1) \ - .replace(".git", "", 1) \ - .replace("https://", "", 1) \ - .replace(":", "/", 1) - @cache def get_version() -> str: From 018b6d0fae1660b4e2916d9ce834daad47503668 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 19 Mar 2024 15:58:30 -0400 Subject: [PATCH 088/384] parameterize get_version and add get_release_notes function (#31922) version --- system/version.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/system/version.py b/system/version.py index 7452506846..7ae8313089 100755 --- a/system/version.py +++ b/system/version.py @@ -16,12 +16,17 @@ training_version: bytes = b"0.2.0" terms_version: bytes = b"2" -@cache -def get_version() -> str: - with open(os.path.join(BASEDIR, "common", "version.h")) as _versionf: +def get_version(path: str = BASEDIR) -> str: + with open(os.path.join(path, "common", "version.h")) as _versionf: version = _versionf.read().split('"')[1] return version + +def get_release_notes(path: str = BASEDIR) -> str: + with open(os.path.join(path, "RELEASES.md"), "r") as f: + return f.read().split('\n\n', 1)[0] + + @cache def get_short_version() -> str: return get_version().split('-')[0] From 3a7582d9a624ab7b43fd6cf98a19657252b11850 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 19 Mar 2024 13:46:31 -0700 Subject: [PATCH 089/384] Abstract out common CarInterface.apply (#31924) --- selfdrive/car/body/interface.py | 3 --- selfdrive/car/chrysler/interface.py | 3 --- selfdrive/car/ford/interface.py | 3 --- selfdrive/car/gm/interface.py | 3 --- selfdrive/car/honda/interface.py | 5 ----- selfdrive/car/hyundai/interface.py | 3 --- selfdrive/car/interfaces.py | 10 +++++----- selfdrive/car/mazda/interface.py | 3 --- selfdrive/car/mock/interface.py | 4 ---- selfdrive/car/nissan/interface.py | 3 --- selfdrive/car/subaru/interface.py | 3 --- selfdrive/car/tesla/interface.py | 3 --- selfdrive/car/toyota/interface.py | 5 ----- selfdrive/car/volkswagen/carcontroller.py | 7 ++++--- selfdrive/car/volkswagen/interface.py | 7 +------ 15 files changed, 10 insertions(+), 55 deletions(-) diff --git a/selfdrive/car/body/interface.py b/selfdrive/car/body/interface.py index 4d72d2f604..f797a7ecf8 100644 --- a/selfdrive/car/body/interface.py +++ b/selfdrive/car/body/interface.py @@ -37,6 +37,3 @@ class CarInterface(CarInterfaceBase): self.frame += 1 return ret - - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index e799767f26..34298a1ead 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -94,6 +94,3 @@ class CarInterface(CarInterfaceBase): ret.events = events.to_msg() return ret - - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index ed8b010491..7dca458083 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -71,6 +71,3 @@ class CarInterface(CarInterfaceBase): ret.events = events.to_msg() return ret - - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 1336e23c70..f470d6f468 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -237,6 +237,3 @@ class CarInterface(CarInterfaceBase): ret.events = events.to_msg() return ret - - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 812b60d479..9d76beb649 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -257,8 +257,3 @@ class CarInterface(CarInterfaceBase): ret.events = events.to_msg() return ret - - # pass in a car.CarControl - # to be called @ 100hz - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index 69b5132806..7f8cf05907 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -175,6 +175,3 @@ class CarInterface(CarInterfaceBase): ret.events = events.to_msg() return ret - - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 97c9e84c96..be1518a25a 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -93,10 +93,13 @@ class CarInterfaceBase(ABC): self.cp_loopback = self.CS.get_loopback_can_parser(CP) self.can_parsers = [self.cp, self.cp_cam, self.cp_adas, self.cp_body, self.cp_loopback] - self.CC = None + self.CC: CarControllerBase = None if CarController is not None: self.CC = CarController(self.cp.dbc_name, CP, self.VM) + def apply(self, c: car.CarControl, now_nanos: int) -> tuple[car.CarControl.Actuators, list[tuple[int, int, bytes, int]]]: + return self.CC.update(c, self.CS, now_nanos) + @staticmethod def get_pid_accel_limits(CP, current_speed, cruise_speed): return ACCEL_MIN, ACCEL_MAX @@ -250,9 +253,6 @@ class CarInterfaceBase(ABC): return reader - @abstractmethod - def apply(self, c: car.CarControl, now_nanos: int) -> tuple[car.CarControl.Actuators, list[bytes]]: - pass def create_common_events(self, cs_out, extra_gears=None, pcm_enable=True, allow_enable=True, enable_buttons=(ButtonType.accelCruise, ButtonType.decelCruise)): @@ -460,7 +460,7 @@ SendCan = tuple[int, int, bytes, int] class CarControllerBase(ABC): @abstractmethod - def update(self, CC, CS, now_nanos) -> tuple[car.CarControl.Actuators, list[SendCan]]: + def update(self, CC: car.CarControl.Actuators, CS: car.CarState, now_nanos: int) -> tuple[car.CarControl.Actuators, list[SendCan]]: pass diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index 12d156fee8..a0fa73c021 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -48,6 +48,3 @@ class CarInterface(CarInterfaceBase): ret.events = events.to_msg() return ret - - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/mock/interface.py b/selfdrive/car/mock/interface.py index 2e4ac43033..6100717a74 100755 --- a/selfdrive/car/mock/interface.py +++ b/selfdrive/car/mock/interface.py @@ -29,7 +29,3 @@ class CarInterface(CarInterfaceBase): ret.vEgoRaw = self.sm[gps_sock].speed return ret - - def apply(self, c, now_nanos): - actuators = car.CarControl.Actuators.new_message() - return actuators, [] diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index 3e82b5192e..170f7de287 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -42,6 +42,3 @@ class CarInterface(CarInterfaceBase): ret.events = events.to_msg() return ret - - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index 30e186bd09..340090ffa9 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -114,6 +114,3 @@ class CarInterface(CarInterfaceBase): def init(CP, logcan, sendcan): if CP.flags & SubaruFlags.DISABLE_EYESIGHT: disable_ecu(logcan, sendcan, bus=2, addr=GLOBAL_ES_ADDR, com_cont_req=b'\x28\x03\x01') - - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/tesla/interface.py b/selfdrive/car/tesla/interface.py index f989886738..9577578f5d 100755 --- a/selfdrive/car/tesla/interface.py +++ b/selfdrive/car/tesla/interface.py @@ -50,6 +50,3 @@ class CarInterface(CarInterfaceBase): ret.events = self.create_common_events(ret).to_msg() return ret - - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 3683e7d049..424a885d53 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -200,8 +200,3 @@ class CarInterface(CarInterfaceBase): ret.events = events.to_msg() return ret - - # pass in a car.CarControl - # to be called @ 100hz - def apply(self, c, now_nanos): - return self.CC.update(c, self.CS, now_nanos) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index cfba43b4da..37a4ed36b8 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -18,6 +18,7 @@ class CarController(CarControllerBase): self.CCP = CarControllerParams(CP) self.CCS = pqcan if CP.flags & VolkswagenFlags.PQ else mqbcan self.packer_pt = CANPacker(dbc_name) + self.ext_bus = CANBUS.pt if CP.networkLocation == car.CarParams.NetworkLocation.fwdCamera else CANBUS.cam self.apply_steer_last = 0 self.gra_acc_counter_last = None @@ -26,7 +27,7 @@ class CarController(CarControllerBase): self.hca_frame_timer_running = 0 self.hca_frame_same_torque = 0 - def update(self, CC, CS, ext_bus, now_nanos): + def update(self, CC, CS, now_nanos): actuators = CC.actuators hud_control = CC.hudControl can_sends = [] @@ -108,7 +109,7 @@ class CarController(CarControllerBase): gra_send_ready = self.CP.pcmCruise and CS.gra_stock_values["COUNTER"] != self.gra_acc_counter_last if gra_send_ready and (CC.cruiseControl.cancel or CC.cruiseControl.resume): - can_sends.append(self.CCS.create_acc_buttons_control(self.packer_pt, ext_bus, CS.gra_stock_values, + can_sends.append(self.CCS.create_acc_buttons_control(self.packer_pt, self.ext_bus, CS.gra_stock_values, cancel=CC.cruiseControl.cancel, resume=CC.cruiseControl.resume)) new_actuators = actuators.copy() @@ -117,4 +118,4 @@ class CarController(CarControllerBase): self.gra_acc_counter_last = CS.gra_stock_values["COUNTER"] self.frame += 1 - return new_actuators, can_sends, self.eps_timer_soft_disable_alert + return new_actuators, can_sends diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 43a8bcdddc..83a8cde9a8 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -19,8 +19,6 @@ class CarInterface(CarInterfaceBase): self.ext_bus = CANBUS.cam self.cp_ext = self.cp_cam - self.eps_timer_soft_disable_alert = False - @staticmethod def _get_params(ret, candidate: CAR, fingerprint, car_fw, experimental_long, docs): ret.carName = "volkswagen" @@ -126,13 +124,10 @@ class CarInterface(CarInterfaceBase): if c.enabled and ret.vEgo < self.CP.minEnableSpeed: events.add(EventName.speedTooLow) - if self.eps_timer_soft_disable_alert: + if self.CC.eps_timer_soft_disable_alert: events.add(EventName.steerTimeLimit) ret.events = events.to_msg() return ret - def apply(self, c, now_nanos): - new_actuators, can_sends, self.eps_timer_soft_disable_alert = self.CC.update(c, self.CS, self.ext_bus, now_nanos) - return new_actuators, can_sends From afc96972c80743378ad0e091d9dca8c216b09298 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 19 Mar 2024 14:16:33 -0700 Subject: [PATCH 090/384] car: CarController and CarState are always present (#31925) * always set * add mock * little more * fix * fix --- selfdrive/car/car_helpers.py | 14 ++----------- selfdrive/car/interfaces.py | 32 +++++++++++++++-------------- selfdrive/car/mock/carcontroller.py | 5 +++++ selfdrive/car/mock/carstate.py | 4 ++++ 4 files changed, 28 insertions(+), 27 deletions(-) create mode 100644 selfdrive/car/mock/carcontroller.py create mode 100644 selfdrive/car/mock/carstate.py diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index f6f3960475..fd8ecc5020 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -4,7 +4,6 @@ from collections.abc import Callable from cereal import car from openpilot.common.params import Params -from openpilot.common.basedir import BASEDIR from openpilot.system.version import is_comma_remote, is_tested_branch from openpilot.selfdrive.car.interfaces import get_interface_attr from openpilot.selfdrive.car.fingerprints import eliminate_incompatible_cars, all_legacy_fingerprint_cars @@ -48,17 +47,8 @@ def load_interfaces(brand_names): for brand_name in brand_names: path = f'openpilot.selfdrive.car.{brand_name}' CarInterface = __import__(path + '.interface', fromlist=['CarInterface']).CarInterface - - if os.path.exists(BASEDIR + '/' + path.replace('.', '/') + '/carstate.py'): - CarState = __import__(path + '.carstate', fromlist=['CarState']).CarState - else: - CarState = None - - if os.path.exists(BASEDIR + '/' + path.replace('.', '/') + '/carcontroller.py'): - CarController = __import__(path + '.carcontroller', fromlist=['CarController']).CarController - else: - CarController = None - + CarState = __import__(path + '.carstate', fromlist=['CarState']).CarState + CarController = __import__(path + '.carcontroller', fromlist=['CarController']).CarController for model_name in brand_names[brand_name]: ret[model_name] = (CarInterface, CarController, CarState) return ret diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index be1518a25a..b6a626edec 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -81,21 +81,16 @@ class CarInterfaceBase(ABC): self.silent_steer_warning = True self.v_ego_cluster_seen = False - self.CS = None - self.can_parsers = [] - if CarState is not None: - self.CS = CarState(CP) - - self.cp = self.CS.get_can_parser(CP) - self.cp_cam = self.CS.get_cam_can_parser(CP) - self.cp_adas = self.CS.get_adas_can_parser(CP) - self.cp_body = self.CS.get_body_can_parser(CP) - self.cp_loopback = self.CS.get_loopback_can_parser(CP) - self.can_parsers = [self.cp, self.cp_cam, self.cp_adas, self.cp_body, self.cp_loopback] - - self.CC: CarControllerBase = None - if CarController is not None: - self.CC = CarController(self.cp.dbc_name, CP, self.VM) + self.CS = CarState(CP) + self.cp = self.CS.get_can_parser(CP) + self.cp_cam = self.CS.get_cam_can_parser(CP) + self.cp_adas = self.CS.get_adas_can_parser(CP) + self.cp_body = self.CS.get_body_can_parser(CP) + self.cp_loopback = self.CS.get_loopback_can_parser(CP) + self.can_parsers = [self.cp, self.cp_cam, self.cp_adas, self.cp_body, self.cp_loopback] + + dbc_name = "" if self.cp is None else self.cp.dbc_name + self.CC: CarControllerBase = CarController(dbc_name, CP, self.VM) def apply(self, c: car.CarControl, now_nanos: int) -> tuple[car.CarControl.Actuators, list[tuple[int, int, bytes, int]]]: return self.CC.update(c, self.CS, now_nanos) @@ -438,6 +433,10 @@ class CarStateBase(ABC): } return d.get(gear.upper(), GearShifter.unknown) + @staticmethod + def get_can_parser(CP): + return None + @staticmethod def get_cam_can_parser(CP): return None @@ -459,6 +458,9 @@ SendCan = tuple[int, int, bytes, int] class CarControllerBase(ABC): + def __init__(self, dbc_name: str, CP, VM): + pass + @abstractmethod def update(self, CC: car.CarControl.Actuators, CS: car.CarState, now_nanos: int) -> tuple[car.CarControl.Actuators, list[SendCan]]: pass diff --git a/selfdrive/car/mock/carcontroller.py b/selfdrive/car/mock/carcontroller.py new file mode 100644 index 0000000000..2b2da954ff --- /dev/null +++ b/selfdrive/car/mock/carcontroller.py @@ -0,0 +1,5 @@ +from openpilot.selfdrive.car.interfaces import CarControllerBase + +class CarController(CarControllerBase): + def update(self, CC, CS, now_nanos): + return CC.actuators.copy(), [] diff --git a/selfdrive/car/mock/carstate.py b/selfdrive/car/mock/carstate.py new file mode 100644 index 0000000000..ece908b51c --- /dev/null +++ b/selfdrive/car/mock/carstate.py @@ -0,0 +1,4 @@ +from openpilot.selfdrive.car.interfaces import CarStateBase + +class CarState(CarStateBase): + pass From b0eb3ba4f477142797624580eb3fdb6448f068d6 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 19 Mar 2024 20:29:50 -0400 Subject: [PATCH 091/384] cars: platform enums -> prepend brand name (#31927) * with brand name * migrate * Fix * fixes * more * passes * fix * fix the doc * collects * these too * more stuff * body exception :/ * more * hardcode i guess * update ref * toyota * more toyota * and here * final! * fix notebooks and ccs * move this here --- scripts/launch_corolla.sh | 2 +- selfdrive/car/body/fingerprints.py | 4 +- selfdrive/car/body/values.py | 2 +- selfdrive/car/chrysler/fingerprints.py | 10 +- selfdrive/car/chrysler/interface.py | 5 +- selfdrive/car/chrysler/values.py | 20 +- selfdrive/car/docs_definitions.py | 2 +- selfdrive/car/fingerprints.py | 364 +++++++++--------- selfdrive/car/ford/fingerprints.py | 16 +- selfdrive/car/ford/values.py | 18 +- selfdrive/car/gm/fingerprints.py | 18 +- selfdrive/car/gm/gmcan.py | 2 +- selfdrive/car/gm/interface.py | 30 +- selfdrive/car/gm/tests/test_gm.py | 4 +- selfdrive/car/gm/values.py | 26 +- selfdrive/car/honda/carstate.py | 26 +- selfdrive/car/honda/fingerprints.py | 36 +- selfdrive/car/honda/hondacan.py | 2 +- selfdrive/car/honda/interface.py | 38 +- selfdrive/car/honda/values.py | 68 ++-- selfdrive/car/hyundai/carstate.py | 2 +- selfdrive/car/hyundai/fingerprints.py | 76 ++-- selfdrive/car/hyundai/hyundaican.py | 12 +- selfdrive/car/hyundai/interface.py | 2 +- selfdrive/car/hyundai/tests/test_hyundai.py | 28 +- selfdrive/car/hyundai/values.py | 88 ++--- selfdrive/car/mazda/fingerprints.py | 12 +- selfdrive/car/mazda/interface.py | 4 +- selfdrive/car/mazda/values.py | 16 +- selfdrive/car/nissan/carcontroller.py | 6 +- selfdrive/car/nissan/carstate.py | 44 +-- selfdrive/car/nissan/fingerprints.py | 18 +- selfdrive/car/nissan/interface.py | 2 +- selfdrive/car/nissan/nissancan.py | 2 +- selfdrive/car/nissan/values.py | 10 +- selfdrive/car/subaru/fingerprints.py | 30 +- selfdrive/car/subaru/interface.py | 18 +- selfdrive/car/subaru/values.py | 46 +-- selfdrive/car/tesla/carstate.py | 8 +- selfdrive/car/tesla/fingerprints.py | 6 +- selfdrive/car/tesla/interface.py | 2 +- selfdrive/car/tesla/radar_interface.py | 4 +- selfdrive/car/tesla/values.py | 12 +- selfdrive/car/tests/routes.py | 340 ++++++++-------- selfdrive/car/tests/test_can_fingerprint.py | 2 +- selfdrive/car/tests/test_docs.py | 2 +- selfdrive/car/tests/test_lateral_limits.py | 4 +- selfdrive/car/tests/test_models.py | 4 +- .../car/torque_data/neural_ff_weights.json | 2 +- selfdrive/car/torque_data/override.toml | 82 ++-- selfdrive/car/torque_data/params.toml | 125 +++--- selfdrive/car/torque_data/substitute.toml | 118 +++--- selfdrive/car/toyota/carcontroller.py | 2 +- selfdrive/car/toyota/carstate.py | 8 +- selfdrive/car/toyota/fingerprints.py | 44 +-- selfdrive/car/toyota/interface.py | 10 +- selfdrive/car/toyota/tests/test_toyota.py | 12 +- selfdrive/car/toyota/values.py | 116 +++--- selfdrive/car/volkswagen/fingerprints.py | 32 +- selfdrive/car/volkswagen/values.py | 34 +- .../controls/lib/tests/test_latcontrol.py | 2 +- .../controls/lib/tests/test_vehicle_model.py | 2 +- selfdrive/controls/tests/test_leads.py | 2 +- selfdrive/controls/tests/test_startup.py | 12 +- selfdrive/test/helpers.py | 2 +- .../test/longitudinal_maneuvers/plant.py | 2 +- selfdrive/test/process_replay/migration.py | 4 +- selfdrive/test/process_replay/ref_commit | 2 +- selfdrive/test/process_replay/test_fuzzy.py | 2 +- .../test/process_replay/test_processes.py | 36 +- selfdrive/test/process_replay/test_regen.py | 2 +- selfdrive/test/profiling/profiler.py | 4 +- .../examples/subaru_fuzzy_fingerprint.ipynb | 14 +- .../examples/subaru_long_accel.ipynb | 4 +- .../examples/subaru_steer_temp_fault.ipynb | 4 +- tools/lib/comma_car_segments.py | 11 +- tools/lib/tests/test_comma_car_segments.py | 8 +- 77 files changed, 1099 insertions(+), 1092 deletions(-) diff --git a/scripts/launch_corolla.sh b/scripts/launch_corolla.sh index aa0243e600..4e5bca6ce5 100755 --- a/scripts/launch_corolla.sh +++ b/scripts/launch_corolla.sh @@ -2,6 +2,6 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -export FINGERPRINT="COROLLA_TSS2" +export FINGERPRINT="TOYOTA_COROLLA_TSS2" export SKIP_FW_QUERY="1" $DIR/../launch_openpilot.sh diff --git a/selfdrive/car/body/fingerprints.py b/selfdrive/car/body/fingerprints.py index 6efaabc137..ab7a5f8d7b 100644 --- a/selfdrive/car/body/fingerprints.py +++ b/selfdrive/car/body/fingerprints.py @@ -8,13 +8,13 @@ Ecu = car.CarParams.Ecu FINGERPRINTS = { - CAR.BODY: [{ + CAR.COMMA_BODY: [{ 513: 8, 516: 8, 514: 3, 515: 4 }], } FW_VERSIONS = { - CAR.BODY: { + CAR.COMMA_BODY: { (Ecu.engine, 0x720, None): [ b'0.0.01', b'0.3.00a', diff --git a/selfdrive/car/body/values.py b/selfdrive/car/body/values.py index e570af0f69..a1195f7cb5 100644 --- a/selfdrive/car/body/values.py +++ b/selfdrive/car/body/values.py @@ -20,7 +20,7 @@ class CarControllerParams: class CAR(Platforms): - BODY = PlatformConfig( + COMMA_BODY = PlatformConfig( [CarDocs("comma body", package="All")], CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44), dbc_dict('comma_body', None), diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 5f3438fd92..81533e6629 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -4,7 +4,7 @@ from openpilot.selfdrive.car.chrysler.values import CAR Ecu = car.CarParams.Ecu FW_VERSIONS = { - CAR.PACIFICA_2017_HYBRID: { + CAR.CHRYSLER_PACIFICA_2017_HYBRID: { (Ecu.combinationMeter, 0x742, None): [ b'68239262AH', b'68239262AI', @@ -33,7 +33,7 @@ FW_VERSIONS = { b'05190226AK', ], }, - CAR.PACIFICA_2018: { + CAR.CHRYSLER_PACIFICA_2018: { (Ecu.combinationMeter, 0x742, None): [ b'68227902AF', b'68227902AG', @@ -90,7 +90,7 @@ FW_VERSIONS = { b'68380571AB', ], }, - CAR.PACIFICA_2020: { + CAR.CHRYSLER_PACIFICA_2020: { (Ecu.combinationMeter, 0x742, None): [ b'68405327AC', b'68436233AB', @@ -162,7 +162,7 @@ FW_VERSIONS = { b'68586231AD', ], }, - CAR.PACIFICA_2018_HYBRID: { + CAR.CHRYSLER_PACIFICA_2018_HYBRID: { (Ecu.combinationMeter, 0x742, None): [ b'68358439AE', b'68358439AG', @@ -189,7 +189,7 @@ FW_VERSIONS = { b'05190226AM', ], }, - CAR.PACIFICA_2019_HYBRID: { + CAR.CHRYSLER_PACIFICA_2019_HYBRID: { (Ecu.combinationMeter, 0x742, None): [ b'68405292AC', b'68434956AC', diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 34298a1ead..217a1a756c 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -29,13 +29,14 @@ class CarInterface(CarInterfaceBase): CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) if candidate not in RAM_CARS: # Newer FW versions standard on the following platforms, or flashed by a dealer onto older platforms have a higher minimum steering speed. - new_eps_platform = candidate in (CAR.PACIFICA_2019_HYBRID, CAR.PACIFICA_2020, CAR.JEEP_GRAND_CHEROKEE_2019, CAR.DODGE_DURANGO) + new_eps_platform = candidate in (CAR.CHRYSLER_PACIFICA_2019_HYBRID, CAR.CHRYSLER_PACIFICA_2020, CAR.JEEP_GRAND_CHEROKEE_2019, CAR.DODGE_DURANGO) new_eps_firmware = any(fw.ecu == 'eps' and fw.fwVersion[:4] >= b"6841" for fw in car_fw) if new_eps_platform or new_eps_firmware: ret.flags |= ChryslerFlags.HIGHER_MIN_STEERING_SPEED.value # Chrysler - if candidate in (CAR.PACIFICA_2017_HYBRID, CAR.PACIFICA_2018, CAR.PACIFICA_2018_HYBRID, CAR.PACIFICA_2019_HYBRID, CAR.PACIFICA_2020, CAR.DODGE_DURANGO): + if candidate in (CAR.CHRYSLER_PACIFICA_2017_HYBRID, CAR.CHRYSLER_PACIFICA_2018, CAR.CHRYSLER_PACIFICA_2018_HYBRID, \ + CAR.CHRYSLER_PACIFICA_2019_HYBRID, CAR.CHRYSLER_PACIFICA_2020, CAR.DODGE_DURANGO): ret.lateralTuning.init('pid') ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kiBP = [[9., 20.], [9., 20.]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.15, 0.30], [0.03, 0.05]] diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 78d5131df5..42ea94cf86 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -32,34 +32,34 @@ class ChryslerCarSpecs(CarSpecs): class CAR(Platforms): # Chrysler - PACIFICA_2017_HYBRID = ChryslerPlatformConfig( + CHRYSLER_PACIFICA_2017_HYBRID = ChryslerPlatformConfig( [ChryslerCarDocs("Chrysler Pacifica Hybrid 2017")], ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2), ) - PACIFICA_2018_HYBRID = ChryslerPlatformConfig( + CHRYSLER_PACIFICA_2018_HYBRID = ChryslerPlatformConfig( [ChryslerCarDocs("Chrysler Pacifica Hybrid 2018")], - PACIFICA_2017_HYBRID.specs, + CHRYSLER_PACIFICA_2017_HYBRID.specs, ) - PACIFICA_2019_HYBRID = ChryslerPlatformConfig( + CHRYSLER_PACIFICA_2019_HYBRID = ChryslerPlatformConfig( [ChryslerCarDocs("Chrysler Pacifica Hybrid 2019-23")], - PACIFICA_2017_HYBRID.specs, + CHRYSLER_PACIFICA_2017_HYBRID.specs, ) - PACIFICA_2018 = ChryslerPlatformConfig( + CHRYSLER_PACIFICA_2018 = ChryslerPlatformConfig( [ChryslerCarDocs("Chrysler Pacifica 2017-18")], - PACIFICA_2017_HYBRID.specs, + CHRYSLER_PACIFICA_2017_HYBRID.specs, ) - PACIFICA_2020 = ChryslerPlatformConfig( + CHRYSLER_PACIFICA_2020 = ChryslerPlatformConfig( [ ChryslerCarDocs("Chrysler Pacifica 2019-20"), ChryslerCarDocs("Chrysler Pacifica 2021-23", package="All"), ], - PACIFICA_2017_HYBRID.specs, + CHRYSLER_PACIFICA_2017_HYBRID.specs, ) # Dodge DODGE_DURANGO = ChryslerPlatformConfig( [ChryslerCarDocs("Dodge Durango 2020-21")], - PACIFICA_2017_HYBRID.specs, + CHRYSLER_PACIFICA_2017_HYBRID.specs, ) # Jeep diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index 02e31fa8e6..fe717d930e 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -346,7 +346,7 @@ class CarDocs: return sentence_builder.format(car_model=f"{self.make} {self.model}", alc=alc, acc=acc) else: - if CP.carFingerprint == "BODY": + if CP.carFingerprint == "COMMA_BODY": return "The body is a robotics dev kit that can run openpilot. Learn more." else: raise Exception(f"This notCar does not have a detail sentence: {CP.carFingerprint}") diff --git a/selfdrive/car/fingerprints.py b/selfdrive/car/fingerprints.py index 31c45876c2..977df6bc9f 100644 --- a/selfdrive/car/fingerprints.py +++ b/selfdrive/car/fingerprints.py @@ -64,32 +64,32 @@ MIGRATION = { "ACURA RDX 2018 ACURAWATCH PLUS": HONDA.ACURA_RDX, "ACURA RDX 2020 TECH": HONDA.ACURA_RDX_3G, "AUDI A3": VW.AUDI_A3_MK3, - "HONDA ACCORD 2018 HYBRID TOURING": HONDA.ACCORD, - "HONDA ACCORD 1.5T 2018": HONDA.ACCORD, - "HONDA ACCORD 2018 LX 1.5T": HONDA.ACCORD, - "HONDA ACCORD 2018 SPORT 2T": HONDA.ACCORD, - "HONDA ACCORD 2T 2018": HONDA.ACCORD, - "HONDA ACCORD HYBRID 2018": HONDA.ACCORD, - "HONDA CIVIC 2016 TOURING": HONDA.CIVIC, - "HONDA CIVIC HATCHBACK 2017 SEDAN/COUPE 2019": HONDA.CIVIC_BOSCH, - "HONDA CIVIC SEDAN 1.6 DIESEL": HONDA.CIVIC_BOSCH_DIESEL, - "HONDA CR-V 2016 EXECUTIVE": HONDA.CRV_EU, - "HONDA CR-V 2016 TOURING": HONDA.CRV, - "HONDA CR-V 2017 EX": HONDA.CRV_5G, - "HONDA CR-V 2019 HYBRID": HONDA.CRV_HYBRID, - "HONDA FIT 2018 EX": HONDA.FIT, - "HONDA HRV 2019 TOURING": HONDA.HRV, - "HONDA INSIGHT 2019 TOURING": HONDA.INSIGHT, - "HONDA ODYSSEY 2018 EX-L": HONDA.ODYSSEY, - "HONDA ODYSSEY 2019 EXCLUSIVE CHN": HONDA.ODYSSEY_CHN, - "HONDA PILOT 2017 TOURING": HONDA.PILOT, - "HONDA PILOT 2019 ELITE": HONDA.PILOT, - "HONDA PILOT 2019": HONDA.PILOT, - "HONDA PASSPORT 2021": HONDA.PILOT, - "HONDA RIDGELINE 2017 BLACK EDITION": HONDA.RIDGELINE, - "HYUNDAI ELANTRA LIMITED ULTIMATE 2017": HYUNDAI.ELANTRA, - "HYUNDAI SANTA FE LIMITED 2019": HYUNDAI.SANTA_FE, - "HYUNDAI TUCSON DIESEL 2019": HYUNDAI.TUCSON, + "HONDA ACCORD 2018 HYBRID TOURING": HONDA.HONDA_ACCORD, + "HONDA ACCORD 1.5T 2018": HONDA.HONDA_ACCORD, + "HONDA ACCORD 2018 LX 1.5T": HONDA.HONDA_ACCORD, + "HONDA ACCORD 2018 SPORT 2T": HONDA.HONDA_ACCORD, + "HONDA ACCORD 2T 2018": HONDA.HONDA_ACCORD, + "HONDA ACCORD HYBRID 2018": HONDA.HONDA_ACCORD, + "HONDA CIVIC 2016 TOURING": HONDA.HONDA_CIVIC, + "HONDA CIVIC HATCHBACK 2017 SEDAN/COUPE 2019": HONDA.HONDA_CIVIC_BOSCH, + "HONDA CIVIC SEDAN 1.6 DIESEL": HONDA.HONDA_CIVIC_BOSCH_DIESEL, + "HONDA CR-V 2016 EXECUTIVE": HONDA.HONDA_CRV_EU, + "HONDA CR-V 2016 TOURING": HONDA.HONDA_CRV, + "HONDA CR-V 2017 EX": HONDA.HONDA_CRV_5G, + "HONDA CR-V 2019 HYBRID": HONDA.HONDA_CRV_HYBRID, + "HONDA FIT 2018 EX": HONDA.HONDA_FIT, + "HONDA HRV 2019 TOURING": HONDA.HONDA_HRV, + "HONDA INSIGHT 2019 TOURING": HONDA.HONDA_INSIGHT, + "HONDA ODYSSEY 2018 EX-L": HONDA.HONDA_ODYSSEY, + "HONDA ODYSSEY 2019 EXCLUSIVE CHN": HONDA.HONDA_ODYSSEY_CHN, + "HONDA PILOT 2017 TOURING": HONDA.HONDA_PILOT, + "HONDA PILOT 2019 ELITE": HONDA.HONDA_PILOT, + "HONDA PILOT 2019": HONDA.HONDA_PILOT, + "HONDA PASSPORT 2021": HONDA.HONDA_PILOT, + "HONDA RIDGELINE 2017 BLACK EDITION": HONDA.HONDA_RIDGELINE, + "HYUNDAI ELANTRA LIMITED ULTIMATE 2017": HYUNDAI.HYUNDAI_ELANTRA, + "HYUNDAI SANTA FE LIMITED 2019": HYUNDAI.HYUNDAI_SANTA_FE, + "HYUNDAI TUCSON DIESEL 2019": HYUNDAI.HYUNDAI_TUCSON, "KIA OPTIMA 2016": HYUNDAI.KIA_OPTIMA_G4, "KIA OPTIMA 2019": HYUNDAI.KIA_OPTIMA_G4_FL, "KIA OPTIMA SX 2019 & 2016": HYUNDAI.KIA_OPTIMA_G4_FL, @@ -102,118 +102,118 @@ MIGRATION = { "LEXUS RX 350 2016": TOYOTA.LEXUS_RX, "LEXUS RX350 2020": TOYOTA.LEXUS_RX_TSS2, "LEXUS RX450 HYBRID 2020": TOYOTA.LEXUS_RX_TSS2, - "TOYOTA SIENNA XLE 2018": TOYOTA.SIENNA, - "TOYOTA C-HR HYBRID 2018": TOYOTA.CHR, - "TOYOTA COROLLA HYBRID TSS2 2019": TOYOTA.COROLLA_TSS2, - "TOYOTA RAV4 HYBRID 2019": TOYOTA.RAV4_TSS2, + "TOYOTA SIENNA XLE 2018": TOYOTA.TOYOTA_SIENNA, + "TOYOTA C-HR HYBRID 2018": TOYOTA.TOYOTA_CHR, + "TOYOTA COROLLA HYBRID TSS2 2019": TOYOTA.TOYOTA_COROLLA_TSS2, + "TOYOTA RAV4 HYBRID 2019": TOYOTA.TOYOTA_RAV4_TSS2, "LEXUS ES HYBRID 2019": TOYOTA.LEXUS_ES_TSS2, "LEXUS NX HYBRID 2018": TOYOTA.LEXUS_NX, "LEXUS NX HYBRID 2020": TOYOTA.LEXUS_NX_TSS2, "LEXUS RX HYBRID 2020": TOYOTA.LEXUS_RX_TSS2, - "TOYOTA ALPHARD HYBRID 2021": TOYOTA.ALPHARD_TSS2, - "TOYOTA AVALON HYBRID 2019": TOYOTA.AVALON_2019, - "TOYOTA AVALON HYBRID 2022": TOYOTA.AVALON_TSS2, - "TOYOTA CAMRY HYBRID 2018": TOYOTA.CAMRY, - "TOYOTA CAMRY HYBRID 2021": TOYOTA.CAMRY_TSS2, - "TOYOTA C-HR HYBRID 2022": TOYOTA.CHR_TSS2, - "TOYOTA HIGHLANDER HYBRID 2020": TOYOTA.HIGHLANDER_TSS2, - "TOYOTA RAV4 HYBRID 2022": TOYOTA.RAV4_TSS2_2022, - "TOYOTA RAV4 HYBRID 2023": TOYOTA.RAV4_TSS2_2023, - "TOYOTA HIGHLANDER HYBRID 2018": TOYOTA.HIGHLANDER, + "TOYOTA ALPHARD HYBRID 2021": TOYOTA.TOYOTA_ALPHARD_TSS2, + "TOYOTA AVALON HYBRID 2019": TOYOTA.TOYOTA_AVALON_2019, + "TOYOTA AVALON HYBRID 2022": TOYOTA.TOYOTA_AVALON_TSS2, + "TOYOTA CAMRY HYBRID 2018": TOYOTA.TOYOTA_CAMRY, + "TOYOTA CAMRY HYBRID 2021": TOYOTA.TOYOTA_CAMRY_TSS2, + "TOYOTA C-HR HYBRID 2022": TOYOTA.TOYOTA_CHR_TSS2, + "TOYOTA HIGHLANDER HYBRID 2020": TOYOTA.TOYOTA_HIGHLANDER_TSS2, + "TOYOTA RAV4 HYBRID 2022": TOYOTA.TOYOTA_RAV4_TSS2_2022, + "TOYOTA RAV4 HYBRID 2023": TOYOTA.TOYOTA_RAV4_TSS2_2023, + "TOYOTA HIGHLANDER HYBRID 2018": TOYOTA.TOYOTA_HIGHLANDER, "LEXUS ES HYBRID 2018": TOYOTA.LEXUS_ES, "LEXUS RX HYBRID 2017": TOYOTA.LEXUS_RX, - "HYUNDAI TUCSON HYBRID 4TH GEN": HYUNDAI.TUCSON_4TH_GEN, + "HYUNDAI TUCSON HYBRID 4TH GEN": HYUNDAI.HYUNDAI_TUCSON_4TH_GEN, "KIA SPORTAGE HYBRID 5TH GEN": HYUNDAI.KIA_SPORTAGE_5TH_GEN, "KIA SORENTO PLUG-IN HYBRID 4TH GEN": HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, # Removal of platform_str, see https://github.com/commaai/openpilot/pull/31868/ - "COMMA BODY": BODY.BODY, - "CHRYSLER PACIFICA HYBRID 2017": CHRYSLER.PACIFICA_2017_HYBRID, - "CHRYSLER PACIFICA HYBRID 2018": CHRYSLER.PACIFICA_2018_HYBRID, - "CHRYSLER PACIFICA HYBRID 2019": CHRYSLER.PACIFICA_2019_HYBRID, - "CHRYSLER PACIFICA 2018": CHRYSLER.PACIFICA_2018, - "CHRYSLER PACIFICA 2020": CHRYSLER.PACIFICA_2020, + "COMMA BODY": BODY.COMMA_BODY, + "CHRYSLER PACIFICA HYBRID 2017": CHRYSLER.CHRYSLER_PACIFICA_2017_HYBRID, + "CHRYSLER PACIFICA HYBRID 2018": CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID, + "CHRYSLER PACIFICA HYBRID 2019": CHRYSLER.CHRYSLER_PACIFICA_2019_HYBRID, + "CHRYSLER PACIFICA 2018": CHRYSLER.CHRYSLER_PACIFICA_2018, + "CHRYSLER PACIFICA 2020": CHRYSLER.CHRYSLER_PACIFICA_2020, "DODGE DURANGO 2021": CHRYSLER.DODGE_DURANGO, "RAM 1500 5TH GEN": CHRYSLER.RAM_1500_5TH_GEN, "RAM HD 5TH GEN": CHRYSLER.RAM_HD_5TH_GEN, - "FORD BRONCO SPORT 1ST GEN": FORD.BRONCO_SPORT_MK1, - "FORD ESCAPE 4TH GEN": FORD.ESCAPE_MK4, - "FORD EXPLORER 6TH GEN": FORD.EXPLORER_MK6, - "FORD F-150 14TH GEN": FORD.F_150_MK14, - "FORD F-150 LIGHTNING 1ST GEN": FORD.F_150_LIGHTNING_MK1, - "FORD FOCUS 4TH GEN": FORD.FOCUS_MK4, - "FORD MAVERICK 1ST GEN": FORD.MAVERICK_MK1, - "FORD MUSTANG MACH-E 1ST GEN": FORD.MUSTANG_MACH_E_MK1, + "FORD BRONCO SPORT 1ST GEN": FORD.FORD_BRONCO_SPORT_MK1, + "FORD ESCAPE 4TH GEN": FORD.FORD_ESCAPE_MK4, + "FORD EXPLORER 6TH GEN": FORD.FORD_EXPLORER_MK6, + "FORD F-150 14TH GEN": FORD.FORD_F_150_MK14, + "FORD F-150 LIGHTNING 1ST GEN": FORD.FORD_F_150_LIGHTNING_MK1, + "FORD FOCUS 4TH GEN": FORD.FORD_FOCUS_MK4, + "FORD MAVERICK 1ST GEN": FORD.FORD_MAVERICK_MK1, + "FORD MUSTANG MACH-E 1ST GEN": FORD.FORD_MUSTANG_MACH_E_MK1, "HOLDEN ASTRA RS-V BK 2017": GM.HOLDEN_ASTRA, - "CHEVROLET VOLT PREMIER 2017": GM.VOLT, + "CHEVROLET VOLT PREMIER 2017": GM.CHEVROLET_VOLT, "CADILLAC ATS Premium Performance 2018": GM.CADILLAC_ATS, - "CHEVROLET MALIBU PREMIER 2017": GM.MALIBU, - "GMC ACADIA DENALI 2018": GM.ACADIA, + "CHEVROLET MALIBU PREMIER 2017": GM.CHEVROLET_MALIBU, + "GMC ACADIA DENALI 2018": GM.GMC_ACADIA, "BUICK LACROSSE 2017": GM.BUICK_LACROSSE, "BUICK REGAL ESSENCE 2018": GM.BUICK_REGAL, - "CADILLAC ESCALADE 2017": GM.ESCALADE, - "CADILLAC ESCALADE ESV 2016": GM.ESCALADE_ESV, - "CADILLAC ESCALADE ESV 2019": GM.ESCALADE_ESV_2019, - "CHEVROLET BOLT EUV 2022": GM.BOLT_EUV, - "CHEVROLET SILVERADO 1500 2020": GM.SILVERADO, - "CHEVROLET EQUINOX 2019": GM.EQUINOX, - "CHEVROLET TRAILBLAZER 2021": GM.TRAILBLAZER, - "HONDA ACCORD 2018": HONDA.ACCORD, - "HONDA CIVIC (BOSCH) 2019": HONDA.CIVIC_BOSCH, - "HONDA CIVIC SEDAN 1.6 DIESEL 2019": HONDA.CIVIC_BOSCH_DIESEL, - "HONDA CIVIC 2022": HONDA.CIVIC_2022, - "HONDA CR-V 2017": HONDA.CRV_5G, - "HONDA CR-V HYBRID 2019": HONDA.CRV_HYBRID, - "HONDA HR-V 2023": HONDA.HRV_3G, + "CADILLAC ESCALADE 2017": GM.CADILLAC_ESCALADE, + "CADILLAC ESCALADE ESV 2016": GM.CADILLAC_ESCALADE_ESV, + "CADILLAC ESCALADE ESV 2019": GM.CADILLAC_ESCALADE_ESV_2019, + "CHEVROLET BOLT EUV 2022": GM.CHEVROLET_BOLT_EUV, + "CHEVROLET SILVERADO 1500 2020": GM.CHEVROLET_SILVERADO, + "CHEVROLET EQUINOX 2019": GM.CHEVROLET_EQUINOX, + "CHEVROLET TRAILBLAZER 2021": GM.CHEVROLET_TRAILBLAZER, + "HONDA ACCORD 2018": HONDA.HONDA_ACCORD, + "HONDA CIVIC (BOSCH) 2019": HONDA.HONDA_CIVIC_BOSCH, + "HONDA CIVIC SEDAN 1.6 DIESEL 2019": HONDA.HONDA_CIVIC_BOSCH_DIESEL, + "HONDA CIVIC 2022": HONDA.HONDA_CIVIC_2022, + "HONDA CR-V 2017": HONDA.HONDA_CRV_5G, + "HONDA CR-V HYBRID 2019": HONDA.HONDA_CRV_HYBRID, + "HONDA HR-V 2023": HONDA.HONDA_HRV_3G, "ACURA RDX 2020": HONDA.ACURA_RDX_3G, - "HONDA INSIGHT 2019": HONDA.INSIGHT, + "HONDA INSIGHT 2019": HONDA.HONDA_INSIGHT, "HONDA E 2020": HONDA.HONDA_E, "ACURA ILX 2016": HONDA.ACURA_ILX, - "HONDA CR-V 2016": HONDA.CRV, - "HONDA CR-V EU 2016": HONDA.CRV_EU, - "HONDA FIT 2018": HONDA.FIT, - "HONDA FREED 2020": HONDA.FREED, - "HONDA HRV 2019": HONDA.HRV, - "HONDA ODYSSEY 2018": HONDA.ODYSSEY, - "HONDA ODYSSEY CHN 2019": HONDA.ODYSSEY_CHN, + "HONDA CR-V 2016": HONDA.HONDA_CRV, + "HONDA CR-V EU 2016": HONDA.HONDA_CRV_EU, + "HONDA FIT 2018": HONDA.HONDA_FIT, + "HONDA FREED 2020": HONDA.HONDA_FREED, + "HONDA HRV 2019": HONDA.HONDA_HRV, + "HONDA ODYSSEY 2018": HONDA.HONDA_ODYSSEY, + "HONDA ODYSSEY CHN 2019": HONDA.HONDA_ODYSSEY_CHN, "ACURA RDX 2018": HONDA.ACURA_RDX, - "HONDA PILOT 2017": HONDA.PILOT, - "HONDA RIDGELINE 2017": HONDA.RIDGELINE, - "HONDA CIVIC 2016": HONDA.CIVIC, - "HYUNDAI AZERA 6TH GEN": HYUNDAI.AZERA_6TH_GEN, - "HYUNDAI AZERA HYBRID 6TH GEN": HYUNDAI.AZERA_HEV_6TH_GEN, - "HYUNDAI ELANTRA 2017": HYUNDAI.ELANTRA, - "HYUNDAI I30 N LINE 2019 & GT 2018 DCT": HYUNDAI.ELANTRA_GT_I30, - "HYUNDAI ELANTRA 2021": HYUNDAI.ELANTRA_2021, - "HYUNDAI ELANTRA HYBRID 2021": HYUNDAI.ELANTRA_HEV_2021, + "HONDA PILOT 2017": HONDA.HONDA_PILOT, + "HONDA RIDGELINE 2017": HONDA.HONDA_RIDGELINE, + "HONDA CIVIC 2016": HONDA.HONDA_CIVIC, + "HYUNDAI AZERA 6TH GEN": HYUNDAI.HYUNDAI_AZERA_6TH_GEN, + "HYUNDAI AZERA HYBRID 6TH GEN": HYUNDAI.HYUNDAI_AZERA_HEV_6TH_GEN, + "HYUNDAI ELANTRA 2017": HYUNDAI.HYUNDAI_ELANTRA, + "HYUNDAI I30 N LINE 2019 & GT 2018 DCT": HYUNDAI.HYUNDAI_ELANTRA_GT_I30, + "HYUNDAI ELANTRA 2021": HYUNDAI.HYUNDAI_ELANTRA_2021, + "HYUNDAI ELANTRA HYBRID 2021": HYUNDAI.HYUNDAI_ELANTRA_HEV_2021, "HYUNDAI GENESIS 2015-2016": HYUNDAI.HYUNDAI_GENESIS, - "HYUNDAI IONIQ HYBRID 2017-2019": HYUNDAI.IONIQ, - "HYUNDAI IONIQ HYBRID 2020-2022": HYUNDAI.IONIQ_HEV_2022, - "HYUNDAI IONIQ ELECTRIC LIMITED 2019": HYUNDAI.IONIQ_EV_LTD, - "HYUNDAI IONIQ ELECTRIC 2020": HYUNDAI.IONIQ_EV_2020, - "HYUNDAI IONIQ PLUG-IN HYBRID 2019": HYUNDAI.IONIQ_PHEV_2019, - "HYUNDAI IONIQ PHEV 2020": HYUNDAI.IONIQ_PHEV, - "HYUNDAI KONA 2020": HYUNDAI.KONA, - "HYUNDAI KONA ELECTRIC 2019": HYUNDAI.KONA_EV, - "HYUNDAI KONA ELECTRIC 2022": HYUNDAI.KONA_EV_2022, - "HYUNDAI KONA ELECTRIC 2ND GEN": HYUNDAI.KONA_EV_2ND_GEN, - "HYUNDAI KONA HYBRID 2020": HYUNDAI.KONA_HEV, - "HYUNDAI SANTA FE 2019": HYUNDAI.SANTA_FE, - "HYUNDAI SANTA FE 2022": HYUNDAI.SANTA_FE_2022, - "HYUNDAI SANTA FE HYBRID 2022": HYUNDAI.SANTA_FE_HEV_2022, - "HYUNDAI SANTA FE PlUG-IN HYBRID 2022": HYUNDAI.SANTA_FE_PHEV_2022, - "HYUNDAI SONATA 2020": HYUNDAI.SONATA, - "HYUNDAI SONATA 2019": HYUNDAI.SONATA_LF, - "HYUNDAI STARIA 4TH GEN": HYUNDAI.STARIA_4TH_GEN, - "HYUNDAI TUCSON 2019": HYUNDAI.TUCSON, - "HYUNDAI PALISADE 2020": HYUNDAI.PALISADE, - "HYUNDAI VELOSTER 2019": HYUNDAI.VELOSTER, - "HYUNDAI SONATA HYBRID 2021": HYUNDAI.SONATA_HYBRID, - "HYUNDAI IONIQ 5 2022": HYUNDAI.IONIQ_5, - "HYUNDAI IONIQ 6 2023": HYUNDAI.IONIQ_6, - "HYUNDAI TUCSON 4TH GEN": HYUNDAI.TUCSON_4TH_GEN, - "HYUNDAI SANTA CRUZ 1ST GEN": HYUNDAI.SANTA_CRUZ_1ST_GEN, - "HYUNDAI CUSTIN 1ST GEN": HYUNDAI.CUSTIN_1ST_GEN, + "HYUNDAI IONIQ HYBRID 2017-2019": HYUNDAI.HYUNDAI_IONIQ, + "HYUNDAI IONIQ HYBRID 2020-2022": HYUNDAI.HYUNDAI_IONIQ_HEV_2022, + "HYUNDAI IONIQ ELECTRIC LIMITED 2019": HYUNDAI.HYUNDAI_IONIQ_EV_LTD, + "HYUNDAI IONIQ ELECTRIC 2020": HYUNDAI.HYUNDAI_IONIQ_EV_2020, + "HYUNDAI IONIQ PLUG-IN HYBRID 2019": HYUNDAI.HYUNDAI_IONIQ_PHEV_2019, + "HYUNDAI IONIQ PHEV 2020": HYUNDAI.HYUNDAI_IONIQ_PHEV, + "HYUNDAI KONA 2020": HYUNDAI.HYUNDAI_KONA, + "HYUNDAI KONA ELECTRIC 2019": HYUNDAI.HYUNDAI_KONA_EV, + "HYUNDAI KONA ELECTRIC 2022": HYUNDAI.HYUNDAI_KONA_EV_2022, + "HYUNDAI KONA ELECTRIC 2ND GEN": HYUNDAI.HYUNDAI_KONA_EV_2ND_GEN, + "HYUNDAI KONA HYBRID 2020": HYUNDAI.HYUNDAI_KONA_HEV, + "HYUNDAI SANTA FE 2019": HYUNDAI.HYUNDAI_SANTA_FE, + "HYUNDAI SANTA FE 2022": HYUNDAI.HYUNDAI_SANTA_FE_2022, + "HYUNDAI SANTA FE HYBRID 2022": HYUNDAI.HYUNDAI_SANTA_FE_HEV_2022, + "HYUNDAI SANTA FE PlUG-IN HYBRID 2022": HYUNDAI.HYUNDAI_SANTA_FE_PHEV_2022, + "HYUNDAI SONATA 2020": HYUNDAI.HYUNDAI_SONATA, + "HYUNDAI SONATA 2019": HYUNDAI.HYUNDAI_SONATA_LF, + "HYUNDAI STARIA 4TH GEN": HYUNDAI.HYUNDAI_STARIA_4TH_GEN, + "HYUNDAI TUCSON 2019": HYUNDAI.HYUNDAI_TUCSON, + "HYUNDAI PALISADE 2020": HYUNDAI.HYUNDAI_PALISADE, + "HYUNDAI VELOSTER 2019": HYUNDAI.HYUNDAI_VELOSTER, + "HYUNDAI SONATA HYBRID 2021": HYUNDAI.HYUNDAI_SONATA_HYBRID, + "HYUNDAI IONIQ 5 2022": HYUNDAI.HYUNDAI_IONIQ_5, + "HYUNDAI IONIQ 6 2023": HYUNDAI.HYUNDAI_IONIQ_6, + "HYUNDAI TUCSON 4TH GEN": HYUNDAI.HYUNDAI_TUCSON_4TH_GEN, + "HYUNDAI SANTA CRUZ 1ST GEN": HYUNDAI.HYUNDAI_SANTA_CRUZ_1ST_GEN, + "HYUNDAI CUSTIN 1ST GEN": HYUNDAI.HYUNDAI_CUSTIN_1ST_GEN, "KIA FORTE E 2018 & GT 2021": HYUNDAI.KIA_FORTE, "KIA K5 2021": HYUNDAI.KIA_K5_2021, "KIA K5 HYBRID 2020": HYUNDAI.KIA_K5_HEV_2020, @@ -245,56 +245,56 @@ MIGRATION = { "GENESIS G80 2017": HYUNDAI.GENESIS_G80, "GENESIS G90 2017": HYUNDAI.GENESIS_G90, "GENESIS GV80 2023": HYUNDAI.GENESIS_GV80, - "MAZDA CX-5": MAZDA.CX5, - "MAZDA CX-9": MAZDA.CX9, - "MAZDA 3": MAZDA.MAZDA3, - "MAZDA 6": MAZDA.MAZDA6, - "MAZDA CX-9 2021": MAZDA.CX9_2021, - "MAZDA CX-5 2022": MAZDA.CX5_2022, - "NISSAN X-TRAIL 2017": NISSAN.XTRAIL, - "NISSAN LEAF 2018": NISSAN.LEAF, - "NISSAN ROGUE 2019": NISSAN.ROGUE, - "NISSAN ALTIMA 2020": NISSAN.ALTIMA, - "SUBARU ASCENT LIMITED 2019": SUBARU.ASCENT, - "SUBARU OUTBACK 6TH GEN": SUBARU.OUTBACK, - "SUBARU LEGACY 7TH GEN": SUBARU.LEGACY, - "SUBARU IMPREZA LIMITED 2019": SUBARU.IMPREZA, - "SUBARU IMPREZA SPORT 2020": SUBARU.IMPREZA_2020, - "SUBARU CROSSTREK HYBRID 2020": SUBARU.CROSSTREK_HYBRID, - "SUBARU FORESTER 2019": SUBARU.FORESTER, - "SUBARU FORESTER HYBRID 2020": SUBARU.FORESTER_HYBRID, - "SUBARU FORESTER 2017 - 2018": SUBARU.FORESTER_PREGLOBAL, - "SUBARU LEGACY 2015 - 2018": SUBARU.LEGACY_PREGLOBAL, - "SUBARU OUTBACK 2015 - 2017": SUBARU.OUTBACK_PREGLOBAL, - "SUBARU OUTBACK 2018 - 2019": SUBARU.OUTBACK_PREGLOBAL_2018, - "SUBARU FORESTER 2022": SUBARU.FORESTER_2022, - "SUBARU OUTBACK 7TH GEN": SUBARU.OUTBACK_2023, - "SUBARU ASCENT 2023": SUBARU.ASCENT_2023, - 'TESLA AP1 MODEL S': TESLA.AP1_MODELS, - 'TESLA AP2 MODEL S': TESLA.AP2_MODELS, - 'TESLA MODEL S RAVEN': TESLA.MODELS_RAVEN, - "TOYOTA ALPHARD 2020": TOYOTA.ALPHARD_TSS2, - "TOYOTA AVALON 2016": TOYOTA.AVALON, - "TOYOTA AVALON 2019": TOYOTA.AVALON_2019, - "TOYOTA AVALON 2022": TOYOTA.AVALON_TSS2, - "TOYOTA CAMRY 2018": TOYOTA.CAMRY, - "TOYOTA CAMRY 2021": TOYOTA.CAMRY_TSS2, - "TOYOTA C-HR 2018": TOYOTA.CHR, - "TOYOTA C-HR 2021": TOYOTA.CHR_TSS2, - "TOYOTA COROLLA 2017": TOYOTA.COROLLA, - "TOYOTA COROLLA TSS2 2019": TOYOTA.COROLLA_TSS2, - "TOYOTA HIGHLANDER 2017": TOYOTA.HIGHLANDER, - "TOYOTA HIGHLANDER 2020": TOYOTA.HIGHLANDER_TSS2, - "TOYOTA PRIUS 2017": TOYOTA.PRIUS, - "TOYOTA PRIUS v 2017": TOYOTA.PRIUS_V, - "TOYOTA PRIUS TSS2 2021": TOYOTA.PRIUS_TSS2, - "TOYOTA RAV4 2017": TOYOTA.RAV4, - "TOYOTA RAV4 HYBRID 2017": TOYOTA.RAV4H, - "TOYOTA RAV4 2019": TOYOTA.RAV4_TSS2, - "TOYOTA RAV4 2022": TOYOTA.RAV4_TSS2_2022, - "TOYOTA RAV4 2023": TOYOTA.RAV4_TSS2_2023, - "TOYOTA MIRAI 2021": TOYOTA.MIRAI, - "TOYOTA SIENNA 2018": TOYOTA.SIENNA, + "MAZDA CX-5": MAZDA.MAZDA_CX5, + "MAZDA CX-9": MAZDA.MAZDA_CX9, + "MAZDA 3": MAZDA.MAZDA_3, + "MAZDA 6": MAZDA.MAZDA_6, + "MAZDA CX-9 2021": MAZDA.MAZDA_CX9_2021, + "MAZDA CX-5 2022": MAZDA.MAZDA_CX5_2022, + "NISSAN X-TRAIL 2017": NISSAN.NISSAN_XTRAIL, + "NISSAN LEAF 2018": NISSAN.NISSAN_LEAF, + "NISSAN ROGUE 2019": NISSAN.NISSAN_ROGUE, + "NISSAN ALTIMA 2020": NISSAN.NISSAN_ALTIMA, + "SUBARU ASCENT LIMITED 2019": SUBARU.SUBARU_ASCENT, + "SUBARU OUTBACK 6TH GEN": SUBARU.SUBARU_OUTBACK, + "SUBARU LEGACY 7TH GEN": SUBARU.SUBARU_LEGACY, + "SUBARU IMPREZA LIMITED 2019": SUBARU.SUBARU_IMPREZA, + "SUBARU IMPREZA SPORT 2020": SUBARU.SUBARU_IMPREZA_2020, + "SUBARU CROSSTREK HYBRID 2020": SUBARU.SUBARU_CROSSTREK_HYBRID, + "SUBARU FORESTER 2019": SUBARU.SUBARU_FORESTER, + "SUBARU FORESTER HYBRID 2020": SUBARU.SUBARU_FORESTER_HYBRID, + "SUBARU FORESTER 2017 - 2018": SUBARU.SUBARU_FORESTER_PREGLOBAL, + "SUBARU LEGACY 2015 - 2018": SUBARU.SUBARU_LEGACY_PREGLOBAL, + "SUBARU OUTBACK 2015 - 2017": SUBARU.SUBARU_OUTBACK_PREGLOBAL, + "SUBARU OUTBACK 2018 - 2019": SUBARU.SUBARU_OUTBACK_PREGLOBAL_2018, + "SUBARU FORESTER 2022": SUBARU.SUBARU_FORESTER_2022, + "SUBARU OUTBACK 7TH GEN": SUBARU.SUBARU_OUTBACK_2023, + "SUBARU ASCENT 2023": SUBARU.SUBARU_ASCENT_2023, + 'TESLA AP1 MODEL S': TESLA.TESLA_AP1_MODELS, + 'TESLA AP2 MODEL S': TESLA.TESLA_AP2_MODELS, + 'TESLA MODEL S RAVEN': TESLA.TESLA_MODELS_RAVEN, + "TOYOTA ALPHARD 2020": TOYOTA.TOYOTA_ALPHARD_TSS2, + "TOYOTA AVALON 2016": TOYOTA.TOYOTA_AVALON, + "TOYOTA AVALON 2019": TOYOTA.TOYOTA_AVALON_2019, + "TOYOTA AVALON 2022": TOYOTA.TOYOTA_AVALON_TSS2, + "TOYOTA CAMRY 2018": TOYOTA.TOYOTA_CAMRY, + "TOYOTA CAMRY 2021": TOYOTA.TOYOTA_CAMRY_TSS2, + "TOYOTA C-HR 2018": TOYOTA.TOYOTA_CHR, + "TOYOTA C-HR 2021": TOYOTA.TOYOTA_CHR_TSS2, + "TOYOTA COROLLA 2017": TOYOTA.TOYOTA_COROLLA, + "TOYOTA COROLLA TSS2 2019": TOYOTA.TOYOTA_COROLLA_TSS2, + "TOYOTA HIGHLANDER 2017": TOYOTA.TOYOTA_HIGHLANDER, + "TOYOTA HIGHLANDER 2020": TOYOTA.TOYOTA_HIGHLANDER_TSS2, + "TOYOTA PRIUS 2017": TOYOTA.TOYOTA_PRIUS, + "TOYOTA PRIUS v 2017": TOYOTA.TOYOTA_PRIUS_V, + "TOYOTA PRIUS TSS2 2021": TOYOTA.TOYOTA_PRIUS_TSS2, + "TOYOTA RAV4 2017": TOYOTA.TOYOTA_RAV4, + "TOYOTA RAV4 HYBRID 2017": TOYOTA.TOYOTA_RAV4H, + "TOYOTA RAV4 2019": TOYOTA.TOYOTA_RAV4_TSS2, + "TOYOTA RAV4 2022": TOYOTA.TOYOTA_RAV4_TSS2_2022, + "TOYOTA RAV4 2023": TOYOTA.TOYOTA_RAV4_TSS2_2023, + "TOYOTA MIRAI 2021": TOYOTA.TOYOTA_MIRAI, + "TOYOTA SIENNA 2018": TOYOTA.TOYOTA_SIENNA, "LEXUS CT HYBRID 2018": TOYOTA.LEXUS_CTH, "LEXUS ES 2018": TOYOTA.LEXUS_ES, "LEXUS ES 2019": TOYOTA.LEXUS_ES_TSS2, @@ -307,22 +307,22 @@ MIGRATION = { "LEXUS RX 2016": TOYOTA.LEXUS_RX, "LEXUS RX 2020": TOYOTA.LEXUS_RX_TSS2, "LEXUS GS F 2016": TOYOTA.LEXUS_GS_F, - "VOLKSWAGEN ARTEON 1ST GEN": VW.ARTEON_MK1, - "VOLKSWAGEN ATLAS 1ST GEN": VW.ATLAS_MK1, - "VOLKSWAGEN CADDY 3RD GEN": VW.CADDY_MK3, - "VOLKSWAGEN CRAFTER 2ND GEN": VW.CRAFTER_MK2, - "VOLKSWAGEN GOLF 7TH GEN": VW.GOLF_MK7, - "VOLKSWAGEN JETTA 7TH GEN": VW.JETTA_MK7, - "VOLKSWAGEN PASSAT 8TH GEN": VW.PASSAT_MK8, - "VOLKSWAGEN PASSAT NMS": VW.PASSAT_NMS, - "VOLKSWAGEN POLO 6TH GEN": VW.POLO_MK6, - "VOLKSWAGEN SHARAN 2ND GEN": VW.SHARAN_MK2, - "VOLKSWAGEN TAOS 1ST GEN": VW.TAOS_MK1, - "VOLKSWAGEN T-CROSS 1ST GEN": VW.TCROSS_MK1, - "VOLKSWAGEN TIGUAN 2ND GEN": VW.TIGUAN_MK2, - "VOLKSWAGEN TOURAN 2ND GEN": VW.TOURAN_MK2, - "VOLKSWAGEN TRANSPORTER T6.1": VW.TRANSPORTER_T61, - "VOLKSWAGEN T-ROC 1ST GEN": VW.TROC_MK1, + "VOLKSWAGEN ARTEON 1ST GEN": VW.VOLKSWAGEN_ARTEON_MK1, + "VOLKSWAGEN ATLAS 1ST GEN": VW.VOLKSWAGEN_ATLAS_MK1, + "VOLKSWAGEN CADDY 3RD GEN": VW.VOLKSWAGEN_CADDY_MK3, + "VOLKSWAGEN CRAFTER 2ND GEN": VW.VOLKSWAGEN_CRAFTER_MK2, + "VOLKSWAGEN GOLF 7TH GEN": VW.VOLKSWAGEN_GOLF_MK7, + "VOLKSWAGEN JETTA 7TH GEN": VW.VOLKSWAGEN_JETTA_MK7, + "VOLKSWAGEN PASSAT 8TH GEN": VW.VOLKSWAGEN_PASSAT_MK8, + "VOLKSWAGEN PASSAT NMS": VW.VOLKSWAGEN_PASSAT_NMS, + "VOLKSWAGEN POLO 6TH GEN": VW.VOLKSWAGEN_POLO_MK6, + "VOLKSWAGEN SHARAN 2ND GEN": VW.VOLKSWAGEN_SHARAN_MK2, + "VOLKSWAGEN TAOS 1ST GEN": VW.VOLKSWAGEN_TAOS_MK1, + "VOLKSWAGEN T-CROSS 1ST GEN": VW.VOLKSWAGEN_TCROSS_MK1, + "VOLKSWAGEN TIGUAN 2ND GEN": VW.VOLKSWAGEN_TIGUAN_MK2, + "VOLKSWAGEN TOURAN 2ND GEN": VW.VOLKSWAGEN_TOURAN_MK2, + "VOLKSWAGEN TRANSPORTER T6.1": VW.VOLKSWAGEN_TRANSPORTER_T61, + "VOLKSWAGEN T-ROC 1ST GEN": VW.VOLKSWAGEN_TROC_MK1, "AUDI A3 3RD GEN": VW.AUDI_A3_MK3, "AUDI Q2 1ST GEN": VW.AUDI_Q2_MK1, "AUDI Q3 2ND GEN": VW.AUDI_Q3_MK2, diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index fae529aa00..32d331b2db 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -4,7 +4,7 @@ from openpilot.selfdrive.car.ford.values import CAR Ecu = car.CarParams.Ecu FW_VERSIONS = { - CAR.BRONCO_SPORT_MK1: { + CAR.FORD_BRONCO_SPORT_MK1: { (Ecu.eps, 0x730, None): [ b'LX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LX6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -23,7 +23,7 @@ FW_VERSIONS = { b'M1PT-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.ESCAPE_MK4: { + CAR.FORD_ESCAPE_MK4: { (Ecu.eps, 0x730, None): [ b'LX6C-14D003-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -46,7 +46,7 @@ FW_VERSIONS = { b'LV4T-14F397-GG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.EXPLORER_MK6: { + CAR.FORD_EXPLORER_MK6: { (Ecu.eps, 0x730, None): [ b'L1MC-14D003-AJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'L1MC-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -74,7 +74,7 @@ FW_VERSIONS = { b'LC5T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.F_150_MK14: { + CAR.FORD_F_150_MK14: { (Ecu.eps, 0x730, None): [ b'ML3V-14D003-BC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], @@ -89,7 +89,7 @@ FW_VERSIONS = { b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.F_150_LIGHTNING_MK1: { + CAR.FORD_F_150_LIGHTNING_MK1: { (Ecu.abs, 0x760, None): [ b'PL38-2D053-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], @@ -100,7 +100,7 @@ FW_VERSIONS = { b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.MUSTANG_MACH_E_MK1: { + CAR.FORD_MUSTANG_MACH_E_MK1: { (Ecu.eps, 0x730, None): [ b'LJ9C-14D003-AM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LJ9C-14D003-CC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -115,7 +115,7 @@ FW_VERSIONS = { b'ML3T-14H102-ABS\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.FOCUS_MK4: { + CAR.FORD_FOCUS_MK4: { (Ecu.eps, 0x730, None): [ b'JX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], @@ -129,7 +129,7 @@ FW_VERSIONS = { b'JX7T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.MAVERICK_MK1: { + CAR.FORD_MAVERICK_MK1: { (Ecu.eps, 0x730, None): [ b'NZ6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index c8b0da3fd3..d1e6686ea0 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -66,7 +66,7 @@ class FordCarDocs(CarDocs): def init_make(self, CP: car.CarParams): harness = CarHarness.ford_q4 if CP.flags & FordFlags.CANFD else CarHarness.ford_q3 - if CP.carFingerprint in (CAR.BRONCO_SPORT_MK1, CAR.MAVERICK_MK1, CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1): + if CP.carFingerprint in (CAR.FORD_BRONCO_SPORT_MK1, CAR.FORD_MAVERICK_MK1, CAR.FORD_F_150_MK14, CAR.FORD_F_150_LIGHTNING_MK1): self.car_parts = CarParts([Device.threex_angled_mount, harness]) else: self.car_parts = CarParts([Device.threex, harness]) @@ -96,44 +96,44 @@ class FordCANFDPlatformConfig(FordPlatformConfig): class CAR(Platforms): - BRONCO_SPORT_MK1 = FordPlatformConfig( + FORD_BRONCO_SPORT_MK1 = FordPlatformConfig( [FordCarDocs("Ford Bronco Sport 2021-23")], CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7), ) - ESCAPE_MK4 = FordPlatformConfig( + FORD_ESCAPE_MK4 = FordPlatformConfig( [ FordCarDocs("Ford Escape 2020-22", hybrid=True, plug_in_hybrid=True), FordCarDocs("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering", hybrid=True, plug_in_hybrid=True), ], CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), ) - EXPLORER_MK6 = FordPlatformConfig( + FORD_EXPLORER_MK6 = FordPlatformConfig( [ FordCarDocs("Ford Explorer 2020-23", hybrid=True), # Hybrid: Limited and Platinum only FordCarDocs("Lincoln Aviator 2020-23", "Co-Pilot360 Plus", plug_in_hybrid=True), # Hybrid: Grand Touring only ], CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), ) - F_150_MK14 = FordCANFDPlatformConfig( + FORD_F_150_MK14 = FordCANFDPlatformConfig( [FordCarDocs("Ford F-150 2022-23", "Co-Pilot360 Active 2.0", hybrid=True)], CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), ) - F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( + FORD_F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( [FordCarDocs("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0")], CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), ) - FOCUS_MK4 = FordPlatformConfig( + FORD_FOCUS_MK4 = FordPlatformConfig( [FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS], hybrid=True)], # mHEV only CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0), ) - MAVERICK_MK1 = FordPlatformConfig( + FORD_MAVERICK_MK1 = FordPlatformConfig( [ FordCarDocs("Ford Maverick 2022", "LARIAT Luxury", hybrid=True), FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist", hybrid=True), ], CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), ) - MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig( + FORD_MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig( [FordCarDocs("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0")], CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio ) diff --git a/selfdrive/car/gm/fingerprints.py b/selfdrive/car/gm/fingerprints.py index 73a205a250..3752fbb8d3 100644 --- a/selfdrive/car/gm/fingerprints.py +++ b/selfdrive/car/gm/fingerprints.py @@ -9,7 +9,7 @@ FINGERPRINTS = { CAR.HOLDEN_ASTRA: [{ 190: 8, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 8, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 401: 8, 413: 8, 417: 8, 419: 8, 422: 1, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 8, 455: 7, 456: 8, 458: 5, 479: 8, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 8, 501: 8, 508: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 647: 5, 707: 8, 715: 8, 723: 8, 753: 5, 761: 7, 806: 1, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1009: 8, 1011: 6, 1017: 8, 1019: 3, 1020: 8, 1105: 6, 1217: 8, 1221: 5, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 8, 1280: 4, 1300: 8, 1328: 4, 1417: 8, 1906: 7, 1907: 7, 1908: 7, 1912: 7, 1919: 7 }], - CAR.VOLT: [{ + CAR.CHEVROLET_VOLT: [{ 170: 8, 171: 8, 189: 7, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 289: 8, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 4, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 5, 567: 3, 568: 1, 573: 1, 577: 8, 647: 3, 707: 8, 711: 6, 715: 8, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 961: 8, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7, 1928: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8 }, { @@ -27,31 +27,31 @@ FINGERPRINTS = { CAR.CADILLAC_ATS: [{ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 368: 3, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 462: 4, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 491: 2, 493: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 528: 5, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 719: 5, 723: 2, 753: 5, 761: 7, 801: 8, 804: 3, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 882: 8, 890: 1, 892: 2, 893: 2, 894: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1241: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1916: 7, 1917: 7, 1918: 7, 1919: 7, 1920: 7, 1930: 7, 2016: 8, 2024: 8 }], - CAR.MALIBU: [{ + CAR.CHEVROLET_MALIBU: [{ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1930: 7, 2016: 8, 2024: 8 }], - CAR.ACADIA: [{ + CAR.GMC_ACADIA: [{ 190: 6, 192: 5, 193: 8, 197: 8, 199: 4, 201: 6, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 1, 290: 1, 298: 8, 304: 8, 309: 8, 313: 8, 320: 8, 322: 7, 328: 1, 352: 7, 368: 8, 381: 8, 384: 8, 386: 8, 388: 8, 393: 8, 398: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 458: 8, 460: 4, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 489: 5, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 512: 3, 530: 8, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 568: 2, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 801: 8, 803: 8, 804: 3, 805: 8, 832: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1003: 5, 1005: 6, 1009: 8, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1918: 7, 1919: 7, 1920: 7, 1930: 7 }, { 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 313: 8, 320: 3, 322: 7, 328: 1, 338: 6, 340: 6, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1919: 7, 1920: 7, 1930: 7, 2016: 8, 2024: 8 }], - CAR.ESCALADE: [{ + CAR.CADILLAC_ESCALADE: [{ 170: 8, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 4, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 460: 5, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 719: 5, 761: 7, 801: 8, 804: 3, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1917: 7, 1918: 7, 1919: 7, 1920: 7, 1930: 7, 1937: 8, 1953: 8, 1968: 8, 2001: 8, 2017: 8, 2018: 8, 2020: 8, 2026: 8 }], - CAR.ESCALADE_ESV: [{ + CAR.CADILLAC_ESCALADE_ESV: [{ 309: 1, 848: 8, 849: 8, 850: 8, 851: 8, 852: 8, 853: 8, 854: 3, 1056: 6, 1057: 8, 1058: 8, 1059: 8, 1060: 8, 1061: 8, 1062: 8, 1063: 8, 1064: 8, 1065: 8, 1066: 8, 1067: 8, 1068: 8, 1120: 8, 1121: 8, 1122: 8, 1123: 8, 1124: 8, 1125: 8, 1126: 8, 1127: 8, 1128: 8, 1129: 8, 1130: 8, 1131: 8, 1132: 8, 1133: 8, 1134: 8, 1135: 8, 1136: 8, 1137: 8, 1138: 8, 1139: 8, 1140: 8, 1141: 8, 1142: 8, 1143: 8, 1146: 8, 1147: 8, 1148: 8, 1149: 8, 1150: 8, 1151: 8, 1216: 8, 1217: 8, 1218: 8, 1219: 8, 1220: 8, 1221: 8, 1222: 8, 1223: 8, 1224: 8, 1225: 8, 1226: 8, 1232: 8, 1233: 8, 1234: 8, 1235: 8, 1236: 8, 1237: 8, 1238: 8, 1239: 8, 1240: 8, 1241: 8, 1242: 8, 1787: 8, 1788: 8 }], - CAR.ESCALADE_ESV_2019: [{ + CAR.CADILLAC_ESCALADE_ESV_2019: [{ 715: 8, 840: 5, 717: 5, 869: 4, 880: 6, 289: 8, 454: 8, 842: 5, 460: 5, 463: 3, 801: 8, 170: 8, 190: 6, 241: 6, 201: 8, 417: 7, 211: 2, 419: 1, 398: 8, 426: 7, 487: 8, 442: 8, 451: 8, 452: 8, 453: 6, 479: 3, 311: 8, 500: 6, 647: 6, 193: 8, 707: 8, 197: 8, 209: 7, 199: 4, 455: 7, 313: 8, 481: 7, 485: 8, 489: 8, 249: 8, 393: 7, 407: 7, 413: 8, 422: 4, 431: 8, 501: 8, 499: 3, 810: 8, 508: 8, 381: 8, 462: 4, 532: 6, 562: 8, 386: 8, 761: 7, 573: 1, 554: 3, 719: 5, 560: 8, 1279: 4, 388: 8, 288: 5, 1005: 6, 497: 8, 844: 8, 961: 8, 967: 4, 977: 8, 979: 8, 985: 5, 1001: 8, 1017: 8, 1019: 2, 1020: 8, 1217: 8, 510: 8, 866: 4, 304: 1, 969: 8, 384: 4, 1033: 7, 1009: 8, 1034: 7, 1296: 4, 1930: 7, 1105: 5, 1013: 5, 1225: 7, 1919: 7, 320: 3, 534: 2, 352: 5, 298: 8, 1223: 2, 1233: 8, 608: 8, 1265: 8, 609: 6, 1267: 1, 1417: 8, 610: 6, 1906: 7, 611: 6, 612: 8, 613: 8, 208: 8, 564: 5, 309: 8, 1221: 5, 1280: 4, 1249: 8, 1907: 7, 1257: 6, 1300: 8, 1920: 7, 563: 5, 1322: 6, 1323: 4, 1328: 4, 1917: 7, 328: 1, 1912: 7, 1914: 7, 804: 3, 1918: 7 }], - CAR.BOLT_EUV: [{ + CAR.CHEVROLET_BOLT_EUV: [{ 189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 451: 8, 452: 8, 453: 6, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 8, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 880: 6, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7 }], - CAR.SILVERADO: [{ + CAR.CHEVROLET_SILVERADO: [{ 190: 6, 193: 8, 197: 8, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 460: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 534: 2, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 761: 7, 789: 5, 800: 6, 801: 8, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7 }], - CAR.EQUINOX: [{ + CAR.CHEVROLET_EQUINOX: [{ 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 510: 8, 528: 5, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7 }, { diff --git a/selfdrive/car/gm/gmcan.py b/selfdrive/car/gm/gmcan.py index cea77985fb..e833e77636 100644 --- a/selfdrive/car/gm/gmcan.py +++ b/selfdrive/car/gm/gmcan.py @@ -76,7 +76,7 @@ def create_friction_brake_command(packer, bus, apply_brake, idx, enabled, near_s mode = 0x1 # TODO: Understand this better. Volts and ICE Camera ACC cars are 0x1 when enabled with no brake - if enabled and CP.carFingerprint in (CAR.BOLT_EUV,): + if enabled and CP.carFingerprint in (CAR.CHEVROLET_BOLT_EUV,): mode = 0x9 if apply_brake > 0: diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index f470d6f468..358bc9e5ba 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -22,9 +22,9 @@ BUTTONS_DICT = {CruiseButtons.RES_ACCEL: ButtonType.accelCruise, CruiseButtons.D NON_LINEAR_TORQUE_PARAMS = { - CAR.BOLT_EUV: [2.6531724862969748, 1.0, 0.1919764879840985, 0.009054123646805178], - CAR.ACADIA: [4.78003305, 1.0, 0.3122, 0.05591772], - CAR.SILVERADO: [3.29974374, 1.0, 0.25571356, 0.0465122] + CAR.CHEVROLET_BOLT_EUV: [2.6531724862969748, 1.0, 0.1919764879840985, 0.009054123646805178], + CAR.GMC_ACADIA: [4.78003305, 1.0, 0.3122, 0.05591772], + CAR.CHEVROLET_SILVERADO: [3.29974374, 1.0, 0.25571356, 0.0465122] } NEURAL_PARAMS_PATH = os.path.join(BASEDIR, 'selfdrive/car/torque_data/neural_ff_weights.json') @@ -43,7 +43,7 @@ class CarInterface(CarInterfaceBase): return 0.10006696 * sigmoid * (v_ego + 3.12485927) def get_steer_feedforward_function(self): - if self.CP.carFingerprint == CAR.VOLT: + if self.CP.carFingerprint == CAR.CHEVROLET_VOLT: return self.get_steer_feedforward_volt else: return CarInterfaceBase.get_steer_feedforward_default @@ -74,7 +74,7 @@ class CarInterface(CarInterfaceBase): return float(self.neural_ff_model.predict(inputs)) + friction def torque_from_lateral_accel(self) -> TorqueFromLateralAccelCallbackType: - if self.CP.carFingerprint == CAR.BOLT_EUV: + if self.CP.carFingerprint == CAR.CHEVROLET_BOLT_EUV: self.neural_ff_model = NanoFFModel(NEURAL_PARAMS_PATH, self.CP.carFingerprint) return self.torque_from_lateral_accel_neural elif self.CP.carFingerprint in NON_LINEAR_TORQUE_PARAMS: @@ -137,7 +137,7 @@ class CarInterface(CarInterfaceBase): # These cars have been put into dashcam only due to both a lack of users and test coverage. # These cars likely still work fine. Once a user confirms each car works and a test route is # added to selfdrive/car/tests/routes.py, we can remove it from this list. - ret.dashcamOnly = candidate in {CAR.CADILLAC_ATS, CAR.HOLDEN_ASTRA, CAR.MALIBU, CAR.BUICK_REGAL} or \ + ret.dashcamOnly = candidate in {CAR.CADILLAC_ATS, CAR.HOLDEN_ASTRA, CAR.CHEVROLET_MALIBU, CAR.BUICK_REGAL} or \ (ret.networkLocation == NetworkLocation.gateway and ret.radarUnavailable) # Start with a baseline tuning for all GM vehicles. Override tuning as needed in each model section below. @@ -150,7 +150,7 @@ class CarInterface(CarInterfaceBase): ret.radarTimeStep = 0.0667 # GM radar runs at 15Hz instead of standard 20Hz ret.longitudinalActuatorDelayUpperBound = 0.5 # large delay to initially start braking - if candidate == CAR.VOLT: + if candidate == CAR.CHEVROLET_VOLT: ret.lateralTuning.pid.kpBP = [0., 40.] ret.lateralTuning.pid.kpV = [0., 0.17] ret.lateralTuning.pid.kiBP = [0.] @@ -158,7 +158,7 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kf = 1. # get_steer_feedforward_volt() ret.steerActuatorDelay = 0.2 - elif candidate == CAR.ACADIA: + elif candidate == CAR.GMC_ACADIA: ret.minEnableSpeed = -1. # engage speed is decided by pcm ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) @@ -166,14 +166,14 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.BUICK_LACROSSE: CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - elif candidate == CAR.ESCALADE: + elif candidate == CAR.CADILLAC_ESCALADE: ret.minEnableSpeed = -1. # engage speed is decided by pcm CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - elif candidate in (CAR.ESCALADE_ESV, CAR.ESCALADE_ESV_2019): + elif candidate in (CAR.CADILLAC_ESCALADE_ESV, CAR.CADILLAC_ESCALADE_ESV_2019): ret.minEnableSpeed = -1. # engage speed is decided by pcm - if candidate == CAR.ESCALADE_ESV: + if candidate == CAR.CADILLAC_ESCALADE_ESV: ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[10., 41.0], [10., 41.0]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.13, 0.24], [0.01, 0.02]] ret.lateralTuning.pid.kf = 0.000045 @@ -181,11 +181,11 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - elif candidate == CAR.BOLT_EUV: + elif candidate == CAR.CHEVROLET_BOLT_EUV: ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - elif candidate == CAR.SILVERADO: + elif candidate == CAR.CHEVROLET_SILVERADO: # On the Bolt, the ECM and camera independently check that you are either above 5 kph or at a stop # with foot on brake to allow engagement, but this platform only has that check in the camera. # TODO: check if this is split by EV/ICE with more platforms in the future @@ -193,10 +193,10 @@ class CarInterface(CarInterfaceBase): ret.minEnableSpeed = -1. CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - elif candidate == CAR.EQUINOX: + elif candidate == CAR.CHEVROLET_EQUINOX: CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - elif candidate == CAR.TRAILBLAZER: + elif candidate == CAR.CHEVROLET_TRAILBLAZER: ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) diff --git a/selfdrive/car/gm/tests/test_gm.py b/selfdrive/car/gm/tests/test_gm.py index 2aea5b231b..9b56cfdf08 100755 --- a/selfdrive/car/gm/tests/test_gm.py +++ b/selfdrive/car/gm/tests/test_gm.py @@ -14,11 +14,11 @@ class TestGMFingerprint(unittest.TestCase): self.assertGreater(len(fingerprints), 0) # Trailblazer is in dashcam - if car_model != CAR.TRAILBLAZER: + if car_model != CAR.CHEVROLET_TRAILBLAZER: self.assertTrue(all(len(finger) for finger in fingerprints)) # The camera can sometimes be communicating on startup - if car_model in CAMERA_ACC_CAR - {CAR.TRAILBLAZER}: + if car_model in CAMERA_ACC_CAR - {CAR.CHEVROLET_TRAILBLAZER}: for finger in fingerprints: for required_addr in (CAMERA_DIAGNOSTIC_ADDRESS, CAMERA_DIAGNOSTIC_ADDRESS + GM_RX_OFFSET): self.assertEqual(finger.get(required_addr), 8, required_addr) diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 24ec9dfb66..46d15431ca 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -94,7 +94,7 @@ class CAR(Platforms): [GMCarDocs("Holden Astra 2017")], GMCarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4), ) - VOLT = GMPlatformConfig( + CHEVROLET_VOLT = GMPlatformConfig( [GMCarDocs("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ")], GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469), ) @@ -102,11 +102,11 @@ class CAR(Platforms): [GMCarDocs("Cadillac ATS Premium Performance 2018")], GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), ) - MALIBU = GMPlatformConfig( + CHEVROLET_MALIBU = GMPlatformConfig( [GMCarDocs("Chevrolet Malibu Premier 2017")], GMCarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4), ) - ACADIA = GMPlatformConfig( + GMC_ACADIA = GMPlatformConfig( [GMCarDocs("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo")], GMCarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4), ) @@ -118,37 +118,37 @@ class CAR(Platforms): [GMCarDocs("Buick Regal Essence 2018")], GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), ) - ESCALADE = GMPlatformConfig( + CADILLAC_ESCALADE = GMPlatformConfig( [GMCarDocs("Cadillac Escalade 2017", "Driver Assist Package")], GMCarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3), ) - ESCALADE_ESV = GMPlatformConfig( + CADILLAC_ESCALADE_ESV = GMPlatformConfig( [GMCarDocs("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")], GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0), ) - ESCALADE_ESV_2019 = GMPlatformConfig( + CADILLAC_ESCALADE_ESV_2019 = GMPlatformConfig( [GMCarDocs("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")], - ESCALADE_ESV.specs, + CADILLAC_ESCALADE_ESV.specs, ) - BOLT_EUV = GMPlatformConfig( + CHEVROLET_BOLT_EUV = GMPlatformConfig( [ GMCarDocs("Chevrolet Bolt EUV 2022-23", "Premier or Premier Redline Trim without Super Cruise Package", video_link="https://youtu.be/xvwzGMUA210"), GMCarDocs("Chevrolet Bolt EV 2022-23", "2LT Trim with Adaptive Cruise Control Package"), ], GMCarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), ) - SILVERADO = GMPlatformConfig( + CHEVROLET_SILVERADO = GMPlatformConfig( [ GMCarDocs("Chevrolet Silverado 1500 2020-21", "Safety Package II"), GMCarDocs("GMC Sierra 1500 2020-21", "Driver Alert Package II", video_link="https://youtu.be/5HbNoBLzRwE"), ], GMCarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3, tireStiffnessFactor=1.0), ) - EQUINOX = GMPlatformConfig( + CHEVROLET_EQUINOX = GMPlatformConfig( [GMCarDocs("Chevrolet Equinox 2019-22")], GMCarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), ) - TRAILBLAZER = GMPlatformConfig( + CHEVROLET_TRAILBLAZER = GMPlatformConfig( [GMCarDocs("Chevrolet Trailblazer 2021-22")], GMCarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), ) @@ -226,10 +226,10 @@ FW_QUERY_CONFIG = FwQueryConfig( extra_ecus=[(Ecu.fwdCamera, 0x24b, None)], ) -EV_CAR = {CAR.VOLT, CAR.BOLT_EUV} +EV_CAR = {CAR.CHEVROLET_VOLT, CAR.CHEVROLET_BOLT_EUV} # We're integrated at the camera with VOACC on these cars (instead of ASCM w/ OBD-II harness) -CAMERA_ACC_CAR = {CAR.BOLT_EUV, CAR.SILVERADO, CAR.EQUINOX, CAR.TRAILBLAZER} +CAMERA_ACC_CAR = {CAR.CHEVROLET_BOLT_EUV, CAR.CHEVROLET_SILVERADO, CAR.CHEVROLET_EQUINOX, CAR.CHEVROLET_TRAILBLAZER} STEER_THRESHOLD = 1.0 diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py index 976511f113..c98d1a72d3 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -28,7 +28,7 @@ def get_can_messages(CP, gearbox_msg): ("STEER_MOTOR_TORQUE", 0), # TODO: not on every car ] - if CP.carFingerprint == CAR.ODYSSEY_CHN: + if CP.carFingerprint == CAR.HONDA_ODYSSEY_CHN: messages += [ ("SCM_FEEDBACK", 25), ("SCM_BUTTONS", 50), @@ -39,7 +39,7 @@ def get_can_messages(CP, gearbox_msg): ("SCM_BUTTONS", 25), ] - if CP.carFingerprint in (CAR.CRV_HYBRID, CAR.CIVIC_BOSCH_DIESEL, CAR.ACURA_RDX_3G, CAR.HONDA_E): + if CP.carFingerprint in (CAR.HONDA_CRV_HYBRID, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.ACURA_RDX_3G, CAR.HONDA_E): messages.append((gearbox_msg, 50)) else: messages.append((gearbox_msg, 100)) @@ -47,7 +47,7 @@ def get_can_messages(CP, gearbox_msg): if CP.flags & HondaFlags.BOSCH_ALT_BRAKE: messages.append(("BRAKE_MODULE", 50)) - if CP.carFingerprint in (HONDA_BOSCH | {CAR.CIVIC, CAR.ODYSSEY, CAR.ODYSSEY_CHN}): + if CP.carFingerprint in (HONDA_BOSCH | {CAR.HONDA_CIVIC, CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN}): messages.append(("EPB_STATUS", 50)) if CP.carFingerprint in HONDA_BOSCH: @@ -58,16 +58,16 @@ def get_can_messages(CP, gearbox_msg): ("ACC_CONTROL", 50), ] else: # Nidec signals - if CP.carFingerprint == CAR.ODYSSEY_CHN: + if CP.carFingerprint == CAR.HONDA_ODYSSEY_CHN: messages.append(("CRUISE_PARAMS", 10)) else: messages.append(("CRUISE_PARAMS", 50)) # TODO: clean this up - if CP.carFingerprint in (CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, - CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.CIVIC_2022, CAR.HRV_3G): + if CP.carFingerprint in (CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.HONDA_CRV_HYBRID, CAR.HONDA_INSIGHT, + CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G): pass - elif CP.carFingerprint in (CAR.ODYSSEY_CHN, CAR.FREED, CAR.HRV): + elif CP.carFingerprint in (CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_FREED, CAR.HONDA_HRV): pass else: messages.append(("DOORS_STATUS", 3)) @@ -85,7 +85,7 @@ class CarState(CarStateBase): super().__init__(CP) can_define = CANDefine(DBC[CP.carFingerprint]["pt"]) self.gearbox_msg = "GEARBOX" - if CP.carFingerprint == CAR.ACCORD and CP.transmissionType == TransmissionType.cvt: + if CP.carFingerprint == CAR.HONDA_ACCORD and CP.transmissionType == TransmissionType.cvt: self.gearbox_msg = "GEARBOX_15T" self.main_on_sig_msg = "SCM_FEEDBACK" @@ -125,10 +125,10 @@ class CarState(CarStateBase): # panda checks if the signal is non-zero ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 1e-5 # TODO: find a common signal across all cars - if self.CP.carFingerprint in (CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, - CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.CIVIC_2022, CAR.HRV_3G): + if self.CP.carFingerprint in (CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.HONDA_CRV_HYBRID, CAR.HONDA_INSIGHT, + CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G): ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"]) - elif self.CP.carFingerprint in (CAR.ODYSSEY_CHN, CAR.FREED, CAR.HRV): + elif self.CP.carFingerprint in (CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_FREED, CAR.HONDA_HRV): ret.doorOpen = bool(cp.vl["SCM_BUTTONS"]["DRIVERS_DOOR_OPEN"]) else: ret.doorOpen = any([cp.vl["DOORS_STATUS"]["DOOR_OPEN_FL"], cp.vl["DOORS_STATUS"]["DOOR_OPEN_FR"], @@ -181,7 +181,7 @@ class CarState(CarStateBase): ret.brakeHoldActive = cp.vl["VSA_STATUS"]["BRAKE_HOLD_ACTIVE"] == 1 # TODO: set for all cars - if self.CP.carFingerprint in (HONDA_BOSCH | {CAR.CIVIC, CAR.ODYSSEY, CAR.ODYSSEY_CHN}): + if self.CP.carFingerprint in (HONDA_BOSCH | {CAR.HONDA_CIVIC, CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN}): ret.parkingBrake = cp.vl["EPB_STATUS"]["EPB_STATE"] != 0 gear = int(cp.vl[self.gearbox_msg]["GEAR_SHIFTER"]) @@ -232,7 +232,7 @@ class CarState(CarStateBase): ret.cruiseState.available = bool(cp.vl[self.main_on_sig_msg]["MAIN_ON"]) # Gets rid of Pedal Grinding noise when brake is pressed at slow speeds for some models - if self.CP.carFingerprint in (CAR.PILOT, CAR.RIDGELINE): + if self.CP.carFingerprint in (CAR.HONDA_PILOT, CAR.HONDA_RIDGELINE): if ret.brake > 0.1: ret.brakePressed = True diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 5296a91e50..8068c63308 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -10,7 +10,7 @@ Ecu = car.CarParams.Ecu FW_VERSIONS = { - CAR.ACCORD: { + CAR.HONDA_ACCORD: { (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-6A0-8720\x00\x00', b'37805-6A0-9520\x00\x00', @@ -205,7 +205,7 @@ FW_VERSIONS = { b'38897-TWD-J020\x00\x00', ], }, - CAR.CIVIC: { + CAR.HONDA_CIVIC: { (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-5AA-A640\x00\x00', b'37805-5AA-A650\x00\x00', @@ -305,7 +305,7 @@ FW_VERSIONS = { b'38897-TBA-A020\x00\x00', ], }, - CAR.CIVIC_BOSCH: { + CAR.HONDA_CIVIC_BOSCH: { (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-5AA-A940\x00\x00', b'37805-5AA-A950\x00\x00', @@ -490,7 +490,7 @@ FW_VERSIONS = { b'39494-TGL-G030\x00\x00', ], }, - CAR.CIVIC_BOSCH_DIESEL: { + CAR.HONDA_CIVIC_BOSCH_DIESEL: { (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-59N-G630\x00\x00', b'37805-59N-G830\x00\x00', @@ -528,7 +528,7 @@ FW_VERSIONS = { b'38897-TBA-A020\x00\x00', ], }, - CAR.CRV: { + CAR.HONDA_CRV: { (Ecu.vsa, 0x18da28f1, None): [ b'57114-T1W-A230\x00\x00', b'57114-T1W-A240\x00\x00', @@ -548,7 +548,7 @@ FW_VERSIONS = { b'36161-T1X-A830\x00\x00', ], }, - CAR.CRV_5G: { + CAR.HONDA_CRV_5G: { (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-5PA-3060\x00\x00', b'37805-5PA-3080\x00\x00', @@ -676,7 +676,7 @@ FW_VERSIONS = { b'77959-TMM-F040\x00\x00', ], }, - CAR.CRV_EU: { + CAR.HONDA_CRV_EU: { (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-R5Z-G740\x00\x00', b'37805-R5Z-G780\x00\x00', @@ -702,7 +702,7 @@ FW_VERSIONS = { b'77959-T1G-G940\x00\x00', ], }, - CAR.CRV_HYBRID: { + CAR.HONDA_CRV_HYBRID: { (Ecu.vsa, 0x18da28f1, None): [ b'57114-TMB-H030\x00\x00', b'57114-TPA-G020\x00\x00', @@ -747,7 +747,7 @@ FW_VERSIONS = { b'77959-TLA-H240\x00\x00', ], }, - CAR.FIT: { + CAR.HONDA_FIT: { (Ecu.vsa, 0x18da28f1, None): [ b'57114-T5R-L020\x00\x00', b'57114-T5R-L220\x00\x00', @@ -774,7 +774,7 @@ FW_VERSIONS = { b'77959-T5R-A230\x00\x00', ], }, - CAR.FREED: { + CAR.HONDA_FREED: { (Ecu.gateway, 0x18daeff1, None): [ b'38897-TDK-J010\x00\x00', ], @@ -796,7 +796,7 @@ FW_VERSIONS = { b'36161-TDK-J530\x00\x00', ], }, - CAR.ODYSSEY: { + CAR.HONDA_ODYSSEY: { (Ecu.gateway, 0x18daeff1, None): [ b'38897-THR-A010\x00\x00', b'38897-THR-A020\x00\x00', @@ -899,7 +899,7 @@ FW_VERSIONS = { b'54008-THR-A020\x00\x00', ], }, - CAR.ODYSSEY_CHN: { + CAR.HONDA_ODYSSEY_CHN: { (Ecu.eps, 0x18da30f1, None): [ b'39990-T6D-H220\x00\x00', ], @@ -916,7 +916,7 @@ FW_VERSIONS = { b'77959-T6A-P110\x00\x00', ], }, - CAR.PILOT: { + CAR.HONDA_PILOT: { (Ecu.shiftByWire, 0x18da0bf1, None): [ b'54008-TG7-A520\x00\x00', b'54008-TG7-A530\x00\x00', @@ -1178,7 +1178,7 @@ FW_VERSIONS = { b'39990-TJB-A130\x00\x00', ], }, - CAR.RIDGELINE: { + CAR.HONDA_RIDGELINE: { (Ecu.eps, 0x18da30f1, None): [ b'39990-T6Z-A020\x00\x00', b'39990-T6Z-A030\x00\x00', @@ -1221,7 +1221,7 @@ FW_VERSIONS = { b'57114-TJZ-A520\x00\x00', ], }, - CAR.INSIGHT: { + CAR.HONDA_INSIGHT: { (Ecu.eps, 0x18da30f1, None): [ b'39990-TXM-A040\x00\x00', ], @@ -1254,7 +1254,7 @@ FW_VERSIONS = { b'78109-TXM-C010\x00\x00', ], }, - CAR.HRV: { + CAR.HONDA_HRV: { (Ecu.gateway, 0x18daeff1, None): [ b'38897-T7A-A010\x00\x00', b'38897-T7A-A110\x00\x00', @@ -1280,7 +1280,7 @@ FW_VERSIONS = { b'78109-THX-C220\x00\x00', ], }, - CAR.HRV_3G: { + CAR.HONDA_HRV_3G: { (Ecu.eps, 0x18da30f1, None): [ b'39990-3W0-A030\x00\x00', ], @@ -1350,7 +1350,7 @@ FW_VERSIONS = { b'57114-TYF-E030\x00\x00', ], }, - CAR.CIVIC_2022: { + CAR.HONDA_CIVIC_2022: { (Ecu.eps, 0x18da30f1, None): [ b'39990-T24-T120\x00\x00', b'39990-T39-A130\x00\x00', diff --git a/selfdrive/car/honda/hondacan.py b/selfdrive/car/honda/hondacan.py index e8a0c1bad3..1be496d951 100644 --- a/selfdrive/car/honda/hondacan.py +++ b/selfdrive/car/honda/hondacan.py @@ -195,7 +195,7 @@ def create_ui_commands(packer, CAN, CP, enabled, pcm_speed, hud, is_metric, acc_ } commands.append(packer.make_can_msg('RADAR_HUD', CAN.pt, radar_hud_values)) - if CP.carFingerprint == CAR.CIVIC_BOSCH: + if CP.carFingerprint == CAR.HONDA_CIVIC_BOSCH: commands.append(packer.make_can_msg("LEGACY_BRAKE_COMMAND", CAN.pt, {})) return commands diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 9d76beb649..2a5a07093d 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -52,7 +52,7 @@ class CarInterface(CarInterfaceBase): ret.pcmCruise = True - if candidate == CAR.CRV_5G: + if candidate == CAR.HONDA_CRV_5G: ret.enableBsm = 0x12f8bfa7 in fingerprint[CAN.radar] # Detect Bosch cars with new HUD msgs @@ -60,7 +60,7 @@ class CarInterface(CarInterfaceBase): ret.flags |= HondaFlags.BOSCH_EXT_HUD.value # Accord ICE 1.5T CVT has different gearbox message - if candidate == CAR.ACCORD and 0x191 in fingerprint[CAN.pt]: + if candidate == CAR.HONDA_ACCORD and 0x191 in fingerprint[CAN.pt]: ret.transmissionType = TransmissionType.cvt # Certain Hondas have an extra steering sensor at the bottom of the steering rack, @@ -89,7 +89,7 @@ class CarInterface(CarInterfaceBase): if fw.ecu == "eps" and b"," in fw.fwVersion: eps_modified = True - if candidate == CAR.CIVIC: + if candidate == CAR.HONDA_CIVIC: if eps_modified: # stock request input values: 0x0000, 0x00DE, 0x014D, 0x01EF, 0x0290, 0x0377, 0x0454, 0x0610, 0x06EE # stock request output values: 0x0000, 0x0917, 0x0DC5, 0x1017, 0x119F, 0x140B, 0x1680, 0x1680, 0x1680 @@ -103,11 +103,11 @@ class CarInterface(CarInterfaceBase): ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2560], [0, 2560]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[1.1], [0.33]] - elif candidate in (CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CIVIC_2022): + elif candidate in (CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.HONDA_CIVIC_2022): ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] - elif candidate == CAR.ACCORD: + elif candidate == CAR.HONDA_ACCORD: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end if eps_modified: @@ -119,12 +119,12 @@ class CarInterface(CarInterfaceBase): ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] # TODO: determine if there is a dead zone at the top end ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] - elif candidate in (CAR.CRV, CAR.CRV_EU): + elif candidate in (CAR.HONDA_CRV, CAR.HONDA_CRV_EU): ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 1000], [0, 1000]] # TODO: determine if there is a dead zone at the top end ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] ret.wheelSpeedFactor = 1.025 - elif candidate == CAR.CRV_5G: + elif candidate == CAR.HONDA_CRV_5G: if eps_modified: # stock request input values: 0x0000, 0x00DB, 0x01BB, 0x0296, 0x0377, 0x0454, 0x0532, 0x0610, 0x067F # stock request output values: 0x0000, 0x0500, 0x0A15, 0x0E6D, 0x1100, 0x1200, 0x129A, 0x134D, 0x1400 @@ -136,22 +136,22 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.64], [0.192]] ret.wheelSpeedFactor = 1.025 - elif candidate == CAR.CRV_HYBRID: + elif candidate == CAR.HONDA_CRV_HYBRID: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] ret.wheelSpeedFactor = 1.025 - elif candidate == CAR.FIT: + elif candidate == CAR.HONDA_FIT: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]] - elif candidate == CAR.FREED: + elif candidate == CAR.HONDA_FREED: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]] - elif candidate in (CAR.HRV, CAR.HRV_3G): + elif candidate in (CAR.HONDA_HRV, CAR.HONDA_HRV_3G): ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] - if candidate == CAR.HRV: + if candidate == CAR.HONDA_HRV: ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.16], [0.025]] ret.wheelSpeedFactor = 1.025 else: @@ -165,22 +165,22 @@ class CarInterface(CarInterfaceBase): ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]] - elif candidate in (CAR.ODYSSEY, CAR.ODYSSEY_CHN): + elif candidate in (CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN): ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.28], [0.08]] - if candidate == CAR.ODYSSEY_CHN: + if candidate == CAR.HONDA_ODYSSEY_CHN: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 32767], [0, 32767]] # TODO: determine if there is a dead zone at the top end else: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end - elif candidate == CAR.PILOT: + elif candidate == CAR.HONDA_PILOT: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.38], [0.11]] - elif candidate == CAR.RIDGELINE: + elif candidate == CAR.HONDA_RIDGELINE: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.38], [0.11]] - elif candidate == CAR.INSIGHT: + elif candidate == CAR.HONDA_INSIGHT: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] @@ -193,7 +193,7 @@ class CarInterface(CarInterfaceBase): # These cars use alternate user brake msg (0x1BE) # TODO: Only detect feature for Accord/Accord Hybrid, not all Bosch DBCs have BRAKE_MODULE - if 0x1BE in fingerprint[CAN.pt] and candidate == CAR.ACCORD: + if 0x1BE in fingerprint[CAN.pt] and candidate == CAR.HONDA_ACCORD: ret.flags |= HondaFlags.BOSCH_ALT_BRAKE.value if ret.flags & HondaFlags.BOSCH_ALT_BRAKE: @@ -212,7 +212,7 @@ class CarInterface(CarInterfaceBase): # min speed to enable ACC. if car can do stop and go, then set enabling speed # to a negative value, so it won't matter. Otherwise, add 0.5 mph margin to not # conflict with PCM acc - ret.autoResumeSng = candidate in (HONDA_BOSCH | {CAR.CIVIC}) + ret.autoResumeSng = candidate in (HONDA_BOSCH | {CAR.HONDA_CIVIC}) ret.minEnableSpeed = -1. if ret.autoResumeSng else 25.5 * CV.MPH_TO_MS ret.steerActuatorDelay = 0.1 diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index ef565e89bf..533e01e9b4 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -115,7 +115,7 @@ class HondaNidecPlatformConfig(PlatformConfig): class CAR(Platforms): # Bosch Cars - ACCORD = HondaBoschPlatformConfig( + HONDA_ACCORD = HondaBoschPlatformConfig( [ HondaCarDocs("Honda Accord 2018-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS), HondaCarDocs("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS), @@ -125,7 +125,7 @@ class CAR(Platforms): CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39, tireStiffnessFactor=0.8467), dbc_dict('honda_accord_2018_can_generated', None), ) - CIVIC_BOSCH = HondaBoschPlatformConfig( + HONDA_CIVIC_BOSCH = HondaBoschPlatformConfig( [ HondaCarDocs("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS), @@ -134,34 +134,34 @@ class CAR(Platforms): CarSpecs(mass=1326, wheelbase=2.7, steerRatio=15.38, centerToFrontRatio=0.4), # steerRatio: 10.93 is end-to-end spec dbc_dict('honda_civic_hatchback_ex_2017_can_generated', None), ) - CIVIC_BOSCH_DIESEL = HondaBoschPlatformConfig( + HONDA_CIVIC_BOSCH_DIESEL = HondaBoschPlatformConfig( [], # don't show in docs - CIVIC_BOSCH.specs, + HONDA_CIVIC_BOSCH.specs, dbc_dict('honda_accord_2018_can_generated', None), ) - CIVIC_2022 = HondaBoschPlatformConfig( + HONDA_CIVIC_2022 = HondaBoschPlatformConfig( [ HondaCarDocs("Honda Civic 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), HondaCarDocs("Honda Civic Hatchback 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), ], - CIVIC_BOSCH.specs, + HONDA_CIVIC_BOSCH.specs, dbc_dict('honda_civic_ex_2022_can_generated', None), flags=HondaFlags.BOSCH_RADARLESS, ) - CRV_5G = HondaBoschPlatformConfig( + HONDA_CRV_5G = HondaBoschPlatformConfig( [HondaCarDocs("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS)], # steerRatio: 12.3 is spec end-to-end CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), flags=HondaFlags.BOSCH_ALT_BRAKE, ) - CRV_HYBRID = HondaBoschPlatformConfig( + HONDA_CRV_HYBRID = HondaBoschPlatformConfig( [HondaCarDocs("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS)], # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), dbc_dict('honda_accord_2018_can_generated', None), ) - HRV_3G = HondaBoschPlatformConfig( + HONDA_HRV_3G = HondaBoschPlatformConfig( [HondaCarDocs("Honda HR-V 2023", "All")], CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41, tireStiffnessFactor=0.5), dbc_dict('honda_civic_ex_2022_can_generated', None), @@ -173,7 +173,7 @@ class CAR(Platforms): dbc_dict('acura_rdx_2020_can_generated', None), flags=HondaFlags.BOSCH_ALT_BRAKE, ) - INSIGHT = HondaBoschPlatformConfig( + HONDA_INSIGHT = HondaBoschPlatformConfig( [HondaCarDocs("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39, tireStiffnessFactor=0.82), # as spec dbc_dict('honda_insight_ex_2019_can_generated', None), @@ -191,45 +191,45 @@ class CAR(Platforms): dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - CRV = HondaNidecPlatformConfig( + HONDA_CRV = HondaNidecPlatformConfig( [HondaCarDocs("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41, tireStiffnessFactor=0.444), # as spec dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - CRV_EU = HondaNidecPlatformConfig( + HONDA_CRV_EU = HondaNidecPlatformConfig( [], # Euro version of CRV Touring, don't show in docs - CRV.specs, + HONDA_CRV.specs, dbc_dict('honda_crv_executive_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - FIT = HondaNidecPlatformConfig( + HONDA_FIT = HondaNidecPlatformConfig( [HondaCarDocs("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - FREED = HondaNidecPlatformConfig( + HONDA_FREED = HondaNidecPlatformConfig( [HondaCarDocs("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), # mostly copied from FIT dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - HRV = HondaNidecPlatformConfig( + HONDA_HRV = HondaNidecPlatformConfig( [HondaCarDocs("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS)], - HRV_3G.specs, + HONDA_HRV_3G.specs, dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - ODYSSEY = HondaNidecPlatformConfig( + HONDA_ODYSSEY = HondaNidecPlatformConfig( [HondaCarDocs("Honda Odyssey 2018-20")], CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41, tireStiffnessFactor=0.82), dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_PCM_ACCEL, ) - ODYSSEY_CHN = HondaNidecPlatformConfig( + HONDA_ODYSSEY_CHN = HondaNidecPlatformConfig( [], # Chinese version of Odyssey, don't show in docs - ODYSSEY.specs, + HONDA_ODYSSEY.specs, dbc_dict('honda_odyssey_extreme_edition_2018_china_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) @@ -239,7 +239,7 @@ class CAR(Platforms): dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - PILOT = HondaNidecPlatformConfig( + HONDA_PILOT = HondaNidecPlatformConfig( [ HondaCarDocs("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS), HondaCarDocs("Honda Passport 2019-23", "All", min_steer_speed=12. * CV.MPH_TO_MS), @@ -248,13 +248,13 @@ class CAR(Platforms): dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - RIDGELINE = HondaNidecPlatformConfig( + HONDA_RIDGELINE = HondaNidecPlatformConfig( [HondaCarDocs("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS)], CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59, tireStiffnessFactor=0.444), # as spec dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - CIVIC = HondaNidecPlatformConfig( + HONDA_CIVIC = HondaNidecPlatformConfig( [HondaCarDocs("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE")], CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'), @@ -307,16 +307,16 @@ FW_QUERY_CONFIG = FwQueryConfig( # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present non_essential_ecus={ - Ecu.programmedFuelInjection: [CAR.ACCORD, CAR.CIVIC, CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.transmission: [CAR.ACCORD, CAR.CIVIC, CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.srs: [CAR.ACCORD], - Ecu.eps: [CAR.ACCORD], - Ecu.vsa: [CAR.ACCORD, CAR.CIVIC, CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.combinationMeter: [CAR.ACCORD, CAR.CIVIC, CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.gateway: [CAR.ACCORD, CAR.CIVIC, CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.electricBrakeBooster: [CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.shiftByWire: [CAR.ACCORD], # existence correlates with transmission type for ICE - Ecu.hud: [CAR.ACCORD], # existence correlates with trim level + Ecu.programmedFuelInjection: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.transmission: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.srs: [CAR.HONDA_ACCORD], + Ecu.eps: [CAR.HONDA_ACCORD], + Ecu.vsa: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.combinationMeter: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.gateway: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.electricBrakeBooster: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.shiftByWire: [CAR.HONDA_ACCORD], # existence correlates with transmission type for ICE + Ecu.hud: [CAR.HONDA_ACCORD], # existence correlates with trim level }, extra_ecus=[ # The only other ECU on PT bus accessible by camera on radarless Civic @@ -327,7 +327,7 @@ FW_QUERY_CONFIG = FwQueryConfig( STEER_THRESHOLD = { # default is 1200, overrides go here CAR.ACURA_RDX: 400, - CAR.CRV_EU: 400, + CAR.HONDA_CRV_EU: 400, } HONDA_NIDEC_ALT_PCM_ACCEL = CAR.with_flags(HondaFlags.NIDEC_ALT_PCM_ACCEL) diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index 64a9fdf2ce..eac91d5293 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -207,7 +207,7 @@ class CarState(CarStateBase): # TODO: alt signal usage may be described by cp.vl['BLINKERS']['USE_ALT_LAMP'] left_blinker_sig, right_blinker_sig = "LEFT_LAMP", "RIGHT_LAMP" - if self.CP.carFingerprint == CAR.KONA_EV_2ND_GEN: + if self.CP.carFingerprint == CAR.HYUNDAI_KONA_EV_2ND_GEN: left_blinker_sig, right_blinker_sig = "LEFT_LAMP_ALT", "RIGHT_LAMP_ALT" ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, cp.vl["BLINKERS"][left_blinker_sig], cp.vl["BLINKERS"][right_blinker_sig]) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 4116c65b3f..b7f9cb3384 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -5,7 +5,7 @@ from openpilot.selfdrive.car.hyundai.values import CAR Ecu = car.CarParams.Ecu FINGERPRINTS = { - CAR.SANTA_FE: [{ + CAR.HYUNDAI_SANTA_FE: [{ 67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 593: 8, 608: 8, 688: 6, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1155: 8, 1156: 8, 1162: 8, 1164: 8, 1168: 7, 1170: 8, 1173: 8, 1183: 8, 1186: 2, 1191: 2, 1227: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1379: 8, 1384: 8, 1407: 8, 1414: 3, 1419: 8, 1427: 6, 1456: 4, 1470: 8 }, { @@ -14,7 +14,7 @@ FINGERPRINTS = { { 67: 8, 68: 8, 80: 4, 160: 8, 161: 8, 272: 8, 288: 4, 339: 8, 356: 8, 357: 8, 399: 8, 544: 8, 608: 8, 672: 8, 688: 5, 704: 1, 790: 8, 809: 8, 848: 8, 880: 8, 898: 8, 900: 8, 901: 8, 904: 8, 1056: 8, 1064: 8, 1065: 8, 1072: 8, 1075: 8, 1087: 8, 1088: 8, 1151: 8, 1200: 8, 1201: 8, 1232: 4, 1264: 8, 1265: 8, 1266: 8, 1296: 8, 1306: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1348: 8, 1349: 8, 1369: 8, 1370: 8, 1371: 8, 1407: 8, 1415: 8, 1419: 8, 1440: 8, 1442: 4, 1461: 8, 1470: 8 }], - CAR.SONATA: [{ + CAR.HYUNDAI_SONATA: [{ 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 546: 8, 549: 8, 550: 8, 576: 8, 593: 8, 608: 8, 688: 6, 809: 8, 832: 8, 854: 8, 865: 8, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 905: 8, 908: 8, 909: 8, 912: 7, 913: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1089: 5, 1096: 8, 1107: 5, 1108: 8, 1114: 8, 1136: 8, 1145: 8, 1151: 8, 1155: 8, 1156: 8, 1157: 4, 1162: 8, 1164: 8, 1168: 8, 1170: 8, 1173: 8, 1180: 8, 1183: 8, 1184: 8, 1186: 2, 1191: 2, 1193: 8, 1210: 8, 1225: 8, 1227: 8, 1265: 4, 1268: 8, 1280: 8, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1330: 8, 1339: 8, 1342: 6, 1343: 8, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1371: 8, 1378: 8, 1379: 8, 1384: 8, 1394: 8, 1407: 8, 1419: 8, 1427: 6, 1446: 8, 1456: 4, 1460: 8, 1470: 8, 1485: 8, 1504: 3, 1988: 8, 1996: 8, 2000: 8, 2004: 8, 2008: 8, 2012: 8, 2015: 8 }], CAR.KIA_STINGER: [{ @@ -23,13 +23,13 @@ FINGERPRINTS = { CAR.GENESIS_G90: [{ 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 359: 8, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1162: 4, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1281: 3, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1434: 2, 1456: 4, 1470: 8, 1988: 8, 2000: 8, 2003: 8, 2004: 8, 2005: 8, 2008: 8, 2011: 8, 2012: 8, 2013: 8 }], - CAR.IONIQ_EV_2020: [{ + CAR.HYUNDAI_IONIQ_EV_2020: [{ 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 524: 8, 544: 7, 593: 8, 688: 5, 832: 8, 881: 8, 882: 8, 897: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1136: 8, 1151: 6, 1155: 8, 1156: 8, 1157: 4, 1164: 8, 1168: 7, 1173: 8, 1183: 8, 1186: 2, 1191: 2, 1225: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1291: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1355: 8, 1363: 8, 1369: 8, 1379: 8, 1407: 8, 1419: 8, 1426: 8, 1427: 6, 1429: 8, 1430: 8, 1456: 4, 1470: 8, 1473: 8, 1507: 8, 1535: 8, 1988: 8, 1996: 8, 2000: 8, 2004: 8, 2005: 8, 2008: 8, 2012: 8, 2013: 8 }], - CAR.KONA_EV: [{ + CAR.HYUNDAI_KONA_EV: [{ 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 544: 8, 549: 8, 593: 8, 688: 5, 832: 8, 881: 8, 882: 8, 897: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1136: 8, 1151: 6, 1168: 7, 1173: 8, 1183: 8, 1186: 2, 1191: 2, 1225: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1291: 8, 1292: 8, 1294: 8, 1307: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1355: 8, 1363: 8, 1369: 8, 1378: 4, 1407: 8, 1419: 8, 1426: 8, 1427: 6, 1429: 8, 1430: 8, 1456: 4, 1470: 8, 1473: 8, 1507: 8, 1535: 8, 2000: 8, 2004: 8, 2008: 8, 2012: 8, 1157: 4, 1193: 8, 1379: 8, 1988: 8, 1996: 8 }], - CAR.KONA_EV_2022: [{ + CAR.HYUNDAI_KONA_EV_2022: [{ 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 544: 8, 593: 8, 688: 5, 832: 8, 881: 8, 882: 8, 897: 8, 902: 8, 903: 8, 905: 8, 909: 8, 913: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1069: 8, 1078: 4, 1136: 8, 1145: 8, 1151: 8, 1155: 8, 1156: 8, 1157: 4, 1162: 8, 1164: 8, 1168: 8, 1173: 8, 1183: 8, 1188: 8, 1191: 2, 1193: 8, 1225: 8, 1227: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1291: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1339: 8, 1342: 8, 1343: 8, 1345: 8, 1348: 8, 1355: 8, 1363: 8, 1369: 8, 1379: 8, 1407: 8, 1419: 8, 1426: 8, 1427: 6, 1429: 8, 1430: 8, 1446: 8, 1456: 4, 1470: 8, 1473: 8, 1485: 8, 1507: 8, 1535: 8, 1990: 8, 1998: 8 }], CAR.KIA_NIRO_EV: [{ @@ -44,7 +44,7 @@ FINGERPRINTS = { } FW_VERSIONS = { - CAR.AZERA_6TH_GEN: { + CAR.HYUNDAI_AZERA_6TH_GEN: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00IG__ SCC F-CU- 1.00 1.00 99110-G8100 ', ], @@ -61,7 +61,7 @@ FW_VERSIONS = { b'\xf1\x81641KA051\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.AZERA_HEV_6TH_GEN: { + CAR.HYUNDAI_AZERA_HEV_6TH_GEN: { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00IGH MFC AT KOR LHD 1.00 1.00 99211-G8000 180903', b'\xf1\x00IGH MFC AT KOR LHD 1.00 1.01 99211-G8000 181109', @@ -93,7 +93,7 @@ FW_VERSIONS = { b'\xf1\x00DH LKAS 1.5 -140425', ], }, - CAR.IONIQ: { + CAR.HYUNDAI_IONIQ: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 ', ], @@ -110,7 +110,7 @@ FW_VERSIONS = { b'\xf1\x816U3H1051\x00\x00\xf1\x006U3H0_C2\x00\x006U3H1051\x00\x00HAE0G16US2\x00\x00\x00\x00', ], }, - CAR.IONIQ_PHEV_2019: { + CAR.HYUNDAI_IONIQ_PHEV_2019: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2100 ', ], @@ -128,7 +128,7 @@ FW_VERSIONS = { b'\xf1\x816U3J2051\x00\x00\xf1\x006U3H0_C2\x00\x006U3J2051\x00\x00PAE0G16NS1\xdbD\r\x81', ], }, - CAR.IONIQ_PHEV: { + CAR.HYUNDAI_IONIQ_PHEV: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00AEhe SCC F-CUP 1.00 1.00 99110-G2200 ', b'\xf1\x00AEhe SCC F-CUP 1.00 1.00 99110-G2600 ', @@ -162,7 +162,7 @@ FW_VERSIONS = { b'\xf1\x816U3J9051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00PAE0G16NL2\x00\x00\x00\x00', ], }, - CAR.IONIQ_EV_2020: { + CAR.HYUNDAI_IONIQ_EV_2020: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00AEev SCC F-CUP 1.00 1.00 99110-G7200 ', b'\xf1\x00AEev SCC F-CUP 1.00 1.00 99110-G7500 ', @@ -180,7 +180,7 @@ FW_VERSIONS = { b'\xf1\x00AEE MFC AT EUR RHD 1.00 1.01 95740-G2600 190819', ], }, - CAR.IONIQ_EV_LTD: { + CAR.HYUNDAI_IONIQ_EV_LTD: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00AEev SCC F-CUP 1.00 1.00 96400-G7000 ', b'\xf1\x00AEev SCC F-CUP 1.00 1.00 96400-G7100 ', @@ -199,7 +199,7 @@ FW_VERSIONS = { b'\xf1\x00AEE MFC AT USA LHD 1.00 1.00 95740-G2400 180222', ], }, - CAR.IONIQ_HEV_2022: { + CAR.HYUNDAI_IONIQ_HEV_2022: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00AEhe SCC F-CUP 1.00 1.00 99110-G2600 ', b'\xf1\x00AEhe SCC FHCUP 1.00 1.00 99110-G2600 ', @@ -218,7 +218,7 @@ FW_VERSIONS = { b'\xf1\x816U3J9051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00HAE0G16NL2\x00\x00\x00\x00', ], }, - CAR.SONATA: { + CAR.HYUNDAI_SONATA: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00DN8_ SCC F-CU- 1.00 1.00 99110-L0000 ', b'\xf1\x00DN8_ SCC F-CUP 1.00 1.00 99110-L0000 ', @@ -361,7 +361,7 @@ FW_VERSIONS = { b'\xf1\x87SANFB45889451GC7wx\x87\x88gw\x87x\x88\x88x\x88\x87wxw\x87wxw\x87\x8f\xfc\xffeU\x8f\xff+Q\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', ], }, - CAR.SONATA_LF: { + CAR.HYUNDAI_SONATA_LF: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00LF__ SCC F-CUP 1.00 1.00 96401-C2200 ', ], @@ -389,7 +389,7 @@ FW_VERSIONS = { b'\xf1\x87\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf1\x816T6B4051\x00\x00\xf1\x006T6H0_C2\x00\x006T6B4051\x00\x00TLF0G24SL2n\x8d\xbe\xd8', ], }, - CAR.TUCSON: { + CAR.HYUNDAI_TUCSON: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00TL__ FCA F-CUP 1.00 1.01 99110-D3500 ', b'\xf1\x00TL__ FCA F-CUP 1.00 1.02 99110-D3510 ', @@ -407,7 +407,7 @@ FW_VERSIONS = { b'\xf1\x87LBJXAN202299KF22\x87x\x87\x88ww\x87xx\x88\x97\x88\x87\x88\x98x\x88\x99\x98\x89\x87o\xf6\xff\x87w\x7f\xff\x12\x9a\xf1\x81U083\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U083\x00\x00\x00\x00\x00\x00TTL2V20KL1\x8fRn\x8a', ], }, - CAR.SANTA_FE: { + CAR.HYUNDAI_SANTA_FE: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00TM__ SCC F-CUP 1.00 1.00 99110-S1210 ', b'\xf1\x00TM__ SCC F-CUP 1.00 1.01 99110-S2000 ', @@ -470,7 +470,7 @@ FW_VERSIONS = { b'\xf1\x87SDKXAA2443414GG1vfvgwv\x87h\x88\x88\x88\x88ww\x87wwwww\x99_\xfc\xffvD?\xffl\xd2\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM4G24NS6\x00\x00\x00\x00', ], }, - CAR.SANTA_FE_2022: { + CAR.HYUNDAI_SANTA_FE_2022: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00TM__ SCC F-CUP 1.00 1.00 99110-S1500 ', b'\xf1\x00TM__ SCC FHCUP 1.00 1.00 99110-S1500 ', @@ -532,7 +532,7 @@ FW_VERSIONS = { b'\xf1\x87SDMXCA9087684GN1VfvgUUeVwwgwwwwwffffU?\xfb\xff\x97\x88\x7f\xff+\xa4\xf1\x89HT6WAD00A1\xf1\x82STM4G25NH1\x00\x00\x00\x00\x00\x00', ], }, - CAR.SANTA_FE_HEV_2022: { + CAR.HYUNDAI_SANTA_FE_HEV_2022: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00TMhe SCC FHCUP 1.00 1.00 99110-CL500 ', b'\xf1\x00TMhe SCC FHCUP 1.00 1.01 99110-CL500 ', @@ -565,7 +565,7 @@ FW_VERSIONS = { b'\xf1\x87391312MTL0', ], }, - CAR.SANTA_FE_PHEV_2022: { + CAR.HYUNDAI_SANTA_FE_PHEV_2022: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00TMhe SCC F-CUP 1.00 1.00 99110-CL500 ', b'\xf1\x00TMhe SCC FHCUP 1.00 1.01 99110-CL500 ', @@ -591,7 +591,7 @@ FW_VERSIONS = { b'\xf1\x87391312MTF1', ], }, - CAR.CUSTIN_1ST_GEN: { + CAR.HYUNDAI_CUSTIN_1ST_GEN: { (Ecu.abs, 0x7d1, None): [ b'\xf1\x00KU ESC \x01 101!\x02\x03 58910-O3200', ], @@ -685,7 +685,7 @@ FW_VERSIONS = { b'\xf1\x87VCNLF11383972DK1vffV\x99\x99\x89\x98\x86eUU\x88wg\x89vfff\x97fff\x99\x87o\xff"\xc1\xf1\x81E30\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E30\x00\x00\x00\x00\x00\x00\x00SCK0T33GH0\xbe`\xfb\xc6', ], }, - CAR.PALISADE: { + CAR.HYUNDAI_PALISADE: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00LX2 SCC FHCUP 1.00 1.04 99110-S8100 ', b'\xf1\x00LX2_ SCC F-CUP 1.00 1.04 99110-S8100 ', @@ -792,7 +792,7 @@ FW_VERSIONS = { b'\xf1\x87LDMVBN950669KF37\x97www\x96fffy\x99\xa7\x99\xa9\x99\xaa\x99g\x88\x96x\xb8\x8f\xf9\xffTD/\xff\xa7\xcb\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', ], }, - CAR.VELOSTER: { + CAR.HYUNDAI_VELOSTER: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00JS__ SCC H-CUP 1.00 1.02 95650-J3200 ', b'\xf1\x00JS__ SCC HNCUP 1.00 1.02 95650-J3100 ', @@ -918,7 +918,7 @@ FW_VERSIONS = { b'\xf1\x810000000000\x00', ], }, - CAR.KONA: { + CAR.HYUNDAI_KONA: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00OS__ SCC F-CUP 1.00 1.00 95655-J9200 ', ], @@ -1063,7 +1063,7 @@ FW_VERSIONS = { b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TDL2H20KA5T\xf2\xc9\xc2', ], }, - CAR.KONA_EV: { + CAR.HYUNDAI_KONA_EV: { (Ecu.abs, 0x7d1, None): [ b'\xf1\x00OS IEB \x01 212 \x11\x13 58520-K4000', b'\xf1\x00OS IEB \x02 212 \x11\x13 58520-K4000', @@ -1091,7 +1091,7 @@ FW_VERSIONS = { b'\xf1\x00OSev SCC FNCUP 1.00 1.01 99110-K4000 ', ], }, - CAR.KONA_EV_2022: { + CAR.HYUNDAI_KONA_EV_2022: { (Ecu.abs, 0x7d1, None): [ b'\xf1\x00OS IEB \x02 102"\x05\x16 58520-K4010', b'\xf1\x00OS IEB \x03 102"\x05\x16 58520-K4010', @@ -1120,7 +1120,7 @@ FW_VERSIONS = { b'\xf1\x00YB__ FCA ----- 1.00 1.01 99110-K4500 \x00\x00\x00', ], }, - CAR.KONA_EV_2ND_GEN: { + CAR.HYUNDAI_KONA_EV_2ND_GEN: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00SXev RDR ----- 1.00 1.00 99110-BF000 ', ], @@ -1320,7 +1320,7 @@ FW_VERSIONS = { b'\xf1\x816H6D1051\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.ELANTRA: { + CAR.HYUNDAI_ELANTRA: { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00AD LKAS AT USA LHD 1.01 1.01 95895-F2000 251', b'\xf1\x00ADP LKAS AT USA LHD 1.00 1.03 99211-F2000 X31', @@ -1347,7 +1347,7 @@ FW_VERSIONS = { b'\xf1\x00AD__ SCC H-CUP 1.00 1.01 96400-F2100 ', ], }, - CAR.ELANTRA_GT_I30: { + CAR.HYUNDAI_ELANTRA_GT_I30: { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00PD LKAS AT KOR LHD 1.00 1.02 95740-G3000 A51', b'\xf1\x00PD LKAS AT USA LHD 1.00 1.02 95740-G3000 A51', @@ -1375,7 +1375,7 @@ FW_VERSIONS = { b'\xf1\x00PD__ SCC FNCUP 1.01 1.00 96400-G3000 ', ], }, - CAR.ELANTRA_2021: { + CAR.HYUNDAI_ELANTRA_2021: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00CN7_ SCC F-CUP 1.00 1.01 99110-AA000 ', b'\xf1\x00CN7_ SCC FHCUP 1.00 1.01 99110-AA000 ', @@ -1417,7 +1417,7 @@ FW_VERSIONS = { b'\xf1\x870\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x81HM6M2_0a0_HC0', ], }, - CAR.ELANTRA_HEV_2021: { + CAR.HYUNDAI_ELANTRA_HEV_2021: { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.03 99210-AA000 200819', b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.05 99210-AA000 210930', @@ -1448,7 +1448,7 @@ FW_VERSIONS = { b'\xf1\x816H6G8051\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.KONA_HEV: { + CAR.HYUNDAI_KONA_HEV: { (Ecu.abs, 0x7d1, None): [ b'\xf1\x00OS IEB \x01 104 \x11 58520-CM000', ], @@ -1468,7 +1468,7 @@ FW_VERSIONS = { b'\xf1\x816H6F6051\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.SONATA_HYBRID: { + CAR.HYUNDAI_SONATA_HYBRID: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00DNhe SCC F-CUP 1.00 1.02 99110-L5000 ', b'\xf1\x00DNhe SCC FHCUP 1.00 1.00 99110-L5000 ', @@ -1544,7 +1544,7 @@ FW_VERSIONS = { b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.06 99210-CV000 220328', ], }, - CAR.IONIQ_5: { + CAR.HYUNDAI_IONIQ_5: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00NE1_ RDR ----- 1.00 1.00 99110-GI000 ', ], @@ -1564,7 +1564,7 @@ FW_VERSIONS = { b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.06 99211-GI010 230110', ], }, - CAR.IONIQ_6: { + CAR.HYUNDAI_IONIQ_6: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00CE__ RDR ----- 1.00 1.01 99110-KL000 ', ], @@ -1574,7 +1574,7 @@ FW_VERSIONS = { b'\xf1\x00CE MFC AT USA LHD 1.00 1.04 99211-KL000 221213', ], }, - CAR.TUCSON_4TH_GEN: { + CAR.HYUNDAI_TUCSON_4TH_GEN: { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00NX4 FR_CMR AT CAN LHD 1.00 1.01 99211-N9100 14A', b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 1.00 99211-N9220 14K', @@ -1594,7 +1594,7 @@ FW_VERSIONS = { b'\xf1\x00NX4__ 1.01 1.00 99110-N9100 ', ], }, - CAR.SANTA_CRUZ_1ST_GEN: { + CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN: { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW000 14M', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW010 14X', @@ -1708,7 +1708,7 @@ FW_VERSIONS = { b'\xf1\x00GL3_ RDR ----- 1.00 1.02 99110-L8000 ', ], }, - CAR.STARIA_4TH_GEN: { + CAR.HYUNDAI_STARIA_4TH_GEN: { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00US4 MFC AT KOR LHD 1.00 1.06 99211-CG000 230524', ], diff --git a/selfdrive/car/hyundai/hyundaican.py b/selfdrive/car/hyundai/hyundaican.py index 7cbeed0afb..fe43def2ae 100644 --- a/selfdrive/car/hyundai/hyundaican.py +++ b/selfdrive/car/hyundai/hyundaican.py @@ -33,12 +33,12 @@ def create_lkas11(packer, frame, CP, apply_steer, steer_req, values["CF_Lkas_ToiFlt"] = torque_fault # seems to allow actuation on CR_Lkas_StrToqReq values["CF_Lkas_MsgCount"] = frame % 0x10 - if CP.carFingerprint in (CAR.SONATA, CAR.PALISADE, CAR.KIA_NIRO_EV, CAR.KIA_NIRO_HEV_2021, CAR.SANTA_FE, - CAR.IONIQ_EV_2020, CAR.IONIQ_PHEV, CAR.KIA_SELTOS, CAR.ELANTRA_2021, CAR.GENESIS_G70_2020, - CAR.ELANTRA_HEV_2021, CAR.SONATA_HYBRID, CAR.KONA_EV, CAR.KONA_HEV, CAR.KONA_EV_2022, - CAR.SANTA_FE_2022, CAR.KIA_K5_2021, CAR.IONIQ_HEV_2022, CAR.SANTA_FE_HEV_2022, - CAR.SANTA_FE_PHEV_2022, CAR.KIA_STINGER_2022, CAR.KIA_K5_HEV_2020, CAR.KIA_CEED, - CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN, CAR.CUSTIN_1ST_GEN): + if CP.carFingerprint in (CAR.HYUNDAI_SONATA, CAR.HYUNDAI_PALISADE, CAR.KIA_NIRO_EV, CAR.KIA_NIRO_HEV_2021, CAR.HYUNDAI_SANTA_FE, + CAR.HYUNDAI_IONIQ_EV_2020, CAR.HYUNDAI_IONIQ_PHEV, CAR.KIA_SELTOS, CAR.HYUNDAI_ELANTRA_2021, CAR.GENESIS_G70_2020, + CAR.HYUNDAI_ELANTRA_HEV_2021, CAR.HYUNDAI_SONATA_HYBRID, CAR.HYUNDAI_KONA_EV, CAR.HYUNDAI_KONA_HEV, CAR.HYUNDAI_KONA_EV_2022, + CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_IONIQ_HEV_2022, CAR.HYUNDAI_SANTA_FE_HEV_2022, + CAR.HYUNDAI_SANTA_FE_PHEV_2022, CAR.KIA_STINGER_2022, CAR.KIA_K5_HEV_2020, CAR.KIA_CEED, + CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_CUSTIN_1ST_GEN): values["CF_Lkas_LdwsActivemode"] = int(left_lane) + (int(right_lane) << 1) values["CF_Lkas_LdwsOpt_USM"] = 2 diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index 7f8cf05907..00452a9ae0 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -132,7 +132,7 @@ class CarInterface(CarInterfaceBase): elif ret.flags & HyundaiFlags.EV: ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_EV_GAS - if candidate in (CAR.KONA, CAR.KONA_EV, CAR.KONA_HEV, CAR.KONA_EV_2022): + if candidate in (CAR.HYUNDAI_KONA, CAR.HYUNDAI_KONA_EV, CAR.HYUNDAI_KONA_HEV, CAR.HYUNDAI_KONA_EV_2022): ret.flags |= HyundaiFlags.ALT_LIMITS.value ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_ALT_LIMITS diff --git a/selfdrive/car/hyundai/tests/test_hyundai.py b/selfdrive/car/hyundai/tests/test_hyundai.py index 61b11a1992..c9ec972313 100755 --- a/selfdrive/car/hyundai/tests/test_hyundai.py +++ b/selfdrive/car/hyundai/tests/test_hyundai.py @@ -18,22 +18,22 @@ ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()} NO_DATES_PLATFORMS = { # CAN FD CAR.KIA_SPORTAGE_5TH_GEN, - CAR.SANTA_CRUZ_1ST_GEN, - CAR.TUCSON_4TH_GEN, + CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN, + CAR.HYUNDAI_TUCSON_4TH_GEN, # CAN - CAR.ELANTRA, - CAR.ELANTRA_GT_I30, + CAR.HYUNDAI_ELANTRA, + CAR.HYUNDAI_ELANTRA_GT_I30, CAR.KIA_CEED, CAR.KIA_FORTE, CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL, CAR.KIA_SORENTO, - CAR.KONA, - CAR.KONA_EV, - CAR.KONA_EV_2022, - CAR.KONA_HEV, - CAR.SONATA_LF, - CAR.VELOSTER, + CAR.HYUNDAI_KONA, + CAR.HYUNDAI_KONA_EV, + CAR.HYUNDAI_KONA_EV_2022, + CAR.HYUNDAI_KONA_HEV, + CAR.HYUNDAI_SONATA_LF, + CAR.HYUNDAI_VELOSTER, } @@ -67,7 +67,7 @@ class TestHyundaiFingerprint(unittest.TestCase): # Tucson having Santa Cruz camera and EPS for example for car_model, ecus in FW_VERSIONS.items(): with self.subTest(car_model=car_model.value): - if car_model == CAR.SANTA_CRUZ_1ST_GEN: + if car_model == CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN: raise unittest.SkipTest("Skip checking Santa Cruz for its parts") for code, _ in get_platform_codes(ecus[(Ecu.fwdCamera, 0x7c4, None)]): @@ -108,9 +108,9 @@ class TestHyundaiFingerprint(unittest.TestCase): # Third and fourth character are usually EV/hybrid identifiers codes = {code.split(b"-")[0][:2] for code, _ in get_platform_codes(fws)} - if car_model == CAR.PALISADE: + if car_model == CAR.HYUNDAI_PALISADE: self.assertEqual(codes, {b"LX", b"ON"}, f"Car has unexpected platform codes: {car_model} {codes}") - elif car_model == CAR.KONA_EV and ecu[0] == Ecu.fwdCamera: + elif car_model == CAR.HYUNDAI_KONA_EV and ecu[0] == Ecu.fwdCamera: self.assertEqual(codes, {b"OE", b"OS"}, f"Car has unexpected platform codes: {car_model} {codes}") else: self.assertEqual(len(codes), 1, f"Car has multiple platform codes: {car_model} {codes}") @@ -120,7 +120,7 @@ class TestHyundaiFingerprint(unittest.TestCase): def test_platform_code_ecus_available(self): # TODO: add queries for these non-CAN FD cars to get EPS no_eps_platforms = CANFD_CAR | {CAR.KIA_SORENTO, CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL, CAR.KIA_OPTIMA_H, - CAR.KIA_OPTIMA_H_G4_FL, CAR.SONATA_LF, CAR.TUCSON, CAR.GENESIS_G90, CAR.GENESIS_G80, CAR.ELANTRA} + CAR.KIA_OPTIMA_H_G4_FL, CAR.HYUNDAI_SONATA_LF, CAR.HYUNDAI_TUCSON, CAR.GENESIS_G90, CAR.GENESIS_G80, CAR.HYUNDAI_ELANTRA} # Asserts ECU keys essential for fuzzy fingerprinting are available on all platforms for car_model, ecus in FW_VERSIONS.items(): diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 81587fc68a..f1a3c3ebc6 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -35,8 +35,8 @@ class CarControllerParams: # To determine the limit for your car, find the maximum value that the stock LKAS will request. # If the max stock LKAS request is <384, add your car to this list. - elif CP.carFingerprint in (CAR.GENESIS_G80, CAR.GENESIS_G90, CAR.ELANTRA, CAR.ELANTRA_GT_I30, CAR.IONIQ, - CAR.IONIQ_EV_LTD, CAR.SANTA_FE_PHEV_2022, CAR.SONATA_LF, CAR.KIA_FORTE, CAR.KIA_NIRO_PHEV, + elif CP.carFingerprint in (CAR.GENESIS_G80, CAR.GENESIS_G90, CAR.HYUNDAI_ELANTRA, CAR.HYUNDAI_ELANTRA_GT_I30, CAR.HYUNDAI_IONIQ, + CAR.HYUNDAI_IONIQ_EV_LTD, CAR.HYUNDAI_SANTA_FE_PHEV_2022, CAR.HYUNDAI_SONATA_LF, CAR.KIA_FORTE, CAR.KIA_NIRO_PHEV, CAR.KIA_OPTIMA_H, CAR.KIA_OPTIMA_H_G4_FL, CAR.KIA_SORENTO): self.STEER_MAX = 255 @@ -134,11 +134,11 @@ class HyundaiCanFDPlatformConfig(PlatformConfig): class CAR(Platforms): # Hyundai - AZERA_6TH_GEN = HyundaiPlatformConfig( + HYUNDAI_AZERA_6TH_GEN = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5), ) - AZERA_HEV_6TH_GEN = HyundaiPlatformConfig( + HYUNDAI_AZERA_HEV_6TH_GEN = HyundaiPlatformConfig( [ HyundaiCarDocs("Hyundai Azera Hybrid 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), HyundaiCarDocs("Hyundai Azera Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), @@ -146,7 +146,7 @@ class CAR(Platforms): CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5), flags=HyundaiFlags.HYBRID, ) - ELANTRA = HyundaiPlatformConfig( + HYUNDAI_ELANTRA = HyundaiPlatformConfig( [ # TODO: 2017-18 could be Hyundai G HyundaiCarDocs("Hyundai Elantra 2017-18", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b])), @@ -156,20 +156,20 @@ class CAR(Platforms): CarSpecs(mass=1275, wheelbase=2.7, steerRatio=15.4, tireStiffnessFactor=0.385), flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH, ) - ELANTRA_GT_I30 = HyundaiPlatformConfig( + HYUNDAI_ELANTRA_GT_I30 = HyundaiPlatformConfig( [ HyundaiCarDocs("Hyundai Elantra GT 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), HyundaiCarDocs("Hyundai i30 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), ], - ELANTRA.specs, + HYUNDAI_ELANTRA.specs, flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH, ) - ELANTRA_2021 = HyundaiPlatformConfig( + HYUNDAI_ELANTRA_2021 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Elantra 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=2800 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), flags=HyundaiFlags.CHECKSUM_CRC8, ) - ELANTRA_HEV_2021 = HyundaiPlatformConfig( + HYUNDAI_ELANTRA_HEV_2021 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Elantra Hybrid 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=3017 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), @@ -184,101 +184,101 @@ class CAR(Platforms): CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5, minSteerSpeed=60 * CV.KPH_TO_MS), flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.LEGACY, ) - IONIQ = HyundaiPlatformConfig( + HYUNDAI_IONIQ = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, ) - IONIQ_HEV_2022 = HyundaiPlatformConfig( + HYUNDAI_IONIQ_HEV_2022 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], # TODO: confirm 2020-21 harness, CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, ) - IONIQ_EV_LTD = HyundaiPlatformConfig( + HYUNDAI_IONIQ_EV_LTD = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY | HyundaiFlags.MIN_STEER_32_MPH, ) - IONIQ_EV_2020 = HyundaiPlatformConfig( + HYUNDAI_IONIQ_EV_2020 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV, ) - IONIQ_PHEV_2019 = HyundaiPlatformConfig( + HYUNDAI_IONIQ_PHEV_2019 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, ) - IONIQ_PHEV = HyundaiPlatformConfig( + HYUNDAI_IONIQ_PHEV = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID, ) - KONA = HyundaiPlatformConfig( + HYUNDAI_KONA = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b]))], CarSpecs(mass=1275, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CLUSTER_GEARS, ) - KONA_EV = HyundaiPlatformConfig( + HYUNDAI_KONA_EV = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))], CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV, ) - KONA_EV_2022 = HyundaiPlatformConfig( + HYUNDAI_KONA_EV_2022 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))], CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV, ) - KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig( + HYUNDAI_KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig( [HyundaiCarDocs("Hyundai Kona Electric (with HDA II, Korea only) 2023", video_link="https://www.youtube.com/watch?v=U2fOCmcQ8hw", car_parts=CarParts.common([CarHarness.hyundai_r]))], CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385), flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, ) - KONA_HEV = HyundaiPlatformConfig( + HYUNDAI_KONA_HEV = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages, CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID, ) - SANTA_FE = HyundaiPlatformConfig( + HYUNDAI_SANTA_FE = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s", car_parts=CarParts.common([CarHarness.hyundai_d]))], CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.766, steerRatio=16.55, tireStiffnessFactor=0.82), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) - SANTA_FE_2022 = HyundaiPlatformConfig( + HYUNDAI_SANTA_FE_2022 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Santa Fe 2021-23", "All", video_link="https://youtu.be/VnHzSTygTS4", car_parts=CarParts.common([CarHarness.hyundai_l]))], - SANTA_FE.specs, + HYUNDAI_SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8, ) - SANTA_FE_HEV_2022 = HyundaiPlatformConfig( + HYUNDAI_SANTA_FE_HEV_2022 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], - SANTA_FE.specs, + HYUNDAI_SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) - SANTA_FE_PHEV_2022 = HyundaiPlatformConfig( + HYUNDAI_SANTA_FE_PHEV_2022 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], - SANTA_FE.specs, + HYUNDAI_SANTA_FE.specs, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) - SONATA = HyundaiPlatformConfig( + HYUNDAI_SONATA = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Sonata 2020-23", "All", video_link="https://www.youtube.com/watch?v=ix63r9kE3Fw", car_parts=CarParts.common([CarHarness.hyundai_a]))], CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) - SONATA_LF = HyundaiPlatformConfig( + HYUNDAI_SONATA_LF = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, ) - STARIA_4TH_GEN = HyundaiCanFDPlatformConfig( + HYUNDAI_STARIA_4TH_GEN = HyundaiCanFDPlatformConfig( [HyundaiCarDocs("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=2205, wheelbase=3.273, steerRatio=11.94), # https://www.hyundai.com/content/dam/hyundai/au/en/models/staria-load/premium-pip-update-2023/spec-sheet/STARIA_Load_Spec-Table_March_2023_v3.1.pdf ) - TUCSON = HyundaiPlatformConfig( + HYUNDAI_TUCSON = HyundaiPlatformConfig( [ HyundaiCarDocs("Hyundai Tucson 2021", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_l])), HyundaiCarDocs("Hyundai Tucson Diesel 2019", car_parts=CarParts.common([CarHarness.hyundai_l])), @@ -286,7 +286,7 @@ class CAR(Platforms): CarSpecs(mass=3520 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=16.1, tireStiffnessFactor=0.385), flags=HyundaiFlags.TCU_GEARS, ) - PALISADE = HyundaiPlatformConfig( + HYUNDAI_PALISADE = HyundaiPlatformConfig( [ HyundaiCarDocs("Hyundai Palisade 2020-22", "All", video_link="https://youtu.be/TAnDqjF4fDY?t=456", car_parts=CarParts.common([CarHarness.hyundai_h])), HyundaiCarDocs("Kia Telluride 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), @@ -294,17 +294,17 @@ class CAR(Platforms): CarSpecs(mass=1999, wheelbase=2.9, steerRatio=15.6 * 1.15, tireStiffnessFactor=0.63), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) - VELOSTER = HyundaiPlatformConfig( + HYUNDAI_VELOSTER = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS, ) - SONATA_HYBRID = HyundaiPlatformConfig( + HYUNDAI_SONATA_HYBRID = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], - SONATA.specs, + HYUNDAI_SONATA.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) - IONIQ_5 = HyundaiCanFDPlatformConfig( + HYUNDAI_IONIQ_5 = HyundaiCanFDPlatformConfig( [ HyundaiCarDocs("Hyundai Ioniq 5 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), HyundaiCarDocs("Hyundai Ioniq 5 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])), @@ -313,12 +313,12 @@ class CAR(Platforms): CarSpecs(mass=1948, wheelbase=2.97, steerRatio=14.26, tireStiffnessFactor=0.65), flags=HyundaiFlags.EV, ) - IONIQ_6 = HyundaiCanFDPlatformConfig( + HYUNDAI_IONIQ_6 = HyundaiCanFDPlatformConfig( [HyundaiCarDocs("Hyundai Ioniq 6 (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))], - IONIQ_5.specs, + HYUNDAI_IONIQ_5.specs, flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, ) - TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( + HYUNDAI_TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( [ HyundaiCarDocs("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Hyundai Tucson 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), @@ -326,12 +326,12 @@ class CAR(Platforms): ], CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385), ) - SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( + HYUNDAI_SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( [HyundaiCarDocs("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))], # weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2), ) - CUSTIN_1ST_GEN = HyundaiPlatformConfig( + HYUNDAI_CUSTIN_1ST_GEN = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner flags=HyundaiFlags.CHECKSUM_CRC8, @@ -743,9 +743,9 @@ FW_QUERY_CONFIG = FwQueryConfig( # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present non_essential_ecus={ - Ecu.transmission: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN, CAR.PALISADE, CAR.SONATA], - Ecu.engine: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN, CAR.PALISADE, CAR.SONATA], - Ecu.abs: [CAR.PALISADE, CAR.SONATA], + Ecu.transmission: [CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA], + Ecu.engine: [CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA], + Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA], }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms diff --git a/selfdrive/car/mazda/fingerprints.py b/selfdrive/car/mazda/fingerprints.py index 8143ad71af..e7396d566e 100644 --- a/selfdrive/car/mazda/fingerprints.py +++ b/selfdrive/car/mazda/fingerprints.py @@ -4,7 +4,7 @@ from openpilot.selfdrive.car.mazda.values import CAR Ecu = car.CarParams.Ecu FW_VERSIONS = { - CAR.CX5_2022: { + CAR.MAZDA_CX5_2022: { (Ecu.eps, 0x730, None): [ b'KSD5-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], @@ -41,7 +41,7 @@ FW_VERSIONS = { b'SH51-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.CX5: { + CAR.MAZDA_CX5: { (Ecu.eps, 0x730, None): [ b'K319-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'KCB8-3210X-B-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -110,7 +110,7 @@ FW_VERSIONS = { b'SH9T-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.CX9: { + CAR.MAZDA_CX9: { (Ecu.eps, 0x730, None): [ b'K070-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'KJ01-3210X-G-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -160,7 +160,7 @@ FW_VERSIONS = { b'PYFM-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.MAZDA3: { + CAR.MAZDA_3: { (Ecu.eps, 0x730, None): [ b'BHN1-3210X-J-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'K070-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -195,7 +195,7 @@ FW_VERSIONS = { b'PYKE-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.MAZDA6: { + CAR.MAZDA_6: { (Ecu.eps, 0x730, None): [ b'GBEF-3210X-B-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'GBEF-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -227,7 +227,7 @@ FW_VERSIONS = { b'PYH7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, - CAR.CX9_2021: { + CAR.MAZDA_CX9_2021: { (Ecu.eps, 0x730, None): [ b'TC3M-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index a0fa73c021..6992d49ffe 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -16,14 +16,14 @@ class CarInterface(CarInterfaceBase): ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.mazda)] ret.radarUnavailable = True - ret.dashcamOnly = candidate not in (CAR.CX5_2022, CAR.CX9_2021) + ret.dashcamOnly = candidate not in (CAR.MAZDA_CX5_2022, CAR.MAZDA_CX9_2021) ret.steerActuatorDelay = 0.1 ret.steerLimitTimer = 0.8 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - if candidate not in (CAR.CX5_2022, ): + if candidate not in (CAR.MAZDA_CX5_2022, ): ret.minSteerSpeed = LKAS_LIMITS.DISABLE_SPEED * CV.KPH_TO_MS ret.centerToFront = ret.wheelbase * 0.41 diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 9d8278f951..a8c808d582 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -50,29 +50,29 @@ class MazdaPlatformConfig(PlatformConfig): class CAR(Platforms): - CX5 = MazdaPlatformConfig( + MAZDA_CX5 = MazdaPlatformConfig( [MazdaCarDocs("Mazda CX-5 2017-21")], MazdaCarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) ) - CX9 = MazdaPlatformConfig( + MAZDA_CX9 = MazdaPlatformConfig( [MazdaCarDocs("Mazda CX-9 2016-20")], MazdaCarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) ) - MAZDA3 = MazdaPlatformConfig( + MAZDA_3 = MazdaPlatformConfig( [MazdaCarDocs("Mazda 3 2017-18")], MazdaCarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) ) - MAZDA6 = MazdaPlatformConfig( + MAZDA_6 = MazdaPlatformConfig( [MazdaCarDocs("Mazda 6 2017-20")], MazdaCarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5) ) - CX9_2021 = MazdaPlatformConfig( + MAZDA_CX9_2021 = MazdaPlatformConfig( [MazdaCarDocs("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4")], - CX9.specs + MAZDA_CX9.specs ) - CX5_2022 = MazdaPlatformConfig( + MAZDA_CX5_2022 = MazdaPlatformConfig( [MazdaCarDocs("Mazda CX-5 2022-24")], - CX5.specs, + MAZDA_CX5.specs, ) diff --git a/selfdrive/car/nissan/carcontroller.py b/selfdrive/car/nissan/carcontroller.py index 6aa4bb9438..83775462b7 100644 --- a/selfdrive/car/nissan/carcontroller.py +++ b/selfdrive/car/nissan/carcontroller.py @@ -51,21 +51,21 @@ class CarController(CarControllerBase): self.apply_angle_last = apply_angle - if self.CP.carFingerprint in (CAR.ROGUE, CAR.XTRAIL, CAR.ALTIMA) and pcm_cancel_cmd: + if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA) and pcm_cancel_cmd: can_sends.append(nissancan.create_acc_cancel_cmd(self.packer, self.car_fingerprint, CS.cruise_throttle_msg)) # TODO: Find better way to cancel! # For some reason spamming the cancel button is unreliable on the Leaf # We now cancel by making propilot think the seatbelt is unlatched, # this generates a beep and a warning message every time you disengage - if self.CP.carFingerprint in (CAR.LEAF, CAR.LEAF_IC) and self.frame % 2 == 0: + if self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC) and self.frame % 2 == 0: can_sends.append(nissancan.create_cancel_msg(self.packer, CS.cancel_msg, pcm_cancel_cmd)) can_sends.append(nissancan.create_steering_control( self.packer, apply_angle, self.frame, CC.latActive, self.lkas_max_torque)) # Below are the HUD messages. We copy the stock message and modify - if self.CP.carFingerprint != CAR.ALTIMA: + if self.CP.carFingerprint != CAR.NISSAN_ALTIMA: if self.frame % 2 == 0: can_sends.append(nissancan.create_lkas_hud_msg(self.packer, CS.lkas_hud_msg, CC.enabled, hud_control.leftLaneVisible, hud_control.rightLaneVisible, hud_control.leftLaneDepart, hud_control.rightLaneDepart)) diff --git a/selfdrive/car/nissan/carstate.py b/selfdrive/car/nissan/carstate.py index 694d6c3bb0..57146b49c4 100644 --- a/selfdrive/car/nissan/carstate.py +++ b/selfdrive/car/nissan/carstate.py @@ -29,16 +29,16 @@ class CarState(CarStateBase): self.prev_distance_button = self.distance_button self.distance_button = cp.vl["CRUISE_THROTTLE"]["FOLLOW_DISTANCE_BUTTON"] - if self.CP.carFingerprint in (CAR.ROGUE, CAR.XTRAIL, CAR.ALTIMA): + if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA): ret.gas = cp.vl["GAS_PEDAL"]["GAS_PEDAL"] - elif self.CP.carFingerprint in (CAR.LEAF, CAR.LEAF_IC): + elif self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): ret.gas = cp.vl["CRUISE_THROTTLE"]["GAS_PEDAL"] ret.gasPressed = bool(ret.gas > 3) - if self.CP.carFingerprint in (CAR.ROGUE, CAR.XTRAIL, CAR.ALTIMA): + if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA): ret.brakePressed = bool(cp.vl["DOORS_LIGHTS"]["USER_BRAKE_PRESSED"]) - elif self.CP.carFingerprint in (CAR.LEAF, CAR.LEAF_IC): + elif self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): ret.brakePressed = bool(cp.vl["CRUISE_THROTTLE"]["USER_BRAKE_PRESSED"]) ret.wheelSpeeds = self.get_wheel_speeds( @@ -52,38 +52,38 @@ class CarState(CarStateBase): ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) ret.standstill = cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RL"] == 0.0 and cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RR"] == 0.0 - if self.CP.carFingerprint == CAR.ALTIMA: + if self.CP.carFingerprint == CAR.NISSAN_ALTIMA: ret.cruiseState.enabled = bool(cp.vl["CRUISE_STATE"]["CRUISE_ENABLED"]) else: ret.cruiseState.enabled = bool(cp_adas.vl["CRUISE_STATE"]["CRUISE_ENABLED"]) - if self.CP.carFingerprint in (CAR.ROGUE, CAR.XTRAIL): + if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL): ret.seatbeltUnlatched = cp.vl["HUD"]["SEATBELT_DRIVER_LATCHED"] == 0 ret.cruiseState.available = bool(cp_cam.vl["PRO_PILOT"]["CRUISE_ON"]) - elif self.CP.carFingerprint in (CAR.LEAF, CAR.LEAF_IC): - if self.CP.carFingerprint == CAR.LEAF: + elif self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): + if self.CP.carFingerprint == CAR.NISSAN_LEAF: ret.seatbeltUnlatched = cp.vl["SEATBELT"]["SEATBELT_DRIVER_LATCHED"] == 0 - elif self.CP.carFingerprint == CAR.LEAF_IC: + elif self.CP.carFingerprint == CAR.NISSAN_LEAF_IC: ret.seatbeltUnlatched = cp.vl["CANCEL_MSG"]["CANCEL_SEATBELT"] == 1 ret.cruiseState.available = bool(cp.vl["CRUISE_THROTTLE"]["CRUISE_AVAILABLE"]) - elif self.CP.carFingerprint == CAR.ALTIMA: + elif self.CP.carFingerprint == CAR.NISSAN_ALTIMA: ret.seatbeltUnlatched = cp.vl["HUD"]["SEATBELT_DRIVER_LATCHED"] == 0 ret.cruiseState.available = bool(cp_adas.vl["PRO_PILOT"]["CRUISE_ON"]) - if self.CP.carFingerprint == CAR.ALTIMA: + if self.CP.carFingerprint == CAR.NISSAN_ALTIMA: speed = cp.vl["PROPILOT_HUD"]["SET_SPEED"] else: speed = cp_adas.vl["PROPILOT_HUD"]["SET_SPEED"] if speed != 255: - if self.CP.carFingerprint in (CAR.LEAF, CAR.LEAF_IC): + if self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): conversion = CV.MPH_TO_MS if cp.vl["HUD_SETTINGS"]["SPEED_MPH"] else CV.KPH_TO_MS else: conversion = CV.MPH_TO_MS if cp.vl["HUD"]["SPEED_MPH"] else CV.KPH_TO_MS ret.cruiseState.speed = speed * conversion ret.cruiseState.speedCluster = (speed - 1) * conversion # Speed on HUD is always 1 lower than actually sent on can bus - if self.CP.carFingerprint == CAR.ALTIMA: + if self.CP.carFingerprint == CAR.NISSAN_ALTIMA: ret.steeringTorque = cp_cam.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"] else: ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"] @@ -107,17 +107,17 @@ class CarState(CarStateBase): can_gear = int(cp.vl["GEARBOX"]["GEAR_SHIFTER"]) ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None)) - if self.CP.carFingerprint == CAR.ALTIMA: + if self.CP.carFingerprint == CAR.NISSAN_ALTIMA: self.lkas_enabled = bool(cp.vl["LKAS_SETTINGS"]["LKAS_ENABLED"]) else: self.lkas_enabled = bool(cp_adas.vl["LKAS_SETTINGS"]["LKAS_ENABLED"]) self.cruise_throttle_msg = copy.copy(cp.vl["CRUISE_THROTTLE"]) - if self.CP.carFingerprint in (CAR.LEAF, CAR.LEAF_IC): + if self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): self.cancel_msg = copy.copy(cp.vl["CANCEL_MSG"]) - if self.CP.carFingerprint != CAR.ALTIMA: + if self.CP.carFingerprint != CAR.NISSAN_ALTIMA: self.lkas_hud_msg = copy.copy(cp_adas.vl["PROPILOT_HUD"]) self.lkas_hud_info_msg = copy.copy(cp_adas.vl["PROPILOT_HUD_INFO_MSG"]) @@ -136,14 +136,14 @@ class CarState(CarStateBase): ("LIGHTS", 10), ] - if CP.carFingerprint in (CAR.ROGUE, CAR.XTRAIL, CAR.ALTIMA): + if CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA): messages += [ ("GAS_PEDAL", 100), ("CRUISE_THROTTLE", 50), ("HUD", 25), ] - elif CP.carFingerprint in (CAR.LEAF, CAR.LEAF_IC): + elif CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): messages += [ ("BRAKE_PEDAL", 100), ("CRUISE_THROTTLE", 50), @@ -152,7 +152,7 @@ class CarState(CarStateBase): ("SEATBELT", 10), ] - if CP.carFingerprint == CAR.ALTIMA: + if CP.carFingerprint == CAR.NISSAN_ALTIMA: messages += [ ("CRUISE_STATE", 10), ("LKAS_SETTINGS", 10), @@ -168,7 +168,7 @@ class CarState(CarStateBase): def get_adas_can_parser(CP): # this function generates lists for signal, messages and initial values - if CP.carFingerprint == CAR.ALTIMA: + if CP.carFingerprint == CAR.NISSAN_ALTIMA: messages = [ ("LKAS", 100), ("PRO_PILOT", 100), @@ -188,9 +188,9 @@ class CarState(CarStateBase): def get_cam_can_parser(CP): messages = [] - if CP.carFingerprint in (CAR.ROGUE, CAR.XTRAIL): + if CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL): messages.append(("PRO_PILOT", 100)) - elif CP.carFingerprint == CAR.ALTIMA: + elif CP.carFingerprint == CAR.NISSAN_ALTIMA: messages.append(("STEER_TORQUE_SENSOR", 100)) return CANParser(DBC[CP.carFingerprint]["pt"], messages, 0) diff --git a/selfdrive/car/nissan/fingerprints.py b/selfdrive/car/nissan/fingerprints.py index 19267ded46..743feeace9 100644 --- a/selfdrive/car/nissan/fingerprints.py +++ b/selfdrive/car/nissan/fingerprints.py @@ -5,31 +5,31 @@ from openpilot.selfdrive.car.nissan.values import CAR Ecu = car.CarParams.Ecu FINGERPRINTS = { - CAR.XTRAIL: [{ + CAR.NISSAN_XTRAIL: [{ 2: 5, 42: 6, 346: 6, 347: 5, 348: 8, 349: 7, 361: 8, 386: 8, 389: 8, 397: 8, 398: 8, 403: 8, 520: 2, 523: 6, 548: 8, 645: 8, 658: 8, 665: 8, 666: 8, 674: 2, 682: 8, 683: 8, 689: 8, 723: 8, 758: 3, 768: 2, 783: 3, 851: 8, 855: 8, 1041: 8, 1055: 2, 1104: 4, 1105: 6, 1107: 4, 1108: 8, 1111: 4, 1227: 8, 1228: 8, 1247: 4, 1266: 8, 1273: 7, 1342: 1, 1376: 6, 1401: 8, 1474: 2, 1497: 3, 1821: 8, 1823: 8, 1837: 8, 2015: 8, 2016: 8, 2024: 8 }, { 2: 5, 42: 6, 346: 6, 347: 5, 348: 8, 349: 7, 361: 8, 386: 8, 389: 8, 397: 8, 398: 8, 403: 8, 520: 2, 523: 6, 527: 1, 548: 8, 637: 4, 645: 8, 658: 8, 665: 8, 666: 8, 674: 2, 682: 8, 683: 8, 689: 8, 723: 8, 758: 3, 768: 6, 783: 3, 851: 8, 855: 8, 1041: 8, 1055: 2, 1104: 4, 1105: 6, 1107: 4, 1108: 8, 1111: 4, 1227: 8, 1228: 8, 1247: 4, 1266: 8, 1273: 7, 1342: 1, 1376: 6, 1401: 8, 1474: 8, 1497: 3, 1534: 6, 1792: 8, 1821: 8, 1823: 8, 1837: 8, 1872: 8, 1937: 8, 1953: 8, 1968: 8, 2015: 8, 2016: 8, 2024: 8 }], - CAR.LEAF: [{ + CAR.NISSAN_LEAF: [{ 2: 5, 42: 6, 264: 3, 361: 8, 372: 8, 384: 8, 389: 8, 403: 8, 459: 7, 460: 4, 470: 8, 520: 1, 569: 8, 581: 8, 634: 7, 640: 8, 644: 8, 645: 8, 646: 5, 658: 8, 682: 8, 683: 8, 689: 8, 724: 6, 758: 3, 761: 2, 783: 3, 852: 8, 853: 8, 856: 8, 861: 8, 944: 1, 976: 6, 1008: 7, 1011: 7, 1057: 3, 1227: 8, 1228: 8, 1261: 5, 1342: 1, 1354: 8, 1361: 8, 1459: 8, 1477: 8, 1497: 3, 1549: 8, 1573: 6, 1821: 8, 1837: 8, 1856: 8, 1859: 8, 1861: 8, 1864: 8, 1874: 8, 1888: 8, 1891: 8, 1893: 8, 1906: 8, 1947: 8, 1949: 8, 1979: 8, 1981: 8, 2016: 8, 2017: 8, 2021: 8, 643: 5, 1792: 8, 1872: 8, 1937: 8, 1953: 8, 1968: 8, 1988: 8, 2000: 8, 2001: 8, 2004: 8, 2005: 8, 2015: 8 }, { 2: 5, 42: 8, 264: 3, 361: 8, 372: 8, 384: 8, 389: 8, 403: 8, 459: 7, 460: 4, 470: 8, 520: 1, 569: 8, 581: 8, 634: 7, 640: 8, 643: 5, 644: 8, 645: 8, 646: 5, 658: 8, 682: 8, 683: 8, 689: 8, 724: 6, 758: 3, 761: 2, 772: 8, 773: 6, 774: 7, 775: 8, 776: 6, 777: 7, 778: 6, 783: 3, 852: 8, 853: 8, 856: 8, 861: 8, 943: 8, 944: 1, 976: 6, 1008: 7, 1009: 8, 1010: 8, 1011: 7, 1012: 8, 1013: 8, 1019: 8, 1020: 8, 1021: 8, 1022: 8, 1057: 3, 1227: 8, 1228: 8, 1261: 5, 1342: 1, 1354: 8, 1361: 8, 1402: 8, 1459: 8, 1477: 8, 1497: 3, 1549: 8, 1573: 6, 1821: 8, 1837: 8 }], - CAR.LEAF_IC: [{ + CAR.NISSAN_LEAF_IC: [{ 2: 5, 42: 6, 264: 3, 282: 8, 361: 8, 372: 8, 384: 8, 389: 8, 403: 8, 459: 7, 460: 4, 470: 8, 520: 1, 569: 8, 581: 8, 634: 7, 640: 8, 643: 5, 644: 8, 645: 8, 646: 5, 658: 8, 682: 8, 683: 8, 689: 8, 756: 5, 758: 3, 761: 2, 783: 3, 830: 2, 852: 8, 853: 8, 856: 8, 861: 8, 943: 8, 944: 1, 1001: 6, 1057: 3, 1227: 8, 1228: 8, 1229: 8, 1342: 1, 1354: 8, 1361: 8, 1459: 8, 1477: 8, 1497: 3, 1514: 6, 1549: 8, 1573: 6, 1792: 8, 1821: 8, 1822: 8, 1837: 8, 1838: 8, 1872: 8, 1937: 8, 1953: 8, 1968: 8, 1988: 8, 2000: 8, 2001: 8, 2004: 8, 2005: 8, 2015: 8, 2016: 8, 2017: 8 }], - CAR.ROGUE: [{ + CAR.NISSAN_ROGUE: [{ 2: 5, 42: 6, 346: 6, 347: 5, 348: 8, 349: 7, 361: 8, 386: 8, 389: 8, 397: 8, 398: 8, 403: 8, 520: 2, 523: 6, 548: 8, 634: 7, 643: 5, 645: 8, 658: 8, 665: 8, 666: 8, 674: 2, 682: 8, 683: 8, 689: 8, 723: 8, 758: 3, 772: 8, 773: 6, 774: 7, 775: 8, 776: 6, 777: 7, 778: 6, 783: 3, 851: 8, 855: 8, 1041: 8, 1042: 8, 1055: 2, 1104: 4, 1105: 6, 1107: 4, 1108: 8, 1110: 7, 1111: 7, 1227: 8, 1228: 8, 1247: 4, 1266: 8, 1273: 7, 1342: 1, 1376: 6, 1401: 8, 1474: 2, 1497: 3, 1534: 7, 1792: 8, 1821: 8, 1823: 8, 1837: 8, 1839: 8, 1872: 8, 1937: 8, 1953: 8, 1968: 8, 1988: 8, 2000: 8, 2001: 8, 2004: 8, 2005: 8, 2015: 8, 2016: 8, 2017: 8, 2024: 8, 2025: 8 }], - CAR.ALTIMA: [{ + CAR.NISSAN_ALTIMA: [{ 2: 5, 42: 6, 346: 6, 347: 5, 348: 8, 349: 7, 361: 8, 386: 8, 389: 8, 397: 8, 398: 8, 403: 8, 438: 8, 451: 8, 517: 8, 520: 2, 522: 8, 523: 6, 539: 8, 541: 7, 542: 8, 543: 8, 544: 8, 545: 8, 546: 8, 547: 8, 548: 8, 570: 8, 576: 8, 577: 8, 582: 8, 583: 8, 584: 8, 586: 8, 587: 8, 588: 8, 589: 8, 590: 8, 591: 8, 592: 8, 600: 8, 601: 8, 610: 8, 611: 8, 612: 8, 614: 8, 615: 8, 616: 8, 617: 8, 622: 8, 623: 8, 634: 7, 638: 8, 645: 8, 648: 5, 654: 6, 658: 8, 659: 8, 660: 8, 661: 8, 665: 8, 666: 8, 674: 2, 675: 8, 676: 8, 682: 8, 683: 8, 684: 8, 685: 8, 686: 8, 687: 8, 689: 8, 690: 8, 703: 8, 708: 7, 709: 7, 711: 7, 712: 7, 713: 7, 714: 8, 715: 8, 716: 8, 717: 7, 718: 7, 719: 7, 720: 7, 723: 8, 726: 7, 727: 7, 728: 7, 735: 8, 746: 8, 748: 6, 749: 6, 750: 8, 758: 3, 772: 8, 773: 6, 774: 7, 775: 8, 776: 6, 777: 7, 778: 6, 779: 7, 781: 7, 782: 7, 783: 3, 851: 8, 855: 5, 1001: 6, 1041: 8, 1042: 8, 1055: 3, 1100: 7, 1104: 4, 1105: 6, 1107: 4, 1108: 8, 1110: 7, 1111: 7, 1144: 7, 1145: 7, 1227: 8, 1228: 8, 1229: 8, 1232: 8, 1247: 4, 1258: 8, 1259: 8, 1266: 8, 1273: 7, 1306: 1, 1314: 8, 1323: 8, 1324: 8, 1342: 1, 1376: 8, 1401: 8, 1454: 8, 1497: 3, 1514: 6, 1526: 8, 1527: 5, 1792: 8, 1821: 8, 1823: 8, 1837: 8, 1872: 8, 1937: 8, 1953: 8, 1968: 8, 1988: 8, 2000: 8, 2001: 8, 2004: 8, 2005: 8, 2015: 8, 2016: 8, 2017: 8, 2024: 8, 2025: 8 }], } FW_VERSIONS = { - CAR.ALTIMA: { + CAR.NISSAN_ALTIMA: { (Ecu.fwdCamera, 0x707, None): [ b'284N86CA1D', ], @@ -43,7 +43,7 @@ FW_VERSIONS = { b'284U29HE0A', ], }, - CAR.LEAF: { + CAR.NISSAN_LEAF: { (Ecu.abs, 0x740, None): [ b'476605SA1C', b'476605SA7D', @@ -72,7 +72,7 @@ FW_VERSIONS = { b'284U26WK0C', ], }, - CAR.LEAF_IC: { + CAR.NISSAN_LEAF_IC: { (Ecu.fwdCamera, 0x707, None): [ b'5SH1BDB\x04\x18\x00\x00\x00\x00\x00_-?\x04\x91\xf2\x00\x00\x00\x80', b'5SH4BDB\x04\x18\x00\x00\x00\x00\x00_-?\x04\x91\xf2\x00\x00\x00\x80', @@ -94,7 +94,7 @@ FW_VERSIONS = { b'284U25SK2D', ], }, - CAR.XTRAIL: { + CAR.NISSAN_XTRAIL: { (Ecu.fwdCamera, 0x707, None): [ b'284N86FR2A', ], diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index 170f7de287..2e9a990610 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -22,7 +22,7 @@ class CarInterface(CarInterfaceBase): ret.steerControlType = car.CarParams.SteerControlType.angle ret.radarUnavailable = True - if candidate == CAR.ALTIMA: + if candidate == CAR.NISSAN_ALTIMA: # Altima has EPS on C-CAN unlike the others that have it on V-CAN ret.safetyConfigs[0].safetyParam |= Panda.FLAG_NISSAN_ALT_EPS_BUS diff --git a/selfdrive/car/nissan/nissancan.py b/selfdrive/car/nissan/nissancan.py index 49dcd6fe93..b9a1b4f843 100644 --- a/selfdrive/car/nissan/nissancan.py +++ b/selfdrive/car/nissan/nissancan.py @@ -39,7 +39,7 @@ def create_acc_cancel_cmd(packer, car_fingerprint, cruise_throttle_msg): "unsure2", "unsure3", ]} - can_bus = 1 if car_fingerprint == CAR.ALTIMA else 2 + can_bus = 1 if car_fingerprint == CAR.NISSAN_ALTIMA else 2 values["CANCEL_BUTTON"] = 1 values["NO_BUTTON_PRESSED"] = 0 diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index 35503a9306..bdd2dec5f4 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -37,23 +37,23 @@ class NissanPlaformConfig(PlatformConfig): class CAR(Platforms): - XTRAIL = NissanPlaformConfig( + NISSAN_XTRAIL = NissanPlaformConfig( [NissanCarDocs("Nissan X-Trail 2017")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) - LEAF = NissanPlaformConfig( + NISSAN_LEAF = NissanPlaformConfig( [NissanCarDocs("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY")], NissanCarSpecs(mass=1610, wheelbase=2.705), dbc_dict('nissan_leaf_2018_generated', None), ) # Leaf with ADAS ECU found behind instrument cluster instead of glovebox # Currently the only known difference between them is the inverted seatbelt signal. - LEAF_IC = LEAF.override(car_docs=[]) - ROGUE = NissanPlaformConfig( + NISSAN_LEAF_IC = NISSAN_LEAF.override(car_docs=[]) + NISSAN_ROGUE = NissanPlaformConfig( [NissanCarDocs("Nissan Rogue 2018-20")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) - ALTIMA = NissanPlaformConfig( + NISSAN_ALTIMA = NissanPlaformConfig( [NissanCarDocs("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b]))], NissanCarSpecs(mass=1492, wheelbase=2.824) ) diff --git a/selfdrive/car/subaru/fingerprints.py b/selfdrive/car/subaru/fingerprints.py index f0ab307274..c9b0b859f4 100644 --- a/selfdrive/car/subaru/fingerprints.py +++ b/selfdrive/car/subaru/fingerprints.py @@ -4,7 +4,7 @@ from openpilot.selfdrive.car.subaru.values import CAR Ecu = car.CarParams.Ecu FW_VERSIONS = { - CAR.ASCENT: { + CAR.SUBARU_ASCENT: { (Ecu.abs, 0x7b0, None): [ b'\xa5 \x19\x02\x00', b'\xa5 !\x02\x00', @@ -33,7 +33,7 @@ FW_VERSIONS = { b'\x01\xfe\xfa\x00\x00', ], }, - CAR.ASCENT_2023: { + CAR.SUBARU_ASCENT_2023: { (Ecu.abs, 0x7b0, None): [ b'\xa5 #\x03\x00', ], @@ -50,7 +50,7 @@ FW_VERSIONS = { b'\x04\xfe\xf3\x00\x00', ], }, - CAR.LEGACY: { + CAR.SUBARU_LEGACY: { (Ecu.abs, 0x7b0, None): [ b'\xa1 \x02\x01', b'\xa1 \x02\x02', @@ -78,7 +78,7 @@ FW_VERSIONS = { b'\xa7\xfe\xc4@\x00', ], }, - CAR.IMPREZA: { + CAR.SUBARU_IMPREZA: { (Ecu.abs, 0x7b0, None): [ b'z\x84\x19\x90\x00', b'z\x94\x08\x90\x00', @@ -158,7 +158,7 @@ FW_VERSIONS = { b'\xe5\xf5B\x00\x00', ], }, - CAR.IMPREZA_2020: { + CAR.SUBARU_IMPREZA_2020: { (Ecu.abs, 0x7b0, None): [ b'\xa2 \x193\x00', b'\xa2 \x194\x00', @@ -212,7 +212,7 @@ FW_VERSIONS = { b'\xe9\xf6F0\x00', ], }, - CAR.CROSSTREK_HYBRID: { + CAR.SUBARU_CROSSTREK_HYBRID: { (Ecu.abs, 0x7b0, None): [ b'\xa2 \x19e\x01', b'\xa2 !e\x01', @@ -230,7 +230,7 @@ FW_VERSIONS = { b'\xf4!`0\x07', ], }, - CAR.FORESTER: { + CAR.SUBARU_FORESTER: { (Ecu.abs, 0x7b0, None): [ b'\xa3 \x18\x14\x00', b'\xa3 \x18&\x00', @@ -270,7 +270,7 @@ FW_VERSIONS = { b'\x1a\xf6b`\x00', ], }, - CAR.FORESTER_HYBRID: { + CAR.SUBARU_FORESTER_HYBRID: { (Ecu.abs, 0x7b0, None): [ b'\xa3 \x19T\x00', ], @@ -287,7 +287,7 @@ FW_VERSIONS = { b'\x1b\xa7@a\x00', ], }, - CAR.FORESTER_PREGLOBAL: { + CAR.SUBARU_FORESTER_PREGLOBAL: { (Ecu.abs, 0x7b0, None): [ b'm\x97\x14@', b'}\x97\x14@', @@ -318,7 +318,7 @@ FW_VERSIONS = { b'\xdc\xf2`\x81\x00', ], }, - CAR.LEGACY_PREGLOBAL: { + CAR.SUBARU_LEGACY_PREGLOBAL: { (Ecu.abs, 0x7b0, None): [ b'[\x97D\x00', b'[\xba\xc4\x03', @@ -351,7 +351,7 @@ FW_VERSIONS = { b'\xbf\xfb\xc0\x80\x00', ], }, - CAR.OUTBACK_PREGLOBAL: { + CAR.SUBARU_OUTBACK_PREGLOBAL: { (Ecu.abs, 0x7b0, None): [ b'[\xba\xac\x03', b'[\xf7\xac\x00', @@ -404,7 +404,7 @@ FW_VERSIONS = { b'\xbf\xfb\xe0b\x00', ], }, - CAR.OUTBACK_PREGLOBAL_2018: { + CAR.SUBARU_OUTBACK_PREGLOBAL_2018: { (Ecu.abs, 0x7b0, None): [ b'\x8b\x97\xac\x00', b'\x8b\x97\xbc\x00', @@ -447,7 +447,7 @@ FW_VERSIONS = { b'\xbc\xfb\xe0\x80\x00', ], }, - CAR.OUTBACK: { + CAR.SUBARU_OUTBACK: { (Ecu.abs, 0x7b0, None): [ b'\xa1 \x06\x00', b'\xa1 \x06\x01', @@ -496,7 +496,7 @@ FW_VERSIONS = { b'\xa7\xfe\xf4@\x00', ], }, - CAR.FORESTER_2022: { + CAR.SUBARU_FORESTER_2022: { (Ecu.abs, 0x7b0, None): [ b'\xa3 !v\x00', b'\xa3 !x\x00', @@ -529,7 +529,7 @@ FW_VERSIONS = { b'\x1e\xf6D0\x00', ], }, - CAR.OUTBACK_2023: { + CAR.SUBARU_OUTBACK_2023: { (Ecu.abs, 0x7b0, None): [ b'\xa1 #\x14\x00', b'\xa1 #\x17\x00', diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index 340090ffa9..1aa4bd95ea 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -40,45 +40,45 @@ class CarInterface(CarInterfaceBase): else: CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - if candidate in (CAR.ASCENT, CAR.ASCENT_2023): + if candidate in (CAR.SUBARU_ASCENT, CAR.SUBARU_ASCENT_2023): ret.steerActuatorDelay = 0.3 # end-to-end angle controller ret.lateralTuning.init('pid') ret.lateralTuning.pid.kf = 0.00003 ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 20.], [0., 20.]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.0025, 0.1], [0.00025, 0.01]] - elif candidate == CAR.IMPREZA: + elif candidate == CAR.SUBARU_IMPREZA: ret.steerActuatorDelay = 0.4 # end-to-end angle controller ret.lateralTuning.init('pid') ret.lateralTuning.pid.kf = 0.00005 ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 20.], [0., 20.]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2, 0.3], [0.02, 0.03]] - elif candidate == CAR.IMPREZA_2020: + elif candidate == CAR.SUBARU_IMPREZA_2020: ret.lateralTuning.init('pid') ret.lateralTuning.pid.kf = 0.00005 ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 14., 23.], [0., 14., 23.]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.045, 0.042, 0.20], [0.04, 0.035, 0.045]] - elif candidate == CAR.CROSSTREK_HYBRID: + elif candidate == CAR.SUBARU_CROSSTREK_HYBRID: ret.steerActuatorDelay = 0.1 - elif candidate in (CAR.FORESTER, CAR.FORESTER_2022, CAR.FORESTER_HYBRID): + elif candidate in (CAR.SUBARU_FORESTER, CAR.SUBARU_FORESTER_2022, CAR.SUBARU_FORESTER_HYBRID): ret.lateralTuning.init('pid') ret.lateralTuning.pid.kf = 0.000038 ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 14., 23.], [0., 14., 23.]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.01, 0.065, 0.2], [0.001, 0.015, 0.025]] - elif candidate in (CAR.OUTBACK, CAR.LEGACY, CAR.OUTBACK_2023): + elif candidate in (CAR.SUBARU_OUTBACK, CAR.SUBARU_LEGACY, CAR.SUBARU_OUTBACK_2023): ret.steerActuatorDelay = 0.1 - elif candidate in (CAR.FORESTER_PREGLOBAL, CAR.OUTBACK_PREGLOBAL_2018): + elif candidate in (CAR.SUBARU_FORESTER_PREGLOBAL, CAR.SUBARU_OUTBACK_PREGLOBAL_2018): ret.safetyConfigs[0].safetyParam = Panda.FLAG_SUBARU_PREGLOBAL_REVERSED_DRIVER_TORQUE # Outback 2018-2019 and Forester have reversed driver torque signal - elif candidate == CAR.LEGACY_PREGLOBAL: + elif candidate == CAR.SUBARU_LEGACY_PREGLOBAL: ret.steerActuatorDelay = 0.15 - elif candidate == CAR.OUTBACK_PREGLOBAL: + elif candidate == CAR.SUBARU_OUTBACK_PREGLOBAL: pass else: raise ValueError(f"unknown car: {candidate}") diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 80263c1e94..0542635370 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -23,7 +23,7 @@ class CarControllerParams: self.STEER_MAX = 1000 self.STEER_DELTA_UP = 40 self.STEER_DELTA_DOWN = 40 - elif CP.carFingerprint == CAR.IMPREZA_2020: + elif CP.carFingerprint == CAR.SUBARU_IMPREZA_2020: self.STEER_MAX = 1439 else: self.STEER_MAX = 2047 @@ -120,19 +120,19 @@ class SubaruGen2PlatformConfig(SubaruPlatformConfig): class CAR(Platforms): # Global platform - ASCENT = SubaruPlatformConfig( + SUBARU_ASCENT = SubaruPlatformConfig( [SubaruCarDocs("Subaru Ascent 2019-21", "All")], CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5), ) - OUTBACK = SubaruGen2PlatformConfig( + SUBARU_OUTBACK = SubaruGen2PlatformConfig( [SubaruCarDocs("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), ) - LEGACY = SubaruGen2PlatformConfig( + SUBARU_LEGACY = SubaruGen2PlatformConfig( [SubaruCarDocs("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], - OUTBACK.specs, + SUBARU_OUTBACK.specs, ) - IMPREZA = SubaruPlatformConfig( + SUBARU_IMPREZA = SubaruPlatformConfig( [ SubaruCarDocs("Subaru Impreza 2017-19"), SubaruCarDocs("Subaru Crosstrek 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), @@ -140,7 +140,7 @@ class CAR(Platforms): ], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15), ) - IMPREZA_2020 = SubaruPlatformConfig( + SUBARU_IMPREZA_2020 = SubaruPlatformConfig( [ SubaruCarDocs("Subaru Impreza 2020-22"), SubaruCarDocs("Subaru Crosstrek 2020-23"), @@ -150,60 +150,60 @@ class CAR(Platforms): flags=SubaruFlags.STEER_RATE_LIMITED, ) # TODO: is there an XV and Impreza too? - CROSSTREK_HYBRID = SubaruPlatformConfig( + SUBARU_CROSSTREK_HYBRID = SubaruPlatformConfig( [SubaruCarDocs("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b]))], CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.HYBRID, ) - FORESTER = SubaruPlatformConfig( + SUBARU_FORESTER = SubaruPlatformConfig( [SubaruCarDocs("Subaru Forester 2019-21", "All")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.STEER_RATE_LIMITED, ) - FORESTER_HYBRID = SubaruPlatformConfig( + SUBARU_FORESTER_HYBRID = SubaruPlatformConfig( [SubaruCarDocs("Subaru Forester Hybrid 2020")], - FORESTER.specs, + SUBARU_FORESTER.specs, flags=SubaruFlags.HYBRID, ) # Pre-global - FORESTER_PREGLOBAL = SubaruPlatformConfig( + SUBARU_FORESTER_PREGLOBAL = SubaruPlatformConfig( [SubaruCarDocs("Subaru Forester 2017-18")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), dbc_dict('subaru_forester_2017_generated', None), flags=SubaruFlags.PREGLOBAL, ) - LEGACY_PREGLOBAL = SubaruPlatformConfig( + SUBARU_LEGACY_PREGLOBAL = SubaruPlatformConfig( [SubaruCarDocs("Subaru Legacy 2015-18")], CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), dbc_dict('subaru_outback_2015_generated', None), flags=SubaruFlags.PREGLOBAL, ) - OUTBACK_PREGLOBAL = SubaruPlatformConfig( + SUBARU_OUTBACK_PREGLOBAL = SubaruPlatformConfig( [SubaruCarDocs("Subaru Outback 2015-17")], - FORESTER_PREGLOBAL.specs, + SUBARU_FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2015_generated', None), flags=SubaruFlags.PREGLOBAL, ) - OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( + SUBARU_OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( [SubaruCarDocs("Subaru Outback 2018-19")], - FORESTER_PREGLOBAL.specs, + SUBARU_FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2019_generated', None), flags=SubaruFlags.PREGLOBAL, ) # Angle LKAS - FORESTER_2022 = SubaruPlatformConfig( + SUBARU_FORESTER_2022 = SubaruPlatformConfig( [SubaruCarDocs("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c]))], - FORESTER.specs, + SUBARU_FORESTER.specs, flags=SubaruFlags.LKAS_ANGLE, ) - OUTBACK_2023 = SubaruGen2PlatformConfig( + SUBARU_OUTBACK_2023 = SubaruGen2PlatformConfig( [SubaruCarDocs("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], - OUTBACK.specs, + SUBARU_OUTBACK.specs, flags=SubaruFlags.LKAS_ANGLE, ) - ASCENT_2023 = SubaruGen2PlatformConfig( + SUBARU_ASCENT_2023 = SubaruGen2PlatformConfig( [SubaruCarDocs("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], - ASCENT.specs, + SUBARU_ASCENT.specs, flags=SubaruFlags.LKAS_ANGLE, ) diff --git a/selfdrive/car/tesla/carstate.py b/selfdrive/car/tesla/carstate.py index bee652ff30..645ea46014 100644 --- a/selfdrive/car/tesla/carstate.py +++ b/selfdrive/car/tesla/carstate.py @@ -37,7 +37,7 @@ class CarState(CarStateBase): ret.brakePressed = bool(cp.vl["BrakeMessage"]["driverBrakeStatus"] != 1) # Steering wheel - epas_status = cp_cam.vl["EPAS3P_sysStatus"] if self.CP.carFingerprint == CAR.MODELS_RAVEN else cp.vl["EPAS_sysStatus"] + epas_status = cp_cam.vl["EPAS3P_sysStatus"] if self.CP.carFingerprint == CAR.TESLA_MODELS_RAVEN else cp.vl["EPAS_sysStatus"] self.hands_on_level = epas_status["EPAS_handsOnLevel"] self.steer_warning = self.can_define.dv["EPAS_sysStatus"]["EPAS_eacErrorCode"].get(int(epas_status["EPAS_eacErrorCode"]), None) @@ -87,7 +87,7 @@ class CarState(CarStateBase): ret.rightBlinker = (cp.vl["GTW_carState"]["BC_indicatorRStatus"] == 1) # Seatbelt - if self.CP.carFingerprint == CAR.MODELS_RAVEN: + if self.CP.carFingerprint == CAR.TESLA_MODELS_RAVEN: ret.seatbeltUnlatched = (cp.vl["DriverSeat"]["buckleStatus"] != 1) else: ret.seatbeltUnlatched = (cp.vl["SDM1"]["SDM_bcklDrivStatus"] != 1) @@ -119,7 +119,7 @@ class CarState(CarStateBase): ("BrakeMessage", 50), ] - if CP.carFingerprint == CAR.MODELS_RAVEN: + if CP.carFingerprint == CAR.TESLA_MODELS_RAVEN: messages.append(("DriverSeat", 20)) else: messages.append(("SDM1", 10)) @@ -133,7 +133,7 @@ class CarState(CarStateBase): ("DAS_control", 40), ] - if CP.carFingerprint == CAR.MODELS_RAVEN: + if CP.carFingerprint == CAR.TESLA_MODELS_RAVEN: messages.append(("EPAS3P_sysStatus", 100)) return CANParser(DBC[CP.carFingerprint]['chassis'], messages, CANBUS.autopilot_chassis) diff --git a/selfdrive/car/tesla/fingerprints.py b/selfdrive/car/tesla/fingerprints.py index 9b6f3865be..5a87986e45 100644 --- a/selfdrive/car/tesla/fingerprints.py +++ b/selfdrive/car/tesla/fingerprints.py @@ -5,13 +5,13 @@ from openpilot.selfdrive.car.tesla.values import CAR Ecu = car.CarParams.Ecu FINGERPRINTS = { - CAR.AP1_MODELS: [{ + CAR.TESLA_AP1_MODELS: [{ 1: 8, 3: 8, 14: 8, 21: 4, 69: 8, 109: 4, 257: 3, 264: 8, 267: 5, 277: 6, 280: 6, 283: 5, 293: 4, 296: 4, 309: 5, 325: 8, 328: 5, 336: 8, 341: 8, 360: 7, 373: 8, 389: 8, 415: 8, 513: 5, 516: 8, 520: 4, 522: 8, 524: 8, 526: 8, 532: 3, 536: 8, 537: 3, 542: 8, 551: 5, 552: 2, 556: 8, 558: 8, 568: 8, 569: 8, 574: 8, 577: 8, 582: 5, 584: 4, 585: 8, 590: 8, 606: 8, 622: 8, 627: 6, 638: 8, 641: 8, 643: 8, 660: 5, 693: 8, 696: 8, 697: 8, 712: 8, 728: 8, 744: 8, 760: 8, 772: 8, 775: 8, 776: 8, 777: 8, 778: 8, 782: 8, 788: 8, 791: 8, 792: 8, 796: 2, 797: 8, 798: 6, 799: 8, 804: 8, 805: 8, 807: 8, 808: 1, 809: 8, 812: 8, 813: 8, 814: 5, 815: 8, 820: 8, 823: 8, 824: 8, 829: 8, 830: 5, 836: 8, 840: 8, 841: 8, 845: 8, 846: 5, 852: 8, 856: 4, 857: 6, 861: 8, 862: 5, 872: 8, 873: 8, 877: 8, 878: 8, 879: 8, 880: 8, 884: 8, 888: 8, 889: 8, 893: 8, 896: 8, 901: 6, 904: 3, 905: 8, 908: 2, 909: 8, 920: 8, 921: 8, 925: 4, 936: 8, 937: 8, 941: 8, 949: 8, 952: 8, 953: 6, 957: 8, 968: 8, 973: 8, 984: 8, 987: 8, 989: 8, 990: 8, 1000: 8, 1001: 8, 1006: 8, 1016: 8, 1026: 8, 1028: 8, 1029: 8, 1030: 8, 1032: 1, 1033: 1, 1034: 8, 1048: 1, 1064: 8, 1070: 8, 1080: 8, 1160: 4, 1281: 8, 1329: 8, 1332: 8, 1335: 8, 1337: 8, 1368: 8, 1412: 8, 1436: 8, 1465: 8, 1476: 8, 1497: 8, 1524: 8, 1527: 8, 1601: 8, 1605: 8, 1611: 8, 1614: 8, 1617: 8, 1621: 8, 1627: 8, 1630: 8, 1800: 4, 1804: 8, 1812: 8, 1815: 8, 1816: 8, 1828: 8, 1831: 8, 1832: 8, 1840: 8, 1848: 8, 1864: 8, 1880: 8, 1892: 8, 1896: 8, 1912: 8, 1960: 8, 1992: 8, 2008: 3, 2043: 5, 2045: 4 }], } FW_VERSIONS = { - CAR.AP2_MODELS: { + CAR.TESLA_AP2_MODELS: { (Ecu.adas, 0x649, None): [ b'\x01\x00\x8b\x07\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11', ], @@ -25,7 +25,7 @@ FW_VERSIONS = { b'\x10#\x01', ], }, - CAR.MODELS_RAVEN: { + CAR.TESLA_MODELS_RAVEN: { (Ecu.electricBrakeBooster, 0x64d, None): [ b'1037123-00-A', ], diff --git a/selfdrive/car/tesla/interface.py b/selfdrive/car/tesla/interface.py index 9577578f5d..e039859263 100755 --- a/selfdrive/car/tesla/interface.py +++ b/selfdrive/car/tesla/interface.py @@ -28,7 +28,7 @@ class CarInterface(CarInterfaceBase): # Check if we have messages on an auxiliary panda, and that 0x2bf (DAS_control) is present on the AP powertrain bus # If so, we assume that it is connected to the longitudinal harness. - flags = (Panda.FLAG_TESLA_RAVEN if candidate == CAR.MODELS_RAVEN else 0) + flags = (Panda.FLAG_TESLA_RAVEN if candidate == CAR.TESLA_MODELS_RAVEN else 0) if (CANBUS.autopilot_powertrain in fingerprint.keys()) and (0x2bf in fingerprint[CANBUS.autopilot_powertrain].keys()): ret.openpilotLongitudinalControl = True flags |= Panda.FLAG_TESLA_LONG_CONTROL diff --git a/selfdrive/car/tesla/radar_interface.py b/selfdrive/car/tesla/radar_interface.py index 599ab31059..ae5077824b 100755 --- a/selfdrive/car/tesla/radar_interface.py +++ b/selfdrive/car/tesla/radar_interface.py @@ -10,7 +10,7 @@ class RadarInterface(RadarInterfaceBase): super().__init__(CP) self.CP = CP - if CP.carFingerprint == CAR.MODELS_RAVEN: + if CP.carFingerprint == CAR.TESLA_MODELS_RAVEN: messages = [('RadarStatus', 16)] self.num_points = 40 self.trigger_msg = 1119 @@ -46,7 +46,7 @@ class RadarInterface(RadarInterfaceBase): if not self.rcp.can_valid: errors.append('canError') - if self.CP.carFingerprint == CAR.MODELS_RAVEN: + if self.CP.carFingerprint == CAR.TESLA_MODELS_RAVEN: radar_status = self.rcp.vl['RadarStatus'] if radar_status['sensorBlocked'] or radar_status['shortTermUnavailable'] or radar_status['vehDynamicsError']: errors.append('fault') diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index 84dd8c51a3..0f9cd00f63 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -10,19 +10,19 @@ Ecu = car.CarParams.Ecu Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values']) class CAR(Platforms): - AP1_MODELS = PlatformConfig( + TESLA_AP1_MODELS = PlatformConfig( [CarDocs("Tesla AP1 Model S", "All")], CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0), dbc_dict('tesla_powertrain', 'tesla_radar_bosch_generated', chassis_dbc='tesla_can') ) - AP2_MODELS = PlatformConfig( + TESLA_AP2_MODELS = PlatformConfig( [CarDocs("Tesla AP2 Model S", "All")], - AP1_MODELS.specs, - AP1_MODELS.dbc_dict + TESLA_AP1_MODELS.specs, + TESLA_AP1_MODELS.dbc_dict ) - MODELS_RAVEN = PlatformConfig( + TESLA_MODELS_RAVEN = PlatformConfig( [CarDocs("Tesla Model S Raven", "All")], - AP1_MODELS.specs, + TESLA_AP1_MODELS.specs, dbc_dict('tesla_powertrain', 'tesla_radar_continental_generated', chassis_dbc='tesla_can') ) diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 9b2cbeeb52..036f39c1f3 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -17,14 +17,14 @@ from openpilot.selfdrive.car.body.values import CAR as COMMA # TODO: add routes for these cars non_tested_cars = [ - FORD.F_150_MK14, + FORD.FORD_F_150_MK14, GM.CADILLAC_ATS, GM.HOLDEN_ASTRA, - GM.MALIBU, + GM.CHEVROLET_MALIBU, HYUNDAI.GENESIS_G90, - HONDA.ODYSSEY_CHN, - VOLKSWAGEN.CRAFTER_MK2, # need a route from an ACC-equipped Crafter - SUBARU.FORESTER_HYBRID, + HONDA.HONDA_ODYSSEY_CHN, + VOLKSWAGEN.VOLKSWAGEN_CRAFTER_MK2, # need a route from an ACC-equipped Crafter + SUBARU.SUBARU_FORESTER_HYBRID, ] @@ -35,81 +35,81 @@ class CarTestRoute(NamedTuple): routes = [ - CarTestRoute("efdf9af95e71cd84|2022-05-13--19-03-31", COMMA.BODY), + CarTestRoute("efdf9af95e71cd84|2022-05-13--19-03-31", COMMA.COMMA_BODY), CarTestRoute("0c94aa1e1296d7c6|2021-05-05--19-48-37", CHRYSLER.JEEP_GRAND_CHEROKEE), CarTestRoute("91dfedae61d7bd75|2021-05-22--20-07-52", CHRYSLER.JEEP_GRAND_CHEROKEE_2019), - CarTestRoute("420a8e183f1aed48|2020-03-05--07-15-29", CHRYSLER.PACIFICA_2017_HYBRID), - CarTestRoute("43a685a66291579b|2021-05-27--19-47-29", CHRYSLER.PACIFICA_2018), - CarTestRoute("378472f830ee7395|2021-05-28--07-38-43", CHRYSLER.PACIFICA_2018_HYBRID), - CarTestRoute("8190c7275a24557b|2020-01-29--08-33-58", CHRYSLER.PACIFICA_2019_HYBRID), - CarTestRoute("3d84727705fecd04|2021-05-25--08-38-56", CHRYSLER.PACIFICA_2020), + CarTestRoute("420a8e183f1aed48|2020-03-05--07-15-29", CHRYSLER.CHRYSLER_PACIFICA_2017_HYBRID), + CarTestRoute("43a685a66291579b|2021-05-27--19-47-29", CHRYSLER.CHRYSLER_PACIFICA_2018), + CarTestRoute("378472f830ee7395|2021-05-28--07-38-43", CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID), + CarTestRoute("8190c7275a24557b|2020-01-29--08-33-58", CHRYSLER.CHRYSLER_PACIFICA_2019_HYBRID), + CarTestRoute("3d84727705fecd04|2021-05-25--08-38-56", CHRYSLER.CHRYSLER_PACIFICA_2020), CarTestRoute("221c253375af4ee9|2022-06-15--18-38-24", CHRYSLER.RAM_1500_5TH_GEN), CarTestRoute("8fb5eabf914632ae|2022-08-04--17-28-53", CHRYSLER.RAM_HD_5TH_GEN, segment=6), CarTestRoute("3379c85aeedc8285|2023-12-07--17-49-39", CHRYSLER.DODGE_DURANGO), - CarTestRoute("54827bf84c38b14f|2023-01-25--14-14-11", FORD.BRONCO_SPORT_MK1), - CarTestRoute("f8eaaccd2a90aef8|2023-05-04--15-10-09", FORD.ESCAPE_MK4), - CarTestRoute("62241b0c7fea4589|2022-09-01--15-32-49", FORD.EXPLORER_MK6), - CarTestRoute("e886087f430e7fe7|2023-06-16--23-06-36", FORD.FOCUS_MK4), - CarTestRoute("bd37e43731e5964b|2023-04-30--10-42-26", FORD.MAVERICK_MK1), - CarTestRoute("112e4d6e0cad05e1|2023-11-14--08-21-43", FORD.F_150_LIGHTNING_MK1), - CarTestRoute("83a4e056c7072678|2023-11-13--16-51-33", FORD.MUSTANG_MACH_E_MK1), + CarTestRoute("54827bf84c38b14f|2023-01-25--14-14-11", FORD.FORD_BRONCO_SPORT_MK1), + CarTestRoute("f8eaaccd2a90aef8|2023-05-04--15-10-09", FORD.FORD_ESCAPE_MK4), + CarTestRoute("62241b0c7fea4589|2022-09-01--15-32-49", FORD.FORD_EXPLORER_MK6), + CarTestRoute("e886087f430e7fe7|2023-06-16--23-06-36", FORD.FORD_FOCUS_MK4), + CarTestRoute("bd37e43731e5964b|2023-04-30--10-42-26", FORD.FORD_MAVERICK_MK1), + CarTestRoute("112e4d6e0cad05e1|2023-11-14--08-21-43", FORD.FORD_F_150_LIGHTNING_MK1), + CarTestRoute("83a4e056c7072678|2023-11-13--16-51-33", FORD.FORD_MUSTANG_MACH_E_MK1), #TestRoute("f1b4c567731f4a1b|2018-04-30--10-15-35", FORD.FUSION), - CarTestRoute("7cc2a8365b4dd8a9|2018-12-02--12-10-44", GM.ACADIA), + CarTestRoute("7cc2a8365b4dd8a9|2018-12-02--12-10-44", GM.GMC_ACADIA), CarTestRoute("aa20e335f61ba898|2019-02-05--16-59-04", GM.BUICK_REGAL), CarTestRoute("75a6bcb9b8b40373|2023-03-11--22-47-33", GM.BUICK_LACROSSE), - CarTestRoute("e746f59bc96fd789|2024-01-31--22-25-58", GM.EQUINOX), - CarTestRoute("ef8f2185104d862e|2023-02-09--18-37-13", GM.ESCALADE), - CarTestRoute("46460f0da08e621e|2021-10-26--07-21-46", GM.ESCALADE_ESV), - CarTestRoute("168f8b3be57f66ae|2023-09-12--21-44-42", GM.ESCALADE_ESV_2019), - CarTestRoute("c950e28c26b5b168|2018-05-30--22-03-41", GM.VOLT), - CarTestRoute("f08912a233c1584f|2022-08-11--18-02-41", GM.BOLT_EUV, segment=1), - CarTestRoute("555d4087cf86aa91|2022-12-02--12-15-07", GM.BOLT_EUV, segment=14), # Bolt EV - CarTestRoute("38aa7da107d5d252|2022-08-15--16-01-12", GM.SILVERADO), - CarTestRoute("5085c761395d1fe6|2023-04-07--18-20-06", GM.TRAILBLAZER), + CarTestRoute("e746f59bc96fd789|2024-01-31--22-25-58", GM.CHEVROLET_EQUINOX), + CarTestRoute("ef8f2185104d862e|2023-02-09--18-37-13", GM.CADILLAC_ESCALADE), + CarTestRoute("46460f0da08e621e|2021-10-26--07-21-46", GM.CADILLAC_ESCALADE_ESV), + CarTestRoute("168f8b3be57f66ae|2023-09-12--21-44-42", GM.CADILLAC_ESCALADE_ESV_2019), + CarTestRoute("c950e28c26b5b168|2018-05-30--22-03-41", GM.CHEVROLET_VOLT), + CarTestRoute("f08912a233c1584f|2022-08-11--18-02-41", GM.CHEVROLET_BOLT_EUV, segment=1), + CarTestRoute("555d4087cf86aa91|2022-12-02--12-15-07", GM.CHEVROLET_BOLT_EUV, segment=14), # Bolt EV + CarTestRoute("38aa7da107d5d252|2022-08-15--16-01-12", GM.CHEVROLET_SILVERADO), + CarTestRoute("5085c761395d1fe6|2023-04-07--18-20-06", GM.CHEVROLET_TRAILBLAZER), CarTestRoute("0e7a2ba168465df5|2020-10-18--14-14-22", HONDA.ACURA_RDX_3G), - CarTestRoute("a74b011b32b51b56|2020-07-26--17-09-36", HONDA.CIVIC), - CarTestRoute("a859a044a447c2b0|2020-03-03--18-42-45", HONDA.CRV_EU), - CarTestRoute("68aac44ad69f838e|2021-05-18--20-40-52", HONDA.CRV), - CarTestRoute("14fed2e5fa0aa1a5|2021-05-25--14-59-42", HONDA.CRV_HYBRID), - CarTestRoute("52f3e9ae60c0d886|2021-05-23--15-59-43", HONDA.FIT), - CarTestRoute("2c4292a5cd10536c|2021-08-19--21-32-15", HONDA.FREED), - CarTestRoute("03be5f2fd5c508d1|2020-04-19--18-44-15", HONDA.HRV), - CarTestRoute("320098ff6c5e4730|2023-04-13--17-47-46", HONDA.HRV_3G), + CarTestRoute("a74b011b32b51b56|2020-07-26--17-09-36", HONDA.HONDA_CIVIC), + CarTestRoute("a859a044a447c2b0|2020-03-03--18-42-45", HONDA.HONDA_CRV_EU), + CarTestRoute("68aac44ad69f838e|2021-05-18--20-40-52", HONDA.HONDA_CRV), + CarTestRoute("14fed2e5fa0aa1a5|2021-05-25--14-59-42", HONDA.HONDA_CRV_HYBRID), + CarTestRoute("52f3e9ae60c0d886|2021-05-23--15-59-43", HONDA.HONDA_FIT), + CarTestRoute("2c4292a5cd10536c|2021-08-19--21-32-15", HONDA.HONDA_FREED), + CarTestRoute("03be5f2fd5c508d1|2020-04-19--18-44-15", HONDA.HONDA_HRV), + CarTestRoute("320098ff6c5e4730|2023-04-13--17-47-46", HONDA.HONDA_HRV_3G), CarTestRoute("917b074700869333|2021-05-24--20-40-20", HONDA.ACURA_ILX), - CarTestRoute("08a3deb07573f157|2020-03-06--16-11-19", HONDA.ACCORD), # 1.5T - CarTestRoute("1da5847ac2488106|2021-05-24--19-31-50", HONDA.ACCORD), # 2.0T - CarTestRoute("085ac1d942c35910|2021-03-25--20-11-15", HONDA.ACCORD), # 2021 with new style HUD msgs - CarTestRoute("07585b0da3c88459|2021-05-26--18-52-04", HONDA.ACCORD), # hybrid - CarTestRoute("f29e2b57a55e7ad5|2021-03-24--20-52-38", HONDA.ACCORD), # hybrid, 2021 with new style HUD msgs - CarTestRoute("1ad763dd22ef1a0e|2020-02-29--18-37-03", HONDA.CRV_5G), - CarTestRoute("0a96f86fcfe35964|2020-02-05--07-25-51", HONDA.ODYSSEY), - CarTestRoute("d83f36766f8012a5|2020-02-05--18-42-21", HONDA.CIVIC_BOSCH_DIESEL), - CarTestRoute("f0890d16a07a236b|2021-05-25--17-27-22", HONDA.INSIGHT), - CarTestRoute("07d37d27996096b6|2020-03-04--21-57-27", HONDA.PILOT), - CarTestRoute("684e8f96bd491a0e|2021-11-03--11-08-42", HONDA.PILOT), # Passport - CarTestRoute("0a78dfbacc8504ef|2020-03-04--13-29-55", HONDA.CIVIC_BOSCH), + CarTestRoute("08a3deb07573f157|2020-03-06--16-11-19", HONDA.HONDA_ACCORD), # 1.5T + CarTestRoute("1da5847ac2488106|2021-05-24--19-31-50", HONDA.HONDA_ACCORD), # 2.0T + CarTestRoute("085ac1d942c35910|2021-03-25--20-11-15", HONDA.HONDA_ACCORD), # 2021 with new style HUD msgs + CarTestRoute("07585b0da3c88459|2021-05-26--18-52-04", HONDA.HONDA_ACCORD), # hybrid + CarTestRoute("f29e2b57a55e7ad5|2021-03-24--20-52-38", HONDA.HONDA_ACCORD), # hybrid, 2021 with new style HUD msgs + CarTestRoute("1ad763dd22ef1a0e|2020-02-29--18-37-03", HONDA.HONDA_CRV_5G), + CarTestRoute("0a96f86fcfe35964|2020-02-05--07-25-51", HONDA.HONDA_ODYSSEY), + CarTestRoute("d83f36766f8012a5|2020-02-05--18-42-21", HONDA.HONDA_CIVIC_BOSCH_DIESEL), + CarTestRoute("f0890d16a07a236b|2021-05-25--17-27-22", HONDA.HONDA_INSIGHT), + CarTestRoute("07d37d27996096b6|2020-03-04--21-57-27", HONDA.HONDA_PILOT), + CarTestRoute("684e8f96bd491a0e|2021-11-03--11-08-42", HONDA.HONDA_PILOT), # Passport + CarTestRoute("0a78dfbacc8504ef|2020-03-04--13-29-55", HONDA.HONDA_CIVIC_BOSCH), CarTestRoute("f34a60d68d83b1e5|2020-10-06--14-35-55", HONDA.ACURA_RDX), - CarTestRoute("54fd8451b3974762|2021-04-01--14-50-10", HONDA.RIDGELINE), + CarTestRoute("54fd8451b3974762|2021-04-01--14-50-10", HONDA.HONDA_RIDGELINE), CarTestRoute("2d5808fae0b38ac6|2021-09-01--17-14-11", HONDA.HONDA_E), - CarTestRoute("f44aa96ace22f34a|2021-12-22--06-22-31", HONDA.CIVIC_2022), + CarTestRoute("f44aa96ace22f34a|2021-12-22--06-22-31", HONDA.HONDA_CIVIC_2022), - CarTestRoute("87d7f06ade479c2e|2023-09-11--23-30-11", HYUNDAI.AZERA_6TH_GEN), - CarTestRoute("66189dd8ec7b50e6|2023-09-20--07-02-12", HYUNDAI.AZERA_HEV_6TH_GEN), + CarTestRoute("87d7f06ade479c2e|2023-09-11--23-30-11", HYUNDAI.HYUNDAI_AZERA_6TH_GEN), + CarTestRoute("66189dd8ec7b50e6|2023-09-20--07-02-12", HYUNDAI.HYUNDAI_AZERA_HEV_6TH_GEN), CarTestRoute("6fe86b4e410e4c37|2020-07-22--16-27-13", HYUNDAI.HYUNDAI_GENESIS), CarTestRoute("b5d6dc830ad63071|2022-12-12--21-28-25", HYUNDAI.GENESIS_GV60_EV_1ST_GEN, segment=12), CarTestRoute("70c5bec28ec8e345|2020-08-08--12-22-23", HYUNDAI.GENESIS_G70), CarTestRoute("ca4de5b12321bd98|2022-10-18--21-15-59", HYUNDAI.GENESIS_GV70_1ST_GEN), CarTestRoute("6b301bf83f10aa90|2020-11-22--16-45-07", HYUNDAI.GENESIS_G80), - CarTestRoute("0bbe367c98fa1538|2023-09-16--00-16-49", HYUNDAI.CUSTIN_1ST_GEN), - CarTestRoute("f0709d2bc6ca451f|2022-10-15--08-13-54", HYUNDAI.SANTA_CRUZ_1ST_GEN), - CarTestRoute("4dbd55df87507948|2022-03-01--09-45-38", HYUNDAI.SANTA_FE), - CarTestRoute("bf43d9df2b660eb0|2021-09-23--14-16-37", HYUNDAI.SANTA_FE_2022), - CarTestRoute("37398f32561a23ad|2021-11-18--00-11-35", HYUNDAI.SANTA_FE_HEV_2022), - CarTestRoute("656ac0d830792fcc|2021-12-28--14-45-56", HYUNDAI.SANTA_FE_PHEV_2022, segment=1), + CarTestRoute("0bbe367c98fa1538|2023-09-16--00-16-49", HYUNDAI.HYUNDAI_CUSTIN_1ST_GEN), + CarTestRoute("f0709d2bc6ca451f|2022-10-15--08-13-54", HYUNDAI.HYUNDAI_SANTA_CRUZ_1ST_GEN), + CarTestRoute("4dbd55df87507948|2022-03-01--09-45-38", HYUNDAI.HYUNDAI_SANTA_FE), + CarTestRoute("bf43d9df2b660eb0|2021-09-23--14-16-37", HYUNDAI.HYUNDAI_SANTA_FE_2022), + CarTestRoute("37398f32561a23ad|2021-11-18--00-11-35", HYUNDAI.HYUNDAI_SANTA_FE_HEV_2022), + CarTestRoute("656ac0d830792fcc|2021-12-28--14-45-56", HYUNDAI.HYUNDAI_SANTA_FE_PHEV_2022, segment=1), CarTestRoute("de59124955b921d8|2023-06-24--00-12-50", HYUNDAI.KIA_CARNIVAL_4TH_GEN), CarTestRoute("409c9409979a8abc|2023-07-11--09-06-44", HYUNDAI.KIA_CARNIVAL_4TH_GEN), # Chinese model CarTestRoute("e0e98335f3ebc58f|2021-03-07--16-38-29", HYUNDAI.KIA_CEED), @@ -118,36 +118,36 @@ routes = [ CarTestRoute("f9716670b2481438|2023-08-23--14-49-50", HYUNDAI.KIA_OPTIMA_H), CarTestRoute("6a42c1197b2a8179|2023-09-21--10-23-44", HYUNDAI.KIA_OPTIMA_H_G4_FL), CarTestRoute("c75a59efa0ecd502|2021-03-11--20-52-55", HYUNDAI.KIA_SELTOS), - CarTestRoute("5b7c365c50084530|2020-04-15--16-13-24", HYUNDAI.SONATA), - CarTestRoute("b2a38c712dcf90bd|2020-05-18--18-12-48", HYUNDAI.SONATA_LF), - CarTestRoute("c344fd2492c7a9d2|2023-12-11--09-03-23", HYUNDAI.STARIA_4TH_GEN), - CarTestRoute("fb3fd42f0baaa2f8|2022-03-30--15-25-05", HYUNDAI.TUCSON), - CarTestRoute("db68bbe12250812c|2022-12-05--00-54-12", HYUNDAI.TUCSON_4TH_GEN), # 2023 - CarTestRoute("36e10531feea61a4|2022-07-25--13-37-42", HYUNDAI.TUCSON_4TH_GEN), # hybrid + CarTestRoute("5b7c365c50084530|2020-04-15--16-13-24", HYUNDAI.HYUNDAI_SONATA), + CarTestRoute("b2a38c712dcf90bd|2020-05-18--18-12-48", HYUNDAI.HYUNDAI_SONATA_LF), + CarTestRoute("c344fd2492c7a9d2|2023-12-11--09-03-23", HYUNDAI.HYUNDAI_STARIA_4TH_GEN), + CarTestRoute("fb3fd42f0baaa2f8|2022-03-30--15-25-05", HYUNDAI.HYUNDAI_TUCSON), + CarTestRoute("db68bbe12250812c|2022-12-05--00-54-12", HYUNDAI.HYUNDAI_TUCSON_4TH_GEN), # 2023 + CarTestRoute("36e10531feea61a4|2022-07-25--13-37-42", HYUNDAI.HYUNDAI_TUCSON_4TH_GEN), # hybrid CarTestRoute("5875672fc1d4bf57|2020-07-23--21-33-28", HYUNDAI.KIA_SORENTO), CarTestRoute("1d0d000db3370fd0|2023-01-04--22-28-42", HYUNDAI.KIA_SORENTO_4TH_GEN, segment=5), CarTestRoute("fc19648042eb6896|2023-08-16--11-43-27", HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, segment=14), CarTestRoute("628935d7d3e5f4f7|2022-11-30--01-12-46", HYUNDAI.KIA_SORENTO_HEV_4TH_GEN), # plug-in hybrid - CarTestRoute("9c917ba0d42ffe78|2020-04-17--12-43-19", HYUNDAI.PALISADE), - CarTestRoute("05a8f0197fdac372|2022-10-19--14-14-09", HYUNDAI.IONIQ_5), # HDA2 - CarTestRoute("eb4eae1476647463|2023-08-26--18-07-04", HYUNDAI.IONIQ_6, segment=6), # HDA2 - CarTestRoute("3f29334d6134fcd4|2022-03-30--22-00-50", HYUNDAI.IONIQ_PHEV_2019), - CarTestRoute("fa8db5869167f821|2021-06-10--22-50-10", HYUNDAI.IONIQ_PHEV), - CarTestRoute("e1107f9d04dfb1e2|2023-09-05--22-32-12", HYUNDAI.IONIQ_PHEV), # openpilot longitudinal enabled - CarTestRoute("2c5cf2dd6102e5da|2020-12-17--16-06-44", HYUNDAI.IONIQ_EV_2020), - CarTestRoute("610ebb9faaad6b43|2020-06-13--15-28-36", HYUNDAI.IONIQ_EV_LTD), - CarTestRoute("2c5cf2dd6102e5da|2020-06-26--16-00-08", HYUNDAI.IONIQ), - CarTestRoute("012c95f06918eca4|2023-01-15--11-19-36", HYUNDAI.IONIQ), # openpilot longitudinal enabled - CarTestRoute("ab59fe909f626921|2021-10-18--18-34-28", HYUNDAI.IONIQ_HEV_2022), - CarTestRoute("22d955b2cd499c22|2020-08-10--19-58-21", HYUNDAI.KONA), - CarTestRoute("efc48acf44b1e64d|2021-05-28--21-05-04", HYUNDAI.KONA_EV), - CarTestRoute("f90d3cd06caeb6fa|2023-09-06--17-15-47", HYUNDAI.KONA_EV), # openpilot longitudinal enabled - CarTestRoute("ff973b941a69366f|2022-07-28--22-01-19", HYUNDAI.KONA_EV_2022, segment=11), - CarTestRoute("1618132d68afc876|2023-08-27--09-32-14", HYUNDAI.KONA_EV_2ND_GEN, segment=13), - CarTestRoute("49f3c13141b6bc87|2021-07-28--08-05-13", HYUNDAI.KONA_HEV), + CarTestRoute("9c917ba0d42ffe78|2020-04-17--12-43-19", HYUNDAI.HYUNDAI_PALISADE), + CarTestRoute("05a8f0197fdac372|2022-10-19--14-14-09", HYUNDAI.HYUNDAI_IONIQ_5), # HDA2 + CarTestRoute("eb4eae1476647463|2023-08-26--18-07-04", HYUNDAI.HYUNDAI_IONIQ_6, segment=6), # HDA2 + CarTestRoute("3f29334d6134fcd4|2022-03-30--22-00-50", HYUNDAI.HYUNDAI_IONIQ_PHEV_2019), + CarTestRoute("fa8db5869167f821|2021-06-10--22-50-10", HYUNDAI.HYUNDAI_IONIQ_PHEV), + CarTestRoute("e1107f9d04dfb1e2|2023-09-05--22-32-12", HYUNDAI.HYUNDAI_IONIQ_PHEV), # openpilot longitudinal enabled + CarTestRoute("2c5cf2dd6102e5da|2020-12-17--16-06-44", HYUNDAI.HYUNDAI_IONIQ_EV_2020), + CarTestRoute("610ebb9faaad6b43|2020-06-13--15-28-36", HYUNDAI.HYUNDAI_IONIQ_EV_LTD), + CarTestRoute("2c5cf2dd6102e5da|2020-06-26--16-00-08", HYUNDAI.HYUNDAI_IONIQ), + CarTestRoute("012c95f06918eca4|2023-01-15--11-19-36", HYUNDAI.HYUNDAI_IONIQ), # openpilot longitudinal enabled + CarTestRoute("ab59fe909f626921|2021-10-18--18-34-28", HYUNDAI.HYUNDAI_IONIQ_HEV_2022), + CarTestRoute("22d955b2cd499c22|2020-08-10--19-58-21", HYUNDAI.HYUNDAI_KONA), + CarTestRoute("efc48acf44b1e64d|2021-05-28--21-05-04", HYUNDAI.HYUNDAI_KONA_EV), + CarTestRoute("f90d3cd06caeb6fa|2023-09-06--17-15-47", HYUNDAI.HYUNDAI_KONA_EV), # openpilot longitudinal enabled + CarTestRoute("ff973b941a69366f|2022-07-28--22-01-19", HYUNDAI.HYUNDAI_KONA_EV_2022, segment=11), + CarTestRoute("1618132d68afc876|2023-08-27--09-32-14", HYUNDAI.HYUNDAI_KONA_EV_2ND_GEN, segment=13), + CarTestRoute("49f3c13141b6bc87|2021-07-28--08-05-13", HYUNDAI.HYUNDAI_KONA_HEV), CarTestRoute("5dddcbca6eb66c62|2020-07-26--13-24-19", HYUNDAI.KIA_STINGER), CarTestRoute("5b50b883a4259afb|2022-11-09--15-00-42", HYUNDAI.KIA_STINGER_2022), - CarTestRoute("d624b3d19adce635|2020-08-01--14-59-12", HYUNDAI.VELOSTER), + CarTestRoute("d624b3d19adce635|2020-08-01--14-59-12", HYUNDAI.HYUNDAI_VELOSTER), CarTestRoute("d545129f3ca90f28|2022-10-19--09-22-54", HYUNDAI.KIA_EV6), # HDA2 CarTestRoute("68d6a96e703c00c9|2022-09-10--16-09-39", HYUNDAI.KIA_EV6), # HDA1 CarTestRoute("9b25e8c1484a1b67|2023-04-13--10-41-45", HYUNDAI.KIA_EV6), @@ -164,37 +164,37 @@ routes = [ CarTestRoute("192283cdbb7a58c2|2022-10-15--01-43-18", HYUNDAI.KIA_SPORTAGE_5TH_GEN), CarTestRoute("09559f1fcaed4704|2023-11-16--02-24-57", HYUNDAI.KIA_SPORTAGE_5TH_GEN), # openpilot longitudinal CarTestRoute("b3537035ffe6a7d6|2022-10-17--15-23-49", HYUNDAI.KIA_SPORTAGE_5TH_GEN), # hybrid - CarTestRoute("c5ac319aa9583f83|2021-06-01--18-18-31", HYUNDAI.ELANTRA), - CarTestRoute("734ef96182ddf940|2022-10-02--16-41-44", HYUNDAI.ELANTRA_GT_I30), - CarTestRoute("82e9cdd3f43bf83e|2021-05-15--02-42-51", HYUNDAI.ELANTRA_2021), - CarTestRoute("715ac05b594e9c59|2021-06-20--16-21-07", HYUNDAI.ELANTRA_HEV_2021), - CarTestRoute("7120aa90bbc3add7|2021-08-02--07-12-31", HYUNDAI.SONATA_HYBRID), + CarTestRoute("c5ac319aa9583f83|2021-06-01--18-18-31", HYUNDAI.HYUNDAI_ELANTRA), + CarTestRoute("734ef96182ddf940|2022-10-02--16-41-44", HYUNDAI.HYUNDAI_ELANTRA_GT_I30), + CarTestRoute("82e9cdd3f43bf83e|2021-05-15--02-42-51", HYUNDAI.HYUNDAI_ELANTRA_2021), + CarTestRoute("715ac05b594e9c59|2021-06-20--16-21-07", HYUNDAI.HYUNDAI_ELANTRA_HEV_2021), + CarTestRoute("7120aa90bbc3add7|2021-08-02--07-12-31", HYUNDAI.HYUNDAI_SONATA_HYBRID), CarTestRoute("715ac05b594e9c59|2021-10-27--23-24-56", HYUNDAI.GENESIS_G70_2020), CarTestRoute("6b0d44d22df18134|2023-05-06--10-36-55", HYUNDAI.GENESIS_GV80), - CarTestRoute("00c829b1b7613dea|2021-06-24--09-10-10", TOYOTA.ALPHARD_TSS2), - CarTestRoute("912119ebd02c7a42|2022-03-19--07-24-50", TOYOTA.ALPHARD_TSS2), # hybrid - CarTestRoute("000cf3730200c71c|2021-05-24--10-42-05", TOYOTA.AVALON), - CarTestRoute("0bb588106852abb7|2021-05-26--12-22-01", TOYOTA.AVALON_2019), - CarTestRoute("87bef2930af86592|2021-05-30--09-40-54", TOYOTA.AVALON_2019), # hybrid - CarTestRoute("e9966711cfb04ce3|2022-01-11--07-59-43", TOYOTA.AVALON_TSS2), - CarTestRoute("eca1080a91720a54|2022-03-17--13-32-29", TOYOTA.AVALON_TSS2), # hybrid - CarTestRoute("6cdecc4728d4af37|2020-02-23--15-44-18", TOYOTA.CAMRY), - CarTestRoute("2f37c007683e85ba|2023-09-02--14-39-44", TOYOTA.CAMRY), # openpilot longitudinal, with radar CAN filter - CarTestRoute("54034823d30962f5|2021-05-24--06-37-34", TOYOTA.CAMRY), # hybrid - CarTestRoute("3456ad0cd7281b24|2020-12-13--17-45-56", TOYOTA.CAMRY_TSS2), - CarTestRoute("ffccc77938ddbc44|2021-01-04--16-55-41", TOYOTA.CAMRY_TSS2), # hybrid - CarTestRoute("4e45c89c38e8ec4d|2021-05-02--02-49-28", TOYOTA.COROLLA), - CarTestRoute("5f5afb36036506e4|2019-05-14--02-09-54", TOYOTA.COROLLA_TSS2), - CarTestRoute("5ceff72287a5c86c|2019-10-19--10-59-02", TOYOTA.COROLLA_TSS2), # hybrid - CarTestRoute("d2525c22173da58b|2021-04-25--16-47-04", TOYOTA.PRIUS), - CarTestRoute("b14c5b4742e6fc85|2020-07-28--19-50-11", TOYOTA.RAV4), - CarTestRoute("32a7df20486b0f70|2020-02-06--16-06-50", TOYOTA.RAV4H), - CarTestRoute("cdf2f7de565d40ae|2019-04-25--03-53-41", TOYOTA.RAV4_TSS2), - CarTestRoute("a5c341bb250ca2f0|2022-05-18--16-05-17", TOYOTA.RAV4_TSS2_2022), - CarTestRoute("ad5a3fa719bc2f83|2023-10-17--19-48-42", TOYOTA.RAV4_TSS2_2023), - CarTestRoute("7e34a988419b5307|2019-12-18--19-13-30", TOYOTA.RAV4_TSS2), # hybrid - CarTestRoute("2475fb3eb2ffcc2e|2022-04-29--12-46-23", TOYOTA.RAV4_TSS2_2022), # hybrid + CarTestRoute("00c829b1b7613dea|2021-06-24--09-10-10", TOYOTA.TOYOTA_ALPHARD_TSS2), + CarTestRoute("912119ebd02c7a42|2022-03-19--07-24-50", TOYOTA.TOYOTA_ALPHARD_TSS2), # hybrid + CarTestRoute("000cf3730200c71c|2021-05-24--10-42-05", TOYOTA.TOYOTA_AVALON), + CarTestRoute("0bb588106852abb7|2021-05-26--12-22-01", TOYOTA.TOYOTA_AVALON_2019), + CarTestRoute("87bef2930af86592|2021-05-30--09-40-54", TOYOTA.TOYOTA_AVALON_2019), # hybrid + CarTestRoute("e9966711cfb04ce3|2022-01-11--07-59-43", TOYOTA.TOYOTA_AVALON_TSS2), + CarTestRoute("eca1080a91720a54|2022-03-17--13-32-29", TOYOTA.TOYOTA_AVALON_TSS2), # hybrid + CarTestRoute("6cdecc4728d4af37|2020-02-23--15-44-18", TOYOTA.TOYOTA_CAMRY), + CarTestRoute("2f37c007683e85ba|2023-09-02--14-39-44", TOYOTA.TOYOTA_CAMRY), # openpilot longitudinal, with radar CAN filter + CarTestRoute("54034823d30962f5|2021-05-24--06-37-34", TOYOTA.TOYOTA_CAMRY), # hybrid + CarTestRoute("3456ad0cd7281b24|2020-12-13--17-45-56", TOYOTA.TOYOTA_CAMRY_TSS2), + CarTestRoute("ffccc77938ddbc44|2021-01-04--16-55-41", TOYOTA.TOYOTA_CAMRY_TSS2), # hybrid + CarTestRoute("4e45c89c38e8ec4d|2021-05-02--02-49-28", TOYOTA.TOYOTA_COROLLA), + CarTestRoute("5f5afb36036506e4|2019-05-14--02-09-54", TOYOTA.TOYOTA_COROLLA_TSS2), + CarTestRoute("5ceff72287a5c86c|2019-10-19--10-59-02", TOYOTA.TOYOTA_COROLLA_TSS2), # hybrid + CarTestRoute("d2525c22173da58b|2021-04-25--16-47-04", TOYOTA.TOYOTA_PRIUS), + CarTestRoute("b14c5b4742e6fc85|2020-07-28--19-50-11", TOYOTA.TOYOTA_RAV4), + CarTestRoute("32a7df20486b0f70|2020-02-06--16-06-50", TOYOTA.TOYOTA_RAV4H), + CarTestRoute("cdf2f7de565d40ae|2019-04-25--03-53-41", TOYOTA.TOYOTA_RAV4_TSS2), + CarTestRoute("a5c341bb250ca2f0|2022-05-18--16-05-17", TOYOTA.TOYOTA_RAV4_TSS2_2022), + CarTestRoute("ad5a3fa719bc2f83|2023-10-17--19-48-42", TOYOTA.TOYOTA_RAV4_TSS2_2023), + CarTestRoute("7e34a988419b5307|2019-12-18--19-13-30", TOYOTA.TOYOTA_RAV4_TSS2), # hybrid + CarTestRoute("2475fb3eb2ffcc2e|2022-04-29--12-46-23", TOYOTA.TOYOTA_RAV4_TSS2_2022), # hybrid CarTestRoute("7a31f030957b9c85|2023-04-01--14-12-51", TOYOTA.LEXUS_ES), CarTestRoute("37041c500fd30100|2020-12-30--12-17-24", TOYOTA.LEXUS_ES), # hybrid CarTestRoute("e6a24be49a6cd46e|2019-10-29--10-52-42", TOYOTA.LEXUS_ES_TSS2), @@ -211,39 +211,39 @@ routes = [ CarTestRoute("3fd5305f8b6ca765|2021-04-28--19-26-49", TOYOTA.LEXUS_NX_TSS2), CarTestRoute("09ae96064ed85a14|2022-06-09--12-22-31", TOYOTA.LEXUS_NX_TSS2), # hybrid CarTestRoute("4765fbbf59e3cd88|2024-02-06--17-45-32", TOYOTA.LEXUS_LC_TSS2), - CarTestRoute("0a302ffddbb3e3d3|2020-02-08--16-19-08", TOYOTA.HIGHLANDER_TSS2), - CarTestRoute("437e4d2402abf524|2021-05-25--07-58-50", TOYOTA.HIGHLANDER_TSS2), # hybrid - CarTestRoute("3183cd9b021e89ce|2021-05-25--10-34-44", TOYOTA.HIGHLANDER), - CarTestRoute("80d16a262e33d57f|2021-05-23--20-01-43", TOYOTA.HIGHLANDER), # hybrid - CarTestRoute("eb6acd681135480d|2019-06-20--20-00-00", TOYOTA.SIENNA), + CarTestRoute("0a302ffddbb3e3d3|2020-02-08--16-19-08", TOYOTA.TOYOTA_HIGHLANDER_TSS2), + CarTestRoute("437e4d2402abf524|2021-05-25--07-58-50", TOYOTA.TOYOTA_HIGHLANDER_TSS2), # hybrid + CarTestRoute("3183cd9b021e89ce|2021-05-25--10-34-44", TOYOTA.TOYOTA_HIGHLANDER), + CarTestRoute("80d16a262e33d57f|2021-05-23--20-01-43", TOYOTA.TOYOTA_HIGHLANDER), # hybrid + CarTestRoute("eb6acd681135480d|2019-06-20--20-00-00", TOYOTA.TOYOTA_SIENNA), CarTestRoute("2e07163a1ba9a780|2019-08-25--13-15-13", TOYOTA.LEXUS_IS), CarTestRoute("649bf2997ada6e3a|2023-08-08--18-04-22", TOYOTA.LEXUS_IS_TSS2), - CarTestRoute("0a0de17a1e6a2d15|2020-09-21--21-24-41", TOYOTA.PRIUS_TSS2), - CarTestRoute("9b36accae406390e|2021-03-30--10-41-38", TOYOTA.MIRAI), - CarTestRoute("cd9cff4b0b26c435|2021-05-13--15-12-39", TOYOTA.CHR), - CarTestRoute("57858ede0369a261|2021-05-18--20-34-20", TOYOTA.CHR), # hybrid - CarTestRoute("ea8fbe72b96a185c|2023-02-08--15-11-46", TOYOTA.CHR_TSS2), - CarTestRoute("ea8fbe72b96a185c|2023-02-22--09-20-34", TOYOTA.CHR_TSS2), # openpilot longitudinal, with smartDSU - CarTestRoute("6719965b0e1d1737|2023-02-09--22-44-05", TOYOTA.CHR_TSS2), # hybrid - CarTestRoute("6719965b0e1d1737|2023-08-29--06-40-05", TOYOTA.CHR_TSS2), # hybrid, openpilot longitudinal, radar disabled - CarTestRoute("14623aae37e549f3|2021-10-24--01-20-49", TOYOTA.PRIUS_V), + CarTestRoute("0a0de17a1e6a2d15|2020-09-21--21-24-41", TOYOTA.TOYOTA_PRIUS_TSS2), + CarTestRoute("9b36accae406390e|2021-03-30--10-41-38", TOYOTA.TOYOTA_MIRAI), + CarTestRoute("cd9cff4b0b26c435|2021-05-13--15-12-39", TOYOTA.TOYOTA_CHR), + CarTestRoute("57858ede0369a261|2021-05-18--20-34-20", TOYOTA.TOYOTA_CHR), # hybrid + CarTestRoute("ea8fbe72b96a185c|2023-02-08--15-11-46", TOYOTA.TOYOTA_CHR_TSS2), + CarTestRoute("ea8fbe72b96a185c|2023-02-22--09-20-34", TOYOTA.TOYOTA_CHR_TSS2), # openpilot longitudinal, with smartDSU + CarTestRoute("6719965b0e1d1737|2023-02-09--22-44-05", TOYOTA.TOYOTA_CHR_TSS2), # hybrid + CarTestRoute("6719965b0e1d1737|2023-08-29--06-40-05", TOYOTA.TOYOTA_CHR_TSS2), # hybrid, openpilot longitudinal, radar disabled + CarTestRoute("14623aae37e549f3|2021-10-24--01-20-49", TOYOTA.TOYOTA_PRIUS_V), - CarTestRoute("202c40641158a6e5|2021-09-21--09-43-24", VOLKSWAGEN.ARTEON_MK1), - CarTestRoute("2c68dda277d887ac|2021-05-11--15-22-20", VOLKSWAGEN.ATLAS_MK1), - CarTestRoute("ffcd23abbbd02219|2024-02-28--14-59-38", VOLKSWAGEN.CADDY_MK3), - CarTestRoute("cae14e88932eb364|2021-03-26--14-43-28", VOLKSWAGEN.GOLF_MK7), # Stock ACC - CarTestRoute("3cfdec54aa035f3f|2022-10-13--14-58-58", VOLKSWAGEN.GOLF_MK7), # openpilot longitudinal - CarTestRoute("58a7d3b707987d65|2021-03-25--17-26-37", VOLKSWAGEN.JETTA_MK7), - CarTestRoute("4d134e099430fba2|2021-03-26--00-26-06", VOLKSWAGEN.PASSAT_MK8), - CarTestRoute("3cfdec54aa035f3f|2022-07-19--23-45-10", VOLKSWAGEN.PASSAT_NMS), - CarTestRoute("0cd0b7f7e31a3853|2021-11-03--19-30-22", VOLKSWAGEN.POLO_MK6), - CarTestRoute("064d1816e448f8eb|2022-09-29--15-32-34", VOLKSWAGEN.SHARAN_MK2), - CarTestRoute("7d82b2f3a9115f1f|2021-10-21--15-39-42", VOLKSWAGEN.TAOS_MK1), - CarTestRoute("2744c89a8dda9a51|2021-07-24--21-28-06", VOLKSWAGEN.TCROSS_MK1), - CarTestRoute("2cef8a0b898f331a|2021-03-25--20-13-57", VOLKSWAGEN.TIGUAN_MK2), - CarTestRoute("a589dcc642fdb10a|2021-06-14--20-54-26", VOLKSWAGEN.TOURAN_MK2), - CarTestRoute("a459f4556782eba1|2021-09-19--09-48-00", VOLKSWAGEN.TRANSPORTER_T61), - CarTestRoute("0cd0b7f7e31a3853|2021-11-18--00-38-32", VOLKSWAGEN.TROC_MK1), + CarTestRoute("202c40641158a6e5|2021-09-21--09-43-24", VOLKSWAGEN.VOLKSWAGEN_ARTEON_MK1), + CarTestRoute("2c68dda277d887ac|2021-05-11--15-22-20", VOLKSWAGEN.VOLKSWAGEN_ATLAS_MK1), + CarTestRoute("ffcd23abbbd02219|2024-02-28--14-59-38", VOLKSWAGEN.VOLKSWAGEN_CADDY_MK3), + CarTestRoute("cae14e88932eb364|2021-03-26--14-43-28", VOLKSWAGEN.VOLKSWAGEN_GOLF_MK7), # Stock ACC + CarTestRoute("3cfdec54aa035f3f|2022-10-13--14-58-58", VOLKSWAGEN.VOLKSWAGEN_GOLF_MK7), # openpilot longitudinal + CarTestRoute("58a7d3b707987d65|2021-03-25--17-26-37", VOLKSWAGEN.VOLKSWAGEN_JETTA_MK7), + CarTestRoute("4d134e099430fba2|2021-03-26--00-26-06", VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK8), + CarTestRoute("3cfdec54aa035f3f|2022-07-19--23-45-10", VOLKSWAGEN.VOLKSWAGEN_PASSAT_NMS), + CarTestRoute("0cd0b7f7e31a3853|2021-11-03--19-30-22", VOLKSWAGEN.VOLKSWAGEN_POLO_MK6), + CarTestRoute("064d1816e448f8eb|2022-09-29--15-32-34", VOLKSWAGEN.VOLKSWAGEN_SHARAN_MK2), + CarTestRoute("7d82b2f3a9115f1f|2021-10-21--15-39-42", VOLKSWAGEN.VOLKSWAGEN_TAOS_MK1), + CarTestRoute("2744c89a8dda9a51|2021-07-24--21-28-06", VOLKSWAGEN.VOLKSWAGEN_TCROSS_MK1), + CarTestRoute("2cef8a0b898f331a|2021-03-25--20-13-57", VOLKSWAGEN.VOLKSWAGEN_TIGUAN_MK2), + CarTestRoute("a589dcc642fdb10a|2021-06-14--20-54-26", VOLKSWAGEN.VOLKSWAGEN_TOURAN_MK2), + CarTestRoute("a459f4556782eba1|2021-09-19--09-48-00", VOLKSWAGEN.VOLKSWAGEN_TRANSPORTER_T61), + CarTestRoute("0cd0b7f7e31a3853|2021-11-18--00-38-32", VOLKSWAGEN.VOLKSWAGEN_TROC_MK1), CarTestRoute("07667b885add75fd|2021-01-23--19-48-42", VOLKSWAGEN.AUDI_A3_MK3), CarTestRoute("6c6b466346192818|2021-06-06--14-17-47", VOLKSWAGEN.AUDI_Q2_MK1), CarTestRoute("0cd0b7f7e31a3853|2021-12-03--03-12-05", VOLKSWAGEN.AUDI_Q3_MK2), @@ -257,42 +257,42 @@ routes = [ CarTestRoute("026b6d18fba6417f|2021-03-26--09-17-04", VOLKSWAGEN.SKODA_SCALA_MK1), CarTestRoute("b2e9858e29db492b|2021-03-26--16-58-42", VOLKSWAGEN.SKODA_SUPERB_MK3), - CarTestRoute("3c8f0c502e119c1c|2020-06-30--12-58-02", SUBARU.ASCENT), - CarTestRoute("c321c6b697c5a5ff|2020-06-23--11-04-33", SUBARU.FORESTER), - CarTestRoute("791340bc01ed993d|2019-03-10--16-28-08", SUBARU.IMPREZA), - CarTestRoute("8bf7e79a3ce64055|2021-05-24--09-36-27", SUBARU.IMPREZA_2020), - CarTestRoute("8de015561e1ea4a0|2023-08-29--17-08-31", SUBARU.IMPREZA), # openpilot longitudinal + CarTestRoute("3c8f0c502e119c1c|2020-06-30--12-58-02", SUBARU.SUBARU_ASCENT), + CarTestRoute("c321c6b697c5a5ff|2020-06-23--11-04-33", SUBARU.SUBARU_FORESTER), + CarTestRoute("791340bc01ed993d|2019-03-10--16-28-08", SUBARU.SUBARU_IMPREZA), + CarTestRoute("8bf7e79a3ce64055|2021-05-24--09-36-27", SUBARU.SUBARU_IMPREZA_2020), + CarTestRoute("8de015561e1ea4a0|2023-08-29--17-08-31", SUBARU.SUBARU_IMPREZA), # openpilot longitudinal # CarTestRoute("c3d1ccb52f5f9d65|2023-07-22--01-23-20", SUBARU.OUTBACK, segment=9), # gen2 longitudinal, eyesight disabled - CarTestRoute("1bbe6bf2d62f58a8|2022-07-14--17-11-43", SUBARU.OUTBACK, segment=10), - CarTestRoute("c56e69bbc74b8fad|2022-08-18--09-43-51", SUBARU.LEGACY, segment=3), - CarTestRoute("f4e3a0c511a076f4|2022-08-04--16-16-48", SUBARU.CROSSTREK_HYBRID, segment=2), - CarTestRoute("7fd1e4f3a33c1673|2022-12-04--15-09-53", SUBARU.FORESTER_2022, segment=4), - CarTestRoute("f3b34c0d2632aa83|2023-07-23--20-43-25", SUBARU.OUTBACK_2023, segment=7), - CarTestRoute("99437cef6d5ff2ee|2023-03-13--21-21-38", SUBARU.ASCENT_2023, segment=7), + CarTestRoute("1bbe6bf2d62f58a8|2022-07-14--17-11-43", SUBARU.SUBARU_OUTBACK, segment=10), + CarTestRoute("c56e69bbc74b8fad|2022-08-18--09-43-51", SUBARU.SUBARU_LEGACY, segment=3), + CarTestRoute("f4e3a0c511a076f4|2022-08-04--16-16-48", SUBARU.SUBARU_CROSSTREK_HYBRID, segment=2), + CarTestRoute("7fd1e4f3a33c1673|2022-12-04--15-09-53", SUBARU.SUBARU_FORESTER_2022, segment=4), + CarTestRoute("f3b34c0d2632aa83|2023-07-23--20-43-25", SUBARU.SUBARU_OUTBACK_2023, segment=7), + CarTestRoute("99437cef6d5ff2ee|2023-03-13--21-21-38", SUBARU.SUBARU_ASCENT_2023, segment=7), # Pre-global, dashcam - CarTestRoute("95441c38ae8c130e|2020-06-08--12-10-17", SUBARU.FORESTER_PREGLOBAL), - CarTestRoute("df5ca7660000fba8|2020-06-16--17-37-19", SUBARU.LEGACY_PREGLOBAL), - CarTestRoute("5ab784f361e19b78|2020-06-08--16-30-41", SUBARU.OUTBACK_PREGLOBAL), - CarTestRoute("e19eb5d5353b1ac1|2020-08-09--14-37-56", SUBARU.OUTBACK_PREGLOBAL_2018), + CarTestRoute("95441c38ae8c130e|2020-06-08--12-10-17", SUBARU.SUBARU_FORESTER_PREGLOBAL), + CarTestRoute("df5ca7660000fba8|2020-06-16--17-37-19", SUBARU.SUBARU_LEGACY_PREGLOBAL), + CarTestRoute("5ab784f361e19b78|2020-06-08--16-30-41", SUBARU.SUBARU_OUTBACK_PREGLOBAL), + CarTestRoute("e19eb5d5353b1ac1|2020-08-09--14-37-56", SUBARU.SUBARU_OUTBACK_PREGLOBAL_2018), - CarTestRoute("fbbfa6af821552b9|2020-03-03--08-09-43", NISSAN.XTRAIL), - CarTestRoute("5b7c365c50084530|2020-03-25--22-10-13", NISSAN.LEAF), - CarTestRoute("22c3dcce2dd627eb|2020-12-30--16-38-48", NISSAN.LEAF_IC), - CarTestRoute("059ab9162e23198e|2020-05-30--09-41-01", NISSAN.ROGUE), - CarTestRoute("b72d3ec617c0a90f|2020-12-11--15-38-17", NISSAN.ALTIMA), + CarTestRoute("fbbfa6af821552b9|2020-03-03--08-09-43", NISSAN.NISSAN_XTRAIL), + CarTestRoute("5b7c365c50084530|2020-03-25--22-10-13", NISSAN.NISSAN_LEAF), + CarTestRoute("22c3dcce2dd627eb|2020-12-30--16-38-48", NISSAN.NISSAN_LEAF_IC), + CarTestRoute("059ab9162e23198e|2020-05-30--09-41-01", NISSAN.NISSAN_ROGUE), + CarTestRoute("b72d3ec617c0a90f|2020-12-11--15-38-17", NISSAN.NISSAN_ALTIMA), - CarTestRoute("32a319f057902bb3|2020-04-27--15-18-58", MAZDA.CX5), - CarTestRoute("10b5a4b380434151|2020-08-26--17-11-45", MAZDA.CX9), - CarTestRoute("74f1038827005090|2020-08-26--20-05-50", MAZDA.MAZDA3), - CarTestRoute("fb53c640f499b73d|2021-06-01--04-17-56", MAZDA.MAZDA6), - CarTestRoute("f6d5b1a9d7a1c92e|2021-07-08--06-56-59", MAZDA.CX9_2021), - CarTestRoute("a4af1602d8e668ac|2022-02-03--12-17-07", MAZDA.CX5_2022), + CarTestRoute("32a319f057902bb3|2020-04-27--15-18-58", MAZDA.MAZDA_CX5), + CarTestRoute("10b5a4b380434151|2020-08-26--17-11-45", MAZDA.MAZDA_CX9), + CarTestRoute("74f1038827005090|2020-08-26--20-05-50", MAZDA.MAZDA_3), + CarTestRoute("fb53c640f499b73d|2021-06-01--04-17-56", MAZDA.MAZDA_6), + CarTestRoute("f6d5b1a9d7a1c92e|2021-07-08--06-56-59", MAZDA.MAZDA_CX9_2021), + CarTestRoute("a4af1602d8e668ac|2022-02-03--12-17-07", MAZDA.MAZDA_CX5_2022), - CarTestRoute("6c14ee12b74823ce|2021-06-30--11-49-02", TESLA.AP1_MODELS), - CarTestRoute("bb50caf5f0945ab1|2021-06-19--17-20-18", TESLA.AP2_MODELS), - CarTestRoute("66c1699b7697267d/2024-03-03--13-09-53", TESLA.MODELS_RAVEN), + CarTestRoute("6c14ee12b74823ce|2021-06-30--11-49-02", TESLA.TESLA_AP1_MODELS), + CarTestRoute("bb50caf5f0945ab1|2021-06-19--17-20-18", TESLA.TESLA_AP2_MODELS), + CarTestRoute("66c1699b7697267d/2024-03-03--13-09-53", TESLA.TESLA_MODELS_RAVEN), # Segments that test specific issues # Controls mismatch due to standstill threshold - CarTestRoute("bec2dcfde6a64235|2022-04-08--14-21-32", HONDA.CRV_HYBRID, segment=22), + CarTestRoute("bec2dcfde6a64235|2022-04-08--14-21-32", HONDA.HONDA_CRV_HYBRID, segment=22), ] diff --git a/selfdrive/car/tests/test_can_fingerprint.py b/selfdrive/car/tests/test_can_fingerprint.py index e768abd20f..8df7007339 100755 --- a/selfdrive/car/tests/test_can_fingerprint.py +++ b/selfdrive/car/tests/test_can_fingerprint.py @@ -28,7 +28,7 @@ class TestCanFingerprint(unittest.TestCase): def test_timing(self): # just pick any CAN fingerprinting car - car_model = "BOLT_EUV" + car_model = "CHEVROLET_BOLT_EUV" fingerprint = FINGERPRINTS[car_model][0] cases = [] diff --git a/selfdrive/car/tests/test_docs.py b/selfdrive/car/tests/test_docs.py index 7f88dba18b..143b402d5f 100755 --- a/selfdrive/car/tests/test_docs.py +++ b/selfdrive/car/tests/test_docs.py @@ -69,7 +69,7 @@ class TestCarDocs(unittest.TestCase): for car in self.all_cars: with self.subTest(car=car): # honda sanity check, it's the definition of a no torque star - if car.car_fingerprint in (HONDA.ACCORD, HONDA.CIVIC, HONDA.CRV, HONDA.ODYSSEY, HONDA.PILOT): + if car.car_fingerprint in (HONDA.HONDA_ACCORD, HONDA.HONDA_CIVIC, HONDA.HONDA_CRV, HONDA.HONDA_ODYSSEY, HONDA.HONDA_PILOT): self.assertEqual(car.row[Column.STEERING_TORQUE], Star.EMPTY, f"{car.name} has full torque star") elif car.car_name in ("toyota", "hyundai"): self.assertNotEqual(car.row[Column.STEERING_TORQUE], Star.EMPTY, f"{car.name} has no torque star") diff --git a/selfdrive/car/tests/test_lateral_limits.py b/selfdrive/car/tests/test_lateral_limits.py index 083cdd5a5e..8f1cee269e 100755 --- a/selfdrive/car/tests/test_lateral_limits.py +++ b/selfdrive/car/tests/test_lateral_limits.py @@ -24,8 +24,8 @@ JERK_MEAS_T = 0.5 # TODO: put these cars within limits ABOVE_LIMITS_CARS = [ - SUBARU.LEGACY, - SUBARU.OUTBACK, + SUBARU.SUBARU_LEGACY, + SUBARU.SUBARU_OUTBACK, ] car_model_jerks: defaultdict[str, dict[str, float]] = defaultdict(dict) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 81dfe195b2..f561fa2ad8 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -367,7 +367,7 @@ class TestCarModelBase(unittest.TestCase): # TODO: remove this exception once this mismatch is resolved brake_pressed = CS.brakePressed if CS.brakePressed and not self.safety.get_brake_pressed_prev(): - if self.CP.carFingerprint in (HONDA.PILOT, HONDA.RIDGELINE) and CS.brake > 0.05: + if self.CP.carFingerprint in (HONDA.HONDA_PILOT, HONDA.HONDA_RIDGELINE) and CS.brake > 0.05: brake_pressed = False self.assertEqual(brake_pressed, self.safety.get_brake_pressed_prev()) @@ -430,7 +430,7 @@ class TestCarModelBase(unittest.TestCase): # TODO: remove this exception once this mismatch is resolved brake_pressed = CS.brakePressed if CS.brakePressed and not self.safety.get_brake_pressed_prev(): - if self.CP.carFingerprint in (HONDA.PILOT, HONDA.RIDGELINE) and CS.brake > 0.05: + if self.CP.carFingerprint in (HONDA.HONDA_PILOT, HONDA.HONDA_RIDGELINE) and CS.brake > 0.05: brake_pressed = False checks['brakePressed'] += brake_pressed != self.safety.get_brake_pressed_prev() checks['regenBraking'] += CS.regenBraking != self.safety.get_regen_braking_prev() diff --git a/selfdrive/car/torque_data/neural_ff_weights.json b/selfdrive/car/torque_data/neural_ff_weights.json index 47d7ced4f9..251b66efb0 100644 --- a/selfdrive/car/torque_data/neural_ff_weights.json +++ b/selfdrive/car/torque_data/neural_ff_weights.json @@ -1 +1 @@ -{"BOLT_EUV": {"w_1": [[0.3452189564704895, -0.15614677965641022, -0.04062516987323761, -0.5960758328437805, 0.3211185932159424, 0.31732726097106934, -0.04430829733610153, -0.37327295541763306, -0.14118380844593048, 0.12712529301643372, 0.2641555070877075, -0.3451094627380371, -0.005127656273543835, 0.6185108423233032, 0.03725295141339302, 0.3763789236545563], [-0.0708412230014801, 0.3667356073856354, 0.031383827328681946, 0.1740853488445282, -0.04695861041545868, 0.018055908381938934, 0.009072160348296165, -0.23640218377113342, -0.10362917929887772, 0.022628149017691612, -0.224413201212883, 0.20718418061733246, -0.016947750002145767, -0.3872031271457672, -0.15500062704086304, -0.06375953555107117], [-0.0838046595454216, -0.0242826659232378, -0.07765661180019379, 0.028858814388513565, -0.09516210108995438, 0.008368706330657005, 0.1689300835132599, 0.015036891214549541, -0.15121428668498993, 0.1388195902109146, 0.11486363410949707, 0.0651545450091362, 0.13559958338737488, 0.04300367832183838, -0.13856294751167297, -0.058136988431215286], [-0.006249868310987949, 0.08809533715248108, -0.040690965950489044, 0.02359287068247795, -0.00766348373144865, 0.24816390872001648, -0.17360293865203857, -0.03676899895071983, -0.17564819753170013, 0.18998438119888306, -0.050583917647600174, -0.006488069426268339, 0.10649101436138153, -0.024557121098041534, -0.103276826441288, 0.18448011577129364]], "b_1": [0.2935388386249542, 0.10967712104320526, -0.014007942751049995, 0.211833655834198, 0.33605605363845825, 0.37722209095954895, -0.16615016758441925, 0.3134673535823822, 0.06695777177810669, 0.3425212800502777, 0.3769673705101013, 0.23186539113521576, 0.5770409107208252, -0.05929069593548775, 0.01839117519557476, 0.03828774020075798], "w_2": [[-0.06261160969734192, 0.010185074992477894, -0.06083013117313385, -0.04531499370932579, -0.08979734033346176, 0.3432150185108185, -0.019801849499344826, 0.3010321259498596], [0.19698476791381836, -0.009238275699317455, 0.08842222392559052, -0.09516377002000809, -0.05022778362035751, 0.13626104593276978, -0.052890390157699585, 0.15569131076335907], [0.0724768117070198, -0.09018408507108688, 0.06850195676088333, -0.025572121143341064, 0.0680626779794693, -0.07648195326328278, 0.07993496209383011, -0.059752143919467926], [1.267876386642456, -0.05755887180566788, -0.08429178595542908, 0.021366603672504425, -0.0006479775765910745, -1.4292563199996948, -0.08077696710824966, -1.414825439453125], [0.04535430669784546, 0.06555880606174469, -0.027145234867930412, -0.07661093026399612, -0.05702832341194153, 0.23650476336479187, 0.0024587824009358883, 0.20126521587371826], [0.006042032968252897, 0.042880818247795105, 0.002187949838116765, -0.017126334831118584, -0.08352015167474747, 0.19801731407642365, -0.029196614399552345, 0.23713473975658417], [-0.01644900068640709, -0.04358499124646187, 0.014584392309188843, 0.07155826687812805, -0.09354910999536514, -0.033351872116327286, 0.07138452678918839, -0.04755295440554619], [-1.1012420654296875, -0.03534531593322754, 0.02167935110628605, -0.01116552110761404, -0.08436500281095505, 1.1038788557052612, 0.027903547510504723, 1.0676132440567017], [0.03843916580080986, -0.0952216386795044, 0.039226632565259933, 0.002778085647150874, -0.020275786519050598, -0.07848760485649109, 0.04803166165947914, 0.015538203530013561], [0.018385495990514755, -0.025189843028783798, 0.0036680365446954966, -0.02105865254998207, 0.04808586835861206, 0.1575016975402832, 0.02703506126999855, 0.23039312660694122], [-0.0033881019335240126, -0.10210853815078735, -0.04877309128642082, 0.006989633198827505, 0.046798162162303925, 0.38676899671554565, -0.032304272055625916, 0.2345031052827835], [0.22092825174331665, -0.09642873704433441, 0.04499409720301628, 0.05108088254928589, -0.10191166400909424, 0.12818090617656708, -0.021021494641900063, 0.09440375864505768], [0.1212429478764534, -0.028194155544042587, -0.0981956496834755, 0.08226924389600754, 0.055346839129924774, 0.27067816257476807, -0.09064067900180817, 0.12580905854701996], [-1.6740131378173828, -0.02066155895590782, -0.05924689769744873, 0.06347910314798355, -0.07821853458881378, 1.2807466983795166, 0.04589352011680603, 1.310766577720642], [-0.09893272817134857, -0.04093599319458008, -0.02502273954451084, 0.09490344673395157, -0.0211324505507946, -0.09021010994911194, 0.07936318963766098, -0.03593116253614426], [-0.08490308374166489, -0.015558987855911255, -0.048692114651203156, -0.007421435788273811, -0.040531404316425323, 0.25889304280281067, 0.06012800335884094, 0.27946868538856506]], "b_2": [0.07973937690258026, -0.010446485131978989, -0.003066520905122161, -0.031895797699689865, 0.006032303906977177, 0.24106740951538086, -0.008969511836767197, 0.2872662842273712], "w_3": [[-1.364486813545227, -0.11682678014039993, 0.01764785870909691, 0.03926877677440643], [-0.05695437639951706, 0.05472218990325928, 0.1266128271818161, 0.09950875490903854], [0.11415273696184158, -0.10069356113672256, 0.0864749327301979, -0.043946366757154465], [-0.10138195008039474, -0.040128443390131, -0.08937158435583115, -0.0048376512713730335], [-0.0028251828625798225, -0.04743027314543724, 0.06340016424655914, 0.07277824729681015], [0.49482327699661255, -0.06410001963376999, -0.0999293103814125, -0.14250673353672028], [0.042802367359399796, 0.0015462725423276424, -0.05991362780332565, 0.1022040992975235], [0.3523194193840027, 0.07343732565641403, 0.04157765582203865, -0.12358107417821884]], "b_3": [0.2653026282787323, -0.058485131710767746, -0.0744510293006897, 0.012550175189971924], "w_4": [[0.5988775491714478, 0.09668736904859543], [-0.04360569268465042, 0.06491032242774963], [-0.11868984252214432, -0.09601487964391708], [-0.06554870307445526, -0.14189276099205017]], "b_4": [-0.08148707449436188, -2.8251802921295166], "input_norm_mat": [[-3.0, 3.0], [-3.0, 3.0], [0.0, 40.0], [-3.0, 3.0]], "output_norm_mat": [-1.0, 1.0], "temperature": 100.0}} \ No newline at end of file +{"CHEVROLET_BOLT_EUV": {"w_1": [[0.3452189564704895, -0.15614677965641022, -0.04062516987323761, -0.5960758328437805, 0.3211185932159424, 0.31732726097106934, -0.04430829733610153, -0.37327295541763306, -0.14118380844593048, 0.12712529301643372, 0.2641555070877075, -0.3451094627380371, -0.005127656273543835, 0.6185108423233032, 0.03725295141339302, 0.3763789236545563], [-0.0708412230014801, 0.3667356073856354, 0.031383827328681946, 0.1740853488445282, -0.04695861041545868, 0.018055908381938934, 0.009072160348296165, -0.23640218377113342, -0.10362917929887772, 0.022628149017691612, -0.224413201212883, 0.20718418061733246, -0.016947750002145767, -0.3872031271457672, -0.15500062704086304, -0.06375953555107117], [-0.0838046595454216, -0.0242826659232378, -0.07765661180019379, 0.028858814388513565, -0.09516210108995438, 0.008368706330657005, 0.1689300835132599, 0.015036891214549541, -0.15121428668498993, 0.1388195902109146, 0.11486363410949707, 0.0651545450091362, 0.13559958338737488, 0.04300367832183838, -0.13856294751167297, -0.058136988431215286], [-0.006249868310987949, 0.08809533715248108, -0.040690965950489044, 0.02359287068247795, -0.00766348373144865, 0.24816390872001648, -0.17360293865203857, -0.03676899895071983, -0.17564819753170013, 0.18998438119888306, -0.050583917647600174, -0.006488069426268339, 0.10649101436138153, -0.024557121098041534, -0.103276826441288, 0.18448011577129364]], "b_1": [0.2935388386249542, 0.10967712104320526, -0.014007942751049995, 0.211833655834198, 0.33605605363845825, 0.37722209095954895, -0.16615016758441925, 0.3134673535823822, 0.06695777177810669, 0.3425212800502777, 0.3769673705101013, 0.23186539113521576, 0.5770409107208252, -0.05929069593548775, 0.01839117519557476, 0.03828774020075798], "w_2": [[-0.06261160969734192, 0.010185074992477894, -0.06083013117313385, -0.04531499370932579, -0.08979734033346176, 0.3432150185108185, -0.019801849499344826, 0.3010321259498596], [0.19698476791381836, -0.009238275699317455, 0.08842222392559052, -0.09516377002000809, -0.05022778362035751, 0.13626104593276978, -0.052890390157699585, 0.15569131076335907], [0.0724768117070198, -0.09018408507108688, 0.06850195676088333, -0.025572121143341064, 0.0680626779794693, -0.07648195326328278, 0.07993496209383011, -0.059752143919467926], [1.267876386642456, -0.05755887180566788, -0.08429178595542908, 0.021366603672504425, -0.0006479775765910745, -1.4292563199996948, -0.08077696710824966, -1.414825439453125], [0.04535430669784546, 0.06555880606174469, -0.027145234867930412, -0.07661093026399612, -0.05702832341194153, 0.23650476336479187, 0.0024587824009358883, 0.20126521587371826], [0.006042032968252897, 0.042880818247795105, 0.002187949838116765, -0.017126334831118584, -0.08352015167474747, 0.19801731407642365, -0.029196614399552345, 0.23713473975658417], [-0.01644900068640709, -0.04358499124646187, 0.014584392309188843, 0.07155826687812805, -0.09354910999536514, -0.033351872116327286, 0.07138452678918839, -0.04755295440554619], [-1.1012420654296875, -0.03534531593322754, 0.02167935110628605, -0.01116552110761404, -0.08436500281095505, 1.1038788557052612, 0.027903547510504723, 1.0676132440567017], [0.03843916580080986, -0.0952216386795044, 0.039226632565259933, 0.002778085647150874, -0.020275786519050598, -0.07848760485649109, 0.04803166165947914, 0.015538203530013561], [0.018385495990514755, -0.025189843028783798, 0.0036680365446954966, -0.02105865254998207, 0.04808586835861206, 0.1575016975402832, 0.02703506126999855, 0.23039312660694122], [-0.0033881019335240126, -0.10210853815078735, -0.04877309128642082, 0.006989633198827505, 0.046798162162303925, 0.38676899671554565, -0.032304272055625916, 0.2345031052827835], [0.22092825174331665, -0.09642873704433441, 0.04499409720301628, 0.05108088254928589, -0.10191166400909424, 0.12818090617656708, -0.021021494641900063, 0.09440375864505768], [0.1212429478764534, -0.028194155544042587, -0.0981956496834755, 0.08226924389600754, 0.055346839129924774, 0.27067816257476807, -0.09064067900180817, 0.12580905854701996], [-1.6740131378173828, -0.02066155895590782, -0.05924689769744873, 0.06347910314798355, -0.07821853458881378, 1.2807466983795166, 0.04589352011680603, 1.310766577720642], [-0.09893272817134857, -0.04093599319458008, -0.02502273954451084, 0.09490344673395157, -0.0211324505507946, -0.09021010994911194, 0.07936318963766098, -0.03593116253614426], [-0.08490308374166489, -0.015558987855911255, -0.048692114651203156, -0.007421435788273811, -0.040531404316425323, 0.25889304280281067, 0.06012800335884094, 0.27946868538856506]], "b_2": [0.07973937690258026, -0.010446485131978989, -0.003066520905122161, -0.031895797699689865, 0.006032303906977177, 0.24106740951538086, -0.008969511836767197, 0.2872662842273712], "w_3": [[-1.364486813545227, -0.11682678014039993, 0.01764785870909691, 0.03926877677440643], [-0.05695437639951706, 0.05472218990325928, 0.1266128271818161, 0.09950875490903854], [0.11415273696184158, -0.10069356113672256, 0.0864749327301979, -0.043946366757154465], [-0.10138195008039474, -0.040128443390131, -0.08937158435583115, -0.0048376512713730335], [-0.0028251828625798225, -0.04743027314543724, 0.06340016424655914, 0.07277824729681015], [0.49482327699661255, -0.06410001963376999, -0.0999293103814125, -0.14250673353672028], [0.042802367359399796, 0.0015462725423276424, -0.05991362780332565, 0.1022040992975235], [0.3523194193840027, 0.07343732565641403, 0.04157765582203865, -0.12358107417821884]], "b_3": [0.2653026282787323, -0.058485131710767746, -0.0744510293006897, 0.012550175189971924], "w_4": [[0.5988775491714478, 0.09668736904859543], [-0.04360569268465042, 0.06491032242774963], [-0.11868984252214432, -0.09601487964391708], [-0.06554870307445526, -0.14189276099205017]], "b_4": [-0.08148707449436188, -2.8251802921295166], "input_norm_mat": [[-3.0, 3.0], [-3.0, 3.0], [0.0, 40.0], [-3.0, 3.0]], "output_norm_mat": [-1.0, 1.0], "temperature": 100.0}} \ No newline at end of file diff --git a/selfdrive/car/torque_data/override.toml b/selfdrive/car/torque_data/override.toml index 11308fad79..4d9646a54a 100644 --- a/selfdrive/car/torque_data/override.toml +++ b/selfdrive/car/torque_data/override.toml @@ -1,53 +1,53 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] ### angle control # Nissan appears to have torque -"XTRAIL" = [nan, 1.5, nan] -"ALTIMA" = [nan, 1.5, nan] -"LEAF_IC" = [nan, 1.5, nan] -"LEAF" = [nan, 1.5, nan] -"ROGUE" = [nan, 1.5, nan] +"NISSAN_XTRAIL" = [nan, 1.5, nan] +"NISSAN_ALTIMA" = [nan, 1.5, nan] +"NISSAN_LEAF_IC" = [nan, 1.5, nan] +"NISSAN_LEAF" = [nan, 1.5, nan] +"NISSAN_ROGUE" = [nan, 1.5, nan] # New subarus angle based controllers -"FORESTER_2022" = [nan, 3.0, nan] -"OUTBACK_2023" = [nan, 3.0, nan] -"ASCENT_2023" = [nan, 3.0, nan] +"SUBARU_FORESTER_2022" = [nan, 3.0, nan] +"SUBARU_OUTBACK_2023" = [nan, 3.0, nan] +"SUBARU_ASCENT_2023" = [nan, 3.0, nan] # Toyota LTA also has torque -"RAV4_TSS2_2023" = [nan, 3.0, nan] +"TOYOTA_RAV4_TSS2_2023" = [nan, 3.0, nan] # Tesla has high torque -"AP1_MODELS" = [nan, 2.5, nan] -"AP2_MODELS" = [nan, 2.5, nan] -"MODELS_RAVEN" = [nan, 2.5, nan] +"TESLA_AP1_MODELS" = [nan, 2.5, nan] +"TESLA_AP2_MODELS" = [nan, 2.5, nan] +"TESLA_MODELS_RAVEN" = [nan, 2.5, nan] # Guess -"BRONCO_SPORT_MK1" = [nan, 1.5, nan] -"ESCAPE_MK4" = [nan, 1.5, nan] -"EXPLORER_MK6" = [nan, 1.5, nan] -"F_150_MK14" = [nan, 1.5, nan] -"FOCUS_MK4" = [nan, 1.5, nan] -"MAVERICK_MK1" = [nan, 1.5, nan] -"F_150_LIGHTNING_MK1" = [nan, 1.5, nan] -"MUSTANG_MACH_E_MK1" = [nan, 1.5, nan] +"FORD_BRONCO_SPORT_MK1" = [nan, 1.5, nan] +"FORD_ESCAPE_MK4" = [nan, 1.5, nan] +"FORD_EXPLORER_MK6" = [nan, 1.5, nan] +"FORD_F_150_MK14" = [nan, 1.5, nan] +"FORD_FOCUS_MK4" = [nan, 1.5, nan] +"FORD_MAVERICK_MK1" = [nan, 1.5, nan] +"FORD_F_150_LIGHTNING_MK1" = [nan, 1.5, nan] +"FORD_MUSTANG_MACH_E_MK1" = [nan, 1.5, nan] ### # No steering wheel -"BODY" = [nan, 1000, nan] +"COMMA_BODY" = [nan, 1000, nan] # Totally new cars "RAM_1500_5TH_GEN" = [2.0, 2.0, 0.05] "RAM_HD_5TH_GEN" = [1.4, 1.4, 0.05] -"OUTBACK" = [2.0, 2.0, 0.2] -"ESCALADE" = [1.899999976158142, 1.842270016670227, 0.1120000034570694] -"ESCALADE_ESV_2019" = [1.15, 1.3, 0.2] -"BOLT_EUV" = [2.0, 2.0, 0.05] -"SILVERADO" = [1.9, 1.9, 0.112] -"TRAILBLAZER" = [1.33, 1.9, 0.16] -"EQUINOX" = [2.5, 2.5, 0.05] -"CADDY_MK3" = [1.2, 1.2, 0.1] -"PASSAT_NMS" = [2.5, 2.5, 0.1] -"SHARAN_MK2" = [2.5, 2.5, 0.1] -"SANTA_CRUZ_1ST_GEN" = [2.7, 2.7, 0.1] +"SUBARU_OUTBACK" = [2.0, 2.0, 0.2] +"CADILLAC_ESCALADE" = [1.899999976158142, 1.842270016670227, 0.1120000034570694] +"CADILLAC_ESCALADE_ESV_2019" = [1.15, 1.3, 0.2] +"CHEVROLET_BOLT_EUV" = [2.0, 2.0, 0.05] +"CHEVROLET_SILVERADO" = [1.9, 1.9, 0.112] +"CHEVROLET_TRAILBLAZER" = [1.33, 1.9, 0.16] +"CHEVROLET_EQUINOX" = [2.5, 2.5, 0.05] +"VOLKSWAGEN_CADDY_MK3" = [1.2, 1.2, 0.1] +"VOLKSWAGEN_PASSAT_NMS" = [2.5, 2.5, 0.1] +"VOLKSWAGEN_SHARAN_MK2" = [2.5, 2.5, 0.1] +"HYUNDAI_SANTA_CRUZ_1ST_GEN" = [2.7, 2.7, 0.1] "KIA_SPORTAGE_5TH_GEN" = [2.6, 2.6, 0.1] "GENESIS_GV70_1ST_GEN" = [2.42, 2.42, 0.1] "GENESIS_GV60_EV_1ST_GEN" = [2.5, 2.5, 0.1] @@ -57,20 +57,20 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "KIA_NIRO_EV_2ND_GEN" = [2.05, 2.5, 0.14] "GENESIS_GV80" = [2.5, 2.5, 0.1] "KIA_CARNIVAL_4TH_GEN" = [1.75, 1.75, 0.15] -"ACADIA" = [1.6, 1.6, 0.2] +"GMC_ACADIA" = [1.6, 1.6, 0.2] "LEXUS_IS_TSS2" = [2.0, 2.0, 0.1] -"KONA_EV_2ND_GEN" = [2.5, 2.5, 0.1] -"IONIQ_6" = [2.5, 2.5, 0.1] -"AZERA_6TH_GEN" = [1.8, 1.8, 0.1] -"AZERA_HEV_6TH_GEN" = [1.8, 1.8, 0.1] +"HYUNDAI_KONA_EV_2ND_GEN" = [2.5, 2.5, 0.1] +"HYUNDAI_IONIQ_6" = [2.5, 2.5, 0.1] +"HYUNDAI_AZERA_6TH_GEN" = [1.8, 1.8, 0.1] +"HYUNDAI_AZERA_HEV_6TH_GEN" = [1.8, 1.8, 0.1] "KIA_K8_HEV_1ST_GEN" = [2.5, 2.5, 0.1] -"CUSTIN_1ST_GEN" = [2.5, 2.5, 0.1] +"HYUNDAI_CUSTIN_1ST_GEN" = [2.5, 2.5, 0.1] "LEXUS_GS_F" = [2.5, 2.5, 0.08] -"STARIA_4TH_GEN" = [1.8, 2.0, 0.15] +"HYUNDAI_STARIA_4TH_GEN" = [1.8, 2.0, 0.15] # Dashcam or fallback configured as ideal car "MOCK" = [10.0, 10, 0.0] # Manually checked -"CIVIC_2022" = [2.5, 1.2, 0.15] -"HRV_3G" = [2.5, 1.2, 0.2] +"HONDA_CIVIC_2022" = [2.5, 1.2, 0.15] +"HONDA_HRV_3G" = [2.5, 1.2, 0.2] diff --git a/selfdrive/car/torque_data/params.toml b/selfdrive/car/torque_data/params.toml index 048c5a1812..f91bc3abab 100644 --- a/selfdrive/car/torque_data/params.toml +++ b/selfdrive/car/torque_data/params.toml @@ -4,40 +4,40 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "ACURA_RDX_3G" = [1.4314459806646749, 0.33874701282109954, 0.18048847083897598] "AUDI_A3_MK3" = [1.5122414863077502, 1.7443517531719404, 0.15194151892450905] "AUDI_Q3_MK2" = [1.4439223359448605, 1.2254955789112076, 0.1413798895978097] -"VOLT" = [1.5961527626411784, 1.8422651988094612, 0.1572393918005158] -"PACIFICA_2018" = [2.07140, 1.3366521181047952, 0.13776367250652022] -"PACIFICA_2020" = [1.86206, 1.509076559398423, 0.14328246159386085] -"PACIFICA_2017_HYBRID" = [1.79422, 1.06831764583744, 0.116237] -"PACIFICA_2018_HYBRID" = [2.08887, 1.2943025830995154, 0.114818] -"PACIFICA_2019_HYBRID" = [1.90120, 1.1958788168371808, 0.131520] +"CHEVROLET_VOLT" = [1.5961527626411784, 1.8422651988094612, 0.1572393918005158] +"CHRYSLER_PACIFICA_2018" = [2.07140, 1.3366521181047952, 0.13776367250652022] +"CHRYSLER_PACIFICA_2020" = [1.86206, 1.509076559398423, 0.14328246159386085] +"CHRYSLER_PACIFICA_2017_HYBRID" = [1.79422, 1.06831764583744, 0.116237] +"CHRYSLER_PACIFICA_2018_HYBRID" = [2.08887, 1.2943025830995154, 0.114818] +"CHRYSLER_PACIFICA_2019_HYBRID" = [1.90120, 1.1958788168371808, 0.131520] "GENESIS_G70" = [3.8520195946707947, 2.354697063349854, 0.06830285485626221] -"ACCORD" = [1.6893333799149202, 0.3246749081720698, 0.2120497022936265] -"CIVIC_BOSCH" = [1.691708637466905, 0.40132900729454185, 0.25460295304024094] -"CIVIC" = [1.6528895627785531, 0.4018518740819229, 0.25458812851328544] -"CRV" = [0.7667141440182675, 0.5927571534745969, 0.40909087636157127] -"CRV_5G" = [2.01323205142022, 0.2700612209345081, 0.2238412881331528] -"CRV_HYBRID" = [2.072034634644233, 0.7152085160516978, 0.20237105008376083] -"FIT" = [1.5719981427109775, 0.5712761407108976, 0.110773383324281] -"HRV" = [2.0661212805710205, 0.7521343418694775, 0.17760375789242094] -"INSIGHT" = [1.5201671214069354, 0.5660229120683284, 0.25808042580281876] -"ODYSSEY" = [1.8774809275211801, 0.8394431662987996, 0.2096978613792822] -"PILOT" = [1.7262026201812795, 0.9470005614967523, 0.21351430733218763] -"RIDGELINE" = [1.4146525028237624, 0.7356572861629564, 0.23307177552211328] -"ELANTRA_2021" = [3.169, 2.1259108157250735, 0.0819] +"HONDA_ACCORD" = [1.6893333799149202, 0.3246749081720698, 0.2120497022936265] +"HONDA_CIVIC_BOSCH" = [1.691708637466905, 0.40132900729454185, 0.25460295304024094] +"HONDA_CIVIC" = [1.6528895627785531, 0.4018518740819229, 0.25458812851328544] +"HONDA_CRV" = [0.7667141440182675, 0.5927571534745969, 0.40909087636157127] +"HONDA_CRV_5G" = [2.01323205142022, 0.2700612209345081, 0.2238412881331528] +"HONDA_CRV_HYBRID" = [2.072034634644233, 0.7152085160516978, 0.20237105008376083] +"HONDA_FIT" = [1.5719981427109775, 0.5712761407108976, 0.110773383324281] +"HONDA_HRV" = [2.0661212805710205, 0.7521343418694775, 0.17760375789242094] +"HONDA_INSIGHT" = [1.5201671214069354, 0.5660229120683284, 0.25808042580281876] +"HONDA_ODYSSEY" = [1.8774809275211801, 0.8394431662987996, 0.2096978613792822] +"HONDA_PILOT" = [1.7262026201812795, 0.9470005614967523, 0.21351430733218763] +"HONDA_RIDGELINE" = [1.4146525028237624, 0.7356572861629564, 0.23307177552211328] +"HYUNDAI_ELANTRA_2021" = [3.169, 2.1259108157250735, 0.0819] "HYUNDAI_GENESIS" = [2.7807965280270794, 2.325, 0.0984484465421171] -"IONIQ_5" = [3.172929, 2.713050, 0.096019] -"IONIQ_EV_LTD" = [1.7662975472852054, 1.613755614526594, 0.17087579756306276] -"IONIQ_PHEV" = [3.2928700076638537, 2.1193482926455656, 0.12463700961468778] -"IONIQ_PHEV_2019" = [2.970807902012267, 1.6312321830002083, 0.1088964990357482] -"KONA_EV" = [3.078814714619148, 2.307336938253934, 0.12359762054065548] -"PALISADE" = [2.544642494803999, 1.8721703683337008, 0.1301424599248651] -"SANTA_FE" = [3.0787027729757632, 2.6173437483495565, 0.1207019341823945] -"SANTA_FE_HEV_2022" = [3.501877602644835, 2.729064118456137, 0.10384068104538963] -"SANTA_FE_PHEV_2022" = [1.6953050513611045, 1.5837614296206861, 0.12672855941458458] -"SONATA_LF" = [2.2200457811703953, 1.2967330275895228, 0.14039920986586393] -"SONATA" = [2.9638737459977467, 2.1259108157250735, 0.07813665616927593] -"SONATA_HYBRID" = [2.8990264092395734, 2.061410192222139, 0.0899805488717382] -"TUCSON_4TH_GEN" = [2.960174, 2.860284, 0.108745] +"HYUNDAI_IONIQ_5" = [3.172929, 2.713050, 0.096019] +"HYUNDAI_IONIQ_EV_LTD" = [1.7662975472852054, 1.613755614526594, 0.17087579756306276] +"HYUNDAI_IONIQ_PHEV" = [3.2928700076638537, 2.1193482926455656, 0.12463700961468778] +"HYUNDAI_IONIQ_PHEV_2019" = [2.970807902012267, 1.6312321830002083, 0.1088964990357482] +"HYUNDAI_KONA_EV" = [3.078814714619148, 2.307336938253934, 0.12359762054065548] +"HYUNDAI_PALISADE" = [2.544642494803999, 1.8721703683337008, 0.1301424599248651] +"HYUNDAI_SANTA_FE" = [3.0787027729757632, 2.6173437483495565, 0.1207019341823945] +"HYUNDAI_SANTA_FE_HEV_2022" = [3.501877602644835, 2.729064118456137, 0.10384068104538963] +"HYUNDAI_SANTA_FE_PHEV_2022" = [1.6953050513611045, 1.5837614296206861, 0.12672855941458458] +"HYUNDAI_SONATA_LF" = [2.2200457811703953, 1.2967330275895228, 0.14039920986586393] +"HYUNDAI_SONATA" = [2.9638737459977467, 2.1259108157250735, 0.07813665616927593] +"HYUNDAI_SONATA_HYBRID" = [2.8990264092395734, 2.061410192222139, 0.0899805488717382] +"HYUNDAI_TUCSON_4TH_GEN" = [2.960174, 2.860284, 0.108745] "JEEP_GRAND_CHEROKEE_2019" = [2.30972, 1.289689569171081, 0.117048] "JEEP_GRAND_CHEROKEE" = [2.27116, 1.4057367824262523, 0.11725947414922003] "KIA_EV6" = [3.2, 2.093457, 0.05] @@ -50,36 +50,33 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "LEXUS_NX_TSS2" = [2.4331999786982936, 2.1045680431705414, 0.14099899317761067] "LEXUS_RX" = [1.6430539050086406, 1.181960058934143, 0.19768806040843034] "LEXUS_RX_TSS2" = [1.5375561442049257, 1.343166476215164, 0.1931062001527557] -"CX9_2021" = [1.7601682915983443, 1.0889677335154337, 0.17713792194297195] +"MAZDA_CX9_2021" = [1.7601682915983443, 1.0889677335154337, 0.17713792194297195] "SKODA_SUPERB_MK3" = [1.166437404652981, 1.1686163012668165, 0.12194533036948708] -"FORESTER" = [3.6617001649776793, 2.342197172531713, 0.11075960785398745] -"IMPREZA" = [1.0670704910352047, 0.8234374840709592, 0.20986563268614938] -"IMPREZA_2020" = [2.6068223389108303, 2.134872342760203, 0.15261513193561627] -"AVALON" = [2.5185770183845646, 1.7153346784214922, 0.10603968787111022] -"AVALON_2019" = [1.7036141952825095, 1.239619084240008, 0.08459830394899492] -"AVALON_TSS2" = [2.3154403649717357, 2.7777922854327124, 0.11453999639164605] -"CHR" = [1.5591084333664578, 1.271271459066948, 0.20259087058453193] -"CHR_TSS2" = [1.7678810166088303, 1.3742176337919942, 0.2319674583741509] -"CAMRY" = [2.0568162685952505, 1.7576185169559122, 0.108878753] -"CAMRY_TSS2" = [2.3548324999999997, 2.368900128946771, 0.118436] -"COROLLA" = [3.117154369115421, 1.8438132575043773, 0.12289685869250652] -"COROLLA_TSS2" = [1.991132339206426, 1.868866242720403, 0.19570063298031432] -"HIGHLANDER" = [1.8108348718624456, 1.6348421600679828, 0.15972686105120398] -"HIGHLANDER_TSS2" = [1.9617570834136164, 1.8611643317268927, 0.14519673256119725] -"MIRAI" = [2.506899832157829, 1.7417213930750164, 0.20182618449440565] -"PRIUS" = [1.60, 1.5023147650693636, 0.151515] -"PRIUS_TSS2" = [1.972600, 1.9104337425537743, 0.170968] -"RAV4" = [2.085695074355425, 2.2142832316984733, 0.13339165270103975] -"RAV4_TSS2" = [2.279239424615458, 2.087101966779332, 0.13682208413446817] -"TOYOTA RAV4 2019 8965" = [2.3080951748210854, 2.1189367835820603, 0.12942102328134028] -"TOYOTA RAV4 2019 x02" = [2.762293266024922, 2.243615865975329, 0.11113568178327986] -"RAV4H" = [1.9796257271652042, 1.7503987331707576, 0.14628860048885406] -"RAV4_TSS2_2022" = [2.241883248393209, 1.9304407208090029, 0.112174] -"TOYOTA RAV4 2022 x02" = [3.044930631831037, 2.3979189796380918, 0.14023209146703736] -"SIENNA" = [1.689726, 1.3208264576110418, 0.140456] -"ARTEON_MK1" = [1.45136518053819, 1.3639364049316804, 0.23806361745695032] -"ATLAS_MK1" = [1.4677006726964945, 1.6733266634075656, 0.12959584092073367] -"GOLF_MK7" = [1.3750394140491293, 1.5814743077200641, 0.2018321939386586] -"JETTA_MK7" = [1.2271623034089392, 1.216955117387, 0.19437384688370712] -"PASSAT_MK8" = [1.3432120736752917, 1.7087275587362314, 0.19444383787326647] -"TIGUAN_MK2" = [0.9711965500094828, 1.0001565939459098, 0.1465626137072916] +"SUBARU_FORESTER" = [3.6617001649776793, 2.342197172531713, 0.11075960785398745] +"SUBARU_IMPREZA" = [1.0670704910352047, 0.8234374840709592, 0.20986563268614938] +"SUBARU_IMPREZA_2020" = [2.6068223389108303, 2.134872342760203, 0.15261513193561627] +"TOYOTA_AVALON" = [2.5185770183845646, 1.7153346784214922, 0.10603968787111022] +"TOYOTA_AVALON_2019" = [1.7036141952825095, 1.239619084240008, 0.08459830394899492] +"TOYOTA_AVALON_TSS2" = [2.3154403649717357, 2.7777922854327124, 0.11453999639164605] +"TOYOTA_CHR" = [1.5591084333664578, 1.271271459066948, 0.20259087058453193] +"TOYOTA_CHR_TSS2" = [1.7678810166088303, 1.3742176337919942, 0.2319674583741509] +"TOYOTA_CAMRY" = [2.0568162685952505, 1.7576185169559122, 0.108878753] +"TOYOTA_CAMRY_TSS2" = [2.3548324999999997, 2.368900128946771, 0.118436] +"TOYOTA_COROLLA" = [3.117154369115421, 1.8438132575043773, 0.12289685869250652] +"TOYOTA_COROLLA_TSS2" = [1.991132339206426, 1.868866242720403, 0.19570063298031432] +"TOYOTA_HIGHLANDER" = [1.8108348718624456, 1.6348421600679828, 0.15972686105120398] +"TOYOTA_HIGHLANDER_TSS2" = [1.9617570834136164, 1.8611643317268927, 0.14519673256119725] +"TOYOTA_MIRAI" = [2.506899832157829, 1.7417213930750164, 0.20182618449440565] +"TOYOTA_PRIUS" = [1.60, 1.5023147650693636, 0.151515] +"TOYOTA_PRIUS_TSS2" = [1.972600, 1.9104337425537743, 0.170968] +"TOYOTA_RAV4" = [2.085695074355425, 2.2142832316984733, 0.13339165270103975] +"TOYOTA_RAV4_TSS2" = [2.279239424615458, 2.087101966779332, 0.13682208413446817] +"TOYOTA_RAV4H" = [1.9796257271652042, 1.7503987331707576, 0.14628860048885406] +"TOYOTA_RAV4_TSS2_2022" = [2.241883248393209, 1.9304407208090029, 0.112174] +"TOYOTA_SIENNA" = [1.689726, 1.3208264576110418, 0.140456] +"VOLKSWAGEN_ARTEON_MK1" = [1.45136518053819, 1.3639364049316804, 0.23806361745695032] +"VOLKSWAGEN_ATLAS_MK1" = [1.4677006726964945, 1.6733266634075656, 0.12959584092073367] +"VOLKSWAGEN_GOLF_MK7" = [1.3750394140491293, 1.5814743077200641, 0.2018321939386586] +"VOLKSWAGEN_JETTA_MK7" = [1.2271623034089392, 1.216955117387, 0.19437384688370712] +"VOLKSWAGEN_PASSAT_MK8" = [1.3432120736752917, 1.7087275587362314, 0.19444383787326647] +"VOLKSWAGEN_TIGUAN_MK2" = [0.9711965500094828, 1.0001565939459098, 0.1465626137072916] diff --git a/selfdrive/car/torque_data/substitute.toml b/selfdrive/car/torque_data/substitute.toml index 2cf5bf41e5..22ee134ae3 100644 --- a/selfdrive/car/torque_data/substitute.toml +++ b/selfdrive/car/torque_data/substitute.toml @@ -1,85 +1,85 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] -"MAZDA3" = "CX9_2021" -"MAZDA6" = "CX9_2021" -"CX5" = "CX9_2021" -"CX5_2022" = "CX9_2021" -"CX9" = "CX9_2021" +"MAZDA_3" = "MAZDA_CX9_2021" +"MAZDA_6" = "MAZDA_CX9_2021" +"MAZDA_CX5" = "MAZDA_CX9_2021" +"MAZDA_CX5_2022" = "MAZDA_CX9_2021" +"MAZDA_CX9" = "MAZDA_CX9_2021" -"DODGE_DURANGO" = "PACIFICA_2020" +"DODGE_DURANGO" = "CHRYSLER_PACIFICA_2020" -"ALPHARD_TSS2" = "SIENNA" -"PRIUS_V" = "PRIUS" +"TOYOTA_ALPHARD_TSS2" = "TOYOTA_SIENNA" +"TOYOTA_PRIUS_V" = "TOYOTA_PRIUS" "LEXUS_IS" = "LEXUS_NX" "LEXUS_CTH" = "LEXUS_NX" -"LEXUS_ES" = "CAMRY" +"LEXUS_ES" = "TOYOTA_CAMRY" "LEXUS_RC" = "LEXUS_NX_TSS2" "LEXUS_LC_TSS2" = "LEXUS_NX_TSS2" -"KIA_OPTIMA_G4" = "SONATA" -"KIA_OPTIMA_G4_FL" = "SONATA" -"KIA_OPTIMA_H" = "SONATA" -"KIA_OPTIMA_H_G4_FL" = "SONATA" -"KIA_FORTE" = "SONATA" -"KIA_CEED" = "SONATA" -"KIA_SELTOS" = "SONATA" +"KIA_OPTIMA_G4" = "HYUNDAI_SONATA" +"KIA_OPTIMA_G4_FL" = "HYUNDAI_SONATA" +"KIA_OPTIMA_H" = "HYUNDAI_SONATA" +"KIA_OPTIMA_H_G4_FL" = "HYUNDAI_SONATA" +"KIA_FORTE" = "HYUNDAI_SONATA" +"KIA_CEED" = "HYUNDAI_SONATA" +"KIA_SELTOS" = "HYUNDAI_SONATA" "KIA_NIRO_PHEV" = "KIA_NIRO_EV" "KIA_NIRO_PHEV_2022" = "KIA_NIRO_EV" "KIA_NIRO_HEV_2021" = "KIA_NIRO_EV" -"VELOSTER" = "SONATA_LF" -"KONA" = "KONA_EV" -"KONA_HEV" = "KONA_EV" -"KONA_EV_2022" = "KONA_EV" -"IONIQ" = "IONIQ_PHEV_2019" -"IONIQ_HEV_2022" = "IONIQ_PHEV_2019" -"IONIQ_EV_2020" = "IONIQ_PHEV_2019" -"ELANTRA" = "SONATA_LF" -"ELANTRA_GT_I30" = "SONATA_LF" -"ELANTRA_HEV_2021" = "SONATA" -"TUCSON" = "SANTA_FE" -"SANTA_FE_2022" = "SANTA_FE_HEV_2022" +"HYUNDAI_VELOSTER" = "HYUNDAI_SONATA_LF" +"HYUNDAI_KONA" = "HYUNDAI_KONA_EV" +"HYUNDAI_KONA_HEV" = "HYUNDAI_KONA_EV" +"HYUNDAI_KONA_EV_2022" = "HYUNDAI_KONA_EV" +"HYUNDAI_IONIQ" = "HYUNDAI_IONIQ_PHEV_2019" +"HYUNDAI_IONIQ_HEV_2022" = "HYUNDAI_IONIQ_PHEV_2019" +"HYUNDAI_IONIQ_EV_2020" = "HYUNDAI_IONIQ_PHEV_2019" +"HYUNDAI_ELANTRA" = "HYUNDAI_SONATA_LF" +"HYUNDAI_ELANTRA_GT_I30" = "HYUNDAI_SONATA_LF" +"HYUNDAI_ELANTRA_HEV_2021" = "HYUNDAI_SONATA" +"HYUNDAI_TUCSON" = "HYUNDAI_SANTA_FE" +"HYUNDAI_SANTA_FE_2022" = "HYUNDAI_SANTA_FE_HEV_2022" "KIA_K5_HEV_2020" = "KIA_K5_2021" "KIA_STINGER_2022" = "KIA_STINGER" "GENESIS_G90" = "GENESIS_G70" "GENESIS_G80" = "GENESIS_G70" -"GENESIS_G70_2020" = "SONATA" +"GENESIS_G70_2020" = "HYUNDAI_SONATA" -"FREED" = "ODYSSEY" -"CRV_EU" = "CRV" -"CIVIC_BOSCH_DIESEL" = "CIVIC_BOSCH" -"HONDA_E" = "CIVIC_BOSCH" -"ODYSSEY_CHN" = "ODYSSEY" +"HONDA_FREED" = "HONDA_ODYSSEY" +"HONDA_CRV_EU" = "HONDA_CRV" +"HONDA_CIVIC_BOSCH_DIESEL" = "HONDA_CIVIC_BOSCH" +"HONDA_E" = "HONDA_CIVIC_BOSCH" +"HONDA_ODYSSEY_CHN" = "HONDA_ODYSSEY" -"BUICK_LACROSSE" = "VOLT" -"BUICK_REGAL" = "VOLT" -"ESCALADE_ESV" = "VOLT" -"CADILLAC_ATS" = "VOLT" -"MALIBU" = "VOLT" -"HOLDEN_ASTRA" = "VOLT" +"BUICK_LACROSSE" = "CHEVROLET_VOLT" +"BUICK_REGAL" = "CHEVROLET_VOLT" +"CADILLAC_ESCALADE_ESV" = "CHEVROLET_VOLT" +"CADILLAC_ATS" = "CHEVROLET_VOLT" +"CHEVROLET_MALIBU" = "CHEVROLET_VOLT" +"HOLDEN_ASTRA" = "CHEVROLET_VOLT" -"SKODA_FABIA_MK4" = "GOLF_MK7" +"SKODA_FABIA_MK4" = "VOLKSWAGEN_GOLF_MK7" "SKODA_OCTAVIA_MK3" = "SKODA_SUPERB_MK3" "SKODA_SCALA_MK1" = "SKODA_SUPERB_MK3" "SKODA_KODIAQ_MK1" = "SKODA_SUPERB_MK3" "SKODA_KAROQ_MK1" = "SKODA_SUPERB_MK3" "SKODA_KAMIQ_MK1" = "SKODA_SUPERB_MK3" -"CRAFTER_MK2" = "TIGUAN_MK2" -"TROC_MK1" = "TIGUAN_MK2" -"TCROSS_MK1" = "TIGUAN_MK2" -"TOURAN_MK2" = "TIGUAN_MK2" -"TRANSPORTER_T61" = "TIGUAN_MK2" -"AUDI_Q2_MK1" = "TIGUAN_MK2" -"TAOS_MK1" = "TIGUAN_MK2" -"POLO_MK6" = "GOLF_MK7" -"SEAT_LEON_MK3" = "GOLF_MK7" -"SEAT_ATECA_MK1" = "GOLF_MK7" +"VOLKSWAGEN_CRAFTER_MK2" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TROC_MK1" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TCROSS_MK1" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TOURAN_MK2" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TRANSPORTER_T61" = "VOLKSWAGEN_TIGUAN_MK2" +"AUDI_Q2_MK1" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TAOS_MK1" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_POLO_MK6" = "VOLKSWAGEN_GOLF_MK7" +"SEAT_LEON_MK3" = "VOLKSWAGEN_GOLF_MK7" +"SEAT_ATECA_MK1" = "VOLKSWAGEN_GOLF_MK7" -"CROSSTREK_HYBRID" = "IMPREZA_2020" -"FORESTER_HYBRID" = "IMPREZA_2020" -"LEGACY" = "OUTBACK" +"SUBARU_CROSSTREK_HYBRID" = "SUBARU_IMPREZA_2020" +"SUBARU_FORESTER_HYBRID" = "SUBARU_IMPREZA_2020" +"SUBARU_LEGACY" = "SUBARU_OUTBACK" # Old subarus don't have much data guessing it's like low torque impreza" -"OUTBACK_PREGLOBAL_2018" = "IMPREZA" -"OUTBACK_PREGLOBAL" = "IMPREZA" -"FORESTER_PREGLOBAL" = "IMPREZA" -"LEGACY_PREGLOBAL" = "IMPREZA" -"ASCENT" = "FORESTER" +"SUBARU_OUTBACK_PREGLOBAL_2018" = "SUBARU_IMPREZA" +"SUBARU_OUTBACK_PREGLOBAL" = "SUBARU_IMPREZA" +"SUBARU_FORESTER_PREGLOBAL" = "SUBARU_IMPREZA" +"SUBARU_LEGACY_PREGLOBAL" = "SUBARU_IMPREZA" +"SUBARU_ASCENT" = "SUBARU_FORESTER" diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index 2bb3fc3c34..f2d8a4a7bc 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -143,7 +143,7 @@ class CarController(CarControllerBase): can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, False, lead, CS.acc_type, False, self.distance_button)) # *** hud ui *** - if self.CP.carFingerprint != CAR.PRIUS_V: + if self.CP.carFingerprint != CAR.TOYOTA_PRIUS_V: # ui mesg is at 1Hz but we send asap if: # - there is something to display # - there is something to stop displaying diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 8a20c57196..0efa065dc2 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -96,7 +96,7 @@ class CarState(CarStateBase): ret.leftBlinker = cp.vl["BLINKERS_STATE"]["TURN_SIGNALS"] == 1 ret.rightBlinker = cp.vl["BLINKERS_STATE"]["TURN_SIGNALS"] == 2 - if self.CP.carFingerprint != CAR.MIRAI: + if self.CP.carFingerprint != CAR.TOYOTA_MIRAI: ret.engineRpm = cp.vl["ENGINE_RPM"]["RPM"] ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"] @@ -161,7 +161,7 @@ class CarState(CarStateBase): ret.leftBlindspot = (cp.vl["BSM"]["L_ADJACENT"] == 1) or (cp.vl["BSM"]["L_APPROACHING"] == 1) ret.rightBlindspot = (cp.vl["BSM"]["R_ADJACENT"] == 1) or (cp.vl["BSM"]["R_APPROACHING"] == 1) - if self.CP.carFingerprint != CAR.PRIUS_V: + if self.CP.carFingerprint != CAR.TOYOTA_PRIUS_V: self.lkas_hud = copy.copy(cp_cam.vl["LKAS_HUD"]) if self.CP.carFingerprint not in UNSUPPORTED_DSU_CAR: @@ -195,7 +195,7 @@ class CarState(CarStateBase): ("STEER_TORQUE_SENSOR", 50), ] - if CP.carFingerprint != CAR.MIRAI: + if CP.carFingerprint != CAR.TOYOTA_MIRAI: messages.append(("ENGINE_RPM", 42)) if CP.carFingerprint in UNSUPPORTED_DSU_CAR: @@ -232,7 +232,7 @@ class CarState(CarStateBase): def get_cam_can_parser(CP): messages = [] - if CP.carFingerprint != CAR.PRIUS_V: + if CP.carFingerprint != CAR.TOYOTA_PRIUS_V: messages += [ ("LKAS_HUD", 1), ] diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index a0d1ef20b2..1803b00255 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -4,7 +4,7 @@ from openpilot.selfdrive.car.toyota.values import CAR Ecu = car.CarParams.Ecu FW_VERSIONS = { - CAR.AVALON: { + CAR.TOYOTA_AVALON: { (Ecu.abs, 0x7b0, None): [ b'F152607060\x00\x00\x00\x00\x00\x00', ], @@ -30,7 +30,7 @@ FW_VERSIONS = { b'8646F0703000\x00\x00\x00\x00', ], }, - CAR.AVALON_2019: { + CAR.TOYOTA_AVALON_2019: { (Ecu.abs, 0x7b0, None): [ b'F152607110\x00\x00\x00\x00\x00\x00', b'F152607140\x00\x00\x00\x00\x00\x00', @@ -71,7 +71,7 @@ FW_VERSIONS = { b'8646F0702100\x00\x00\x00\x00', ], }, - CAR.AVALON_TSS2: { + CAR.TOYOTA_AVALON_TSS2: { (Ecu.abs, 0x7b0, None): [ b'\x01F152607240\x00\x00\x00\x00\x00\x00', b'\x01F152607250\x00\x00\x00\x00\x00\x00', @@ -95,7 +95,7 @@ FW_VERSIONS = { b'\x028646F4104100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', ], }, - CAR.CAMRY: { + CAR.TOYOTA_CAMRY: { (Ecu.engine, 0x700, None): [ b'\x018966306L3100\x00\x00\x00\x00', b'\x018966306L4200\x00\x00\x00\x00', @@ -222,7 +222,7 @@ FW_VERSIONS = { b'8646F0607100 ', ], }, - CAR.CAMRY_TSS2: { + CAR.TOYOTA_CAMRY_TSS2: { (Ecu.eps, 0x7a1, None): [ b'8965B33630\x00\x00\x00\x00\x00\x00', b'8965B33640\x00\x00\x00\x00\x00\x00', @@ -268,7 +268,7 @@ FW_VERSIONS = { b'\x028646F3305500\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', ], }, - CAR.CHR: { + CAR.TOYOTA_CHR: { (Ecu.engine, 0x700, None): [ b'\x01896631017100\x00\x00\x00\x00', b'\x01896631017200\x00\x00\x00\x00', @@ -353,7 +353,7 @@ FW_VERSIONS = { b'8646FF407100 ', ], }, - CAR.CHR_TSS2: { + CAR.TOYOTA_CHR_TSS2: { (Ecu.abs, 0x7b0, None): [ b'F152610041\x00\x00\x00\x00\x00\x00', b'F152610260\x00\x00\x00\x00\x00\x00', @@ -385,7 +385,7 @@ FW_VERSIONS = { b'\x028646FF413100\x00\x00\x00\x008646GF411100\x00\x00\x00\x00', ], }, - CAR.COROLLA: { + CAR.TOYOTA_COROLLA: { (Ecu.engine, 0x7e0, None): [ b'\x0230ZC2000\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x0230ZC2100\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', @@ -419,7 +419,7 @@ FW_VERSIONS = { b'8646F0201200\x00\x00\x00\x00', ], }, - CAR.COROLLA_TSS2: { + CAR.TOYOTA_COROLLA_TSS2: { (Ecu.engine, 0x700, None): [ b'\x01896630A22000\x00\x00\x00\x00', b'\x01896630ZG2000\x00\x00\x00\x00', @@ -594,7 +594,7 @@ FW_VERSIONS = { b'\x028646F7605100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', ], }, - CAR.HIGHLANDER: { + CAR.TOYOTA_HIGHLANDER: { (Ecu.engine, 0x700, None): [ b'\x01896630E09000\x00\x00\x00\x00', b'\x01896630E43000\x00\x00\x00\x00', @@ -650,7 +650,7 @@ FW_VERSIONS = { b'8646F0E01300\x00\x00\x00\x00', ], }, - CAR.HIGHLANDER_TSS2: { + CAR.TOYOTA_HIGHLANDER_TSS2: { (Ecu.eps, 0x7a1, None): [ b'8965B48241\x00\x00\x00\x00\x00\x00', b'8965B48310\x00\x00\x00\x00\x00\x00', @@ -796,7 +796,7 @@ FW_VERSIONS = { b'\x028646F5303400\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', ], }, - CAR.PRIUS: { + CAR.TOYOTA_PRIUS: { (Ecu.engine, 0x700, None): [ b'\x02896634761000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634761100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', @@ -894,7 +894,7 @@ FW_VERSIONS = { b'8646F4705200\x00\x00\x00\x00', ], }, - CAR.PRIUS_V: { + CAR.TOYOTA_PRIUS_V: { (Ecu.abs, 0x7b0, None): [ b'F152647280\x00\x00\x00\x00\x00\x00', ], @@ -911,7 +911,7 @@ FW_VERSIONS = { b'8646F4703300\x00\x00\x00\x00', ], }, - CAR.RAV4: { + CAR.TOYOTA_RAV4: { (Ecu.engine, 0x7e0, None): [ b'\x02342Q1000\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02342Q1100\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00', @@ -952,7 +952,7 @@ FW_VERSIONS = { b'8646F4204000\x00\x00\x00\x00', ], }, - CAR.RAV4H: { + CAR.TOYOTA_RAV4H: { (Ecu.engine, 0x7e0, None): [ b'\x02342N9000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02342N9100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', @@ -989,7 +989,7 @@ FW_VERSIONS = { b'8646F4204000\x00\x00\x00\x00', ], }, - CAR.RAV4_TSS2: { + CAR.TOYOTA_RAV4_TSS2: { (Ecu.engine, 0x700, None): [ b'\x01896630R58000\x00\x00\x00\x00', b'\x01896630R58100\x00\x00\x00\x00', @@ -1099,7 +1099,7 @@ FW_VERSIONS = { b'\x028646F4203800\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', ], }, - CAR.RAV4_TSS2_2022: { + CAR.TOYOTA_RAV4_TSS2_2022: { (Ecu.abs, 0x7b0, None): [ b'\x01F15260R350\x00\x00\x00\x00\x00\x00', b'\x01F15260R361\x00\x00\x00\x00\x00\x00', @@ -1135,7 +1135,7 @@ FW_VERSIONS = { b'\x028646F0R02100\x00\x00\x00\x008646G0R01100\x00\x00\x00\x00', ], }, - CAR.RAV4_TSS2_2023: { + CAR.TOYOTA_RAV4_TSS2_2023: { (Ecu.abs, 0x7b0, None): [ b'\x01F15260R450\x00\x00\x00\x00\x00\x00', b'\x01F15260R51000\x00\x00\x00\x00', @@ -1167,7 +1167,7 @@ FW_VERSIONS = { b'\x028646F0R11000\x00\x00\x00\x008646G0R04000\x00\x00\x00\x00', ], }, - CAR.SIENNA: { + CAR.TOYOTA_SIENNA: { (Ecu.engine, 0x700, None): [ b'\x01896630832100\x00\x00\x00\x00', b'\x01896630832200\x00\x00\x00\x00', @@ -1591,7 +1591,7 @@ FW_VERSIONS = { b'\x028646F4810400\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', ], }, - CAR.PRIUS_TSS2: { + CAR.TOYOTA_PRIUS_TSS2: { (Ecu.engine, 0x700, None): [ b'\x028966347B1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x028966347C4000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', @@ -1622,7 +1622,7 @@ FW_VERSIONS = { b'\x028646F4712000\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', ], }, - CAR.MIRAI: { + CAR.TOYOTA_MIRAI: { (Ecu.abs, 0x7d1, None): [ b'\x01898A36203000\x00\x00\x00\x00', ], @@ -1640,7 +1640,7 @@ FW_VERSIONS = { b'\x028646F6201400\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', ], }, - CAR.ALPHARD_TSS2: { + CAR.TOYOTA_ALPHARD_TSS2: { (Ecu.engine, 0x7e0, None): [ b'\x0235870000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x0235879000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 424a885d53..4b4b0a6cc7 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -57,7 +57,7 @@ class CarInterface(CarInterfaceBase): ret.enableDsu = len(found_ecus) > 0 and Ecu.dsu not in found_ecus and candidate not in (NO_DSU_CAR | UNSUPPORTED_DSU_CAR) \ and not (ret.flags & ToyotaFlags.SMART_DSU) - if candidate == CAR.PRIUS: + if candidate == CAR.TOYOTA_PRIUS: stop_and_go = True # Only give steer angle deadzone to for bad angle sensor prius for fw in car_fw: @@ -69,12 +69,12 @@ class CarInterface(CarInterfaceBase): stop_and_go = True ret.wheelSpeedFactor = 1.035 - elif candidate in (CAR.AVALON, CAR.AVALON_2019, CAR.AVALON_TSS2): + elif candidate in (CAR.TOYOTA_AVALON, CAR.TOYOTA_AVALON_2019, CAR.TOYOTA_AVALON_TSS2): # starting from 2019, all Avalon variants have stop and go # https://engage.toyota.com/static/images/toyota_safety_sense/TSS_Applicability_Chart.pdf - stop_and_go = candidate != CAR.AVALON + stop_and_go = candidate != CAR.TOYOTA_AVALON - elif candidate in (CAR.RAV4_TSS2, CAR.RAV4_TSS2_2022, CAR.RAV4_TSS2_2023): + elif candidate in (CAR.TOYOTA_RAV4_TSS2, CAR.TOYOTA_RAV4_TSS2_2022, CAR.TOYOTA_RAV4_TSS2_2023): ret.lateralTuning.init('pid') ret.lateralTuning.pid.kiBP = [0.0] ret.lateralTuning.pid.kpBP = [0.0] @@ -91,7 +91,7 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kf = 0.00004 break - elif candidate in (CAR.RAV4H, CAR.CHR, CAR.CAMRY, CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_NX): + elif candidate in (CAR.TOYOTA_RAV4H, CAR.TOYOTA_CHR, CAR.TOYOTA_CAMRY, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_NX): # TODO: Some of these platforms are not advertised to have full range ACC, are they similar to SNG_WITHOUT_DSU cars? stop_and_go = True diff --git a/selfdrive/car/toyota/tests/test_toyota.py b/selfdrive/car/toyota/tests/test_toyota.py index 6a2476dff9..ba131a0185 100755 --- a/selfdrive/car/toyota/tests/test_toyota.py +++ b/selfdrive/car/toyota/tests/test_toyota.py @@ -24,7 +24,7 @@ class TestToyotaInterfaces(unittest.TestCase): def test_lta_platforms(self): # At this time, only RAV4 2023 is expected to use LTA/angle control - self.assertEqual(ANGLE_CONTROL_CAR, {CAR.RAV4_TSS2_2023}) + self.assertEqual(ANGLE_CONTROL_CAR, {CAR.TOYOTA_RAV4_TSS2_2023}) def test_tss2_dbc(self): # We make some assumptions about TSS2 platforms, @@ -43,13 +43,13 @@ class TestToyotaInterfaces(unittest.TestCase): self.assertEqual(len(missing_ecus), 0) # Some exceptions for other common ECUs - if car_model not in (CAR.ALPHARD_TSS2,): + if car_model not in (CAR.TOYOTA_ALPHARD_TSS2,): self.assertIn(Ecu.abs, present_ecus) - if car_model not in (CAR.MIRAI,): + if car_model not in (CAR.TOYOTA_MIRAI,): self.assertIn(Ecu.engine, present_ecus) - if car_model not in (CAR.PRIUS_V, CAR.LEXUS_CTH): + if car_model not in (CAR.TOYOTA_PRIUS_V, CAR.LEXUS_CTH): self.assertIn(Ecu.eps, present_ecus) @@ -85,9 +85,9 @@ class TestToyotaFingerprint(unittest.TestCase): for car_model, ecus in FW_VERSIONS.items(): with self.subTest(car_model=car_model.value): for platform_code_ecu in PLATFORM_CODE_ECUS: - if platform_code_ecu == Ecu.eps and car_model in (CAR.PRIUS_V, CAR.LEXUS_CTH,): + if platform_code_ecu == Ecu.eps and car_model in (CAR.TOYOTA_PRIUS_V, CAR.LEXUS_CTH,): continue - if platform_code_ecu == Ecu.abs and car_model in (CAR.ALPHARD_TSS2,): + if platform_code_ecu == Ecu.abs and car_model in (CAR.TOYOTA_ALPHARD_TSS2,): continue self.assertIn(platform_code_ecu, [e[0] for e in ecus]) diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index d8c28d8a8a..c20736d5bc 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -85,14 +85,14 @@ class ToyotaTSS2PlatformConfig(PlatformConfig): class CAR(Platforms): # Toyota - ALPHARD_TSS2 = ToyotaTSS2PlatformConfig( + TOYOTA_ALPHARD_TSS2 = ToyotaTSS2PlatformConfig( [ ToyotaCarDocs("Toyota Alphard 2019-20"), ToyotaCarDocs("Toyota Alphard Hybrid 2021"), ], CarSpecs(mass=4305. * CV.LB_TO_KG, wheelbase=3.0, steerRatio=14.2, tireStiffnessFactor=0.444), ) - AVALON = PlatformConfig( + TOYOTA_AVALON = PlatformConfig( [ ToyotaCarDocs("Toyota Avalon 2016", "Toyota Safety Sense P"), ToyotaCarDocs("Toyota Avalon 2017-18"), @@ -100,22 +100,22 @@ class CAR(Platforms): CarSpecs(mass=3505. * CV.LB_TO_KG, wheelbase=2.82, steerRatio=14.8, tireStiffnessFactor=0.7983), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), ) - AVALON_2019 = PlatformConfig( + TOYOTA_AVALON_2019 = PlatformConfig( [ ToyotaCarDocs("Toyota Avalon 2019-21"), ToyotaCarDocs("Toyota Avalon Hybrid 2019-21"), ], - AVALON.specs, + TOYOTA_AVALON.specs, dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), ) - AVALON_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5 + TOYOTA_AVALON_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5 [ ToyotaCarDocs("Toyota Avalon 2022"), ToyotaCarDocs("Toyota Avalon Hybrid 2022"), ], - AVALON.specs, + TOYOTA_AVALON.specs, ) - CAMRY = PlatformConfig( + TOYOTA_CAMRY = PlatformConfig( [ ToyotaCarDocs("Toyota Camry 2018-20", video_link="https://www.youtube.com/watch?v=fkcjviZY9CM", footnotes=[Footnote.CAMRY]), ToyotaCarDocs("Toyota Camry Hybrid 2018-20", video_link="https://www.youtube.com/watch?v=Q2DYY0AWKgk"), @@ -124,14 +124,14 @@ class CAR(Platforms): dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_DSU, ) - CAMRY_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5 + TOYOTA_CAMRY_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5 [ ToyotaCarDocs("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]), ToyotaCarDocs("Toyota Camry Hybrid 2021-24"), ], - CAMRY.specs, + TOYOTA_CAMRY.specs, ) - CHR = PlatformConfig( + TOYOTA_CHR = PlatformConfig( [ ToyotaCarDocs("Toyota C-HR 2017-20"), ToyotaCarDocs("Toyota C-HR Hybrid 2017-20"), @@ -140,21 +140,21 @@ class CAR(Platforms): dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_DSU, ) - CHR_TSS2 = ToyotaTSS2PlatformConfig( + TOYOTA_CHR_TSS2 = ToyotaTSS2PlatformConfig( [ ToyotaCarDocs("Toyota C-HR 2021"), ToyotaCarDocs("Toyota C-HR Hybrid 2021-22"), ], - CHR.specs, + TOYOTA_CHR.specs, flags=ToyotaFlags.RADAR_ACC, ) - COROLLA = PlatformConfig( + TOYOTA_COROLLA = PlatformConfig( [ToyotaCarDocs("Toyota Corolla 2017-19")], CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) # LSS2 Lexus UX Hybrid is same as a TSS2 Corolla Hybrid - COROLLA_TSS2 = ToyotaTSS2PlatformConfig( + TOYOTA_COROLLA_TSS2 = ToyotaTSS2PlatformConfig( [ ToyotaCarDocs("Toyota Corolla 2020-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), ToyotaCarDocs("Toyota Corolla Cross (Non-US only) 2020-23", min_enable_speed=7.5), @@ -167,7 +167,7 @@ class CAR(Platforms): ], CarSpecs(mass=3060. * CV.LB_TO_KG, wheelbase=2.67, steerRatio=13.9, tireStiffnessFactor=0.444), ) - HIGHLANDER = PlatformConfig( + TOYOTA_HIGHLANDER = PlatformConfig( [ ToyotaCarDocs("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo"), ToyotaCarDocs("Toyota Highlander Hybrid 2017-19"), @@ -176,14 +176,14 @@ class CAR(Platforms): dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, ) - HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig( + TOYOTA_HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig( [ ToyotaCarDocs("Toyota Highlander 2020-23"), ToyotaCarDocs("Toyota Highlander Hybrid 2020-23"), ], - HIGHLANDER.specs, + TOYOTA_HIGHLANDER.specs, ) - PRIUS = PlatformConfig( + TOYOTA_PRIUS = PlatformConfig( [ ToyotaCarDocs("Toyota Prius 2016", "Toyota Safety Sense P", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), ToyotaCarDocs("Toyota Prius 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), @@ -192,20 +192,20 @@ class CAR(Platforms): CarSpecs(mass=3045. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.74, tireStiffnessFactor=0.6371), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), ) - PRIUS_V = PlatformConfig( + TOYOTA_PRIUS_V = PlatformConfig( [ToyotaCarDocs("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED)], CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, ) - PRIUS_TSS2 = ToyotaTSS2PlatformConfig( + TOYOTA_PRIUS_TSS2 = ToyotaTSS2PlatformConfig( [ ToyotaCarDocs("Toyota Prius 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), ToyotaCarDocs("Toyota Prius Prime 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), ], CarSpecs(mass=3115. * CV.LB_TO_KG, wheelbase=2.70002, steerRatio=13.4, tireStiffnessFactor=0.6371), ) - RAV4 = PlatformConfig( + TOYOTA_RAV4 = PlatformConfig( [ ToyotaCarDocs("Toyota RAV4 2016", "Toyota Safety Sense P"), ToyotaCarDocs("Toyota RAV4 2017-18") @@ -213,43 +213,43 @@ class CAR(Platforms): CarSpecs(mass=3650. * CV.LB_TO_KG, wheelbase=2.65, steerRatio=16.88, tireStiffnessFactor=0.5533), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), ) - RAV4H = PlatformConfig( + TOYOTA_RAV4H = PlatformConfig( [ ToyotaCarDocs("Toyota RAV4 Hybrid 2016", "Toyota Safety Sense P", video_link="https://youtu.be/LhT5VzJVfNI?t=26"), ToyotaCarDocs("Toyota RAV4 Hybrid 2017-18", video_link="https://youtu.be/LhT5VzJVfNI?t=26") ], - RAV4.specs, + TOYOTA_RAV4.specs, dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_STOP_TIMER, ) - RAV4_TSS2 = ToyotaTSS2PlatformConfig( + TOYOTA_RAV4_TSS2 = ToyotaTSS2PlatformConfig( [ ToyotaCarDocs("Toyota RAV4 2019-21", video_link="https://www.youtube.com/watch?v=wJxjDd42gGA"), ToyotaCarDocs("Toyota RAV4 Hybrid 2019-21"), ], CarSpecs(mass=3585. * CV.LB_TO_KG, wheelbase=2.68986, steerRatio=14.3, tireStiffnessFactor=0.7933), ) - RAV4_TSS2_2022 = ToyotaTSS2PlatformConfig( + TOYOTA_RAV4_TSS2_2022 = ToyotaTSS2PlatformConfig( [ ToyotaCarDocs("Toyota RAV4 2022"), ToyotaCarDocs("Toyota RAV4 Hybrid 2022", video_link="https://youtu.be/U0nH9cnrFB0"), ], - RAV4_TSS2.specs, + TOYOTA_RAV4_TSS2.specs, flags=ToyotaFlags.RADAR_ACC, ) - RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig( + TOYOTA_RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig( [ ToyotaCarDocs("Toyota RAV4 2023-24"), ToyotaCarDocs("Toyota RAV4 Hybrid 2023-24"), ], - RAV4_TSS2.specs, + TOYOTA_RAV4_TSS2.specs, flags=ToyotaFlags.RADAR_ACC | ToyotaFlags.ANGLE_CONTROL, ) - MIRAI = ToyotaTSS2PlatformConfig( # TSS 2.5 + TOYOTA_MIRAI = ToyotaTSS2PlatformConfig( # TSS 2.5 [ToyotaCarDocs("Toyota Mirai 2021")], CarSpecs(mass=4300. * CV.LB_TO_KG, wheelbase=2.91, steerRatio=14.8, tireStiffnessFactor=0.8), ) - SIENNA = PlatformConfig( + TOYOTA_SIENNA = PlatformConfig( [ToyotaCarDocs("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED)], CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), @@ -340,32 +340,33 @@ class CAR(Platforms): # (addr, cars, bus, 1/freq*100, vl) STATIC_DSU_MSGS = [ - (0x128, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.RAV4, CAR.COROLLA, CAR.AVALON), 1, 3, b'\xf4\x01\x90\x83\x00\x37'), - (0x128, (CAR.HIGHLANDER, CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES), 1, 3, b'\x03\x00\x20\x00\x00\x52'), - (0x141, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.RAV4, CAR.COROLLA, CAR.HIGHLANDER, CAR.AVALON, - CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.PRIUS_V), 1, 2, b'\x00\x00\x00\x46'), - (0x160, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.RAV4, CAR.COROLLA, CAR.HIGHLANDER, CAR.AVALON, - CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.PRIUS_V), 1, 7, b'\x00\x00\x08\x12\x01\x31\x9c\x51'), - (0x161, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.RAV4, CAR.COROLLA, CAR.AVALON, CAR.PRIUS_V), + (0x128, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_AVALON), \ + 1, 3, b'\xf4\x01\x90\x83\x00\x37'), + (0x128, (CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES), 1, 3, b'\x03\x00\x20\x00\x00\x52'), + (0x141, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_AVALON, + CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.TOYOTA_PRIUS_V), 1, 2, b'\x00\x00\x00\x46'), + (0x160, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_AVALON, + CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.TOYOTA_PRIUS_V), 1, 7, b'\x00\x00\x08\x12\x01\x31\x9c\x51'), + (0x161, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_AVALON, CAR.TOYOTA_PRIUS_V), 1, 7, b'\x00\x1e\x00\x00\x00\x80\x07'), - (0X161, (CAR.HIGHLANDER, CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES), 1, 7, b'\x00\x1e\x00\xd4\x00\x00\x5b'), - (0x283, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.RAV4, CAR.COROLLA, CAR.HIGHLANDER, CAR.AVALON, - CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.PRIUS_V), 0, 3, b'\x00\x00\x00\x00\x00\x00\x8c'), - (0x2E6, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX), 0, 3, b'\xff\xf8\x00\x08\x7f\xe0\x00\x4e'), - (0x2E7, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX), 0, 3, b'\xa8\x9c\x31\x9c\x00\x00\x00\x02'), - (0x33E, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX), 0, 20, b'\x0f\xff\x26\x40\x00\x1f\x00'), - (0x344, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.RAV4, CAR.COROLLA, CAR.HIGHLANDER, CAR.AVALON, - CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.PRIUS_V), 0, 5, b'\x00\x00\x01\x00\x00\x00\x00\x50'), - (0x365, (CAR.PRIUS, CAR.LEXUS_NX, CAR.HIGHLANDER), 0, 20, b'\x00\x00\x00\x80\x03\x00\x08'), - (0x365, (CAR.RAV4, CAR.RAV4H, CAR.COROLLA, CAR.AVALON, CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.LEXUS_RX, - CAR.PRIUS_V), 0, 20, b'\x00\x00\x00\x80\xfc\x00\x08'), - (0x366, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.HIGHLANDER), 0, 20, b'\x00\x00\x4d\x82\x40\x02\x00'), - (0x366, (CAR.RAV4, CAR.COROLLA, CAR.AVALON, CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.PRIUS_V), + (0X161, (CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES), 1, 7, b'\x00\x1e\x00\xd4\x00\x00\x5b'), + (0x283, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_AVALON, + CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.TOYOTA_PRIUS_V), 0, 3, b'\x00\x00\x00\x00\x00\x00\x8c'), + (0x2E6, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX), 0, 3, b'\xff\xf8\x00\x08\x7f\xe0\x00\x4e'), + (0x2E7, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX), 0, 3, b'\xa8\x9c\x31\x9c\x00\x00\x00\x02'), + (0x33E, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX), 0, 20, b'\x0f\xff\x26\x40\x00\x1f\x00'), + (0x344, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_AVALON, + CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.TOYOTA_PRIUS_V), 0, 5, b'\x00\x00\x01\x00\x00\x00\x00\x50'), + (0x365, (CAR.TOYOTA_PRIUS, CAR.LEXUS_NX, CAR.TOYOTA_HIGHLANDER), 0, 20, b'\x00\x00\x00\x80\x03\x00\x08'), + (0x365, (CAR.TOYOTA_RAV4, CAR.TOYOTA_RAV4H, CAR.TOYOTA_COROLLA, CAR.TOYOTA_AVALON, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.LEXUS_RX, + CAR.TOYOTA_PRIUS_V), 0, 20, b'\x00\x00\x00\x80\xfc\x00\x08'), + (0x366, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.TOYOTA_HIGHLANDER), 0, 20, b'\x00\x00\x4d\x82\x40\x02\x00'), + (0x366, (CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_AVALON, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.TOYOTA_PRIUS_V), 0, 20, b'\x00\x72\x07\xff\x09\xfe\x00'), - (0x470, (CAR.PRIUS, CAR.LEXUS_RX), 1, 100, b'\x00\x00\x02\x7a'), - (0x470, (CAR.HIGHLANDER, CAR.RAV4H, CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.PRIUS_V), 1, 100, b'\x00\x00\x01\x79'), - (0x4CB, (CAR.PRIUS, CAR.RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.RAV4, CAR.COROLLA, CAR.HIGHLANDER, CAR.AVALON, - CAR.SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.PRIUS_V), 0, 100, b'\x0c\x00\x00\x00\x00\x00\x00\x00'), + (0x470, (CAR.TOYOTA_PRIUS, CAR.LEXUS_RX), 1, 100, b'\x00\x00\x02\x7a'), + (0x470, (CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_RAV4H, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.TOYOTA_PRIUS_V), 1, 100, b'\x00\x00\x01\x79'), + (0x4CB, (CAR.TOYOTA_PRIUS, CAR.TOYOTA_RAV4H, CAR.LEXUS_RX, CAR.LEXUS_NX, CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_AVALON, + CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_ES, CAR.TOYOTA_PRIUS_V), 0, 100, b'\x0c\x00\x00\x00\x00\x00\x00\x00'), ] @@ -513,9 +514,9 @@ FW_QUERY_CONFIG = FwQueryConfig( ], non_essential_ecus={ # FIXME: On some models, abs can sometimes be missing - Ecu.abs: [CAR.RAV4, CAR.COROLLA, CAR.HIGHLANDER, CAR.SIENNA, CAR.LEXUS_IS, CAR.ALPHARD_TSS2], + Ecu.abs: [CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_SIENNA, CAR.LEXUS_IS, CAR.TOYOTA_ALPHARD_TSS2], # On some models, the engine can show on two different addresses - Ecu.engine: [CAR.HIGHLANDER, CAR.CAMRY, CAR.COROLLA_TSS2, CAR.CHR, CAR.CHR_TSS2, CAR.LEXUS_IS, + Ecu.engine: [CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_CAMRY, CAR.TOYOTA_COROLLA_TSS2, CAR.TOYOTA_CHR, CAR.TOYOTA_CHR_TSS2, CAR.LEXUS_IS, CAR.LEXUS_IS_TSS2, CAR.LEXUS_RC, CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2, CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2], }, extra_ecus=[ @@ -557,7 +558,8 @@ FW_QUERY_CONFIG = FwQueryConfig( STEER_THRESHOLD = 100 # These cars have non-standard EPS torque scale factors. All others are 73 -EPS_SCALE = defaultdict(lambda: 73, {CAR.PRIUS: 66, CAR.COROLLA: 88, CAR.LEXUS_IS: 77, CAR.LEXUS_RC: 77, CAR.LEXUS_CTH: 100, CAR.PRIUS_V: 100}) +EPS_SCALE = defaultdict(lambda: 73, + {CAR.TOYOTA_PRIUS: 66, CAR.TOYOTA_COROLLA: 88, CAR.LEXUS_IS: 77, CAR.LEXUS_RC: 77, CAR.LEXUS_CTH: 100, CAR.TOYOTA_PRIUS_V: 100}) # Toyota/Lexus Safety Sense 2.0 and 2.5 TSS2_CAR = CAR.with_flags(ToyotaFlags.TSS2) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index e39e65b52c..71aee67815 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -7,7 +7,7 @@ Ecu = car.CarParams.Ecu FW_VERSIONS = { - CAR.ARTEON_MK1: { + CAR.VOLKSWAGEN_ARTEON_MK1: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x873G0906259AH\xf1\x890001', b'\xf1\x873G0906259F \xf1\x890004', @@ -49,7 +49,7 @@ FW_VERSIONS = { b'\xf1\x875Q0907572R \xf1\x890771', ], }, - CAR.ATLAS_MK1: { + CAR.VOLKSWAGEN_ATLAS_MK1: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8703H906026AA\xf1\x899970', b'\xf1\x8703H906026AG\xf1\x899973', @@ -101,7 +101,7 @@ FW_VERSIONS = { b'\xf1\x875Q0907572P \xf1\x890682', ], }, - CAR.CADDY_MK3: { + CAR.VOLKSWAGEN_CADDY_MK3: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704E906027T \xf1\x892363', ], @@ -112,7 +112,7 @@ FW_VERSIONS = { b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0155', ], }, - CAR.CRAFTER_MK2: { + CAR.VOLKSWAGEN_CRAFTER_MK2: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704L906056BP\xf1\x894729', b'\xf1\x8704L906056EK\xf1\x896391', @@ -134,7 +134,7 @@ FW_VERSIONS = { b'\xf1\x872Q0907572M \xf1\x890233', ], }, - CAR.GOLF_MK7: { + CAR.VOLKSWAGEN_GOLF_MK7: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704E906016A \xf1\x897697', b'\xf1\x8704E906016AD\xf1\x895758', @@ -325,7 +325,7 @@ FW_VERSIONS = { b'\xf1\x875Q0907572S \xf1\x890780', ], }, - CAR.JETTA_MK7: { + CAR.VOLKSWAGEN_JETTA_MK7: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704E906024AK\xf1\x899937', b'\xf1\x8704E906024AS\xf1\x899912', @@ -377,7 +377,7 @@ FW_VERSIONS = { b'\xf1\x875Q0907572R \xf1\x890771', ], }, - CAR.PASSAT_MK8: { + CAR.VOLKSWAGEN_PASSAT_MK8: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8703N906026E \xf1\x892114', b'\xf1\x8704E906023AH\xf1\x893379', @@ -450,7 +450,7 @@ FW_VERSIONS = { b'\xf1\x875Q0907572R \xf1\x890771', ], }, - CAR.PASSAT_NMS: { + CAR.VOLKSWAGEN_PASSAT_NMS: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8706K906016C \xf1\x899609', b'\xf1\x8706K906016E \xf1\x899830', @@ -472,7 +472,7 @@ FW_VERSIONS = { b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0152', ], }, - CAR.POLO_MK6: { + CAR.VOLKSWAGEN_POLO_MK6: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704C906025H \xf1\x895177', b'\xf1\x8705C906032J \xf1\x891702', @@ -496,7 +496,7 @@ FW_VERSIONS = { b'\xf1\x872Q0907572R \xf1\x890372', ], }, - CAR.SHARAN_MK2: { + CAR.VOLKSWAGEN_SHARAN_MK2: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704L906016HE\xf1\x894635', ], @@ -507,7 +507,7 @@ FW_VERSIONS = { b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0153', ], }, - CAR.TAOS_MK1: { + CAR.VOLKSWAGEN_TAOS_MK1: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704E906025CK\xf1\x892228', b'\xf1\x8704E906027NJ\xf1\x891445', @@ -537,7 +537,7 @@ FW_VERSIONS = { b'\xf1\x872Q0907572T \xf1\x890383', ], }, - CAR.TCROSS_MK1: { + CAR.VOLKSWAGEN_TCROSS_MK1: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704C906025AK\xf1\x897053', ], @@ -554,7 +554,7 @@ FW_VERSIONS = { b'\xf1\x872Q0907572T \xf1\x890383', ], }, - CAR.TIGUAN_MK2: { + CAR.VOLKSWAGEN_TIGUAN_MK2: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8703N906026D \xf1\x893680', b'\xf1\x8704E906024AP\xf1\x891461', @@ -641,7 +641,7 @@ FW_VERSIONS = { b'\xf1\x872Q0907572T \xf1\x890383', ], }, - CAR.TOURAN_MK2: { + CAR.VOLKSWAGEN_TOURAN_MK2: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704E906025BE\xf1\x890720', b'\xf1\x8704E906027HQ\xf1\x893746', @@ -671,7 +671,7 @@ FW_VERSIONS = { b'\xf1\x875Q0907572R \xf1\x890771', ], }, - CAR.TRANSPORTER_T61: { + CAR.VOLKSWAGEN_TRANSPORTER_T61: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704L906056AG\xf1\x899970', b'\xf1\x8704L906056AL\xf1\x899970', @@ -703,7 +703,7 @@ FW_VERSIONS = { b'\xf1\x872Q0907572R \xf1\x890372', ], }, - CAR.TROC_MK1: { + CAR.VOLKSWAGEN_TROC_MK1: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8705E906018AT\xf1\x899640', b'\xf1\x8705E906018CK\xf1\x890863', diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index c8116de579..ab4008d643 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -167,7 +167,7 @@ class VWCarDocs(CarDocs): if "SKODA" in CP.carFingerprint: self.footnotes.append(Footnote.SKODA_HEATED_WINDSHIELD) - if CP.carFingerprint in (CAR.CRAFTER_MK2, CAR.TRANSPORTER_T61): + if CP.carFingerprint in (CAR.VOLKSWAGEN_CRAFTER_MK2, CAR.VOLKSWAGEN_TRANSPORTER_T61): self.car_parts = CarParts([Device.threex_angled_mount, CarHarness.j533]) @@ -177,7 +177,7 @@ class VWCarDocs(CarDocs): # Exception: SEAT Leon and SEAT Ateca share a chassis code class CAR(Platforms): - ARTEON_MK1 = VolkswagenMQBPlatformConfig( # Chassis AN + VOLKSWAGEN_ARTEON_MK1 = VolkswagenMQBPlatformConfig( # Chassis AN [ VWCarDocs("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"), VWCarDocs("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), @@ -186,7 +186,7 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1733, wheelbase=2.84), ) - ATLAS_MK1 = VolkswagenMQBPlatformConfig( # Chassis CA + VOLKSWAGEN_ATLAS_MK1 = VolkswagenMQBPlatformConfig( # Chassis CA [ VWCarDocs("Volkswagen Atlas 2018-23"), VWCarDocs("Volkswagen Atlas Cross Sport 2020-22"), @@ -196,14 +196,14 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=2011, wheelbase=2.98), ) - CADDY_MK3 = VolkswagenPQPlatformConfig( # Chassis 2K + VOLKSWAGEN_CADDY_MK3 = VolkswagenPQPlatformConfig( # Chassis 2K [ VWCarDocs("Volkswagen Caddy 2019"), VWCarDocs("Volkswagen Caddy Maxi 2019"), ], VolkswagenCarSpecs(mass=1613, wheelbase=2.6, minSteerSpeed=21 * CV.KPH_TO_MS), ) - CRAFTER_MK2 = VolkswagenMQBPlatformConfig( # Chassis SY/SZ + VOLKSWAGEN_CRAFTER_MK2 = VolkswagenMQBPlatformConfig( # Chassis SY/SZ [ VWCarDocs("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"), VWCarDocs("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"), @@ -213,7 +213,7 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS), ) - GOLF_MK7 = VolkswagenMQBPlatformConfig( # Chassis 5G/AU/BA/BE + VOLKSWAGEN_GOLF_MK7 = VolkswagenMQBPlatformConfig( # Chassis 5G/AU/BA/BE [ VWCarDocs("Volkswagen e-Golf 2014-20"), VWCarDocs("Volkswagen Golf 2015-20", auto_resume=False), @@ -226,14 +226,14 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1397, wheelbase=2.62), ) - JETTA_MK7 = VolkswagenMQBPlatformConfig( # Chassis BU + VOLKSWAGEN_JETTA_MK7 = VolkswagenMQBPlatformConfig( # Chassis BU [ VWCarDocs("Volkswagen Jetta 2018-24"), VWCarDocs("Volkswagen Jetta GLI 2021-24"), ], VolkswagenCarSpecs(mass=1328, wheelbase=2.71), ) - PASSAT_MK8 = VolkswagenMQBPlatformConfig( # Chassis 3G + VOLKSWAGEN_PASSAT_MK8 = VolkswagenMQBPlatformConfig( # Chassis 3G [ VWCarDocs("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), VWCarDocs("Volkswagen Passat Alltrack 2015-22"), @@ -241,51 +241,51 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1551, wheelbase=2.79), ) - PASSAT_NMS = VolkswagenPQPlatformConfig( # Chassis A3 + VOLKSWAGEN_PASSAT_NMS = VolkswagenPQPlatformConfig( # Chassis A3 [VWCarDocs("Volkswagen Passat NMS 2017-22")], VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50*CV.KPH_TO_MS, minEnableSpeed=20*CV.KPH_TO_MS), ) - POLO_MK6 = VolkswagenMQBPlatformConfig( # Chassis AW + VOLKSWAGEN_POLO_MK6 = VolkswagenMQBPlatformConfig( # Chassis AW [ VWCarDocs("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), VWCarDocs("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), ], VolkswagenCarSpecs(mass=1230, wheelbase=2.55), ) - SHARAN_MK2 = VolkswagenPQPlatformConfig( # Chassis 7N + VOLKSWAGEN_SHARAN_MK2 = VolkswagenPQPlatformConfig( # Chassis 7N [ VWCarDocs("Volkswagen Sharan 2018-22"), VWCarDocs("SEAT Alhambra 2018-20"), ], VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50*CV.KPH_TO_MS), ) - TAOS_MK1 = VolkswagenMQBPlatformConfig( # Chassis B2 + VOLKSWAGEN_TAOS_MK1 = VolkswagenMQBPlatformConfig( # Chassis B2 [VWCarDocs("Volkswagen Taos 2022-23")], VolkswagenCarSpecs(mass=1498, wheelbase=2.69), ) - TCROSS_MK1 = VolkswagenMQBPlatformConfig( # Chassis C1 + VOLKSWAGEN_TCROSS_MK1 = VolkswagenMQBPlatformConfig( # Chassis C1 [VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1150, wheelbase=2.60), ) - TIGUAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis AD/BW + VOLKSWAGEN_TIGUAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis AD/BW [ VWCarDocs("Volkswagen Tiguan 2018-24"), VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"), ], VolkswagenCarSpecs(mass=1715, wheelbase=2.74), ) - TOURAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis 1T + VOLKSWAGEN_TOURAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis 1T [VWCarDocs("Volkswagen Touran 2016-23")], VolkswagenCarSpecs(mass=1516, wheelbase=2.79), ) - TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( # Chassis 7H/7L + VOLKSWAGEN_TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( # Chassis 7H/7L [ VWCarDocs("Volkswagen Caravelle 2020"), VWCarDocs("Volkswagen California 2021-23"), ], VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0), ) - TROC_MK1 = VolkswagenMQBPlatformConfig( # Chassis A1 + VOLKSWAGEN_TROC_MK1 = VolkswagenMQBPlatformConfig( # Chassis A1 [VWCarDocs("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1413, wheelbase=2.63), ) diff --git a/selfdrive/controls/lib/tests/test_latcontrol.py b/selfdrive/controls/lib/tests/test_latcontrol.py index 866270ca60..838023af72 100755 --- a/selfdrive/controls/lib/tests/test_latcontrol.py +++ b/selfdrive/controls/lib/tests/test_latcontrol.py @@ -17,7 +17,7 @@ from openpilot.common.mock.generators import generate_liveLocationKalman class TestLatControl(unittest.TestCase): - @parameterized.expand([(HONDA.CIVIC, LatControlPID), (TOYOTA.RAV4, LatControlTorque), (NISSAN.LEAF, LatControlAngle)]) + @parameterized.expand([(HONDA.HONDA_CIVIC, LatControlPID), (TOYOTA.TOYOTA_RAV4, LatControlTorque), (NISSAN.NISSAN_LEAF, LatControlAngle)]) def test_saturation(self, car_name, controller): CarInterface, CarController, CarState = interfaces[car_name] CP = CarInterface.get_non_essential_params(car_name) diff --git a/selfdrive/controls/lib/tests/test_vehicle_model.py b/selfdrive/controls/lib/tests/test_vehicle_model.py index d016e87527..c3997afdf3 100755 --- a/selfdrive/controls/lib/tests/test_vehicle_model.py +++ b/selfdrive/controls/lib/tests/test_vehicle_model.py @@ -12,7 +12,7 @@ from openpilot.selfdrive.controls.lib.vehicle_model import VehicleModel, dyn_ss_ class TestVehicleModel(unittest.TestCase): def setUp(self): - CP = CarInterface.get_non_essential_params(CAR.CIVIC) + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) self.VM = VehicleModel(CP) def test_round_trip_yaw_rate(self): diff --git a/selfdrive/controls/tests/test_leads.py b/selfdrive/controls/tests/test_leads.py index 268d9c47a7..a06387a087 100755 --- a/selfdrive/controls/tests/test_leads.py +++ b/selfdrive/controls/tests/test_leads.py @@ -25,7 +25,7 @@ class TestLeads(unittest.TestCase): return msgs msgs = [m for _ in range(3) for m in single_iter_pkg()] - out = replay_process_with_name("radard", msgs, fingerprint=TOYOTA.COROLLA_TSS2) + out = replay_process_with_name("radard", msgs, fingerprint=TOYOTA.TOYOTA_COROLLA_TSS2) states = [m for m in out if m.which() == "radarState"] failures = [not state.valid and len(state.radarState.radarErrors) for state in states] diff --git a/selfdrive/controls/tests/test_startup.py b/selfdrive/controls/tests/test_startup.py index 34d14fbb39..23cc96a2e4 100644 --- a/selfdrive/controls/tests/test_startup.py +++ b/selfdrive/controls/tests/test_startup.py @@ -39,12 +39,12 @@ CX5_FW_VERSIONS = [ # TODO: test EventName.startup for release branches # officially supported car - (EventName.startupMaster, TOYOTA.COROLLA, COROLLA_FW_VERSIONS, "toyota"), - (EventName.startupMaster, TOYOTA.COROLLA, COROLLA_FW_VERSIONS, "toyota"), + (EventName.startupMaster, TOYOTA.TOYOTA_COROLLA, COROLLA_FW_VERSIONS, "toyota"), + (EventName.startupMaster, TOYOTA.TOYOTA_COROLLA, COROLLA_FW_VERSIONS, "toyota"), # dashcamOnly car - (EventName.startupNoControl, MAZDA.CX5, CX5_FW_VERSIONS, "mazda"), - (EventName.startupNoControl, MAZDA.CX5, CX5_FW_VERSIONS, "mazda"), + (EventName.startupNoControl, MAZDA.MAZDA_CX5, CX5_FW_VERSIONS, "mazda"), + (EventName.startupNoControl, MAZDA.MAZDA_CX5, CX5_FW_VERSIONS, "mazda"), # unrecognized car with no fw (EventName.startupNoFw, None, None, ""), @@ -55,8 +55,8 @@ CX5_FW_VERSIONS = [ (EventName.startupNoCar, None, COROLLA_FW_VERSIONS[:1], "toyota"), # fuzzy match - (EventName.startupMaster, TOYOTA.COROLLA, COROLLA_FW_VERSIONS_FUZZY, "toyota"), - (EventName.startupMaster, TOYOTA.COROLLA, COROLLA_FW_VERSIONS_FUZZY, "toyota"), + (EventName.startupMaster, TOYOTA.TOYOTA_COROLLA, COROLLA_FW_VERSIONS_FUZZY, "toyota"), + (EventName.startupMaster, TOYOTA.TOYOTA_COROLLA, COROLLA_FW_VERSIONS_FUZZY, "toyota"), ]) def test_startup_alert(expected_event, car_model, fw_versions, brand): controls_sock = messaging.sub_sock("controlsState") diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index 44090cce1a..43eadd38f4 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -14,7 +14,7 @@ from openpilot.system.version import training_version, terms_version def set_params_enabled(): - os.environ['FINGERPRINT'] = "COROLLA_TSS2" + os.environ['FINGERPRINT'] = "TOYOTA_COROLLA_TSS2" os.environ['LOGPRINT'] = "debug" params = Params() diff --git a/selfdrive/test/longitudinal_maneuvers/plant.py b/selfdrive/test/longitudinal_maneuvers/plant.py index 3fb8b6bab0..ac54967f88 100755 --- a/selfdrive/test/longitudinal_maneuvers/plant.py +++ b/selfdrive/test/longitudinal_maneuvers/plant.py @@ -50,7 +50,7 @@ class Plant: from openpilot.selfdrive.car.honda.values import CAR from openpilot.selfdrive.car.honda.interface import CarInterface - self.planner = LongitudinalPlanner(CarInterface.get_non_essential_params(CAR.CIVIC), init_v=self.speed) + self.planner = LongitudinalPlanner(CarInterface.get_non_essential_params(CAR.HONDA_CIVIC), init_v=self.speed) @property def current_time(self): diff --git a/selfdrive/test/process_replay/migration.py b/selfdrive/test/process_replay/migration.py index e88f62c10c..152f281948 100644 --- a/selfdrive/test/process_replay/migration.py +++ b/selfdrive/test/process_replay/migration.py @@ -73,8 +73,8 @@ def migrate_pandaStates(lr): all_msgs = [] # TODO: safety param migration should be handled automatically safety_param_migration = { - "PRIUS": EPS_SCALE["PRIUS"] | Panda.FLAG_TOYOTA_STOCK_LONGITUDINAL, - "RAV4": EPS_SCALE["RAV4"] | Panda.FLAG_TOYOTA_ALT_BRAKE, + "TOYOTA_PRIUS": EPS_SCALE["TOYOTA_PRIUS"] | Panda.FLAG_TOYOTA_STOCK_LONGITUDINAL, + "TOYOTA_RAV4": EPS_SCALE["TOYOTA_RAV4"] | Panda.FLAG_TOYOTA_ALT_BRAKE, "KIA_EV6": Panda.FLAG_HYUNDAI_EV_GAS | Panda.FLAG_HYUNDAI_CANFD_HDA2, } diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index cd0876f2af..7defed3f68 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -9338c27947c1d8c1aa8e74ccc2a646e541f1ca8c \ No newline at end of file +4e5e37be9d70450154f8b100ed88151bb3612331 \ No newline at end of file diff --git a/selfdrive/test/process_replay/test_fuzzy.py b/selfdrive/test/process_replay/test_fuzzy.py index adff06f88a..6c81119fbf 100755 --- a/selfdrive/test/process_replay/test_fuzzy.py +++ b/selfdrive/test/process_replay/test_fuzzy.py @@ -27,7 +27,7 @@ class TestFuzzProcesses(unittest.TestCase): msgs = FuzzyGenerator.get_random_event_msg(data.draw, events=cfg.pubs, real_floats=True) lr = [log.Event.new_message(**m).as_reader() for m in msgs] cfg.timeout = 5 - pr.replay_process(cfg, lr, fingerprint=TOYOTA.COROLLA_TSS2, disable_progress=True) + pr.replay_process(cfg, lr, fingerprint=TOYOTA.TOYOTA_COROLLA_TSS2, disable_progress=True) if __name__ == "__main__": unittest.main() diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index ce1daddf42..5fa80f0e09 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -17,27 +17,27 @@ from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.helpers import save_log source_segments = [ - ("BODY", "937ccb7243511b65|2022-05-24--16-03-09--1"), # COMMA.BODY - ("HYUNDAI", "02c45f73a2e5c6e9|2021-01-01--19-08-22--1"), # HYUNDAI.SONATA - ("HYUNDAI2", "d545129f3ca90f28|2022-11-07--20-43-08--3"), # HYUNDAI.KIA_EV6 (+ QCOM GPS) - ("TOYOTA", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.PRIUS - ("TOYOTA2", "0982d79ebb0de295|2021-01-03--20-03-36--6"), # TOYOTA.RAV4 - ("TOYOTA3", "f7d7e3538cda1a2a|2021-08-16--08-55-34--6"), # TOYOTA.COROLLA_TSS2 - ("HONDA", "eb140f119469d9ab|2021-06-12--10-46-24--27"), # HONDA.CIVIC (NIDEC) - ("HONDA2", "7d2244f34d1bbcda|2021-06-25--12-25-37--26"), # HONDA.ACCORD (BOSCH) - ("CHRYSLER", "4deb27de11bee626|2021-02-20--11-28-55--8"), # CHRYSLER.PACIFICA_2018_HYBRID + ("BODY", "937ccb7243511b65|2022-05-24--16-03-09--1"), # COMMA.COMMA_BODY + ("HYUNDAI", "02c45f73a2e5c6e9|2021-01-01--19-08-22--1"), # HYUNDAI.HYUNDAI_SONATA + ("HYUNDAI2", "d545129f3ca90f28|2022-11-07--20-43-08--3"), # HYUNDAI.HYUNDAI_KIA_EV6 (+ QCOM GPS) + ("TOYOTA", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.TOYOTA_PRIUS + ("TOYOTA2", "0982d79ebb0de295|2021-01-03--20-03-36--6"), # TOYOTA.TOYOTA_RAV4 + ("TOYOTA3", "f7d7e3538cda1a2a|2021-08-16--08-55-34--6"), # TOYOTA.TOYOTA_COROLLA_TSS2 + ("HONDA", "eb140f119469d9ab|2021-06-12--10-46-24--27"), # HONDA.HONDA_CIVIC (NIDEC) + ("HONDA2", "7d2244f34d1bbcda|2021-06-25--12-25-37--26"), # HONDA.HONDA_ACCORD (BOSCH) + ("CHRYSLER", "4deb27de11bee626|2021-02-20--11-28-55--8"), # CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID ("RAM", "17fc16d840fe9d21|2023-04-26--13-28-44--5"), # CHRYSLER.RAM_1500_5TH_GEN - ("SUBARU", "341dccd5359e3c97|2022-09-12--10-35-33--3"), # SUBARU.OUTBACK - ("GM", "0c58b6a25109da2b|2021-02-23--16-35-50--11"), # GM.VOLT - ("GM2", "376bf99325883932|2022-10-27--13-41-22--1"), # GM.BOLT_EUV - ("NISSAN", "35336926920f3571|2021-02-12--18-38-48--46"), # NISSAN.XTRAIL - ("VOLKSWAGEN", "de9592456ad7d144|2021-06-29--11-00-15--6"), # VOLKSWAGEN.GOLF - ("MAZDA", "bd6a637565e91581|2021-10-30--15-14-53--4"), # MAZDA.CX9_2021 - ("FORD", "54827bf84c38b14f|2023-01-26--21-59-07--4"), # FORD.BRONCO_SPORT_MK1 + ("SUBARU", "341dccd5359e3c97|2022-09-12--10-35-33--3"), # SUBARU.SUBARU_OUTBACK + ("GM", "0c58b6a25109da2b|2021-02-23--16-35-50--11"), # GM.CHEVROLET_VOLT + ("GM2", "376bf99325883932|2022-10-27--13-41-22--1"), # GM.CHEVROLET_BOLT_EUV + ("NISSAN", "35336926920f3571|2021-02-12--18-38-48--46"), # NISSAN.NISSAN_XTRAIL + ("VOLKSWAGEN", "de9592456ad7d144|2021-06-29--11-00-15--6"), # VOLKSWAGEN.VOLKSWAGEN_GOLF + ("MAZDA", "bd6a637565e91581|2021-10-30--15-14-53--4"), # MAZDA.MAZDA_CX9_2021 + ("FORD", "54827bf84c38b14f|2023-01-26--21-59-07--4"), # FORD.FORD_BRONCO_SPORT_MK1 # Enable when port is tested and dashcamOnly is no longer set - #("TESLA", "bb50caf5f0945ab1|2021-06-19--17-20-18--3"), # TESLA.AP2_MODELS - #("VOLKSWAGEN2", "3cfdec54aa035f3f|2022-07-19--23-45-10--2"), # VOLKSWAGEN.PASSAT_NMS + #("TESLA", "bb50caf5f0945ab1|2021-06-19--17-20-18--3"), # TESLA.TESLA_AP2_MODELS + #("VOLKSWAGEN2", "3cfdec54aa035f3f|2022-07-19--23-45-10--2"), # VOLKSWAGEN.VOLKSWAGEN_PASSAT_NMS ] segments = [ diff --git a/selfdrive/test/process_replay/test_regen.py b/selfdrive/test/process_replay/test_regen.py index a0343d7d2d..d989635497 100755 --- a/selfdrive/test/process_replay/test_regen.py +++ b/selfdrive/test/process_replay/test_regen.py @@ -11,7 +11,7 @@ from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.framereader import FrameReader TESTED_SEGMENTS = [ - ("PRIUS_C2", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.PRIUS: NEO, pandaStateDEPRECATED, no peripheralState, sensorEventsDEPRECATED + ("PRIUS_C2", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.TOYOTA_PRIUS: NEO, pandaStateDEPRECATED, no peripheralState, sensorEventsDEPRECATED # Enable these once regen on CI becomes faster or use them for different tests running controlsd in isolation # ("MAZDA_C3", "bd6a637565e91581|2021-10-30--15-14-53--4"), # MAZDA.CX9_2021: TICI, incomplete managerState # ("FORD_C3", "54827bf84c38b14f|2023-01-26--21-59-07--4"), # FORD.BRONCO_SPORT_MK1: TICI diff --git a/selfdrive/test/profiling/profiler.py b/selfdrive/test/profiling/profiler.py index 6571825418..2cd547171a 100755 --- a/selfdrive/test/profiling/profiler.py +++ b/selfdrive/test/profiling/profiler.py @@ -16,8 +16,8 @@ from openpilot.selfdrive.car.volkswagen.values import CAR as VW BASE_URL = "https://commadataci.blob.core.windows.net/openpilotci/" CARS = { - 'toyota': ("0982d79ebb0de295|2021-01-03--20-03-36/6", TOYOTA.RAV4), - 'honda': ("0982d79ebb0de295|2021-01-08--10-13-10/6", HONDA.CIVIC), + 'toyota': ("0982d79ebb0de295|2021-01-03--20-03-36/6", TOYOTA.TOYOTA_RAV4), + 'honda': ("0982d79ebb0de295|2021-01-08--10-13-10/6", HONDA.HONDA_CIVIC), "vw": ("ef895f46af5fd73f|2021-05-22--14-06-35/6", VW.AUDI_A3_MK3), } diff --git a/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb b/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb index 9376f6a253..99efc45aca 100644 --- a/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb +++ b/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -27,18 +27,18 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "PLATFORM_CODES = {\n", " Ecu.abs: {\n", " 0: {\n", - " b'\\xa5': [CAR.ASCENT, CAR.ASCENT_2023],\n", - " b'\\xa2': [CAR.IMPREZA, CAR.IMPREZA_2020, CAR.CROSSTREK_HYBRID],\n", - " b'\\xa1': [CAR.OUTBACK, CAR.LEGACY, CAR.OUTBACK_2023],\n", - " b'\\xa3': [CAR.FORESTER, CAR.FORESTER_HYBRID, CAR.FORESTER_2022],\n", - " b'z': [CAR.IMPREZA],\n", + " b'\\xa5': [CAR.SUBARU_ASCENT, CAR.SUBARU_ASCENT_2023],\n", + " b'\\xa2': [CAR.SUBARU_IMPREZA, CAR.SUBARU_IMPREZA_2020, CAR.SUBARU_CROSSTREK_HYBRID],\n", + " b'\\xa1': [CAR.SUBARU_OUTBACK, CAR.SUBARU_LEGACY, CAR.SUBARU_OUTBACK_2023],\n", + " b'\\xa3': [CAR.SUBARU_FORESTER, CAR.SUBARU_FORESTER_HYBRID, CAR.SUBARU_FORESTER_2022],\n", + " b'z': [CAR.SUBARU_IMPREZA],\n", " }\n", " }\n", "}\n", diff --git a/tools/car_porting/examples/subaru_long_accel.ipynb b/tools/car_porting/examples/subaru_long_accel.ipynb index 24470b44d2..9d18a114df 100644 --- a/tools/car_porting/examples/subaru_long_accel.ipynb +++ b/tools/car_porting/examples/subaru_long_accel.ipynb @@ -9,7 +9,7 @@ "segments = [\n", " \"d9df6f87e8feff94|2023-03-28--17-41-10/1:12\"\n", "]\n", - "platform = \"SUBARU OUTBACK 6TH GEN\"\n" + "platform = \"SUBARU_OUTBACK\"\n" ] }, { @@ -56,7 +56,7 @@ " es_status_history.append(copy.copy(cp.vl[\"ES_Status\"]))\n", "\n", " acceleration_history.append(last_acc)\n", - " \n", + "\n", " if msg.which() == \"carState\":\n", " last_acc = msg.carState.aEgo" ] diff --git a/tools/car_porting/examples/subaru_steer_temp_fault.ipynb b/tools/car_porting/examples/subaru_steer_temp_fault.ipynb index 46d8dc413e..3d5055cbc2 100644 --- a/tools/car_porting/examples/subaru_steer_temp_fault.ipynb +++ b/tools/car_porting/examples/subaru_steer_temp_fault.ipynb @@ -11,7 +11,7 @@ "segments = [\n", " \"c3d1ccb52f5f9d65|2023-07-22--01-23-20/6:10\",\n", "]\n", - "platform = \"SUBARU OUTBACK 6TH GEN\"" + "platform = \"SUBARU_OUTBACK\"" ] }, { @@ -52,7 +52,7 @@ " for msg in can_msgs:\n", " cp.update_strings([msg.as_builder().to_bytes()])\n", " steering_torque_history.append(copy.copy(cp.vl[\"Steering_Torque\"]))\n", - " \n", + "\n", " steer_warning_last = False\n", " for i, steering_torque_msg in enumerate(steering_torque_history):\n", " steer_warning = steering_torque_msg[\"Steer_Warning\"]\n", diff --git a/tools/lib/comma_car_segments.py b/tools/lib/comma_car_segments.py index 9027fec637..78825504e6 100644 --- a/tools/lib/comma_car_segments.py +++ b/tools/lib/comma_car_segments.py @@ -1,13 +1,22 @@ import os import requests + # Forks with additional car support can fork the commaCarSegments repo on huggingface or host the LFS files themselves COMMA_CAR_SEGMENTS_REPO = os.environ.get("COMMA_CAR_SEGMENTS_REPO", "https://huggingface.co/datasets/commaai/commaCarSegments") COMMA_CAR_SEGMENTS_BRANCH = os.environ.get("COMMA_CAR_SEGMENTS_BRANCH", "main") COMMA_CAR_SEGMENTS_LFS_INSTANCE = os.environ.get("COMMA_CAR_SEGMENTS_LFS_INSTANCE", COMMA_CAR_SEGMENTS_REPO) def get_comma_car_segments_database(): - return requests.get(get_repo_raw_url("database.json")).json() + from openpilot.selfdrive.car.fingerprints import MIGRATION + + database = requests.get(get_repo_raw_url("database.json")).json() + + ret = {} + for platform in database: + ret[MIGRATION.get(platform, platform)] = database[platform] + + return ret # Helpers related to interfacing with the commaCarSegments repository, which contains a collection of public segments for users to perform validation on. diff --git a/tools/lib/tests/test_comma_car_segments.py b/tools/lib/tests/test_comma_car_segments.py index 5c8906f92d..91bab94343 100644 --- a/tools/lib/tests/test_comma_car_segments.py +++ b/tools/lib/tests/test_comma_car_segments.py @@ -1,7 +1,7 @@ import pytest import unittest - import requests +from openpilot.selfdrive.car.fingerprints import MIGRATION from openpilot.tools.lib.comma_car_segments import get_comma_car_segments_database, get_url from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.route import SegmentRange @@ -19,7 +19,7 @@ class TestCommaCarSegments(unittest.TestCase): def test_download_segment(self): database = get_comma_car_segments_database() - fp = "FORESTER" + fp = "SUBARU_FORESTER" segment = database[fp][0] @@ -31,10 +31,8 @@ class TestCommaCarSegments(unittest.TestCase): self.assertEqual(resp.status_code, 200) lr = LogReader(url) - CP = lr.first("carParams") - - self.assertEqual(CP.carFingerprint, fp) + self.assertEqual(MIGRATION.get(CP.carFingerprint, CP.carFingerprint), fp) if __name__ == "__main__": From 9ed5c78a805263908df030d7037efdfecb9323d2 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 20 Mar 2024 10:03:23 +0800 Subject: [PATCH 092/384] cabana: horizontal scrolling with Shift+wheel (#31929) --- tools/cabana/messageswidget.cc | 12 +++++++++++- tools/cabana/messageswidget.h | 6 +++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tools/cabana/messageswidget.cc b/tools/cabana/messageswidget.cc index 0cec551017..720553dcb3 100644 --- a/tools/cabana/messageswidget.cc +++ b/tools/cabana/messageswidget.cc @@ -85,7 +85,9 @@ MessagesWidget::MessagesWidget(QWidget *parent) : menu(new QMenu(this)), QWidget Byte color
constant changing
increasing
- decreasing + decreasing
+ Shortcuts
+ Horizontal Scrolling:  shift+wheel  )")); } @@ -391,6 +393,14 @@ void MessageView::updateBytesSectionSize() { header()->resizeSection(MessageListModel::Column::DATA, delegate->sizeForBytes(max_bytes).width()); } +void MessageView::wheelEvent(QWheelEvent *event) { + if (event->modifiers() == Qt::ShiftModifier) { + QApplication::sendEvent(horizontalScrollBar(), event); + } else { + QTreeView::wheelEvent(event); + } +} + // MessageViewHeader MessageViewHeader::MessageViewHeader(QWidget *parent) : QHeaderView(Qt::Horizontal, parent) { diff --git a/tools/cabana/messageswidget.h b/tools/cabana/messageswidget.h index 4f54941c64..e7f1f8c033 100644 --- a/tools/cabana/messageswidget.h +++ b/tools/cabana/messageswidget.h @@ -12,6 +12,7 @@ #include #include #include +#include #include "tools/cabana/dbc/dbcmanager.h" #include "tools/cabana/streams/abstractstream.h" @@ -65,10 +66,13 @@ class MessageView : public QTreeView { Q_OBJECT public: MessageView(QWidget *parent) : QTreeView(parent) {} + void updateBytesSectionSize(); + +protected: void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const override {} void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles = QVector()) override; - void updateBytesSectionSize(); + void wheelEvent(QWheelEvent *event) override; }; class MessageViewHeader : public QHeaderView { From 8f174d82d6d1b9719b267cdc2106a02b63c075e9 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 19 Mar 2024 23:10:20 -0500 Subject: [PATCH 093/384] Toyota: RAV4 Hybrid cannot do stop and go as stock (#31931) * rav4 also like this * docs --- docs/CARS.md | 4 ++-- selfdrive/car/toyota/interface.py | 2 +- selfdrive/car/toyota/values.py | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 251ceb4780..35a77fd78f 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -256,8 +256,8 @@ A supported vehicle is one that just works when you install a comma device. All |Toyota|RAV4 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 2023-24|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 Hybrid 2016|Toyota Safety Sense P|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 Hybrid 2017-18|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 Hybrid 2016|Toyota Safety Sense P|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 Hybrid 2017-18|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 Hybrid 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 Hybrid 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 Hybrid 2023-24|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 4b4b0a6cc7..3ea05f9fef 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -91,7 +91,7 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kf = 0.00004 break - elif candidate in (CAR.TOYOTA_RAV4H, CAR.TOYOTA_CHR, CAR.TOYOTA_CAMRY, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_NX): + elif candidate in (CAR.TOYOTA_CHR, CAR.TOYOTA_CAMRY, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_NX): # TODO: Some of these platforms are not advertised to have full range ACC, are they similar to SNG_WITHOUT_DSU cars? stop_and_go = True diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index c20736d5bc..179e3f97e3 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -220,7 +220,8 @@ class CAR(Platforms): ], TOYOTA_RAV4.specs, dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), - flags=ToyotaFlags.NO_STOP_TIMER, + # Note that the ICE RAV4 does not respect positive acceleration commands under 19 mph + flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, ) TOYOTA_RAV4_TSS2 = ToyotaTSS2PlatformConfig( [ From 6d8534758f545660cd68665a7c36678f1f874826 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 20 Mar 2024 00:39:30 -0500 Subject: [PATCH 094/384] Honda: allow fingerprinting without comma power for some platforms (#31933) * pending * notes * these are ready! * do odyssey * Freed * ACURA_RDX_3G * HONDA_HRV * new lines * sort * clean up * comment new line comment new line --- selfdrive/car/honda/values.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 533e01e9b4..d0df8e2da4 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -307,16 +307,20 @@ FW_QUERY_CONFIG = FwQueryConfig( # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present non_essential_ecus={ - Ecu.programmedFuelInjection: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], - Ecu.transmission: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], - Ecu.srs: [CAR.HONDA_ACCORD], - Ecu.eps: [CAR.HONDA_ACCORD], - Ecu.vsa: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], - Ecu.combinationMeter: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], - Ecu.gateway: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], - Ecu.electricBrakeBooster: [CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], - Ecu.shiftByWire: [CAR.HONDA_ACCORD], # existence correlates with transmission type for ICE - Ecu.hud: [CAR.HONDA_ACCORD], # existence correlates with trim level + Ecu.programmedFuelInjection: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.transmission: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.srs: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD], + Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD], + Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.combinationMeter: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, + CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_ODYSSEY_CHN], + Ecu.gateway: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FREED, + CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_ODYSSEY_CHN], + Ecu.electricBrakeBooster: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + # existence correlates with transmission type for Accord ICE + Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD], + # existence correlates with trim level + Ecu.hud: [CAR.HONDA_ACCORD], }, extra_ecus=[ # The only other ECU on PT bus accessible by camera on radarless Civic From 1b930ae616ac31d0fc7aa63eeb1f96866f6bf1ac Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 20 Mar 2024 00:47:08 -0500 Subject: [PATCH 095/384] Honda E: allow fingerprinting without comma power (#31934) HONDA_E --- selfdrive/car/honda/values.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index d0df8e2da4..32846f87a2 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -309,16 +309,16 @@ FW_QUERY_CONFIG = FwQueryConfig( non_essential_ecus={ Ecu.programmedFuelInjection: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], Ecu.transmission: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], - Ecu.srs: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD], - Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD], - Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.srs: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], + Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], + Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_E], Ecu.combinationMeter: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, - CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_ODYSSEY_CHN], + CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_E, CAR.HONDA_ODYSSEY_CHN], Ecu.gateway: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FREED, - CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_ODYSSEY_CHN], + CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_E, CAR.HONDA_ODYSSEY_CHN], Ecu.electricBrakeBooster: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], # existence correlates with transmission type for Accord ICE - Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD], + Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], # existence correlates with trim level Ecu.hud: [CAR.HONDA_ACCORD], }, From 23e8ad73979735479131dfb303e249b861829468 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 20 Mar 2024 10:35:33 -0700 Subject: [PATCH 096/384] cleanup pedal crc --- selfdrive/car/__init__.py | 14 -------------- tools/sim/lib/simulated_car.py | 3 --- 2 files changed, 17 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index f7d6140640..3898d46534 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -165,20 +165,6 @@ def common_fault_avoidance(fault_condition: bool, request: bool, above_limit_fra return above_limit_frames, request -def crc8_pedal(data): - crc = 0xFF # standard init value - poly = 0xD5 # standard crc8: x8+x7+x6+x4+x2+1 - size = len(data) - for i in range(size - 1, -1, -1): - crc ^= data[i] - for _ in range(8): - if ((crc & 0x80) != 0): - crc = ((crc << 1) ^ poly) & 0xFF - else: - crc <<= 1 - return crc - - def make_can_msg(addr, dat, bus): return [addr, 0, dat, bus] diff --git a/tools/sim/lib/simulated_car.py b/tools/sim/lib/simulated_car.py index 9148d0ddb2..746886ba43 100644 --- a/tools/sim/lib/simulated_car.py +++ b/tools/sim/lib/simulated_car.py @@ -4,7 +4,6 @@ from opendbc.can.packer import CANPacker from opendbc.can.parser import CANParser from openpilot.common.params import Params from openpilot.selfdrive.boardd.boardd_api_impl import can_list_to_can_capnp -from openpilot.selfdrive.car import crc8_pedal from openpilot.tools.sim.lib.common import SimulatorState @@ -55,8 +54,6 @@ class SimulatedCar: "INTERCEPTOR_GAS": simulator_state.user_gas * 2**12, "INTERCEPTOR_GAS2": simulator_state.user_gas * 2**12, } - checksum = crc8_pedal(self.packer.make_can_msg("GAS_SENSOR", 0, values)[2][:-1]) - values["CHECKSUM_PEDAL"] = checksum msg.append(self.packer.make_can_msg("GAS_SENSOR", 0, values)) msg.append(self.packer.make_can_msg("GEARBOX", 0, {"GEAR": 4, "GEAR_SHIFTER": 8})) From 90ff0dd04728c55237a71ec99ece7adcd03c1e21 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Wed, 20 Mar 2024 17:57:28 +0000 Subject: [PATCH 097/384] test_models: migrate fingerprint (#31936) --- selfdrive/car/tests/test_models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index f561fa2ad8..69220ae2b9 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -15,7 +15,7 @@ from openpilot.common.basedir import BASEDIR from openpilot.common.params import Params from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.car import gen_empty_fingerprint -from openpilot.selfdrive.car.fingerprints import all_known_cars +from openpilot.selfdrive.car.fingerprints import all_known_cars, MIGRATION from openpilot.selfdrive.car.car_helpers import FRAME_FINGERPRINT, interfaces from openpilot.selfdrive.car.honda.values import CAR as HONDA, HondaFlags from openpilot.selfdrive.car.tests.routes import non_tested_cars, routes, CarTestRoute @@ -95,7 +95,8 @@ class TestCarModelBase(unittest.TestCase): if msg.carParams.openpilotLongitudinalControl: experimental_long = True if cls.platform is None and not cls.ci: - cls.platform = msg.carParams.carFingerprint + live_fingerprint = msg.carParams.carFingerprint + cls.platform = MIGRATION.get(live_fingerprint, live_fingerprint) # Log which can frame the panda safety mode left ELM327, for CAN validity checks elif msg.which() == 'pandaStates': From 1f424bf7dcbe13a6a60212816cfd3057da6f5a1f Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 20 Mar 2024 13:57:41 -0400 Subject: [PATCH 098/384] cabana: migrate dbc map (#31920) * fix cabana * within platform map --- selfdrive/car/fingerprints.py | 14 ++++++++++++++ selfdrive/car/values.py | 8 +------- tools/cabana/dbc/generate_dbc_json.py | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/selfdrive/car/fingerprints.py b/selfdrive/car/fingerprints.py index 977df6bc9f..e25b5486a0 100644 --- a/selfdrive/car/fingerprints.py +++ b/selfdrive/car/fingerprints.py @@ -1,3 +1,4 @@ +from typing import Any, Callable from openpilot.selfdrive.car.interfaces import get_interface_attr from openpilot.selfdrive.car.body.values import CAR as BODY from openpilot.selfdrive.car.chrysler.values import CAR as CHRYSLER @@ -10,6 +11,7 @@ from openpilot.selfdrive.car.nissan.values import CAR as NISSAN from openpilot.selfdrive.car.subaru.values import CAR as SUBARU from openpilot.selfdrive.car.tesla.values import CAR as TESLA from openpilot.selfdrive.car.toyota.values import CAR as TOYOTA +from openpilot.selfdrive.car.values import PLATFORMS, Platform from openpilot.selfdrive.car.volkswagen.values import CAR as VW FW_VERSIONS = get_interface_attr('FW_VERSIONS', combine_brands=True, ignore_none=True) @@ -336,3 +338,15 @@ MIGRATION = { "SKODA SCALA 1ST GEN": VW.SKODA_SCALA_MK1, "SKODA SUPERB 3RD GEN": VW.SKODA_SUPERB_MK3, } + + +MapFunc = Callable[[Platform], Any] + + +def create_platform_map(func: MapFunc): + ret = {str(platform): func(platform) for platform in PLATFORMS.values() if func(platform) is not None} + + for m in MIGRATION: + ret[m] = ret[MIGRATION[m]] + + return ret diff --git a/selfdrive/car/values.py b/selfdrive/car/values.py index 0c8249838b..dfbcf3b74f 100644 --- a/selfdrive/car/values.py +++ b/selfdrive/car/values.py @@ -1,4 +1,4 @@ -from typing import Any, Callable, cast +from typing import cast from openpilot.selfdrive.car.body.values import CAR as BODY from openpilot.selfdrive.car.chrysler.values import CAR as CHRYSLER from openpilot.selfdrive.car.ford.values import CAR as FORD @@ -17,9 +17,3 @@ Platform = BODY | CHRYSLER | FORD | GM | HONDA | HYUNDAI | MAZDA | MOCK | NISSAN BRANDS = [BODY, CHRYSLER, FORD, GM, HONDA, HYUNDAI, MAZDA, MOCK, NISSAN, SUBARU, TESLA, TOYOTA, VOLKSWAGEN] PLATFORMS: dict[str, Platform] = {str(platform): platform for brand in BRANDS for platform in cast(list[Platform], brand)} - -MapFunc = Callable[[Platform], Any] - - -def create_platform_map(func: MapFunc): - return {str(platform): func(platform) for platform in PLATFORMS.values() if func(platform) is not None} diff --git a/tools/cabana/dbc/generate_dbc_json.py b/tools/cabana/dbc/generate_dbc_json.py index dec1766a7e..deda0909c4 100755 --- a/tools/cabana/dbc/generate_dbc_json.py +++ b/tools/cabana/dbc/generate_dbc_json.py @@ -2,7 +2,7 @@ import argparse import json -from openpilot.selfdrive.car.values import create_platform_map +from openpilot.selfdrive.car.fingerprints import create_platform_map def generate_dbc_json() -> str: From d75c32eaaaf4c7e1858a3b31238ffb35e7a67b5e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 20 Mar 2024 17:59:31 +0000 Subject: [PATCH 099/384] and juggler --- tools/plotjuggler/juggle.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/plotjuggler/juggle.py b/tools/plotjuggler/juggle.py index 0caf5a18ff..fd26020bf9 100755 --- a/tools/plotjuggler/juggle.py +++ b/tools/plotjuggler/juggle.py @@ -11,6 +11,7 @@ import argparse from functools import partial from openpilot.common.basedir import BASEDIR +from openpilot.selfdrive.car.fingerprints import MIGRATION from openpilot.tools.lib.helpers import save_log from openpilot.tools.lib.logreader import LogReader, ReadMode @@ -82,7 +83,7 @@ def juggle_route(route_or_segment_name, can, layout, dbc=None): for cp in [m for m in all_data if m.which() == 'carParams']: try: DBC = __import__(f"openpilot.selfdrive.car.{cp.carParams.carName}.values", fromlist=['DBC']).DBC - dbc = DBC[cp.carParams.carFingerprint]['pt'] + dbc = DBC[MIGRATION.get(cp.carParams.carFingerprint, cp.carParams.carFingerprint)]['pt'] except Exception: pass break From b489550b7ff8866bda726b97283efe7dfa00f0e3 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 20 Mar 2024 18:03:04 +0000 Subject: [PATCH 100/384] Revert "and juggler" This reverts commit d75c32eaaaf4c7e1858a3b31238ffb35e7a67b5e. --- tools/plotjuggler/juggle.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/plotjuggler/juggle.py b/tools/plotjuggler/juggle.py index fd26020bf9..0caf5a18ff 100755 --- a/tools/plotjuggler/juggle.py +++ b/tools/plotjuggler/juggle.py @@ -11,7 +11,6 @@ import argparse from functools import partial from openpilot.common.basedir import BASEDIR -from openpilot.selfdrive.car.fingerprints import MIGRATION from openpilot.tools.lib.helpers import save_log from openpilot.tools.lib.logreader import LogReader, ReadMode @@ -83,7 +82,7 @@ def juggle_route(route_or_segment_name, can, layout, dbc=None): for cp in [m for m in all_data if m.which() == 'carParams']: try: DBC = __import__(f"openpilot.selfdrive.car.{cp.carParams.carName}.values", fromlist=['DBC']).DBC - dbc = DBC[MIGRATION.get(cp.carParams.carFingerprint, cp.carParams.carFingerprint)]['pt'] + dbc = DBC[cp.carParams.carFingerprint]['pt'] except Exception: pass break From a0b589eda9c749c697fa4db80b6129b2545e8fee Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 20 Mar 2024 17:35:19 -0500 Subject: [PATCH 101/384] Honda: allow fingerprinting without comma power for more platforms (#31935) * 4 more platforms * only the first is missing srs?! * vsa didn't respond on these 8 routes * acura is good! * do CRV Hybrid * CRV is already done * new line * Revert "new line" This reverts commit 411c92c77b695d3df716f84b6f302fa0f791d555. --- selfdrive/car/honda/values.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 32846f87a2..a050cf8e2a 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -311,14 +311,14 @@ FW_QUERY_CONFIG = FwQueryConfig( Ecu.transmission: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], Ecu.srs: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], - Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_E], - Ecu.combinationMeter: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, - CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_E, CAR.HONDA_ODYSSEY_CHN], - Ecu.gateway: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FREED, - CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_E, CAR.HONDA_ODYSSEY_CHN], + Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E], + Ecu.combinationMeter: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, + CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_ODYSSEY_CHN], + Ecu.gateway: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, CAR.HONDA_FREED, + CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_ODYSSEY_CHN], Ecu.electricBrakeBooster: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], # existence correlates with transmission type for Accord ICE - Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], + Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E], # existence correlates with trim level Ecu.hud: [CAR.HONDA_ACCORD], }, From 1a03da9df336c136c7bf0e93cb2d2f3731f89555 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 20 Mar 2024 18:19:18 -0500 Subject: [PATCH 102/384] Honda Ridgeline and Insight: allow fingerprinting without comma power (#31938) * Ridgeline and Insight * ridgeline * Insight --- selfdrive/car/honda/values.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index a050cf8e2a..7a8c4314ac 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -311,14 +311,15 @@ FW_QUERY_CONFIG = FwQueryConfig( Ecu.transmission: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], Ecu.srs: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], - Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E], + Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, + CAR.HONDA_E, CAR.HONDA_INSIGHT], Ecu.combinationMeter: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, - CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_ODYSSEY_CHN], + CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY_CHN], Ecu.gateway: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, CAR.HONDA_FREED, - CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_ODYSSEY_CHN], + CAR.HONDA_HRV, CAR.HONDA_RIDGELINE, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY_CHN], Ecu.electricBrakeBooster: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], # existence correlates with transmission type for Accord ICE - Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E], + Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT], # existence correlates with trim level Ecu.hud: [CAR.HONDA_ACCORD], }, From 38d03b997958effea805a6c3860d2c5edaf2ae65 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 20 Mar 2024 19:43:58 -0400 Subject: [PATCH 103/384] add get_build_metadata function (#31923) * version * Get build metadata * two lines * channel * cwd * default to unknown * dataclass --- common/git.py | 16 ++++++++-------- common/run.py | 8 ++++---- system/version.py | 42 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/common/git.py b/common/git.py index e15a5051d2..1ab8b87099 100644 --- a/common/git.py +++ b/common/git.py @@ -4,23 +4,23 @@ from openpilot.common.run import run_cmd, run_cmd_default @cache -def get_commit(branch: str = "HEAD") -> str: - return run_cmd_default(["git", "rev-parse", branch]) +def get_commit(cwd: str = None, branch: str = "HEAD") -> str: + return run_cmd_default(["git", "rev-parse", branch], cwd=cwd) @cache -def get_commit_date(commit: str = "HEAD") -> str: - return run_cmd_default(["git", "show", "--no-patch", "--format='%ct %ci'", commit]) +def get_commit_date(cwd: str = None, commit: str = "HEAD") -> str: + return run_cmd_default(["git", "show", "--no-patch", "--format='%ct %ci'", commit], cwd=cwd) @cache -def get_short_branch() -> str: - return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "HEAD"]) +def get_short_branch(cwd: str = None) -> str: + return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "HEAD"], cwd=cwd) @cache -def get_branch() -> str: - return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]) +def get_branch(cwd: str = None) -> str: + return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], cwd=cwd) @cache diff --git a/common/run.py b/common/run.py index 25abe98c41..c1a36bf041 100644 --- a/common/run.py +++ b/common/run.py @@ -1,13 +1,13 @@ import subprocess -def run_cmd(cmd: list[str]) -> str: - return subprocess.check_output(cmd, encoding='utf8').strip() +def run_cmd(cmd: list[str], cwd=None) -> str: + return subprocess.check_output(cmd, encoding='utf8', cwd=cwd).strip() -def run_cmd_default(cmd: list[str], default: str = "") -> str: +def run_cmd_default(cmd: list[str], default: str = "", cwd=None) -> str: try: - return run_cmd(cmd) + return run_cmd(cmd, cwd=cwd) except subprocess.CalledProcessError: return default diff --git a/system/version.py b/system/version.py index 7ae8313089..8866026152 100755 --- a/system/version.py +++ b/system/version.py @@ -1,17 +1,22 @@ #!/usr/bin/env python3 +from dataclasses import dataclass +import json import os +import pathlib import subprocess from openpilot.common.basedir import BASEDIR from openpilot.common.swaglog import cloudlog from openpilot.common.utils import cache -from openpilot.common.git import get_origin, get_branch, get_short_branch, get_normalized_origin, get_commit_date +from openpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_normalized_origin, get_commit_date RELEASE_BRANCHES = ['release3-staging', 'release3', 'nightly'] TESTED_BRANCHES = RELEASE_BRANCHES + ['devel', 'devel-staging'] +BUILD_METADATA_FILENAME = "build.json" + training_version: bytes = b"0.2.0" terms_version: bytes = b"2" @@ -75,6 +80,41 @@ def is_dirty() -> bool: return dirty +@dataclass(frozen=True) +class OpenpilotMetadata: + version: str + release_notes: str + git_commit: str + + +@dataclass(frozen=True) +class BuildMetadata: + channel: str + openpilot: OpenpilotMetadata + + + +def get_build_metadata(path: str = BASEDIR) -> BuildMetadata | None: + build_metadata_path = pathlib.Path(path) / BUILD_METADATA_FILENAME + + if build_metadata_path.exists(): + build_metadata = json.loads(build_metadata_path.read_text()) + openpilot_metadata = build_metadata.get("openpilot", {}) + + channel = build_metadata.get("channel", "unknown") + version = openpilot_metadata.get("version", "unknown") + release_notes = openpilot_metadata.get("release_notes", "unknown") + git_commit = openpilot_metadata.get("git_commit", "unknown") + return BuildMetadata(channel, OpenpilotMetadata(version, release_notes, git_commit)) + + git_folder = pathlib.Path(path) / ".git" + + if git_folder.exists(): + return BuildMetadata(get_short_branch(path), OpenpilotMetadata(get_version(path), get_release_notes(path), get_commit(path))) + + return None + + if __name__ == "__main__": from openpilot.common.params import Params From 0a30af327d3de444dfb69e5180626a1dde80bd99 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 20 Mar 2024 22:08:12 -0500 Subject: [PATCH 104/384] Honda Pilot: allow fingerprinting without comma power (#31945) * pilot * pilot * clean up --- selfdrive/car/honda/values.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 7a8c4314ac..cf0aef8ce3 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -307,8 +307,8 @@ FW_QUERY_CONFIG = FwQueryConfig( # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present non_essential_ecus={ - Ecu.programmedFuelInjection: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], - Ecu.transmission: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], + Ecu.programmedFuelInjection: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_PILOT], + Ecu.transmission: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_PILOT], Ecu.srs: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, @@ -316,10 +316,11 @@ FW_QUERY_CONFIG = FwQueryConfig( Ecu.combinationMeter: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY_CHN], Ecu.gateway: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, CAR.HONDA_FREED, - CAR.HONDA_HRV, CAR.HONDA_RIDGELINE, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY_CHN], + CAR.HONDA_HRV, CAR.HONDA_RIDGELINE, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, + CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_PILOT], Ecu.electricBrakeBooster: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], # existence correlates with transmission type for Accord ICE - Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT], + Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_PILOT], # existence correlates with trim level Ecu.hud: [CAR.HONDA_ACCORD], }, From 2be012aa39a84e475d1c098220948e527cc4f842 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 20 Mar 2024 23:31:53 -0500 Subject: [PATCH 105/384] Honda: allow fingerprinting without comma power (#31926) * pending * acura ilx * do odyssey * clean up --- selfdrive/car/honda/values.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index cf0aef8ce3..1f59bd24d0 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -313,10 +313,10 @@ FW_QUERY_CONFIG = FwQueryConfig( Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT], - Ecu.combinationMeter: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, + Ecu.combinationMeter: [CAR.ACURA_ILX, CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY_CHN], - Ecu.gateway: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, CAR.HONDA_FREED, - CAR.HONDA_HRV, CAR.HONDA_RIDGELINE, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, + Ecu.gateway: [CAR.ACURA_ILX, CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, CAR.HONDA_FREED, + CAR.HONDA_HRV, CAR.HONDA_RIDGELINE, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_PILOT], Ecu.electricBrakeBooster: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], # existence correlates with transmission type for Accord ICE From 35b31df7f716d4d5de045d6dd5305572c20d01f9 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 21 Mar 2024 12:34:09 +0800 Subject: [PATCH 106/384] util/timeAgo: add missing translation (#31944) * add missing translation * update languages --- selfdrive/ui/qt/util.cc | 2 +- selfdrive/ui/translations/main_ar.ts | 4 ++++ selfdrive/ui/translations/main_de.ts | 4 ++++ selfdrive/ui/translations/main_fr.ts | 4 ++++ selfdrive/ui/translations/main_ja.ts | 4 ++++ selfdrive/ui/translations/main_ko.ts | 4 ++++ selfdrive/ui/translations/main_pt-BR.ts | 4 ++++ selfdrive/ui/translations/main_th.ts | 4 ++++ selfdrive/ui/translations/main_tr.ts | 4 ++++ selfdrive/ui/translations/main_zh-CHS.ts | 4 ++++ selfdrive/ui/translations/main_zh-CHT.ts | 4 ++++ 11 files changed, 41 insertions(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/util.cc b/selfdrive/ui/qt/util.cc index bc3c494fa7..9138f8bca5 100644 --- a/selfdrive/ui/qt/util.cc +++ b/selfdrive/ui/qt/util.cc @@ -61,7 +61,7 @@ QString timeAgo(const QDateTime &date) { QString s; if (diff < 60) { - s = "now"; + s = QObject::tr("now"); } else if (diff < 60 * 60) { int minutes = diff / 60; s = QObject::tr("%n minute(s) ago", "", minutes); diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 10c87d87bd..64cb8d9812 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -615,6 +615,10 @@ ft قدم + + now + +
Reset diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index cdcea24778..e8bd89db9a 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -598,6 +598,10 @@ ft fuß + + now + + Reset diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index b1c39db18e..340ab694ff 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -599,6 +599,10 @@ ft ft + + now + + Reset diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 5360c352d1..332b443ddd 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -594,6 +594,10 @@ ft フィート + + now + + Reset diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index ed751912a6..48ccb1a712 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -595,6 +595,10 @@ ft ft + + now + + Reset diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index c32aeacaa3..fed4077667 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -599,6 +599,10 @@ ft pés + + now + + Reset diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index 25a8aaeebd..ff74ba66c6 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -595,6 +595,10 @@ ft ฟุต + + now + + Reset diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index dfe4b3670b..69946fa318 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -594,6 +594,10 @@ ft ft + + now + + Reset diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index d985945f02..4a314c94bd 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -595,6 +595,10 @@ ft ft + + now + + Reset diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index e64134f253..b013890956 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -595,6 +595,10 @@ ft ft + + now + + Reset From 806f743e126b4bfcccec0b0b8458b5473da9c1b4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 21 Mar 2024 12:47:26 -0400 Subject: [PATCH 107/384] git commands: more parameterization on path (#31942) * more cwd * here top * and here * basedir --- common/git.py | 14 +++++++------- system/version.py | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/common/git.py b/common/git.py index 1ab8b87099..bfb18ce25d 100644 --- a/common/git.py +++ b/common/git.py @@ -24,18 +24,18 @@ def get_branch(cwd: str = None) -> str: @cache -def get_origin() -> str: +def get_origin(cwd: str = None) -> str: try: - local_branch = run_cmd(["git", "name-rev", "--name-only", "HEAD"]) - tracking_remote = run_cmd(["git", "config", "branch." + local_branch + ".remote"]) - return run_cmd(["git", "config", "remote." + tracking_remote + ".url"]) + local_branch = run_cmd(["git", "name-rev", "--name-only", "HEAD"], cwd=cwd) + tracking_remote = run_cmd(["git", "config", "branch." + local_branch + ".remote"], cwd=cwd) + return run_cmd(["git", "config", "remote." + tracking_remote + ".url"], cwd=cwd) except subprocess.CalledProcessError: # Not on a branch, fallback - return run_cmd_default(["git", "config", "--get", "remote.origin.url"]) + return run_cmd_default(["git", "config", "--get", "remote.origin.url"], cwd=cwd) @cache -def get_normalized_origin() -> str: - return get_origin() \ +def get_normalized_origin(cwd: str = None) -> str: + return get_origin(cwd) \ .replace("git@", "", 1) \ .replace(".git", "", 1) \ .replace("https://", "", 1) \ diff --git a/system/version.py b/system/version.py index 8866026152..7b3ea940f4 100755 --- a/system/version.py +++ b/system/version.py @@ -37,8 +37,8 @@ def get_short_version() -> str: return get_version().split('-')[0] @cache -def is_prebuilt() -> bool: - return os.path.exists(os.path.join(BASEDIR, 'prebuilt')) +def is_prebuilt(path: str = BASEDIR) -> bool: + return os.path.exists(os.path.join(path, 'prebuilt')) @cache @@ -56,23 +56,23 @@ def is_release_branch() -> bool: return get_short_branch() in RELEASE_BRANCHES @cache -def is_dirty() -> bool: - origin = get_origin() - branch = get_branch() +def is_dirty(cwd: str = BASEDIR) -> bool: + origin = get_origin(cwd) + branch = get_branch(cwd) if not origin or not branch: return True dirty = False try: # Actually check dirty files - if not is_prebuilt(): + if not is_prebuilt(cwd): # This is needed otherwise touched files might show up as modified try: - subprocess.check_call(["git", "update-index", "--refresh"]) + subprocess.check_call(["git", "update-index", "--refresh"], cwd=cwd) except subprocess.CalledProcessError: pass - dirty = (subprocess.call(["git", "diff-index", "--quiet", branch, "--"]) != 0) + dirty = (subprocess.call(["git", "diff-index", "--quiet", branch, "--"], cwd=cwd)) != 0 except subprocess.CalledProcessError: cloudlog.exception("git subprocess failed while checking dirty") dirty = True From effee900c4e9f3950b88a43b08da40bdbc47aed0 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 21 Mar 2024 13:15:29 -0400 Subject: [PATCH 108/384] use build_metadata everywhere we used to use get_version, get_commit, etc (#31941) * use build_metadata * fix normailzed * also normalized * and here * fix diff * and that one * cleanup --- selfdrive/athena/athenad.py | 12 ++-- selfdrive/athena/manage_athenad.py | 15 ++--- selfdrive/car/car_helpers.py | 5 +- selfdrive/manager/build.py | 5 +- selfdrive/manager/manager.py | 41 +++++++------- selfdrive/sentry.py | 18 +++--- selfdrive/statsd.py | 12 ++-- selfdrive/tombstoned.py | 6 +- selfdrive/updated/updated.py | 5 +- system/version.py | 88 ++++++++++++++++++------------ 10 files changed, 118 insertions(+), 89 deletions(-) diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index d228af572c..989e284e74 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -32,13 +32,12 @@ from cereal import log from cereal.services import SERVICE_LIST from openpilot.common.api import Api from openpilot.common.file_helpers import CallbackReader -from openpilot.common.git import get_commit, get_normalized_origin, get_short_branch from openpilot.common.params import Params from openpilot.common.realtime import set_core_affinity from openpilot.system.hardware import HARDWARE, PC from openpilot.system.loggerd.xattr_cache import getxattr, setxattr from openpilot.common.swaglog import cloudlog -from openpilot.system.version import get_version +from openpilot.system.version import get_build_metadata from openpilot.system.hardware.hw import Paths @@ -320,11 +319,12 @@ def getMessage(service: str, timeout: int = 1000) -> dict: @dispatcher.add_method def getVersion() -> dict[str, str]: + build_metadata = get_build_metadata() return { - "version": get_version(), - "remote": get_normalized_origin(), - "branch": get_short_branch(), - "commit": get_commit(), + "version": build_metadata.openpilot.version, + "remote": build_metadata.openpilot.git_normalized_origin, + "branch": build_metadata.channel, + "commit": build_metadata.openpilot.git_commit, } diff --git a/selfdrive/athena/manage_athenad.py b/selfdrive/athena/manage_athenad.py index 3065bed5c7..2ec92cc3e0 100755 --- a/selfdrive/athena/manage_athenad.py +++ b/selfdrive/athena/manage_athenad.py @@ -7,8 +7,7 @@ from openpilot.common.params import Params from openpilot.selfdrive.manager.process import launcher from openpilot.common.swaglog import cloudlog from openpilot.system.hardware import HARDWARE -from openpilot.common.git import get_commit, get_normalized_origin, get_short_branch -from openpilot.system.version import get_version, is_dirty +from openpilot.system.version import get_build_metadata ATHENA_MGR_PID_PARAM = "AthenadPid" @@ -16,12 +15,14 @@ ATHENA_MGR_PID_PARAM = "AthenadPid" def main(): params = Params() dongle_id = params.get("DongleId").decode('utf-8') + build_metadata = get_build_metadata() + cloudlog.bind_global(dongle_id=dongle_id, - version=get_version(), - origin=get_normalized_origin(), - branch=get_short_branch(), - commit=get_commit(), - dirty=is_dirty(), + version=build_metadata.openpilot.version, + origin=build_metadata.openpilot.git_normalized_origin, + branch=build_metadata.channel, + commit=build_metadata.openpilot.git_commit, + dirty=build_metadata.openpilot.is_dirty, device=HARDWARE.get_device_type()) try: diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index fd8ecc5020..0e2443d330 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -4,7 +4,6 @@ from collections.abc import Callable from cereal import car from openpilot.common.params import Params -from openpilot.system.version import is_comma_remote, is_tested_branch from openpilot.selfdrive.car.interfaces import get_interface_attr from openpilot.selfdrive.car.fingerprints import eliminate_incompatible_cars, all_legacy_fingerprint_cars from openpilot.selfdrive.car.vin import get_vin, is_valid_vin, VIN_UNKNOWN @@ -13,6 +12,7 @@ from openpilot.selfdrive.car.mock.values import CAR as MOCK from openpilot.common.swaglog import cloudlog import cereal.messaging as messaging from openpilot.selfdrive.car import gen_empty_fingerprint +from openpilot.system.version import get_build_metadata FRAME_FINGERPRINT = 100 # 1s @@ -20,7 +20,8 @@ EventName = car.CarEvent.EventName def get_startup_event(car_recognized, controller_available, fw_seen): - if is_comma_remote() and is_tested_branch(): + build_metadata = get_build_metadata() + if build_metadata.openpilot.comma_remote and build_metadata.tested_channel: event = EventName.startup else: event = EventName.startupMaster diff --git a/selfdrive/manager/build.py b/selfdrive/manager/build.py index 067e1b5a1e..859d0920c3 100755 --- a/selfdrive/manager/build.py +++ b/selfdrive/manager/build.py @@ -9,7 +9,7 @@ from openpilot.common.spinner import Spinner from openpilot.common.text_window import TextWindow from openpilot.system.hardware import AGNOS from openpilot.common.swaglog import cloudlog, add_file_handler -from openpilot.system.version import is_dirty +from openpilot.system.version import get_build_metadata MAX_CACHE_SIZE = 4e9 if "CI" in os.environ else 2e9 CACHE_DIR = Path("/data/scons_cache" if AGNOS else "/tmp/scons_cache") @@ -86,4 +86,5 @@ def build(spinner: Spinner, dirty: bool = False, minimal: bool = False) -> None: if __name__ == "__main__": spinner = Spinner() spinner.update_progress(0, 100) - build(spinner, is_dirty(), minimal = AGNOS) + build_metadata = get_build_metadata() + build(spinner, build_metadata.openpilot.is_dirty, minimal = AGNOS) diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index f30b81861a..512320a8db 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -16,21 +16,20 @@ from openpilot.selfdrive.manager.process import ensure_running from openpilot.selfdrive.manager.process_config import managed_processes from openpilot.selfdrive.athena.registration import register, UNREGISTERED_DONGLE_ID from openpilot.common.swaglog import cloudlog, add_file_handler -from openpilot.common.git import get_commit, get_origin, get_short_branch, get_commit_date -from openpilot.system.version import is_dirty, get_version, \ - get_normalized_origin, terms_version, training_version, \ - is_tested_branch, is_release_branch +from openpilot.system.version import get_build_metadata, terms_version, training_version def manager_init() -> None: save_bootlog() + build_metadata = get_build_metadata() + params = Params() params.clear_all(ParamKeyType.CLEAR_ON_MANAGER_START) params.clear_all(ParamKeyType.CLEAR_ON_ONROAD_TRANSITION) params.clear_all(ParamKeyType.CLEAR_ON_OFFROAD_TRANSITION) - if is_release_branch(): + if build_metadata.release_channel: params.clear_all(ParamKeyType.DEVELOPMENT_ONLY) default_params: list[tuple[str, str | bytes]] = [ @@ -62,15 +61,15 @@ def manager_init() -> None: print("WARNING: failed to make /dev/shm") # set version params - params.put("Version", get_version()) + params.put("Version", build_metadata.openpilot.version) params.put("TermsVersion", terms_version) params.put("TrainingVersion", training_version) - params.put("GitCommit", get_commit()) - params.put("GitCommitDate", get_commit_date()) - params.put("GitBranch", get_short_branch()) - params.put("GitRemote", get_origin()) - params.put_bool("IsTestedBranch", is_tested_branch()) - params.put_bool("IsReleaseBranch", is_release_branch()) + params.put("GitCommit", build_metadata.openpilot.git_commit) + params.put("GitCommitDate", build_metadata.openpilot.git_commit_date) + params.put("GitBranch", build_metadata.channel) + params.put("GitRemote", build_metadata.openpilot.git_origin) + params.put_bool("IsTestedBranch", build_metadata.tested_channel) + params.put_bool("IsReleaseBranch", build_metadata.release_channel) # set dongle id reg_res = register(show_spinner=True) @@ -80,21 +79,21 @@ def manager_init() -> None: serial = params.get("HardwareSerial") raise Exception(f"Registration failed for device {serial}") os.environ['DONGLE_ID'] = dongle_id # Needed for swaglog - os.environ['GIT_ORIGIN'] = get_normalized_origin() # Needed for swaglog - os.environ['GIT_BRANCH'] = get_short_branch() # Needed for swaglog - os.environ['GIT_COMMIT'] = get_commit() # Needed for swaglog + os.environ['GIT_ORIGIN'] = build_metadata.openpilot.git_normalized_origin # Needed for swaglog + os.environ['GIT_BRANCH'] = build_metadata.channel # Needed for swaglog + os.environ['GIT_COMMIT'] = build_metadata.openpilot.git_commit # Needed for swaglog - if not is_dirty(): + if not build_metadata.openpilot.is_dirty: os.environ['CLEAN'] = '1' # init logging sentry.init(sentry.SentryProject.SELFDRIVE) cloudlog.bind_global(dongle_id=dongle_id, - version=get_version(), - origin=get_normalized_origin(), - branch=get_short_branch(), - commit=get_commit(), - dirty=is_dirty(), + version=build_metadata.openpilot.version, + origin=build_metadata.openpilot.git_normalized_origin, + branch=build_metadata.channel, + commit=build_metadata.openpilot.git_commit, + dirty=build_metadata.openpilot.is_dirty, device=HARDWARE.get_device_type()) # preimport all processes diff --git a/selfdrive/sentry.py b/selfdrive/sentry.py index 889178610f..204d9cab09 100644 --- a/selfdrive/sentry.py +++ b/selfdrive/sentry.py @@ -6,9 +6,8 @@ from sentry_sdk.integrations.threading import ThreadingIntegration from openpilot.common.params import Params from openpilot.selfdrive.athena.registration import is_registered_device from openpilot.system.hardware import HARDWARE, PC -from openpilot.common.git import get_commit, get_branch, get_origin from openpilot.common.swaglog import cloudlog -from openpilot.system.version import get_version, is_comma_remote, is_dirty, is_tested_branch +from openpilot.system.version import get_build_metadata, get_version class SentryProject(Enum): @@ -43,12 +42,13 @@ def set_tag(key: str, value: str) -> None: def init(project: SentryProject) -> bool: + build_metadata = get_build_metadata() # forks like to mess with this, so double check - comma_remote = is_comma_remote() and "commaai" in get_origin() + comma_remote = build_metadata.openpilot.comma_remote and "commaai" in build_metadata.openpilot.git_origin if not comma_remote or not is_registered_device() or PC: return False - env = "release" if is_tested_branch() else "master" + env = "release" if build_metadata.tested_channel else "master" dongle_id = Params().get("DongleId", encoding='utf-8') integrations = [] @@ -63,11 +63,13 @@ def init(project: SentryProject) -> bool: max_value_length=8192, environment=env) + build_metadata = get_build_metadata() + sentry_sdk.set_user({"id": dongle_id}) - sentry_sdk.set_tag("dirty", is_dirty()) - sentry_sdk.set_tag("origin", get_origin()) - sentry_sdk.set_tag("branch", get_branch()) - sentry_sdk.set_tag("commit", get_commit()) + sentry_sdk.set_tag("dirty", build_metadata.openpilot.is_dirty) + sentry_sdk.set_tag("origin", build_metadata.openpilot.git_origin) + sentry_sdk.set_tag("branch", build_metadata.channel) + sentry_sdk.set_tag("commit", build_metadata.openpilot.git_commit) sentry_sdk.set_tag("device", HARDWARE.get_device_type()) if project == SentryProject.SELFDRIVE: diff --git a/selfdrive/statsd.py b/selfdrive/statsd.py index 299aa295d7..2f9149b096 100755 --- a/selfdrive/statsd.py +++ b/selfdrive/statsd.py @@ -13,7 +13,7 @@ from openpilot.system.hardware.hw import Paths from openpilot.common.swaglog import cloudlog from openpilot.system.hardware import HARDWARE from openpilot.common.file_helpers import atomic_write_in_dir -from openpilot.system.version import get_normalized_origin, get_short_branch, get_short_version, is_dirty +from openpilot.system.version import get_build_metadata from openpilot.system.loggerd.config import STATS_DIR_FILE_LIMIT, STATS_SOCKET, STATS_FLUSH_TIME_S @@ -86,13 +86,15 @@ def main() -> NoReturn: # initialize stats directory Path(STATS_DIR).mkdir(parents=True, exist_ok=True) + build_metadata = get_build_metadata() + # initialize tags tags = { 'started': False, - 'version': get_short_version(), - 'branch': get_short_branch(), - 'dirty': is_dirty(), - 'origin': get_normalized_origin(), + 'version': build_metadata.openpilot.version, + 'branch': build_metadata.channel, + 'dirty': build_metadata.openpilot.is_dirty, + 'origin': build_metadata.openpilot.git_normalized_origin, 'deviceType': HARDWARE.get_device_type(), } diff --git a/selfdrive/tombstoned.py b/selfdrive/tombstoned.py index f1b8c88083..2c99c7eafe 100755 --- a/selfdrive/tombstoned.py +++ b/selfdrive/tombstoned.py @@ -11,8 +11,8 @@ from typing import NoReturn import openpilot.selfdrive.sentry as sentry from openpilot.system.hardware.hw import Paths -from openpilot.common.git import get_commit from openpilot.common.swaglog import cloudlog +from openpilot.system.version import get_build_metadata MAX_SIZE = 1_000_000 * 100 # allow up to 100M MAX_TOMBSTONE_FN_LEN = 62 # 85 - 23 ("/crash/") @@ -124,7 +124,9 @@ def report_tombstone_apport(fn): clean_path = path.replace('/', '_') date = datetime.datetime.now().strftime("%Y-%m-%d--%H-%M-%S") - new_fn = f"{date}_{(get_commit() or 'nocommit')[:8]}_{safe_fn(clean_path)}"[:MAX_TOMBSTONE_FN_LEN] + build_metadata = get_build_metadata() + + new_fn = f"{date}_{(build_metadata.openpilot.git_commit or 'nocommit')[:8]}_{safe_fn(clean_path)}"[:MAX_TOMBSTONE_FN_LEN] crashlog_dir = os.path.join(Paths.log_root(), "crash") os.makedirs(crashlog_dir, exist_ok=True) diff --git a/selfdrive/updated/updated.py b/selfdrive/updated/updated.py index b6b395f254..3a710ba02f 100755 --- a/selfdrive/updated/updated.py +++ b/selfdrive/updated/updated.py @@ -19,7 +19,7 @@ from openpilot.common.time import system_time_valid from openpilot.system.hardware import AGNOS, HARDWARE from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.controls.lib.alertmanager import set_offroad_alert -from openpilot.system.version import is_tested_branch +from openpilot.system.version import get_build_metadata LOCK_FILE = os.getenv("UPDATER_LOCK_FILE", "/tmp/safe_staging_overlay.lock") STAGING_ROOT = os.getenv("UPDATER_STAGING_ROOT", "/data/safe_staging") @@ -325,8 +325,9 @@ class Updater: now = datetime.datetime.utcnow() dt = now - last_update + build_metadata = get_build_metadata() if failed_count > 15 and exception is not None and self.has_internet: - if is_tested_branch(): + if build_metadata.tested_channel: extra_text = "Ensure the software is correctly installed. Uninstall and re-install if this error persists." else: extra_text = exception diff --git a/system/version.py b/system/version.py index 7b3ea940f4..f370beb4ae 100755 --- a/system/version.py +++ b/system/version.py @@ -9,7 +9,7 @@ import subprocess from openpilot.common.basedir import BASEDIR from openpilot.common.swaglog import cloudlog from openpilot.common.utils import cache -from openpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_normalized_origin, get_commit_date +from openpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_commit_date RELEASE_BRANCHES = ['release3-staging', 'release3', 'nightly'] @@ -32,33 +32,15 @@ def get_release_notes(path: str = BASEDIR) -> str: return f.read().split('\n\n', 1)[0] -@cache -def get_short_version() -> str: - return get_version().split('-')[0] - @cache def is_prebuilt(path: str = BASEDIR) -> bool: return os.path.exists(os.path.join(path, 'prebuilt')) -@cache -def is_comma_remote() -> bool: - # note to fork maintainers, this is used for release metrics. please do not - # touch this to get rid of the orange startup alert. there's better ways to do that - return get_normalized_origin() == "github.com/commaai/openpilot" - -@cache -def is_tested_branch() -> bool: - return get_short_branch() in TESTED_BRANCHES - -@cache -def is_release_branch() -> bool: - return get_short_branch() in RELEASE_BRANCHES - @cache def is_dirty(cwd: str = BASEDIR) -> bool: - origin = get_origin(cwd) - branch = get_branch(cwd) + origin = get_origin() + branch = get_branch() if not origin or not branch: return True @@ -85,6 +67,27 @@ class OpenpilotMetadata: version: str release_notes: str git_commit: str + git_origin: str + git_commit_date: str + is_dirty: bool # whether there are local changes + + @property + def short_version(self) -> str: + return self.version.split('-')[0] + + @property + def comma_remote(self) -> bool: + # note to fork maintainers, this is used for release metrics. please do not + # touch this to get rid of the orange startup alert. there's better ways to do that + return self.git_normalized_origin == "github.com/commaai/openpilot" + + @property + def git_normalized_origin(self) -> str: + return self.git_origin \ + .replace("git@", "", 1) \ + .replace(".git", "", 1) \ + .replace("https://", "", 1) \ + .replace(":", "/", 1) @dataclass(frozen=True) @@ -92,9 +95,17 @@ class BuildMetadata: channel: str openpilot: OpenpilotMetadata + @property + def tested_channel(self) -> bool: + return self.channel in TESTED_BRANCHES + + @property + def release_channel(self) -> bool: + return self.channel in RELEASE_BRANCHES + -def get_build_metadata(path: str = BASEDIR) -> BuildMetadata | None: +def get_build_metadata(path: str = BASEDIR) -> BuildMetadata: build_metadata_path = pathlib.Path(path) / BUILD_METADATA_FILENAME if build_metadata_path.exists(): @@ -105,14 +116,31 @@ def get_build_metadata(path: str = BASEDIR) -> BuildMetadata | None: version = openpilot_metadata.get("version", "unknown") release_notes = openpilot_metadata.get("release_notes", "unknown") git_commit = openpilot_metadata.get("git_commit", "unknown") - return BuildMetadata(channel, OpenpilotMetadata(version, release_notes, git_commit)) + git_origin = openpilot_metadata.get("git_origin", "unknown") + git_commit_date = openpilot_metadata.get("git_commit_date", "unknown") + return BuildMetadata(channel, + OpenpilotMetadata( + version=version, + release_notes=release_notes, + git_commit=git_commit, + git_origin=git_origin, + git_commit_date=git_commit_date, + is_dirty=False)) git_folder = pathlib.Path(path) / ".git" if git_folder.exists(): - return BuildMetadata(get_short_branch(path), OpenpilotMetadata(get_version(path), get_release_notes(path), get_commit(path))) + return BuildMetadata(get_short_branch(path), + OpenpilotMetadata( + version=get_version(path), + release_notes=get_release_notes(path), + git_commit=get_commit(path), + git_origin=get_origin(path), + git_commit_date=get_commit_date(path), + is_dirty=is_dirty(path))) - return None + cloudlog.exception("unable to get build metadata") + raise Exception("invalid build metadata") if __name__ == "__main__": @@ -122,12 +150,4 @@ if __name__ == "__main__": params.put("TermsVersion", terms_version) params.put("TrainingVersion", training_version) - print(f"Dirty: {is_dirty()}") - print(f"Version: {get_version()}") - print(f"Short version: {get_short_version()}") - print(f"Origin: {get_origin()}") - print(f"Normalized origin: {get_normalized_origin()}") - print(f"Branch: {get_branch()}") - print(f"Short branch: {get_short_branch()}") - print(f"Prebuilt: {is_prebuilt()}") - print(f"Commit date: {get_commit_date()}") + print(get_build_metadata()) From e28edf874b4caa68a47326a98018a0e21fe22f58 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 22 Mar 2024 01:58:05 +0800 Subject: [PATCH 109/384] ui/sidebar: do not send the `userFlag` while offroad (#31952) --- selfdrive/ui/qt/sidebar.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc index e952940056..75b966c9aa 100644 --- a/selfdrive/ui/qt/sidebar.cc +++ b/selfdrive/ui/qt/sidebar.cc @@ -55,7 +55,7 @@ void Sidebar::mouseReleaseEvent(QMouseEvent *event) { flag_pressed = settings_pressed = false; update(); } - if (home_btn.contains(event->pos())) { + if (onroad && home_btn.contains(event->pos())) { MessageBuilder msg; msg.initEvent().initUserFlag(); pm->send("userFlag", msg); From 27d2a6066d944255608d953c9a8fc7c8cb79f828 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Thu, 21 Mar 2024 17:58:35 +0000 Subject: [PATCH 110/384] tools: remove unused timestamp_to_datetime (#31950) --- tools/lib/helpers.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tools/lib/helpers.py b/tools/lib/helpers.py index 653eb3d7e0..e9b4b85e70 100644 --- a/tools/lib/helpers.py +++ b/tools/lib/helpers.py @@ -1,7 +1,4 @@ import bz2 -import datetime - -TIME_FMT = "%Y-%m-%d--%H-%M-%S" # regex patterns @@ -23,13 +20,6 @@ class RE: OP_SEGMENT_DIR = fr'^(?P{SEGMENT_NAME})$' -def timestamp_to_datetime(t: str) -> datetime.datetime: - """ - Convert an openpilot route timestamp to a python datetime - """ - return datetime.datetime.strptime(t, TIME_FMT) - - def save_log(dest, log_msgs, compress=True): dat = b"".join(msg.as_builder().to_bytes() for msg in log_msgs) From 028f6938b2e28d79054e9c11f1b95eba150bfcad Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 22 Mar 2024 01:58:48 +0800 Subject: [PATCH 111/384] ui.py: quit if the "X"(exit) button is clicked (#31949) --- tools/replay/ui.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/replay/ui.py b/tools/replay/ui.py index aa03ae193c..31e4fff74d 100755 --- a/tools/replay/ui.py +++ b/tools/replay/ui.py @@ -101,8 +101,11 @@ def ui_thread(addr): draw_plots = init_plots(plot_arr, name_to_arr_idx, plot_xlims, plot_ylims, plot_names, plot_colors, plot_styles) vipc_client = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_ROAD, True) - while 1: - list(pygame.event.get()) + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() screen.fill((64, 64, 64)) lid_overlay = lid_overlay_blank.copy() From 0201c786e85c22aea6e79d873a367b274016648e Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 22 Mar 2024 02:02:26 +0800 Subject: [PATCH 112/384] ui: pairing device in settings (#31947) --- selfdrive/ui/qt/offroad/settings.cc | 21 +++++++++++++++- selfdrive/ui/qt/offroad/settings.h | 3 +++ selfdrive/ui/qt/onroad.cc | 31 ++++++++++++++---------- selfdrive/ui/qt/onroad.h | 1 + selfdrive/ui/translations/main_ar.ts | 12 +++++++++ selfdrive/ui/translations/main_de.ts | 12 +++++++++ selfdrive/ui/translations/main_fr.ts | 12 +++++++++ selfdrive/ui/translations/main_ja.ts | 12 +++++++++ selfdrive/ui/translations/main_ko.ts | 12 +++++++++ selfdrive/ui/translations/main_pt-BR.ts | 12 +++++++++ selfdrive/ui/translations/main_th.ts | 12 +++++++++ selfdrive/ui/translations/main_tr.ts | 12 +++++++++ selfdrive/ui/translations/main_zh-CHS.ts | 12 +++++++++ selfdrive/ui/translations/main_zh-CHT.ts | 12 +++++++++ 14 files changed, 162 insertions(+), 14 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index bc7989b773..185d5457e3 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -16,6 +16,7 @@ #include "system/hardware/hw.h" #include "selfdrive/ui/qt/widgets/controls.h" #include "selfdrive/ui/qt/widgets/input.h" +#include "selfdrive/ui/qt/widgets/prime.h" #include "selfdrive/ui/qt/widgets/scrollview.h" #include "selfdrive/ui/qt/widgets/ssh_keys.h" #include "selfdrive/ui/qt/widgets/toggle.h" @@ -215,6 +216,14 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { addItem(new LabelControl(tr("Dongle ID"), getDongleId().value_or(tr("N/A")))); addItem(new LabelControl(tr("Serial"), params.get("HardwareSerial").c_str())); + pair_device = new ButtonControl(tr("Pair Device"), tr("Pair"), + tr("Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer.")); + connect(pair_device, &ButtonControl::clicked, [=]() { + PairingPopup popup(this); + popup.exec(); + }); + addItem(pair_device); + // offroad-only buttons auto dcamBtn = new ButtonControl(tr("Driver Camera"), tr("PREVIEW"), @@ -262,9 +271,14 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { }); addItem(translateBtn); + QObject::connect(uiState(), &UIState::primeChanged, [this] (bool prime) { + pair_device->setVisible(!prime); + }); QObject::connect(uiState(), &UIState::offroadTransition, [=](bool offroad) { for (auto btn : findChildren()) { - btn->setEnabled(offroad); + if (btn != pair_device) { + btn->setEnabled(offroad); + } } }); @@ -345,6 +359,11 @@ void DevicePanel::poweroff() { } } +void DevicePanel::showEvent(QShowEvent *event) { + pair_device->setVisible(!uiState()->primeType()); + ListWidget::showEvent(event); +} + void SettingsWindow::showEvent(QShowEvent *event) { setCurrentPanel(0); } diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index 581fc098f4..f9e1648447 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -43,6 +43,8 @@ class DevicePanel : public ListWidget { Q_OBJECT public: explicit DevicePanel(SettingsWindow *parent); + void showEvent(QShowEvent *event) override; + signals: void reviewTrainingGuide(); void showDriverView(); @@ -54,6 +56,7 @@ private slots: private: Params params; + ButtonControl *pair_device; }; class TogglesPanel : public ListWidget { diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 01750eaf2f..40ae436c65 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -105,26 +105,29 @@ void OnroadWindow::mousePressEvent(QMouseEvent* e) { QWidget::mousePressEvent(e); } +void OnroadWindow::createMapWidget() { +#ifdef ENABLE_MAPS + auto m = new MapPanel(get_mapbox_settings()); + map = m; + QObject::connect(m, &MapPanel::mapPanelRequested, this, &OnroadWindow::mapPanelRequested); + QObject::connect(nvg->map_settings_btn, &MapSettingsButton::clicked, m, &MapPanel::toggleMapSettings); + nvg->map_settings_btn->setEnabled(true); + + m->setFixedWidth(topWidget(this)->width() / 2 - UI_BORDER_SIZE); + split->insertWidget(0, m); + // hidden by default, made visible when navRoute is published + m->setVisible(false); +#endif +} + void OnroadWindow::offroadTransition(bool offroad) { #ifdef ENABLE_MAPS if (!offroad) { if (map == nullptr && (uiState()->hasPrime() || !MAPBOX_TOKEN.isEmpty())) { - auto m = new MapPanel(get_mapbox_settings()); - map = m; - - QObject::connect(m, &MapPanel::mapPanelRequested, this, &OnroadWindow::mapPanelRequested); - QObject::connect(nvg->map_settings_btn, &MapSettingsButton::clicked, m, &MapPanel::toggleMapSettings); - nvg->map_settings_btn->setEnabled(true); - - m->setFixedWidth(topWidget(this)->width() / 2 - UI_BORDER_SIZE); - split->insertWidget(0, m); - - // hidden by default, made visible when navRoute is published - m->setVisible(false); + createMapWidget(); } } #endif - alerts->updateAlert({}); } @@ -135,6 +138,8 @@ void OnroadWindow::primeChanged(bool prime) { nvg->map_settings_btn->setVisible(false); map->deleteLater(); map = nullptr; + } else if (!map && (prime || !MAPBOX_TOKEN.isEmpty())) { + createMapWidget(); } #endif } diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index b3ba411453..c72d1225e6 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -127,6 +127,7 @@ signals: void mapPanelRequested(); private: + void createMapWidget(); void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent* e) override; OnroadAlerts *alerts; diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 64cb8d9812..024ca0d4f6 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -293,6 +293,18 @@ Review مراجعة + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + اقرن جهازك بجهاز (connect.comma.ai) واحصل على عرضك من comma prime. + + + Pair Device + + + + Pair + + DriverViewWindow diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index e8bd89db9a..d849b27103 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -293,6 +293,18 @@ Review Überprüfen + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + Koppele dein Gerät mit Comma Connect (connect.comma.ai) und sichere dir dein Comma Prime Angebot. + + + Pair Device + + + + Pair + + DriverViewWindow diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index 340ab694ff..2294ba7af9 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -293,6 +293,18 @@ Disengage to Power Off Désengager pour éteindre + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + Associez votre appareil avec comma connect (connect.comma.ai) et profitez de l'offre comma prime. + + + Pair Device + + + + Pair + + DriverViewWindow diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 332b443ddd..7b07866efc 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -293,6 +293,18 @@ Review 確認 + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + デバイスを comma connect (connect.comma.ai)でペアリングし、comma primeの特典を申請してください。 + + + Pair Device + + + + Pair + + DriverViewWindow diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 48ccb1a712..e8fcb44228 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -293,6 +293,18 @@ Review 다시보기 + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + 장치를 comma connect (connect.comma.ai)에서 페어링하고 comma prime 무료 이용권을 사용하세요. + + + Pair Device + + + + Pair + + DriverViewWindow diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index fed4077667..a61f3a9949 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -293,6 +293,18 @@ Review Revisar + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + Pareie seu dispositivo com comma connect (connect.comma.ai) e reivindique sua oferta de comma prime. + + + Pair Device + + + + Pair + + DriverViewWindow diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index ff74ba66c6..eae564d645 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -293,6 +293,18 @@ Review ทบทวน + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + จับคู่อุปกรณ์ของคุณกับ comma connect (connect.comma.ai) และรับข้อเสนอ comma prime ของคุณ + + + Pair Device + + + + Pair + + DriverViewWindow diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index 69946fa318..33773af16b 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -293,6 +293,18 @@ Review + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + Cihazınızı comma connect (connect.comma.ai) ile eşleştirin ve comma prime aboneliğine göz atın. + + + Pair Device + + + + Pair + + DriverViewWindow diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 4a314c94bd..fa858b8a8c 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -293,6 +293,18 @@ Review 预览 + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + 将您的设备与comma connect (connect.comma.ai)配对并领取您的comma prime优惠。 + + + Pair Device + + + + Pair + + DriverViewWindow diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index b013890956..12ae9fbe13 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -293,6 +293,18 @@ Review 回顧 + + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. + 將您的設備與 comma connect (connect.comma.ai) 配對並領取您的 comma 高級會員優惠。 + + + Pair Device + + + + Pair + + DriverViewWindow From 77bbeb442ebeb66bcb00289df66084ee0475196e Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 22 Mar 2024 02:40:01 +0800 Subject: [PATCH 113/384] ui/cameraview: fix accessing uninitialized variable (#31951) --- selfdrive/ui/qt/widgets/cameraview.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/widgets/cameraview.cc b/selfdrive/ui/qt/widgets/cameraview.cc index 7818da8669..e4f1396268 100644 --- a/selfdrive/ui/qt/widgets/cameraview.cc +++ b/selfdrive/ui/qt/widgets/cameraview.cc @@ -98,7 +98,7 @@ mat4 get_fit_view_transform(float widget_aspect_ratio, float frame_aspect_ratio) } // namespace CameraWidget::CameraWidget(std::string stream_name, VisionStreamType type, bool zoom, QWidget* parent) : - stream_name(stream_name), requested_stream_type(type), zoomed_view(zoom), QOpenGLWidget(parent) { + stream_name(stream_name), active_stream_type(type), requested_stream_type(type), zoomed_view(zoom), QOpenGLWidget(parent) { setAttribute(Qt::WA_OpaquePaintEvent); qRegisterMetaType>("availableStreams"); QObject::connect(this, &CameraWidget::vipcThreadConnected, this, &CameraWidget::vipcConnected, Qt::BlockingQueuedConnection); From 9feb027de53d4ea7bcd8bee2177ef9df37340426 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 21 Mar 2024 11:41:08 -0700 Subject: [PATCH 114/384] bump panda --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 567dbfe6d8..86348b431f 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 567dbfe6d86ddda6d803da371942603c6dbe36c8 +Subproject commit 86348b431f78b58dfaafd78460aa70ff9b9a1c5d From c3bbc58a85f515c834e6f4eb92c2d0ec45c9317e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 21 Mar 2024 14:55:54 -0400 Subject: [PATCH 115/384] build nightly casync build in jenkins (#31880) * casync in jenkins * rename some stuff, add a readme * slightly better names * clean * more cleanup * cleaner * release3 staging too * always rm the signed version * cleanups * in build dir * better name * simpler * more * divider * built * build * and contains * add channel description * and git branches * and build required * move this up * these are terms * updates * 3/3x * bullets * wording * version metadata * git type * more channel -> release * more build * just release * more channel to release * also fix jenkins * use build_metadata * fix normailzed * also normalized * and here * use build_metadata * dont commit that * don't touch the git stuff * branch * don't need that * or that * improved names * build_metadata * use this instead * fix * build * test nightly build again * fix * fixes * Revert "test nightly build again" This reverts commit be5e7aa7089bfc0947c9b2b484d0277c109ee089. --- Jenkinsfile | 25 +++++++++++---- release/README.md | 44 ++++++++++++++++++++++++++ release/copy_build_files.sh | 15 +++++++++ release/create_casync_build.sh | 21 +++++++++++++ release/create_casync_release.py | 25 +++++++++++++++ release/create_prebuilt.sh | 34 ++++++++++++++++++++ release/upload_casync_release.sh | 9 ++++++ system/updated/casync/common.py | 53 ++++++++++++++++++++++++++++++++ 8 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 release/README.md create mode 100755 release/copy_build_files.sh create mode 100755 release/create_casync_build.sh create mode 100755 release/create_casync_release.py create mode 100755 release/create_prebuilt.sh create mode 100755 release/upload_casync_release.sh create mode 100644 system/updated/casync/common.py diff --git a/Jenkinsfile b/Jenkinsfile index 4afb3964f7..efe598c275 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -142,6 +142,23 @@ def setupCredentials() { } +def build_release(String channel_name) { + return parallel ( + "${channel_name} (git)": { + deviceStage("build git", "tici-needs-can", [], [ + ["build ${channel_name}", "RELEASE_BRANCH=${channel_name} $SOURCE_DIR/release/build_release.sh"], + ]) + }, + "${channel_name} (casync)": { + deviceStage("build casync", "tici-needs-can", [], [ + ["build ${channel_name}", "RELEASE=1 OPENPILOT_CHANNEL=${channel_name} BUILD_DIR=/data/openpilot_build CASYNC_DIR=/data/casync $SOURCE_DIR/release/create_casync_build.sh"], + //["upload ${channel_name}", "OPENPILOT_CHANNEL=${channel_name} $SOURCE_DIR/release/upload_casync_release.sh"], + ]) + } + ) +} + + node { env.CI = "1" env.PYTHONWARNINGS = "error" @@ -164,15 +181,11 @@ node { try { if (env.BRANCH_NAME == 'devel-staging') { - deviceStage("build release3-staging", "tici-needs-can", [], [ - ["build release3-staging", "RELEASE_BRANCH=release3-staging $SOURCE_DIR/release/build_release.sh"], - ]) + build_release("release3-staging") } if (env.BRANCH_NAME == 'master-ci') { - deviceStage("build nightly", "tici-needs-can", [], [ - ["build nightly", "RELEASE_BRANCH=nightly $SOURCE_DIR/release/build_release.sh"], - ]) + build_release("nightly") } if (!env.BRANCH_NAME.matches(excludeRegex)) { diff --git a/release/README.md b/release/README.md new file mode 100644 index 0000000000..77cd15ad69 --- /dev/null +++ b/release/README.md @@ -0,0 +1,44 @@ +# openpilot releases + + +## terms + +- `channel` - a named version of openpilot (git branch, casync caidx) which receives updates +- `build` - a release which is already built for the comma 3/3x and contains only required files for running openpilot and identifying the release + +- `build_style` - type of build, either `debug` or `release` + - `debug` - build with `ALLOW_DEBUG=true`, can test experimental features like longitudinal on alpha cars + - `release` - build with `ALLOW_DEBUG=false`, experimental features disabled + + +## openpilot channels + +| channel | build_style | description | +| ----------- | ----------- | ---------- | +| release | `release` | stable release of openpilot | +| staging | `release` | release candidate of openpilot for final verification | +| nightly | `release` | generated nightly from last commit passing CI tests | +| master | `debug` | current master commit with experimental features enabled | +| git branches | `debug` | installed manually, experimental features enabled, build required | + + +## creating casync build + +`create_casync_build.sh` - creates a casync openpilot build, ready to upload to `openpilot-releases` + +```bash +# run on a tici, within the directory you want to create the build from. +# creates a prebuilt version of openpilot into BUILD_DIR and outputs the caidx +# and other casync files into CASYNC_DIR for uploading to openpilot-releases. +BUILD_DIR=/data/openpilot_build \ +CASYNC_DIR=/data/casync \ +OPENPILOT_CHANNEL=nightly \ +release/create_casync_build.sh +``` + +`upload_casync_release.sh` - helper for uploading a casync build to `openpilot-releases` + + +## release builds + +to create a release build, set `RELEASE=1` environment variable when running the build script diff --git a/release/copy_build_files.sh b/release/copy_build_files.sh new file mode 100755 index 0000000000..31fd8af778 --- /dev/null +++ b/release/copy_build_files.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +SOURCE_DIR=$1 +TARGET_DIR=$2 + +if [ -f /TICI ]; then + FILES_SRC="release/files_tici" +else + echo "no release files set" + exit 1 +fi + +cd $SOURCE_DIR +cp -pR --parents $(cat release/files_common) $BUILD_DIR/ +cp -pR --parents $(cat $FILES_SRC) $TARGET_DIR/ diff --git a/release/create_casync_build.sh b/release/create_casync_build.sh new file mode 100755 index 0000000000..d41909a6ab --- /dev/null +++ b/release/create_casync_build.sh @@ -0,0 +1,21 @@ +#!/usr/bin/bash + +set -ex + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" + +CASYNC_DIR="${CASYNC_DIR:=/tmp/casync}" +SOURCE_DIR="$(git -C $DIR rev-parse --show-toplevel)" +BUILD_DIR="${BUILD_DIR:=$(mktemp -d)}" + +echo "Creating casync release from $SOURCE_DIR to $CASYNC_DIR" + +mkdir -p $CASYNC_DIR +rm -rf $BUILD_DIR +mkdir -p $BUILD_DIR + +release/copy_build_files.sh $SOURCE_DIR $BUILD_DIR +release/create_prebuilt.sh $BUILD_DIR + +cd $SOURCE_DIR +release/create_casync_release.py $BUILD_DIR $CASYNC_DIR $OPENPILOT_CHANNEL diff --git a/release/create_casync_release.py b/release/create_casync_release.py new file mode 100755 index 0000000000..8977e09abc --- /dev/null +++ b/release/create_casync_release.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import argparse +import pathlib + +from openpilot.system.updated.casync.common import create_caexclude_file, create_casync_release, create_build_metadata_file +from openpilot.system.version import get_build_metadata + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="creates a casync release") + parser.add_argument("target_dir", type=str, help="target directory to build channel from") + parser.add_argument("output_dir", type=str, help="output directory for the channel") + parser.add_argument("channel", type=str, help="what channel this build is") + args = parser.parse_args() + + target_dir = pathlib.Path(args.target_dir) + output_dir = pathlib.Path(args.output_dir) + + create_build_metadata_file(target_dir, get_build_metadata(), args.channel) + create_caexclude_file(target_dir) + + digest, caidx = create_casync_release(target_dir, output_dir, args.channel) + + print(f"Created casync release from {target_dir} to {caidx} with digest {digest}") diff --git a/release/create_prebuilt.sh b/release/create_prebuilt.sh new file mode 100755 index 0000000000..6d3768c536 --- /dev/null +++ b/release/create_prebuilt.sh @@ -0,0 +1,34 @@ +#!/usr/bin/bash -e + +# runs on tici to create a prebuilt version of a release + +set -ex + +BUILD_DIR=$1 + +cd $BUILD_DIR + +# Build +export PYTHONPATH="$BUILD_DIR" + +rm -f panda/board/obj/panda.bin.signed +rm -f panda/board/obj/panda_h7.bin.signed + +if [ -n "$RELEASE" ]; then + export CERT=/data/pandaextra/certs/release +fi + +scons -j$(nproc) + +# Cleanup +find . -name '*.a' -delete +find . -name '*.o' -delete +find . -name '*.os' -delete +find . -name '*.pyc' -delete +find . -name 'moc_*' -delete +find . -name '__pycache__' -delete +rm -rf .sconsign.dblite Jenkinsfile release/ +rm selfdrive/modeld/models/supercombo.onnx + +# Mark as prebuilt release +touch prebuilt diff --git a/release/upload_casync_release.sh b/release/upload_casync_release.sh new file mode 100755 index 0000000000..02ced8338e --- /dev/null +++ b/release/upload_casync_release.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +CASYNC_DIR="${CASYNC_DIR:=/tmp/casync}" + +OPENPILOT_RELEASES="https://commadist.blob.core.windows.net/openpilot-releases/" + +SAS="$(python -c 'from tools.lib.azure_container import get_container_sas;print(get_container_sas("commadist","openpilot-releases"))')" + +azcopy cp "$CASYNC_DIR*" "$OPENPILOT_RELEASES?$SAS" --recursive diff --git a/system/updated/casync/common.py b/system/updated/casync/common.py new file mode 100644 index 0000000000..1703c74a76 --- /dev/null +++ b/system/updated/casync/common.py @@ -0,0 +1,53 @@ +import dataclasses +import json +import pathlib +import subprocess + +from openpilot.system.version import BUILD_METADATA_FILENAME, BuildMetadata + + +CASYNC_ARGS = ["--with=symlinks", "--with=permissions"] +CASYNC_FILES = [BUILD_METADATA_FILENAME, ".caexclude"] + + +def run(cmd): + return subprocess.check_output(cmd) + + +def get_exclude_set(path) -> set[str]: + exclude_set = set(CASYNC_FILES) + + for file in path.rglob("*"): + if file.is_file() or file.is_symlink(): + + while file.resolve() != path.resolve(): + exclude_set.add(str(file.relative_to(path))) + + file = file.parent + + return exclude_set + + +def create_caexclude_file(path: pathlib.Path): + with open(path / ".caexclude", "w") as f: + # exclude everything except the paths already in the release + f.write("*\n") + f.write(".*\n") + + for file in sorted(get_exclude_set(path)): + f.write(f"!{file}\n") + + +def create_build_metadata_file(path: pathlib.Path, build_metadata: BuildMetadata, channel: str): + with open(path / BUILD_METADATA_FILENAME, "w") as f: + build_metadata_dict = dataclasses.asdict(build_metadata) + build_metadata_dict["channel"] = channel + build_metadata_dict["openpilot"].pop("is_dirty") # this is determined at runtime + f.write(json.dumps(build_metadata_dict)) + + +def create_casync_release(target_dir: pathlib.Path, output_dir: pathlib.Path, channel: str): + caidx_file = output_dir / f"{channel}.caidx" + run(["casync", "make", *CASYNC_ARGS, caidx_file, target_dir]) + digest = run(["casync", "digest", *CASYNC_ARGS, target_dir]).decode("utf-8").strip() + return digest, caidx_file From efc32c2930a7d85fbdd308e1d9110ff270e4667d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 21 Mar 2024 15:58:16 -0400 Subject: [PATCH 116/384] common/run: add environment variable argument (#31957) run add environment argument --- common/run.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/run.py b/common/run.py index c1a36bf041..06deb6388d 100644 --- a/common/run.py +++ b/common/run.py @@ -1,13 +1,13 @@ import subprocess -def run_cmd(cmd: list[str], cwd=None) -> str: - return subprocess.check_output(cmd, encoding='utf8', cwd=cwd).strip() +def run_cmd(cmd: list[str], cwd=None, env=None) -> str: + return subprocess.check_output(cmd, encoding='utf8', cwd=cwd, env=env).strip() -def run_cmd_default(cmd: list[str], default: str = "", cwd=None) -> str: +def run_cmd_default(cmd: list[str], default: str = "", cwd=None, env=None) -> str: try: - return run_cmd(cmd, cwd=cwd) + return run_cmd(cmd, cwd=cwd, env=env) except subprocess.CalledProcessError: return default From c197b3f52c6c3698a0c917fe24caf4766b1f96a8 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 21 Mar 2024 16:00:30 -0400 Subject: [PATCH 117/384] add helper for creating build_metadata from a dict (#31958) helper --- system/version.py | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/system/version.py b/system/version.py index f370beb4ae..ab8082dce2 100755 --- a/system/version.py +++ b/system/version.py @@ -104,28 +104,30 @@ class BuildMetadata: return self.channel in RELEASE_BRANCHES +def build_metadata_from_dict(build_metadata: dict) -> BuildMetadata: + channel = build_metadata.get("channel", "unknown") + openpilot_metadata = build_metadata.get("openpilot", {}) + version = openpilot_metadata.get("version", "unknown") + release_notes = openpilot_metadata.get("release_notes", "unknown") + git_commit = openpilot_metadata.get("git_commit", "unknown") + git_origin = openpilot_metadata.get("git_origin", "unknown") + git_commit_date = openpilot_metadata.get("git_commit_date", "unknown") + return BuildMetadata(channel, + OpenpilotMetadata( + version=version, + release_notes=release_notes, + git_commit=git_commit, + git_origin=git_origin, + git_commit_date=git_commit_date, + is_dirty=False)) + def get_build_metadata(path: str = BASEDIR) -> BuildMetadata: build_metadata_path = pathlib.Path(path) / BUILD_METADATA_FILENAME if build_metadata_path.exists(): build_metadata = json.loads(build_metadata_path.read_text()) - openpilot_metadata = build_metadata.get("openpilot", {}) - - channel = build_metadata.get("channel", "unknown") - version = openpilot_metadata.get("version", "unknown") - release_notes = openpilot_metadata.get("release_notes", "unknown") - git_commit = openpilot_metadata.get("git_commit", "unknown") - git_origin = openpilot_metadata.get("git_origin", "unknown") - git_commit_date = openpilot_metadata.get("git_commit_date", "unknown") - return BuildMetadata(channel, - OpenpilotMetadata( - version=version, - release_notes=release_notes, - git_commit=git_commit, - git_origin=git_origin, - git_commit_date=git_commit_date, - is_dirty=False)) + return build_metadata_from_dict(build_metadata) git_folder = pathlib.Path(path) / ".git" From db9aec2a3b79ae24c6cc7c2b657ba4bf4a8cb620 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 21 Mar 2024 14:00:45 -0700 Subject: [PATCH 118/384] remove rest of GMLAN (#31960) --- cereal | 2 +- panda | 2 +- selfdrive/boardd/boardd.cc | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cereal b/cereal index 430535068a..6bfd39a506 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 430535068ac3bb94d3e117a3cfbc348ef37eb72d +Subproject commit 6bfd39a506c5123949ecf58831bfe48f938e6143 diff --git a/panda b/panda index 86348b431f..de061e4f73 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 86348b431f78b58dfaafd78460aa70ff9b9a1c5d +Subproject commit de061e4f7317dbacc206ef5f038d35a17e8ef0e7 diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index c4db1eab40..22747d0918 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -316,7 +316,6 @@ std::optional send_panda_states(PubMaster *pm, const std::vector ps.setControlsAllowed(health.controls_allowed_pkt); ps.setTxBufferOverflow(health.tx_buffer_overflow_pkt); ps.setRxBufferOverflow(health.rx_buffer_overflow_pkt); - ps.setGmlanSendErrs(health.gmlan_send_errs_pkt); ps.setPandaType(panda->hw_type); ps.setSafetyModel(cereal::CarParams::SafetyModel(health.safety_mode_pkt)); ps.setSafetyParam(health.safety_param_pkt); From d9c2928e730febcf1ddb866a92cb38094dce74d2 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 21 Mar 2024 14:32:13 -0700 Subject: [PATCH 119/384] boardd: keep same offset for now --- selfdrive/boardd/boardd.cc | 2 +- selfdrive/boardd/panda.cc | 2 +- selfdrive/boardd/panda.h | 2 ++ selfdrive/boardd/tests/test_boardd_usbprotocol.cc | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index 22747d0918..fcbf58999e 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -144,7 +144,7 @@ bool safety_setter_thread(std::vector pandas) { Panda *connect(std::string serial="", uint32_t index=0) { std::unique_ptr panda; try { - panda = std::make_unique(serial, (index * PANDA_BUS_CNT)); + panda = std::make_unique(serial, (index * PANDA_BUS_OFFSET)); } catch (std::exception &e) { return nullptr; } diff --git a/selfdrive/boardd/panda.cc b/selfdrive/boardd/panda.cc index 95cfe04efd..a2e5574090 100644 --- a/selfdrive/boardd/panda.cc +++ b/selfdrive/boardd/panda.cc @@ -172,7 +172,7 @@ void Panda::pack_can_buffer(const capnp::List::Reader &can_data for (auto cmsg : can_data_list) { // check if the message is intended for this panda uint8_t bus = cmsg.getSrc(); - if (bus < bus_offset || bus >= (bus_offset + PANDA_BUS_CNT)) { + if (bus < bus_offset || bus >= (bus_offset + PANDA_BUS_OFFSET)) { continue; } auto can_data = cmsg.getDat(); diff --git a/selfdrive/boardd/panda.h b/selfdrive/boardd/panda.h index f46150dd95..3002afeba9 100644 --- a/selfdrive/boardd/panda.h +++ b/selfdrive/boardd/panda.h @@ -23,6 +23,8 @@ #define CAN_REJECTED_BUS_OFFSET 0xC0U #define CAN_RETURNED_BUS_OFFSET 0x80U +#define PANDA_BUS_OFFSET 4 + struct __attribute__((packed)) can_header { uint8_t reserved : 1; uint8_t bus : 3; diff --git a/selfdrive/boardd/tests/test_boardd_usbprotocol.cc b/selfdrive/boardd/tests/test_boardd_usbprotocol.cc index 86476d05cd..aa67e8cf8c 100644 --- a/selfdrive/boardd/tests/test_boardd_usbprotocol.cc +++ b/selfdrive/boardd/tests/test_boardd_usbprotocol.cc @@ -40,7 +40,7 @@ PandaTest::PandaTest(uint32_t bus_offset_, int can_list_size, cereal::PandaState uint32_t id = util::random_int(0, std::size(dlc_to_len) - 1); const std::string &dat = test_data[dlc_to_len[id]]; can.setAddress(i); - can.setSrc(util::random_int(0, 3) + bus_offset); + can.setSrc(util::random_int(0, 2) + bus_offset); can.setDat(kj::ArrayPtr((uint8_t *)dat.data(), dat.size())); total_pakets_size += sizeof(can_header) + dat.size(); } From b59ae50961244de60b7bc426e5566c24278adc85 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Thu, 21 Mar 2024 23:19:59 +0000 Subject: [PATCH 120/384] Ford: handle metric cruise speed (v2) (#31463) * Ford: handle metric cruise speed (v2) **Description** I found a signal which appears to match the IPC "Show km/h" setting. Requires https://github.com/commaai/opendbc/pull/1010. **Verification** - [ ] Test in car and confirm that toggling the "Show km/h" setting does not result in the cruise speed shown in openpilot being incorrect. - [ ] Test in a non-English (metric) car. * not present on Q4 * fix freq * test * Revert "test" This reverts commit 5e3a9f6df126d51685157de1e52bd6695db40fac. * Update ref_commit --------- Co-authored-by: Shane Smiskol --- selfdrive/car/ford/carstate.py | 7 ++++++- selfdrive/test/process_replay/ref_commit | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/ford/carstate.py b/selfdrive/car/ford/carstate.py index b3ee6a4649..78f48ec5c4 100644 --- a/selfdrive/car/ford/carstate.py +++ b/selfdrive/car/ford/carstate.py @@ -57,7 +57,8 @@ class CarState(CarStateBase): ret.steerFaultTemporary |= cp.vl["Lane_Assist_Data3_FD1"]["LatCtlSte_D_Stat"] not in (1, 2, 3) # cruise state - ret.cruiseState.speed = cp.vl["EngBrakeData"]["Veh_V_DsplyCcSet"] * CV.MPH_TO_MS + is_metric = cp.vl["INSTRUMENT_PANEL"]["METRIC_UNITS"] == 1 if not self.CP.flags & FordFlags.CANFD else False + ret.cruiseState.speed = cp.vl["EngBrakeData"]["Veh_V_DsplyCcSet"] * (CV.KPH_TO_MS if is_metric else CV.MPH_TO_MS) ret.cruiseState.enabled = cp.vl["EngBrakeData"]["CcStat_D_Actl"] in (4, 5) ret.cruiseState.available = cp.vl["EngBrakeData"]["CcStat_D_Actl"] in (3, 4, 5) ret.cruiseState.nonAdaptive = cp.vl["Cluster_Info1_FD1"]["AccEnbl_B_RqDrv"] == 0 @@ -131,6 +132,10 @@ class CarState(CarStateBase): messages += [ ("Lane_Assist_Data3_FD1", 33), ] + else: + messages += [ + ("INSTRUMENT_PANEL", 1), + ] if CP.transmissionType == TransmissionType.automatic: messages += [ diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 7defed3f68..4bb8cd01e9 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -4e5e37be9d70450154f8b100ed88151bb3612331 \ No newline at end of file +f77699bfd783ab0c9a419f2af883b36aed20cc68 \ No newline at end of file From 33f9193c94d3afb9120369e6557ddcd71133c5ee Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 21 Mar 2024 19:41:40 -0400 Subject: [PATCH 121/384] casync build: caidx filename is canonical representation of build (#31964) * canonical * short commit * channel * cleanup * let's do 9 characters * fixes * set the build style during release creation * as a property --- release/copy_build_files.sh | 2 +- release/create_casync_release.py | 8 ++++++-- system/updated/casync/common.py | 4 ++-- system/version.py | 12 ++++++++++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/release/copy_build_files.sh b/release/copy_build_files.sh index 31fd8af778..b40bd4b763 100755 --- a/release/copy_build_files.sh +++ b/release/copy_build_files.sh @@ -11,5 +11,5 @@ else fi cd $SOURCE_DIR -cp -pR --parents $(cat release/files_common) $BUILD_DIR/ +cp -pR --parents $(cat release/files_common) $TARGET_DIR/ cp -pR --parents $(cat $FILES_SRC) $TARGET_DIR/ diff --git a/release/create_casync_release.py b/release/create_casync_release.py index 8977e09abc..9aa75eca5d 100755 --- a/release/create_casync_release.py +++ b/release/create_casync_release.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import argparse +import os import pathlib from openpilot.system.updated.casync.common import create_caexclude_file, create_casync_release, create_build_metadata_file @@ -17,9 +18,12 @@ if __name__ == "__main__": target_dir = pathlib.Path(args.target_dir) output_dir = pathlib.Path(args.output_dir) - create_build_metadata_file(target_dir, get_build_metadata(), args.channel) + build_metadata = get_build_metadata() + build_metadata.openpilot.build_style = "release" if os.environ.get("RELEASE", None) is not None else "debug" + + create_build_metadata_file(target_dir, build_metadata, args.channel) create_caexclude_file(target_dir) - digest, caidx = create_casync_release(target_dir, output_dir, args.channel) + digest, caidx = create_casync_release(target_dir, output_dir, build_metadata.canonical) print(f"Created casync release from {target_dir} to {caidx} with digest {digest}") diff --git a/system/updated/casync/common.py b/system/updated/casync/common.py index 1703c74a76..7061689c66 100644 --- a/system/updated/casync/common.py +++ b/system/updated/casync/common.py @@ -46,8 +46,8 @@ def create_build_metadata_file(path: pathlib.Path, build_metadata: BuildMetadata f.write(json.dumps(build_metadata_dict)) -def create_casync_release(target_dir: pathlib.Path, output_dir: pathlib.Path, channel: str): - caidx_file = output_dir / f"{channel}.caidx" +def create_casync_release(target_dir: pathlib.Path, output_dir: pathlib.Path, caidx_name: str): + caidx_file = output_dir / f"{caidx_name}.caidx" run(["casync", "make", *CASYNC_ARGS, caidx_file, target_dir]) digest = run(["casync", "digest", *CASYNC_ARGS, target_dir]).decode("utf-8").strip() return digest, caidx_file diff --git a/system/version.py b/system/version.py index ab8082dce2..902f013469 100755 --- a/system/version.py +++ b/system/version.py @@ -62,13 +62,14 @@ def is_dirty(cwd: str = BASEDIR) -> bool: return dirty -@dataclass(frozen=True) +@dataclass class OpenpilotMetadata: version: str release_notes: str git_commit: str git_origin: str git_commit_date: str + build_style: str is_dirty: bool # whether there are local changes @property @@ -90,7 +91,7 @@ class OpenpilotMetadata: .replace(":", "/", 1) -@dataclass(frozen=True) +@dataclass class BuildMetadata: channel: str openpilot: OpenpilotMetadata @@ -103,6 +104,10 @@ class BuildMetadata: def release_channel(self) -> bool: return self.channel in RELEASE_BRANCHES + @property + def canonical(self) -> str: + return f"{self.openpilot.version}-{self.openpilot.git_commit}-{self.openpilot.build_style}" + def build_metadata_from_dict(build_metadata: dict) -> BuildMetadata: channel = build_metadata.get("channel", "unknown") @@ -112,6 +117,7 @@ def build_metadata_from_dict(build_metadata: dict) -> BuildMetadata: git_commit = openpilot_metadata.get("git_commit", "unknown") git_origin = openpilot_metadata.get("git_origin", "unknown") git_commit_date = openpilot_metadata.get("git_commit_date", "unknown") + build_style = openpilot_metadata.get("build_style", "unknown") return BuildMetadata(channel, OpenpilotMetadata( version=version, @@ -119,6 +125,7 @@ def build_metadata_from_dict(build_metadata: dict) -> BuildMetadata: git_commit=git_commit, git_origin=git_origin, git_commit_date=git_commit_date, + build_style=build_style, is_dirty=False)) @@ -139,6 +146,7 @@ def get_build_metadata(path: str = BASEDIR) -> BuildMetadata: git_commit=get_commit(path), git_origin=get_origin(path), git_commit_date=get_commit_date(path), + build_style="unknown", is_dirty=is_dirty(path))) cloudlog.exception("unable to get build metadata") From 0cca1bb91a214ea2005d3e22b98df9714450770b Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 21 Mar 2024 20:21:36 -0400 Subject: [PATCH 122/384] add system/updated to release (#31966) * add updated * all --- release/files_common | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/release/files_common b/release/files_common index 94af70eff2..b00f99906b 100644 --- a/release/files_common +++ b/release/files_common @@ -55,7 +55,7 @@ selfdrive/sentry.py selfdrive/tombstoned.py selfdrive/statsd.py -selfdrive/updated/* +selfdrive/updated/** system/logmessaged.py system/micd.py @@ -187,6 +187,8 @@ system/ubloxd/generated/* system/ubloxd/*.h system/ubloxd/*.cc +system/updated/* + selfdrive/locationd/__init__.py selfdrive/locationd/SConscript selfdrive/locationd/.gitignore From 4ecbaa41fae93d13fd0de805e216b670541a0084 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 21 Mar 2024 21:31:22 -0400 Subject: [PATCH 123/384] controlsd: fix steer saturation premature warning (#31909) fix last actuators --- selfdrive/controls/controlsd.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index e6f91130b9..72f1514d88 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -143,6 +143,7 @@ class Controls: self.logged_comm_issue = None self.not_running_prev = None self.steer_limited = False + self.last_actuators = car.CarControl.Actuators.new_message() self.desired_curvature = 0.0 self.experimental_mode = False self.personality = self.read_personality_param() @@ -620,7 +621,7 @@ class Controls: undershooting = abs(lac_log.desiredLateralAccel) / abs(1e-3 + lac_log.actualLateralAccel) > 1.2 turning = abs(lac_log.desiredLateralAccel) > 1.0 good_speed = CS.vEgo > 5 - max_torque = abs(actuators.steer) > 0.99 + max_torque = abs(self.last_actuators.steer) > 0.99 if undershooting and turning and good_speed and max_torque: lac_log.active and self.events.add(EventName.steerSaturated) elif lac_log.saturated: @@ -727,6 +728,7 @@ class Controls: if not self.CP.passive and self.initialized: self.card.controls_update(CC) + self.last_actuators = CO.actuatorsOutput if self.CP.steerControlType == car.CarParams.SteerControlType.angle: self.steer_limited = abs(CC.actuators.steeringAngleDeg - CO.actuatorsOutput.steeringAngleDeg) > \ STEER_ANGLE_SATURATION_THRESHOLD From 108e033af32f37bfd78471a15584a051e666742e Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Thu, 21 Mar 2024 21:39:05 -0400 Subject: [PATCH 124/384] PlotJuggler: Update controls mismatch layout (#31965) * PlotJuggler: Update controls mismatch layout * Revert "PlotJuggler: Update controls mismatch layout" This reverts commit 665e6451f1f68bd300ad306a5bd7c8e6e2e61954. * minimize diff --- tools/plotjuggler/layouts/controls_mismatch_debug.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/plotjuggler/layouts/controls_mismatch_debug.xml b/tools/plotjuggler/layouts/controls_mismatch_debug.xml index 54586d6e7b..7f9def379c 100644 --- a/tools/plotjuggler/layouts/controls_mismatch_debug.xml +++ b/tools/plotjuggler/layouts/controls_mismatch_debug.xml @@ -24,6 +24,7 @@ + From d5cd457f827d698a1f4298d8efdda9800a87c018 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 21 Mar 2024 18:49:18 -0700 Subject: [PATCH 125/384] Honda Civic 2022: fix spotty camera query (#31963) * no extra ecu * cmt * documentation * update refs * nice * for testing * byebye * Update launch_openpilot.sh --- selfdrive/car/honda/values.py | 22 +++++++++------------- selfdrive/car/tests/test_fw_fingerprint.py | 4 ++-- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 1f59bd24d0..ceb1d4f27e 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -261,9 +261,9 @@ class CAR(Platforms): ) -HONDA_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ +HONDA_ALT_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ p16(0xF112) -HONDA_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ +HONDA_ALT_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ p16(0xF112) FW_QUERY_CONFIG = FwQueryConfig( @@ -276,17 +276,10 @@ FW_QUERY_CONFIG = FwQueryConfig( ), # Data collection requests: - # Attempt to get the radarless Civic 2022+ camera FW + # Log manufacturer-specific identifier for current ECUs Request( - [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.UDS_VERSION_REQUEST], - [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.UDS_VERSION_RESPONSE], - bus=0, - logging=True - ), - # Log extra identifiers for current ECUs - Request( - [HONDA_VERSION_REQUEST], - [HONDA_VERSION_RESPONSE], + [HONDA_ALT_VERSION_REQUEST], + [HONDA_ALT_VERSION_RESPONSE], bus=1, logging=True, ), @@ -326,7 +319,10 @@ FW_QUERY_CONFIG = FwQueryConfig( }, extra_ecus=[ # The only other ECU on PT bus accessible by camera on radarless Civic - (Ecu.unknown, 0x18DAB3F1, None), + # This is likely a manufacturer-specific sub-address implementation: the camera responds to this and 0x18dab0f1 + # Unclear what the part number refers to: 8S103 is 'Camera Set Mono', while 36160 is 'Camera Monocular - Honda' + # TODO: add query back, camera does not support querying both in parallel and 0x18dab0f1 often fails to respond + # (Ecu.unknown, 0x18DAB3F1, None), ], ) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index d9bea3b965..17ffc358f1 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -263,14 +263,14 @@ class TestFwFingerprintTiming(unittest.TestCase): print(f'get_vin {name} case, query time={self.total_time / self.N} seconds') def test_fw_query_timing(self): - total_ref_time = {1: 8.6, 2: 9.5} + total_ref_time = {1: 8.5, 2: 9.4} brand_ref_times = { 1: { 'gm': 1.0, 'body': 0.1, 'chrysler': 0.3, 'ford': 1.5, - 'honda': 0.55, + 'honda': 0.45, 'hyundai': 1.05, 'mazda': 0.1, 'nissan': 0.8, From 3ca113162e52928681d996380b607d9b19ece270 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 21 Mar 2024 19:32:11 -0700 Subject: [PATCH 126/384] speedup panda startup + test (#31955) * faster panda startup * 10hz signal * more iters * nothing * comment * usb is slow :/ --------- Co-authored-by: Comma Device --- selfdrive/boardd/pandad.py | 5 +--- selfdrive/boardd/tests/test_pandad.py | 37 +++++++++++++++++++-------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/selfdrive/boardd/pandad.py b/selfdrive/boardd/pandad.py index cf9938ec1d..9158a51469 100755 --- a/selfdrive/boardd/pandad.py +++ b/selfdrive/boardd/pandad.py @@ -155,10 +155,7 @@ def main() -> NoReturn: if first_run: # reset panda to ensure we're in a good state cloudlog.info(f"Resetting panda {panda.get_usb_serial()}") - if panda.is_internal(): - HARDWARE.reset_internal_panda() - else: - panda.reset(reconnect=False) + panda.reset(reconnect=False) for p in pandas: p.close() diff --git a/selfdrive/boardd/tests/test_pandad.py b/selfdrive/boardd/tests/test_pandad.py index 21cc0b5f37..9d7d0063f1 100755 --- a/selfdrive/boardd/tests/test_pandad.py +++ b/selfdrive/boardd/tests/test_pandad.py @@ -23,23 +23,28 @@ class TestPandad(unittest.TestCase): if len(Panda.list()) == 0: self._run_test(60) + self.spi = HARDWARE.get_device_type() != 'tici' + def tearDown(self): managed_processes['pandad'].stop() - def _run_test(self, timeout=30): - managed_processes['pandad'].start() + def _run_test(self, timeout=30) -> float: + st = time.monotonic() + sm = messaging.SubMaster(['pandaStates']) - sm = messaging.SubMaster(['peripheralState']) - for _ in range(timeout*10): + managed_processes['pandad'].start() + while (time.monotonic() - st) < timeout: sm.update(100) - if sm['peripheralState'].pandaType != log.PandaState.PandaType.unknown: + if len(sm['pandaStates']) and sm['pandaStates'][0].pandaType != log.PandaState.PandaType.unknown: break - + dt = time.monotonic() - st managed_processes['pandad'].stop() - if sm['peripheralState'].pandaType == log.PandaState.PandaType.unknown: + if len(sm['pandaStates']) == 0 or sm['pandaStates'][0].pandaType == log.PandaState.PandaType.unknown: raise Exception("boardd failed to start") + return dt + def _go_to_dfu(self): HARDWARE.recover_internal_panda() assert Panda.wait_for_dfu(None, 10) @@ -88,14 +93,24 @@ class TestPandad(unittest.TestCase): assert any(Panda(s).is_internal() for s in Panda.list()) def test_best_case_startup_time(self): - # run once so we're setup + # run once so we're up to date self._run_test(60) - # should be fast this time - self._run_test(8) + ts = [] + for _ in range(10): + # should be nearly instant this time + dt = self._run_test(5) + ts.append(dt) + + # 2s for SPI, 5s for USB (due to enumeration) + # 0.2s pandad -> boardd + # 1.1s panda boot time (FIXME: it's all the drivers/harness.h init) + # plus some buffer + assert 1.0 < (sum(ts)/len(ts)) < (2.0 if self.spi else 5.0) + print("startup times", ts, sum(ts) / len(ts)) def test_protocol_version_check(self): - if HARDWARE.get_device_type() == 'tici': + if not self.spi: raise unittest.SkipTest("SPI test") # flash old fw fn = os.path.join(HERE, "bootstub.panda_h7_spiv0.bin") From ceaff0d96370a5cb0f15de27ae6e3a8bd9764c72 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 21 Mar 2024 20:00:15 -0700 Subject: [PATCH 127/384] Honda Civic 2022: allow fingerprinting without comma power (#31967) * do civic 2022 * new lines --- selfdrive/car/honda/values.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index ceb1d4f27e..36cdbc8732 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -300,17 +300,18 @@ FW_QUERY_CONFIG = FwQueryConfig( # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present non_essential_ecus={ - Ecu.programmedFuelInjection: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_PILOT], - Ecu.transmission: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_PILOT], - Ecu.srs: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], - Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E], - Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, + Ecu.programmedFuelInjection: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, + CAR.HONDA_PILOT], + Ecu.transmission: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, CAR.HONDA_PILOT], + Ecu.srs: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E], + Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E], + Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT], - Ecu.combinationMeter: [CAR.ACURA_ILX, CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, + Ecu.combinationMeter: [CAR.ACURA_ILX, CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_FIT, CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY_CHN], - Ecu.gateway: [CAR.ACURA_ILX, CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_FIT, CAR.HONDA_FREED, - CAR.HONDA_HRV, CAR.HONDA_RIDGELINE, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY, - CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_PILOT], + Ecu.gateway: [CAR.ACURA_ILX, CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_FIT, + CAR.HONDA_FREED, CAR.HONDA_HRV, CAR.HONDA_RIDGELINE, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, + CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_PILOT], Ecu.electricBrakeBooster: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], # existence correlates with transmission type for Accord ICE Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_PILOT], From 9315d0e7a5698a7fbcbdd23ce96450c7629f88fc Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 22 Mar 2024 11:10:29 +0800 Subject: [PATCH 128/384] ui/map_eta: round remaining km/mi to one decimal place (#31968) round distance --- selfdrive/ui/qt/maps/map_helpers.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/selfdrive/ui/qt/maps/map_helpers.cc b/selfdrive/ui/qt/maps/map_helpers.cc index 3907ff7b05..16923f7a43 100644 --- a/selfdrive/ui/qt/maps/map_helpers.cc +++ b/selfdrive/ui/qt/maps/map_helpers.cc @@ -137,17 +137,17 @@ std::optional coordinate_from_param(const std::string &pa // return {distance, unit} std::pair map_format_distance(float d, bool is_metric) { - auto round_distance = [](float d) -> float { - return (d > 10) ? std::nearbyint(d) : std::nearbyint(d * 10) / 10.0; + auto round_distance = [](float d) -> QString { + return (d > 10) ? QString::number(std::nearbyint(d)) : QString::number(std::nearbyint(d * 10) / 10.0, 'f', 1); }; d = std::max(d, 0.0f); if (is_metric) { - return (d > 500) ? std::pair{QString::number(round_distance(d / 1000)), QObject::tr("km")} + return (d > 500) ? std::pair{round_distance(d / 1000), QObject::tr("km")} : std::pair{QString::number(50 * std::nearbyint(d / 50)), QObject::tr("m")}; } else { float feet = d * METER_TO_FOOT; - return (feet > 500) ? std::pair{QString::number(round_distance(d * METER_TO_MILE)), QObject::tr("mi")} + return (feet > 500) ? std::pair{round_distance(d * METER_TO_MILE), QObject::tr("mi")} : std::pair{QString::number(50 * std::nearbyint(d / 50)), QObject::tr("ft")}; } } From 695fb1b5bf334db470ed4bde95ca0ef364a07b59 Mon Sep 17 00:00:00 2001 From: Marius David Date: Fri, 22 Mar 2024 05:48:04 +0200 Subject: [PATCH 129/384] VW: Octavia Scout 2018 fingerprint (#31094) Update all submodules to latest Co-authored-by: Shane Smiskol --- docs/CARS.md | 3 ++- selfdrive/car/volkswagen/fingerprints.py | 3 +++ selfdrive/car/volkswagen/values.py | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/CARS.md b/docs/CARS.md index 35a77fd78f..570c373f33 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -4,7 +4,7 @@ A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. -# 289 Supported Cars +# 290 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -215,6 +215,7 @@ A supported vehicle is one that just works when you install a comma device. All |Škoda|Kodiaq 2017-23[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Škoda|Octavia 2015-19[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Škoda|Octavia RS 2016[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Octavia Scout 2017-19[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Škoda|Scala 2020-23[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| |Škoda|Superb 2015-22[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Alphard 2019-20|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 71aee67815..96d721bd56 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -1069,6 +1069,7 @@ FW_VERSIONS = { b'\xf1\x8704L906026BP\xf1\x897608', b'\xf1\x8704L906026BS\xf1\x891541', b'\xf1\x875G0906259C \xf1\x890002', + b'\xf1\x8704L906026BT\xf1\x897612', ], (Ecu.transmission, 0x7e1, None): [ b'\xf1\x870CW300041L \xf1\x891601', @@ -1080,6 +1081,7 @@ FW_VERSIONS = { b'\xf1\x870D9300041H \xf1\x895220', b'\xf1\x870D9300041J \xf1\x894902', b'\xf1\x870D9300041P \xf1\x894507', + b'\xf1\x870D9300014T \xf1\x895221', ], (Ecu.srs, 0x715, None): [ b'\xf1\x873Q0959655AC\xf1\x890200\xf1\x82\r11120011100010022212110200', @@ -1099,6 +1101,7 @@ FW_VERSIONS = { b'\xf1\x875Q0909144R \xf1\x891061\xf1\x82\x0516A00604A1', b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521T00601A1', b'\xf1\x875QD909144E \xf1\x891081\xf1\x82\x0521T00503A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521T00603A1', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x875Q0907567P \xf1\x890100\xf1\x82\x0101', diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index ab4008d643..86b0dbd7aa 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -334,6 +334,7 @@ class CAR(Platforms): [ VWCarDocs("Škoda Octavia 2015-19"), VWCarDocs("Škoda Octavia RS 2016"), + VWCarDocs("Škoda Octavia Scout 2017-19"), ], VolkswagenCarSpecs(mass=1388, wheelbase=2.68), ) From a785a71190c7846577e45b7787dde4a3faf974e5 Mon Sep 17 00:00:00 2001 From: Pedro Nascimento de Lima Date: Fri, 22 Mar 2024 15:58:56 -0400 Subject: [PATCH 130/384] Mazda CX-5 2024 fingerprint (#31974) mazda cx5 2024 fingerprint --- selfdrive/car/mazda/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/mazda/fingerprints.py b/selfdrive/car/mazda/fingerprints.py index e7396d566e..f30bc1b5cd 100644 --- a/selfdrive/car/mazda/fingerprints.py +++ b/selfdrive/car/mazda/fingerprints.py @@ -10,6 +10,7 @@ FW_VERSIONS = { ], (Ecu.engine, 0x7e0, None): [ b'PEW5-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2D-188K2-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PW67-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2G-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2H-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -38,6 +39,7 @@ FW_VERSIONS = { b'PXFG-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYB2-21PS1-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYB2-21PS1-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYJ3-21PS1-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'SH51-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, From 7cbf3a54f11c1b33627bb30eed3de38640b77fe2 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 22 Mar 2024 16:20:11 -0400 Subject: [PATCH 131/384] casync: use xz compression (#31977) use xz compression --- system/updated/casync/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/updated/casync/common.py b/system/updated/casync/common.py index 7061689c66..b5fb4d5802 100644 --- a/system/updated/casync/common.py +++ b/system/updated/casync/common.py @@ -6,7 +6,7 @@ import subprocess from openpilot.system.version import BUILD_METADATA_FILENAME, BuildMetadata -CASYNC_ARGS = ["--with=symlinks", "--with=permissions"] +CASYNC_ARGS = ["--with=symlinks", "--with=permissions", "--compression=xz"] CASYNC_FILES = [BUILD_METADATA_FILENAME, ".caexclude"] From a2a372d3147d14f7cb688458c659331a52951cae Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:09:23 -0700 Subject: [PATCH 132/384] Cleanup settings imports (#31979) --- selfdrive/ui/qt/offroad/settings.cc | 15 +++------------ selfdrive/ui/qt/offroad/settings.h | 1 - 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 185d5457e3..af32a9b10b 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -1,5 +1,3 @@ -#include "selfdrive/ui/qt/offroad/settings.h" - #include #include #include @@ -8,21 +6,14 @@ #include -#include "selfdrive/ui/qt/network/networking.h" - -#include "common/params.h" #include "common/watchdog.h" #include "common/util.h" -#include "system/hardware/hw.h" -#include "selfdrive/ui/qt/widgets/controls.h" -#include "selfdrive/ui/qt/widgets/input.h" +#include "selfdrive/ui/qt/network/networking.h" +#include "selfdrive/ui/qt/offroad/settings.h" +#include "selfdrive/ui/qt/qt_window.h" #include "selfdrive/ui/qt/widgets/prime.h" #include "selfdrive/ui/qt/widgets/scrollview.h" #include "selfdrive/ui/qt/widgets/ssh_keys.h" -#include "selfdrive/ui/qt/widgets/toggle.h" -#include "selfdrive/ui/ui.h" -#include "selfdrive/ui/qt/util.h" -#include "selfdrive/ui/qt/qt_window.h" TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { // param, title, desc, icon diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index f9e1648447..35a044bdd2 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -10,7 +10,6 @@ #include #include - #include "selfdrive/ui/ui.h" #include "selfdrive/ui/qt/util.h" #include "selfdrive/ui/qt/widgets/controls.h" From b4fdfeec6216bd57f03c560ead15bd16c5e54cf6 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 22 Mar 2024 14:12:23 -0700 Subject: [PATCH 133/384] why did panda have a boot time (#31978) * why did panda have a boot time * update test --- panda | 2 +- selfdrive/boardd/tests/test_pandad.py | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/panda b/panda index de061e4f73..dd82382d5f 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit de061e4f7317dbacc206ef5f038d35a17e8ef0e7 +Subproject commit dd82382d5f9fcfbf9958238ee33739693fd3f6fa diff --git a/selfdrive/boardd/tests/test_pandad.py b/selfdrive/boardd/tests/test_pandad.py index 9d7d0063f1..3434be3fe4 100755 --- a/selfdrive/boardd/tests/test_pandad.py +++ b/selfdrive/boardd/tests/test_pandad.py @@ -102,11 +102,10 @@ class TestPandad(unittest.TestCase): dt = self._run_test(5) ts.append(dt) - # 2s for SPI, 5s for USB (due to enumeration) - # 0.2s pandad -> boardd - # 1.1s panda boot time (FIXME: it's all the drivers/harness.h init) - # plus some buffer - assert 1.0 < (sum(ts)/len(ts)) < (2.0 if self.spi else 5.0) + # 5s for USB (due to enumeration) + # - 0.2s pandad -> boardd + # - plus some buffer + assert 0.1 < (sum(ts)/len(ts)) < (0.5 if self.spi else 5.0) print("startup times", ts, sum(ts) / len(ts)) def test_protocol_version_check(self): From 10e3652f286d9a2caf82ee168d7e760221bd61fb Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Fri, 22 Mar 2024 18:36:32 -0300 Subject: [PATCH 134/384] Multilang: update pt-BR translations (#31980) update pt-BR translations --- selfdrive/ui/translations/main_pt-BR.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index a61f3a9949..adab93eff9 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -299,11 +299,11 @@ Pair Device - + Parear Dispositivo Pair - + PAREAR
@@ -613,7 +613,7 @@ now - + agora From 6e60fed737114099834faea8fcde1669fe44a3ad Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 22 Mar 2024 15:05:38 -0700 Subject: [PATCH 135/384] Hyundai CAN: allow fingerprinting without comma power for many platforms (#31969) * only including master data since eps and other ecus were only added in last 60 days * CAR.HYUNDAI_SANTA_FE_2022 * CAR.GENESIS_G70 * CAR.KIA_K5_2021 * CAR.HYUNDAI_SONATA_HYBRID * CAR.HYUNDAI_ELANTRA_2021 * CAR.HYUNDAI_ELANTRA_HEV_2021 * CAR.HYUNDAI_SANTA_FE * CAR.KIA_STINGER * CAR.KIA_NIRO_PHEV_2022 * slightly more data * data from forks now * CAR.GENESIS_G70_2020 * CAR.KIA_NIRO_HEV_2021 * CAR.KIA_FORTE * CAR.HYUNDAI_IONIQ_PHEV * CAR.HYUNDAI_KONA_EV_2022 * CAR.KIA_STINGER_2022 * HYUNDAI_KONA_EV * CAR.KIA_OPTIMA_H_G4_FL * clean up --- selfdrive/car/hyundai/values.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index f1a3c3ebc6..37d18d2427 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -743,9 +743,16 @@ FW_QUERY_CONFIG = FwQueryConfig( # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present non_essential_ecus={ - Ecu.transmission: [CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA], - Ecu.engine: [CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA], - Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA], + Ecu.transmission: [CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, + CAR.GENESIS_G70, CAR.KIA_K5_2021, CAR.HYUNDAI_SONATA_HYBRID, CAR.HYUNDAI_ELANTRA_2021, CAR.HYUNDAI_ELANTRA_HEV_2021, + CAR.HYUNDAI_SANTA_FE, CAR.KIA_STINGER, CAR.KIA_NIRO_PHEV_2022, CAR.GENESIS_G70_2020, CAR.KIA_NIRO_HEV_2021, + CAR.KIA_FORTE, CAR.HYUNDAI_IONIQ_PHEV, CAR.KIA_STINGER_2022, CAR.GENESIS_G90], + Ecu.engine: [CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, + CAR.GENESIS_G70, CAR.KIA_K5_2021, CAR.HYUNDAI_SONATA_HYBRID, CAR.HYUNDAI_ELANTRA_2021, CAR.HYUNDAI_ELANTRA_HEV_2021, + CAR.HYUNDAI_SANTA_FE, CAR.KIA_STINGER, CAR.KIA_NIRO_PHEV_2022, CAR.GENESIS_G70_2020, CAR.KIA_NIRO_HEV_2021, CAR.KIA_FORTE, + CAR.HYUNDAI_IONIQ_PHEV, CAR.KIA_STINGER_2022, CAR.GENESIS_G90, CAR.KIA_OPTIMA_H_G4_FL], + Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_ELANTRA_2021, + CAR.HYUNDAI_SANTA_FE, CAR.KIA_FORTE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV], }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms From c0a96d27470eee9b8f4bedf1a9e050e5e2e77df3 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 22 Mar 2024 15:57:36 -0700 Subject: [PATCH 136/384] thermald: publish immediately after ignition (#31981) * thermald: publish immediately after ignition * fix --- selfdrive/thermald/thermald.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index bfc50c4478..f5fc949637 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -207,17 +207,10 @@ def thermald_thread(end_event, hw_queue) -> None: while not end_event.is_set(): sm.update(PANDA_STATES_TIMEOUT) - # Run at 2Hz - if sm.frame % round(SERVICE_LIST['pandaStates'].frequency * DT_TRML) != 0: - continue - pandaStates = sm['pandaStates'] peripheralState = sm['peripheralState'] peripheral_panda_present = peripheralState.pandaType != log.PandaState.PandaType.unknown - msg = read_thermal(thermal_config) - msg.deviceState.deviceType = HARDWARE.get_device_type() - if sm.updated['pandaStates'] and len(pandaStates) > 0: # Set ignition based on any panda connected @@ -237,6 +230,14 @@ def thermald_thread(end_event, hw_queue) -> None: onroad_conditions["ignition"] = False cloudlog.error("panda timed out onroad") + # Run at 2Hz, plus rising edge of ignition + ign_edge = started_ts is None and onroad_conditions["ignition"] + if (sm.frame % round(SERVICE_LIST['pandaStates'].frequency * DT_TRML) != 0) and not ign_edge: + continue + + msg = read_thermal(thermal_config) + msg.deviceState.deviceType = HARDWARE.get_device_type() + try: last_hw_state = hw_queue.get_nowait() except queue.Empty: From 82a07afb2111b4367742b97ef7073b441d371891 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 23 Mar 2024 04:30:55 -0700 Subject: [PATCH 137/384] HKG: remove engine and transmission ECUs (#31985) * remove engine and transmission * remove engine and transmission * also here --- selfdrive/car/hyundai/fingerprints.py | 574 -------------------- selfdrive/car/hyundai/tests/test_hyundai.py | 2 +- selfdrive/car/hyundai/values.py | 16 +- 3 files changed, 5 insertions(+), 587 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index b7f9cb3384..68598b65ff 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -54,12 +54,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00IG MFC AT MES LHD 1.00 1.04 99211-G8100 200511', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00bcsh8p54 U912\x00\x00\x00\x00\x00\x00SIG0M35MH0\xa4 |.', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81641KA051\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_AZERA_HEV_6TH_GEN: { (Ecu.fwdCamera, 0x7c4, None): [ @@ -77,14 +71,6 @@ FW_VERSIONS = { b'\xf1\x00IGhe SCC FHCUP 1.00 1.01 99110-M9000 ', b'\xf1\x00IGhe SCC FHCUP 1.00 1.02 99110-M9000 ', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006T7N0_C2\x00\x006T7Q2051\x00\x00TIG2H24KA2\x12@\x11\xb7', - b'\xf1\x006T7N0_C2\x00\x006T7VA051\x00\x00TIGSH24KA1\xc7\x85\xe2`', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H570051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816H590051\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_GENESIS: { (Ecu.fwdCamera, 0x7c4, None): [ @@ -103,12 +89,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00AEH MFC AT EUR LHD 1.00 1.00 95740-G2400 180222', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6F2051\x00\x00\x00\x00\x00\x00\x00\x00', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x816U3H1051\x00\x00\xf1\x006U3H0_C2\x00\x006U3H1051\x00\x00HAE0G16US2\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_IONIQ_PHEV_2019: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -120,13 +100,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00AEP MFC AT USA LHD 1.00 1.00 95740-G2400 180222', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6F6051\x00\x00\x00\x00\x00\x00\x00\x00', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x816U3J2051\x00\x00\xf1\x006U3H0_C2\x00\x006U3J2051\x00\x00PAE0G16NS1\x00\x00\x00\x00', - b'\xf1\x816U3J2051\x00\x00\xf1\x006U3H0_C2\x00\x006U3J2051\x00\x00PAE0G16NS1\xdbD\r\x81', - ], }, CAR.HYUNDAI_IONIQ_PHEV: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -148,19 +121,6 @@ FW_VERSIONS = { b'\xf1\x00AEP MFC AT USA LHD 1.00 1.00 95740-G2700 201027', b'\xf1\x00AEP MFC AT USA LHD 1.00 1.01 95740-G2600 190819', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6F6051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816H6G5051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816H6G6051\x00\x00\x00\x00\x00\x00\x00\x00', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006U3H1_C2\x00\x006U3J8051\x00\x00PAETG16UL0\x00\x00\x00\x00', - b'\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00PAE0G16NL0\x00\x00\x00\x00', - b'\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00PAE0G16NL2\xad\xeb\xabt', - b'\xf1\x816U3J8051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J8051\x00\x00PAETG16UL0\x00\x00\x00\x00', - b'\xf1\x816U3J9051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00PAE0G16NL0\x82zT\xd2', - b'\xf1\x816U3J9051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00PAE0G16NL2\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_IONIQ_EV_2020: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -210,13 +170,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00AEH MFC AT USA LHD 1.00 1.00 95740-G2700 201027', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6G5051\x00\x00\x00\x00\x00\x00\x00\x00', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00HAE0G16NL2\x96\xda\xd4\xee', - b'\xf1\x816U3J9051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00HAE0G16NL2\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_SONATA: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -242,28 +195,6 @@ FW_VERSIONS = { b'\xf1\x8758910-L0100\xf1\x00DN ESC \x07 104\x19\x08\x01 58910-L0100', b'\xf1\x8758910-L0100\xf1\x00DN ESC \x07 106 \x07\x01 58910-L0100', ], - (Ecu.engine, 0x7e0, None): [ - b'HM6M1_0a0_F00', - b'HM6M1_0a0_G20', - b'HM6M2_0a0_BD0', - b'\xf1\x81HM6M1_0a0_F00', - b'\xf1\x81HM6M1_0a0_G20', - b'\xf1\x82DNBVN5GMCCXXXDCA', - b'\xf1\x82DNBVN5GMCCXXXG2F', - b'\xf1\x82DNBWN5TMDCXXXG2E', - b'\xf1\x82DNCVN5GMCCXXXF0A', - b'\xf1\x82DNCVN5GMCCXXXG2B', - b'\xf1\x870\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x81HM6M1_0a0_J10', - b'\xf1\x870\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x82DNDWN5TMDCXXXJ1A', - b'\xf1\x8739110-2S041\xf1\x81HM6M1_0a0_M00', - b'\xf1\x8739110-2S041\xf1\x81HM6M1_0a0_M10', - b'\xf1\x8739110-2S042\xf1\x81HM6M1_0a0_M00', - b'\xf1\x8739110-2S278\xf1\x82DNDVD5GMCCXXXL5B', - b'\xf1\x87391162M003', - b'\xf1\x87391162M010', - b'\xf1\x87391162M013', - b'\xf1\x87391162M023', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DN8 MDPS C 1,00 1,01 56310L0010\x00 4DNAC101', b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101', @@ -294,72 +225,6 @@ FW_VERSIONS = { b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.06 99211-L1000 210325', b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.07 99211-L1000 211223', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00HT6TA260BLHT6TA800A1TDN8C20KS4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x00HT6TA260BLHT6TA810A1TDN8M25GS0\x00\x00\x00\x00\x00\x00\xaa\x8c\xd9p', - b'\xf1\x00HT6WA250BLHT6WA910A1SDN8G25NB1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x00HT6WA250BLHT6WA910A1SDN8G25NB1\x00\x00\x00\x00\x00\x00\x96\xa1\xf1\x92', - b'\xf1\x00HT6WA280BLHT6WAD10A1SDN8G25NB2\x00\x00\x00\x00\x00\x00\x08\xc9O:', - b'\xf1\x00HT6WA280BLHT6WAD10A1SDN8G25NB4\x00\x00\x00\x00\x00\x00g!l[', - b'\xf1\x00HT6WA280BLHT6WAE10A1SDN8G25NB5\x00\x00\x00\x00\x00\x00\xe0t\xa9\xba', - b'\xf1\x00T02601BL T02730A1 VDN8T25XXX730NS5\xf7_\x92\xf5', - b'\xf1\x00T02601BL T02832A1 VDN8T25XXX832NS8G\x0e\xfeE', - b'\xf1\x00T02601BL T02900A1 VDN8T25XXX900NSA\xb9\x13\xf9p', - b'\xf1\x00T02601BL T02900A1 VDN8T25XXX900NSCF\xe4!Y', - b'\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16KB05\x95h%', - b'\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB1\xe3\xc10\xa1', - b'\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - b'\xf1\x87954A02N060\x00\x00\x00\x00\x00\xf1\x81T02730A1 \xf1\x00T02601BL T02730A1 VDN8T25XXX730NS5\xf7_\x92\xf5', - b'\xf1\x87SAKFBA2926554GJ2VefVww\x87xwwwww\x88\x87xww\x87wTo\xfb\xffvUo\xff\x8d\x16\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SAKFBA3030524GJ2UVugww\x97yx\x88\x87\x88vw\x87gww\x87wto\xf9\xfffUo\xff\xa2\x0c\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SAKFBA3356084GJ2\x86fvgUUuWgw\x86www\x87wffvf\xb6\xcf\xfc\xffeUO\xff\x12\x19\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SAKFBA3474944GJ2ffvgwwwwg\x88\x86x\x88\x88\x98\x88ffvfeo\xfa\xff\x86fo\xff\t\xae\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SAKFBA3475714GJ2Vfvgvg\x96yx\x88\x97\x88ww\x87ww\x88\x87xs_\xfb\xffvUO\xff\x0f\xff\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALDBA3510954GJ3ww\x87xUUuWx\x88\x87\x88\x87w\x88wvfwfc_\xf9\xff\x98wO\xffl\xe0\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA3573534GJ3\x89\x98\x89\x88EUuWgwvwwwwww\x88\x87xTo\xfa\xff\x86f\x7f\xffo\x0e\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA3601464GJ3\x88\x88\x88\x88ffvggwvwvw\x87gww\x87wvo\xfb\xff\x98\x88\x7f\xffjJ\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA3753044GJ3UUeVff\x86hwwwwvwwgvfgfvo\xf9\xfffU_\xffC\xae\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA3862294GJ3vfvgvefVxw\x87\x87w\x88\x87xwwwwc_\xf9\xff\x87w\x9f\xff\xd5\xdc\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA3873834GJ3fefVwuwWx\x88\x97\x88w\x88\x97xww\x87wU_\xfb\xff\x86f\x8f\xffN\x04\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA4525334GJ3\x89\x99\x99\x99fevWh\x88\x86\x88fwvgw\x88\x87xfo\xfa\xffuDo\xff\xd1>\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA4626804GJ3wwww\x88\x87\x88xx\x88\x87\x88wwgw\x88\x88\x98\x88\x95_\xf9\xffuDo\xff|\xe7\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA4803224GJ3wwwwwvwg\x88\x88\x98\x88wwww\x87\x88\x88xu\x9f\xfc\xff\x87f\x8f\xff\xea\xea\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA6212564GJ3\x87wwwUTuGg\x88\x86xx\x88\x87\x88\x87\x88\x98xu?\xf9\xff\x97f\x7f\xff\xb8\n\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA6347404GJ3wwwwff\x86hx\x88\x97\x88\x88\x88\x88\x88vfgf\x88?\xfc\xff\x86Uo\xff\xec/\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA6901634GJ3UUuWVeVUww\x87wwwwwvUge\x86/\xfb\xff\xbb\x99\x7f\xff]2\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALDBA7077724GJ3\x98\x88\x88\x88ww\x97ygwvwww\x87ww\x88\x87x\x87_\xfd\xff\xba\x99o\xff\x99\x01\xf1\x89HT6WA910A1\xf1\x82SDN8G25NB1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SALFBA3525114GJ2wvwgvfvggw\x86wffvffw\x86g\x85_\xf9\xff\xa8wo\xffv\xcd\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA3624024GJ2\x88\x88\x88\x88wv\x87hx\x88\x97\x88x\x88\x97\x88ww\x87w\x86o\xfa\xffvU\x7f\xff\xd1\xec\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA3960824GJ2wwwwff\x86hffvfffffvfwfg_\xf9\xff\xa9\x88\x8f\xffb\x99\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA4011074GJ2fgvwwv\x87hw\x88\x87xww\x87wwfgvu_\xfa\xffefo\xff\x87\xc0\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA4121304GJ2x\x87xwff\x86hwwwwww\x87wwwww\x84_\xfc\xff\x98\x88\x9f\xffi\xa6\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA4195874GJ2EVugvf\x86hgwvwww\x87wgw\x86wc_\xfb\xff\x98\x88\x8f\xff\xe23\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA4625294GJ2eVefeUeVx\x88\x97\x88wwwwwwww\xa7o\xfb\xffvw\x9f\xff\xee.\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA4728774GJ2vfvg\x87vwgww\x87ww\x88\x97xww\x87w\x86_\xfb\xffeD?\xffk0\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA5129064GJ2vfvgwv\x87hx\x88\x87\x88ww\x87www\x87wd_\xfa\xffvfo\xff\x1d\x00\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA5454914GJ2\x98\x88\x88\x88\x87vwgx\x88\x87\x88xww\x87ffvf\xa7\x7f\xf9\xff\xa8w\x7f\xff\x1b\x90\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA5987784GJ2UVugDDtGx\x88\x87\x88w\x88\x87xwwwwd/\xfb\xff\x97fO\xff\xb0h\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA5987864GJ2fgvwUUuWgwvw\x87wxwwwww\x84/\xfc\xff\x97w\x7f\xff\xdf\x1d\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA6337644GJ2vgvwwv\x87hgffvwwwwwwww\x85O\xfa\xff\xa7w\x7f\xff\xc5\xfc\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA6802004GJ2UUuWUUuWgw\x86www\x87www\x87w\x96?\xf9\xff\xa9\x88\x7f\xff\x9fK\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA6892284GJ233S5\x87w\x87xx\x88\x87\x88vwwgww\x87w\x84?\xfb\xff\x98\x88\x8f\xff*\x9e\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00SDN8T16NB0z{\xd4v', - b'\xf1\x87SALFBA7005534GJ2eUuWfg\x86xxww\x87x\x88\x87\x88\x88w\x88\x87\x87O\xfc\xffuUO\xff\xa3k\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB1\xe3\xc10\xa1', - b'\xf1\x87SALFBA7152454GJ2gvwgFf\x86hx\x88\x87\x88vfWfffffd?\xfa\xff\xba\x88o\xff,\xcf\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB1\xe3\xc10\xa1', - b'\xf1\x87SALFBA7460044GJ2gx\x87\x88Vf\x86hx\x88\x87\x88wwwwgw\x86wd?\xfa\xff\x86U_\xff\xaf\x1f\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - b'\xf1\x87SALFBA7485034GJ2ww\x87xww\x87xfwvgwwwwvfgf\xa5/\xfc\xff\xa9w_\xff40\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - b'\xf1\x87SAMDBA7743924GJ3wwwwww\x87xgwvw\x88\x88\x88\x88wwww\x85_\xfa\xff\x86f\x7f\xff0\x9d\xf1\x89HT6WAD10A1\xf1\x82SDN8G25NB2\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SAMDBA7817334GJ3Vgvwvfvgww\x87wwwwwwfgv\x97O\xfd\xff\x88\x88o\xff\x8e\xeb\xf1\x89HT6WAD10A1\xf1\x82SDN8G25NB2\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SAMDBA8054504GJ3gw\x87xffvgffffwwwweUVUf?\xfc\xffvU_\xff\xddl\xf1\x89HT6WAD10A1\xf1\x82SDN8G25NB2\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SAMFB41553621GC7ww\x87xUU\x85Xvwwg\x88\x88\x88\x88wwgw\x86\xaf\xfb\xffuDo\xff\xaa\x8f\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - b'\xf1\x87SAMFB42555421GC7\x88\x88\x88\x88wvwgx\x88\x87\x88wwgw\x87wxw3\x8f\xfc\xff\x98f\x8f\xffga\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - b'\xf1\x87SAMFBA7978674GJ2gw\x87xgw\x97ywwwwvUGeUUeU\x87O\xfb\xff\x98w\x8f\xfffF\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - b'\xf1\x87SAMFBA8105254GJ2wx\x87\x88Vf\x86hx\x88\x87\x88wwwwwwww\x86O\xfa\xff\x99\x88\x7f\xffZG\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - b'\xf1\x87SAMFBA9283024GJ2wwwwEUuWwwgwwwwwwwww\x87/\xfb\xff\x98w\x8f\xff<\xd3\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - b'\xf1\x87SAMFBA9708354GJ2wwwwVf\x86h\x88wx\x87xww\x87\x88\x88\x88\x88w/\xfa\xff\x97w\x8f\xff\x86\xa0\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - b'\xf1\x87SANDB45316691GC6\x99\x99\x99\x99\x88\x88\xa8\x8avfwfwwww\x87wxwT\x9f\xfd\xff\x88wo\xff\x1c\xfa\xf1\x89HT6WAD10A1\xf1\x82SDN8G25NB3\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SANFB45889451GC7wx\x87\x88gw\x87x\x88\x88x\x88\x87wxw\x87wxw\x87\x8f\xfc\xffeU\x8f\xff+Q\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00SDN8T16NB2\n\xdd^\xbc', - ], }, CAR.HYUNDAI_SONATA_LF: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -369,43 +234,20 @@ FW_VERSIONS = { b'\xf1\x00LF ESC \t 11 \x17\x01\x13 58920-C2610', b'\xf1\x00LF ESC \x0c 11 \x17\x01\x13 58920-C2610', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81606D5051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81606D5K51\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81606G1051\x00\x00\x00\x00\x00\x00\x00\x00', - ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00LFF LKAS AT USA LHD 1.00 1.01 95740-C1000 E51', b'\xf1\x00LFF LKAS AT USA LHD 1.01 1.02 95740-C1000 E52', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006T6H0_C2\x00\x006T6B4051\x00\x00TLF0G24NL1\xb0\x9f\xee\xf5', - b'\xf1\x006T6H0_C2\x00\x006T6B7051\x00\x00TLF0G24SL4;\x08\x12i', - b'\xf1\x87LAHSGN012918KF10\x98\x88x\x87\x88\x88x\x87\x88\x88\x98\x88\x87w\x88w\x88\x88\x98\x886o\xf6\xff\x98w\x7f\xff3\x00\xf1\x816W3B1051\x00\x00\xf1\x006W351_C2\x00\x006W3B1051\x00\x00TLF0T20NL2\x00\x00\x00\x00', - b'\xf1\x87LAHSGN012918KF10\x98\x88x\x87\x88\x88x\x87\x88\x88\x98\x88\x87w\x88w\x88\x88\x98\x886o\xf6\xff\x98w\x7f\xff3\x00\xf1\x816W3B1051\x00\x00\xf1\x006W351_C2\x00\x006W3B1051\x00\x00TLF0T20NL2H\r\xbdm', - b'\xf1\x87LAJSG49645724HF0\x87x\x87\x88\x87www\x88\x99\xa8\x89\x88\x99\xa8\x89\x88\x99\xa8\x89S_\xfb\xff\x87f\x7f\xff^2\xf1\x816W3B1051\x00\x00\xf1\x006W351_C2\x00\x006W3B1051\x00\x00TLF0T20NL2H\r\xbdm', - b'\xf1\x87\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf1\x816T6B4051\x00\x00\xf1\x006T6H0_C2\x00\x006T6B4051\x00\x00TLF0G24NL1\x00\x00\x00\x00', - b'\xf1\x87\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf1\x816T6B4051\x00\x00\xf1\x006T6H0_C2\x00\x006T6B4051\x00\x00TLF0G24NL1\xb0\x9f\xee\xf5', - b'\xf1\x87\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf1\x816T6B4051\x00\x00\xf1\x006T6H0_C2\x00\x006T6B4051\x00\x00TLF0G24SL2n\x8d\xbe\xd8', - ], }, CAR.HYUNDAI_TUCSON: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00TL__ FCA F-CUP 1.00 1.01 99110-D3500 ', b'\xf1\x00TL__ FCA F-CUP 1.00 1.02 99110-D3510 ', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81606G3051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x8971TLC2NAIDDIR002\xf1\x8271TLC2NAIDDIR002', - ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00TL MFC AT KOR LHD 1.00 1.02 95895-D3800 180719', b'\xf1\x00TL MFC AT USA LHD 1.00 1.06 95895-D3800 190107', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x87KMLDCU585233TJ20wx\x87\x88x\x88\x98\x89vfwfwwww\x87f\x9f\xff\x98\xff\x7f\xf9\xf7s\xf1\x816T6G4051\x00\x00\xf1\x006T6J0_C2\x00\x006T6G4051\x00\x00TTL4G24NH2\x00\x00\x00\x00', - b'\xf1\x87LBJXAN202299KF22\x87x\x87\x88ww\x87xx\x88\x97\x88\x87\x88\x98x\x88\x99\x98\x89\x87o\xf6\xff\x87w\x7f\xff\x12\x9a\xf1\x81U083\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U083\x00\x00\x00\x00\x00\x00TTL2V20KL1\x8fRn\x8a', - ], }, CAR.HYUNDAI_SANTA_FE: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -426,11 +268,6 @@ FW_VERSIONS = { b'\xf1\x00TM ESC \r 104\x19\x07\x08 58910-S2650', b'\xf1\x00TM ESC \r 105\x19\x05# 58910-S1500', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81606EA051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81606G1051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81606G3051\x00\x00\x00\x00\x00\x00\x00\x00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00TM MDPS C 1.00 1.00 56340-S2000 8409', b'\xf1\x00TM MDPS C 1.00 1.00 56340-S2000 8A12', @@ -441,34 +278,6 @@ FW_VERSIONS = { b'\xf1\x00TM MFC AT EUR LHD 1.00 1.01 99211-S1010 181207', b'\xf1\x00TM MFC AT USA LHD 1.00 1.00 99211-S2000 180409', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM4T20NS5\x00\x00\x00\x00', - b'\xf1\x00bcsh8p54 U833\x00\x00\x00\x00\x00\x00TTM4V22US3_<]\xf1', - b'\xf1\x87LBJSGA7082574HG0\x87www\x98\x88\x88\x88\x99\xaa\xb9\x9afw\x86gx\x99\xa7\x89co\xf8\xffvU_\xffR\xaf\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM2T20NS1\x00\xa6\xe0\x91', - b'\xf1\x87LBKSGA0458404HG0vfvg\x87www\x89\x99\xa8\x99y\xaa\xa7\x9ax\x88\xa7\x88t_\xf9\xff\x86w\x8f\xff\x15x\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM2T20NS1\x00\x00\x00\x00', - b'\xf1\x87LDJUEA6010814HG1\x87w\x87x\x86gvw\x88\x88\x98\x88gw\x86wx\x88\x97\x88\x85o\xf8\xff\x86f_\xff\xd37\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM4T20NS0\xf8\x19\x92g', - b'\xf1\x87LDJUEA6458264HG1ww\x87x\x97x\x87\x88\x88\x99\x98\x89g\x88\x86xw\x88\x97x\x86o\xf7\xffvw\x8f\xff3\x9a\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM4T20NS0\xf8\x19\x92g', - b'\xf1\x87LDKUEA2045844HG1wwww\x98\x88x\x87\x88\x88\xa8\x88x\x99\x97\x89x\x88\xa7\x88U\x7f\xf8\xffvfO\xffC\x1e\xf1\x816W3E0051\x00\x00\xf1\x006W351_C2\x00\x006W3E0051\x00\x00TTM4T20NS3\x00\x00\x00\x00', - b'\xf1\x87LDKUEA9993304HG1\x87www\x97x\x87\x88\x99\x99\xa9\x99x\x99\xa7\x89w\x88\x97x\x86_\xf7\xffwwO\xffl#\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM4T20NS1R\x7f\x90\n', - b'\xf1\x87LDLUEA6061564HG1\xa9\x99\x89\x98\x87wwwx\x88\x97\x88x\x99\xa7\x89x\x99\xa7\x89sO\xf9\xffvU_\xff<\xde\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM4T20NS50\xcb\xc3\xed', - b'\xf1\x87LDLUEA6159884HG1\x88\x87hv\x99\x99y\x97\x89\xaa\xb8\x9ax\x99\x87\x89y\x99\xb7\x99\xa7?\xf7\xff\x97wo\xff\xf3\x05\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM4T20NS5\x00\x00\x00\x00', - b'\xf1\x87LDLUEA6852664HG1\x97wWu\x97www\x89\xaa\xc8\x9ax\x99\x97\x89x\x99\xa7\x89SO\xf7\xff\xa8\x88\x7f\xff\x03z\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM4T20NS50\xcb\xc3\xed', - b'\xf1\x87LDLUEA6898374HG1fevW\x87wwwx\x88\x97\x88h\x88\x96\x88x\x88\xa7\x88ao\xf9\xff\x98\x99\x7f\xffD\xe2\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM4T20NS5\x00\x00\x00\x00', - b'\xf1\x87LDLUEA6898374HG1fevW\x87wwwx\x88\x97\x88h\x88\x96\x88x\x88\xa7\x88ao\xf9\xff\x98\x99\x7f\xffD\xe2\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM4T20NS50\xcb\xc3\xed', - b'\xf1\x87SBJWAA5842214GG0\x88\x87\x88xww\x87x\x89\x99\xa8\x99\x88\x99\x98\x89w\x88\x87xw_\xfa\xfffU_\xff\xd1\x8d\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM2G24NS1\x98{|\xe3', - b'\xf1\x87SBJWAA5890864GG0\xa9\x99\x89\x98\x98\x87\x98y\x89\x99\xa8\x99w\x88\x87xww\x87wvo\xfb\xffuD_\xff\x9f\xb5\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM2G24NS1\x98{|\xe3', - b'\xf1\x87SBJWAA6562474GG0ffvgeTeFx\x88\x97\x88ww\x87www\x87w\x84o\xfa\xff\x87fO\xff\xc2 \xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM2G24NS1\x00\x00\x00\x00', - b'\xf1\x87SBJWAA6562474GG0ffvgeTeFx\x88\x97\x88ww\x87www\x87w\x84o\xfa\xff\x87fO\xff\xc2 \xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM2G24NS1\x98{|\xe3', - b'\xf1\x87SBJWAA7780564GG0wvwgUUeVwwwwx\x88\x87\x88wwwwd_\xfc\xff\x86f\x7f\xff\xd7*\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM2G24NS2F\x84<\xc0', - b'\xf1\x87SBJWAA8278284GG0ffvgUU\x85Xx\x88\x87\x88x\x88w\x88ww\x87w\x96o\xfd\xff\xa7U_\xff\xf2\xa0\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM2G24NS2F\x84<\xc0', - b'\xf1\x87SBLWAA4363244GG0wvwgwv\x87hgw\x86ww\x88\x87xww\x87wdo\xfb\xff\x86f\x7f\xff3$\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM2G24NS6\x00\x00\x00\x00', - b'\xf1\x87SBLWAA4363244GG0wvwgwv\x87hgw\x86ww\x88\x87xww\x87wdo\xfb\xff\x86f\x7f\xff3$\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM2G24NS6x0\x17\xfe', - b'\xf1\x87SBLWAA4899564GG0VfvgUU\x85Xx\x88\x87\x88vfgf\x87wxwvO\xfb\xff\x97f\xb1\xffSB\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM2G24NS7\x00\x00\x00\x00', - b'\xf1\x87SBLWAA6622844GG0wwwwff\x86hwwwwx\x88\x87\x88\x88\x88\x88\x88\x98?\xfd\xff\xa9\x88\x7f\xffn\xe5\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM2G24NS7u\x1e{\x1c', - b'\xf1\x87SDJXAA7656854GG1DEtWUU\x85X\x88\x88\x98\x88w\x88\x87xx\x88\x87\x88\x96o\xfb\xff\x86f\x7f\xff.\xca\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM4G24NS2\x00\x00\x00\x00', - b'\xf1\x87SDJXAA7656854GG1DEtWUU\x85X\x88\x88\x98\x88w\x88\x87xx\x88\x87\x88\x96o\xfb\xff\x86f\x7f\xff.\xca\xf1\x816W3C2051\x00\x00\xf1\x006W351_C2\x00\x006W3C2051\x00\x00TTM4G24NS2K\xdaV0', - b'\xf1\x87SDKXAA2443414GG1vfvgwv\x87h\x88\x88\x88\x88ww\x87wwwww\x99_\xfc\xffvD?\xffl\xd2\xf1\x816W3E1051\x00\x00\xf1\x006W351_C2\x00\x006W3E1051\x00\x00TTM4G24NS6\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_SANTA_FE_2022: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -488,20 +297,6 @@ FW_VERSIONS = { b'\xf1\x8758910-S2GA0\xf1\x00TM ESC \x02 101 \x08\x04 58910-S2GA0', b'\xf1\x8758910-S2GA0\xf1\x00TM ESC \x04 102!\x04\x05 58910-S2GA0', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81HM6M1_0a0_G20', - b'\xf1\x81HM6M1_0a0_H00', - b'\xf1\x81HM6M2_0a0_G00', - b'\xf1\x82TACVN5GMI3XXXH0A', - b'\xf1\x82TACVN5GSI3XXXH0A', - b'\xf1\x82TMBZN5TMD3XXXG2E', - b'\xf1\x82TMCFD5MMCXXXXG0A', - b'\xf1\x87 \xf1\x81 ', - b'\xf1\x870\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x81HM6M1_0a0_J10', - b'\xf1\x870\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x81HM6M1_0a0_L50', - b'\xf1\x870\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x82TMDWN5TMD3TXXJ1A', - b'\xf1\x8739101-2STN8\xf1\x81HM6M1_0a0_M00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00TM MDPS C 1.00 1.01 56310-S1AB0 4TSDC101', b'\xf1\x00TM MDPS C 1.00 1.01 56310-S1EB0 4TSDC101', @@ -515,22 +310,6 @@ FW_VERSIONS = { b'\xf1\x00TMA MFC AT USA LHD 1.00 1.01 99211-S2500 210205', b'\xf1\x00TMA MFC AT USA LHD 1.00 1.03 99211-S2500 220414', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00HT6TA290BLHT6TAF00A1STM0M25GS1\x00\x00\x00\x00\x00\x006\xd8\x97\x15', - b'\xf1\x00HT6WA280BLHT6WAD00A1STM2G25NH2\x00\x00\x00\x00\x00\x00\xf8\xc0\xc3\xaa', - b'\xf1\x00HT6WA280BLHT6WAD00A1STM4G25NH1\x00\x00\x00\x00\x00\x00\x9cl\x04\xbc', - b'\xf1\x00T02601BL T02730A1 VTMPT25XXX730NS2\xa6\x06\x88\xf7', - b'\xf1\x00T02601BL T02800A1 VTMPT25XXX800NS4\xed\xaf\xed\xf5', - b'\xf1\x00T02601BL T02900A1 VTMPT25XXW900NS1c\x918\xc5', - b'\xf1\x00T02601BL T02900A1 VTMPT25XXX900NS8\xb7\xaa\xfe\xfc', - b'\xf1\x00T02601BL T02900A1 VTMPT25XXX900NSA\xf3\xf4Uj', - b'\xf1\x87954A02N250\x00\x00\x00\x00\x00\xf1\x81T02730A1 \xf1\x00T02601BL T02730A1 VTMPT25XXX730NS2\xa6', - b'\xf1\x87954A02N250\x00\x00\x00\x00\x00\xf1\x81T02730A1 \xf1\x00T02601BL T02730A1 VTMPT25XXX730NS2\xa6\x06\x88\xf7', - b'\xf1\x87954A02N250\x00\x00\x00\x00\x00\xf1\x81T02900A1 \xf1\x00T02601BL T02900A1 VTMPT25XXX900NS8\xb7\xaa\xfe\xfc', - b'\xf1\x87KMMYBU034207SB72x\x89\x88\x98h\x88\x98\x89\x87fhvvfWf33_\xff\x87\xff\x8f\xfa\x81\xe5\xf1\x89HT6TAF00A1\xf1\x82STM0M25GS1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SDMXCA8653204GN1EVugEUuWwwwwww\x87wwwwwv/\xfb\xff\xa8\x88\x9f\xff\xa5\x9c\xf1\x89HT6WAD00A1\xf1\x82STM4G25NH1\x00\x00\x00\x00\x00\x00', - b'\xf1\x87SDMXCA9087684GN1VfvgUUeVwwgwwwwwffffU?\xfb\xff\x97\x88\x7f\xff+\xa4\xf1\x89HT6WAD00A1\xf1\x82STM4G25NH1\x00\x00\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_SANTA_FE_HEV_2022: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -552,18 +331,6 @@ FW_VERSIONS = { b'\xf1\x00TMH MFC AT USA LHD 1.00 1.05 99211-S1500 220126', b'\xf1\x00TMH MFC AT USA LHD 1.00 1.06 99211-S1500 220727', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2H16KA1\xc6\x15Q\x1e', - b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2H16SA3\xa3\x1b\xe14', - b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2H16UA3I\x94\xac\x8f', - b'\xf1\x87959102T250\x00\x00\x00\x00\x00\xf1\x81E14\x00\x00\x00\x00\x00\x00\x00\xf1\x00PSBG2333 E14\x00\x00\x00\x00\x00\x00\x00TTM2H16SA2\x80\xd7l\xb2', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x87391312MTA0', - b'\xf1\x87391312MTC1', - b'\xf1\x87391312MTE0', - b'\xf1\x87391312MTL0', - ], }, CAR.HYUNDAI_SANTA_FE_PHEV_2022: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -580,16 +347,6 @@ FW_VERSIONS = { b'\xf1\x00TMP MFC AT USA LHD 1.00 1.03 99211-S1500 210224', b'\xf1\x00TMP MFC AT USA LHD 1.00 1.06 99211-S1500 220727', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2P16SA0o\x88^\xbe', - b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2P16SA1\x0b\xc5\x0f\xea', - b'\xf1\x8795441-3D121\x00\xf1\x81E16\x00\x00\x00\x00\x00\x00\x00\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2P16SA0o\x88^\xbe', - b'\xf1\x8795441-3D121\x00\xf1\x81E16\x00\x00\x00\x00\x00\x00\x00\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TTM2P16SA1\x0b\xc5\x0f\xea', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x87391312MTF0', - b'\xf1\x87391312MTF1', - ], }, CAR.HYUNDAI_CUSTIN_1ST_GEN: { (Ecu.abs, 0x7d1, None): [ @@ -604,12 +361,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00KU2 MFC AT CHN LHD 1.00 1.02 99211-O3000 220923', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x87391212MEC0', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00bcsh8p54 U928\x00\x00\x00\x00\x00\x00SKU0T15KB2\x92U\xf9M', - ], }, CAR.KIA_STINGER: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -618,14 +369,6 @@ FW_VERSIONS = { b'\xf1\x00CK__ SCC F_CUP 1.00 1.02 96400-J5100 ', b'\xf1\x00CK__ SCC F_CUP 1.00 1.03 96400-J5100 ', ], - (Ecu.engine, 0x7e0, None): [ - b'\xe0\x19\xff\xe7\xe7g\x01\xa2\x00\x0f\x00\x9e\x00\x06\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x0f\x0e\x0f\x0f\x0e\r\x00\x00\x7f\x02.\xff\x00\x00~p\x00\x00\x00\x00u\xff\xf9\xff\x00\x00\x00\x00V\t\xd5\x01\xc0\x00\x00\x00\x007\xfb\xfc\x0b\x8d\x00', - b'\xf1\x81606DE051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81640E0051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81640H0051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x82CKJN3TMSDE0B\x00\x00\x00\x00', - b'\xf1\x82CKKN3TMD_H0A\x00\x00\x00\x00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00CK MDPS R 1.00 1.04 57700-J5200 4C2CL104', b'\xf1\x00CK MDPS R 1.00 1.04 57700-J5220 4C2VL104', @@ -639,20 +382,6 @@ FW_VERSIONS = { b'\xf1\x00CK MFC AT USA LHD 1.00 1.03 95740-J5000 170822', b'\xf1\x00CK MFC AT USA LHD 1.00 1.04 95740-J5000 180504', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00bcsh8p54 E21\x00\x00\x00\x00\x00\x00\x00SCK0T33NB0\t\xb7\x17\xf5', - b'\xf1\x00bcsh8p54 E21\x00\x00\x00\x00\x00\x00\x00SCK0T33NB0\x88\xa2\xe6\xf0', - b'\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SCK0T33NB2\xb3\xee\xba\xdc', - b'\xf1\x87VCJLE17622572DK0vd6D\x99\x98y\x97vwVffUfvfC%CuT&Dx\x87o\xff{\x1c\xf1\x81E21\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E21\x00\x00\x00\x00\x00\x00\x00SCK0T33NB0\x88\xa2\xe6\xf0', - b'\xf1\x87VDHLG17000192DK2xdFffT\xa5VUD$DwT\x86wveVeeD&T\x99\xba\x8f\xff\xcc\x99\xf1\x81E21\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E21\x00\x00\x00\x00\x00\x00\x00SCK0T33NB0\t\xb7\x17\xf5', - b'\xf1\x87VDHLG17000192DK2xdFffT\xa5VUD$DwT\x86wveVeeD&T\x99\xba\x8f\xff\xcc\x99\xf1\x81E21\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E21\x00\x00\x00\x00\x00\x00\x00SCK0T33NB0\x88\xa2\xe6\xf0', - b'\xf1\x87VDHLG17000192DK2xdFffT\xa5VUD$DwT\x86wveVeeD&T\x99\xba\x8f\xff\xcc\x99\xf1\x89E21\x00\x00\x00\x00\x00\x00\x00\xf1\x82SCK0T33NB0', - b'\xf1\x87VDHLG17034412DK2vD6DfVvVTD$D\x99w\x88\x98EDEDeT6DgfO\xff\xc3=\xf1\x81E21\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E21\x00\x00\x00\x00\x00\x00\x00SCK0T33NB0\x88\xa2\xe6\xf0', - b'\xf1\x87VDHLG17118862DK2\x8awWwgu\x96wVfUVwv\x97xWvfvUTGTx\x87o\xff\xc9\xed\xf1\x81E21\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E21\x00\x00\x00\x00\x00\x00\x00SCK0T33NB0\x88\xa2\xe6\xf0', - b'\xf1\x87VDHLG17274082DK2wfFf\x89x\x98wUT5T\x88v\x97xgeGefTGTVvO\xff\x1c\x14\xf1\x81E19\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E19\x00\x00\x00\x00\x00\x00\x00SCK0T33UB2\xee[\x97S', - b'\xf1\x87VDKLJ18675252DK6\x89vhgwwwwveVU\x88w\x87w\x99vgf\x97vXfgw_\xff\xc2\xfb\xf1\x89E25\x00\x00\x00\x00\x00\x00\x00\xf1\x82TCK0T33NB2', - b'\xf1\x87WAJTE17552812CH4vfFffvfVeT5DwvvVVdFeegeg\x88\x88o\xff\x1a]\xf1\x81E21\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E21\x00\x00\x00\x00\x00\x00\x00TCK2T20NB1\x19\xd2\x00\x94', - ], }, CAR.KIA_STINGER_2022: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -661,11 +390,6 @@ FW_VERSIONS = { b'\xf1\x00CK__ SCC FHCUP 1.00 1.00 99110-J5600 ', b'\xf1\x00CK__ SCC FHCUP 1.00 1.01 99110-J5100 ', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81640N2051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81640R0051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81HM6M1_0a0_H00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503', b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5320 4C2VL503', @@ -678,12 +402,6 @@ FW_VERSIONS = { b'\xf1\x00CK MFC AT USA LHD 1.00 1.00 99211-J5500 210622', b'\xf1\x00CK MFC AT USA LHD 1.00 1.03 99211-J5000 201209', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00bcsh8p54 E31\x00\x00\x00\x00\x00\x00\x00SCK0T25KH2B\xfbI\xe2', - b'\xf1\x00bcsh8p54 E31\x00\x00\x00\x00\x00\x00\x00SCK0T33NH07\xdf\xf0\xc1', - b'\xf1\x00bcsh8p54 E31\x00\x00\x00\x00\x00\x00\x00TCK0T33NH0%g~\xd3', - b'\xf1\x87VCNLF11383972DK1vffV\x99\x99\x89\x98\x86eUU\x88wg\x89vfff\x97fff\x99\x87o\xff"\xc1\xf1\x81E30\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E30\x00\x00\x00\x00\x00\x00\x00SCK0T33GH0\xbe`\xfb\xc6', - ], }, CAR.HYUNDAI_PALISADE: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -712,11 +430,6 @@ FW_VERSIONS = { b'\xf1\x00ON ESC \x0b 101\x19\t\x05 58910-S9320', b'\xf1\x00ON ESC \x0b 101\x19\t\x08 58910-S9360', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81640J0051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81640K0051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81640S1051\x00\x00\x00\x00\x00\x00\x00\x00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00LX2 MDPS C 1,00 1,03 56310-S8020 4LXDC103', b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-S8000 4LXDC103', @@ -737,60 +450,6 @@ FW_VERSIONS = { b'\xf1\x00ON MFC AT USA LHD 1.00 1.03 99211-S9100 200720', b'\xf1\x00ON MFC AT USA LHD 1.00 1.04 99211-S9100 211227', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00bcsh8p54 U872\x00\x00\x00\x00\x00\x00TON4G38NB1\x96z28', - b'\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00TON4G38NB2[v\\\xb6', - b'\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX2G38NB5X\xfa\xe88', - b'\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00TON2G38NB5j\x94.\xde', - b'\xf1\x87LBLUFN591307KF25vgvw\x97wwwy\x99\xa7\x99\x99\xaa\xa9\x9af\x88\x96h\x95o\xf7\xff\x99f/\xff\xe4c\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX2G38NB2\xd7\xc1/\xd1', - b"\xf1\x87LBLUFN622950KF36\xa8\x88\x88\x88\x87w\x87xh\x99\x96\x89\x88\x99\x98\x89\x88\x99\x98\x89\x87o\xf6\xff\x98\x88o\xffx'\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX2G38NB3\xd1\xc3\xf8\xa8", - b'\xf1\x87LBLUFN650868KF36\xa9\x98\x89\x88\xa8\x88\x88\x88h\x99\xa6\x89fw\x86gw\x88\x97x\xaa\x7f\xf6\xff\xbb\xbb\x8f\xff+\x82\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX2G38NB3\xd1\xc3\xf8\xa8', - b'\xf1\x87LBLUFN655162KF36\x98\x88\x88\x88\x98\x88\x88\x88x\x99\xa7\x89x\x99\xa7\x89x\x99\x97\x89g\x7f\xf7\xffwU_\xff\xe9!\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX2G38NB3\xd1\xc3\xf8\xa8', - b'\xf1\x87LBLUFN731381KF36\xb9\x99\x89\x98\x98\x88\x88\x88\x89\x99\xa8\x99\x88\x99\xa8\x89\x88\x88\x98\x88V\x7f\xf6\xff\x99w\x8f\xff\xad\xd8\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX2G38NB3\xd1\xc3\xf8\xa8', - b'\xf1\x87LDKVAA0028604HH1\xa8\x88x\x87vgvw\x88\x99\xa8\x89gw\x86ww\x88\x97x\x97o\xf9\xff\x97w\x7f\xffo\x02\xf1\x81U872\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U872\x00\x00\x00\x00\x00\x00TON4G38NB1\x96z28', - b'\xf1\x87LDKVAA3068374HH1wwww\x87xw\x87y\x99\xa7\x99w\x88\x87xw\x88\x97x\x85\xaf\xfa\xffvU/\xffU\xdc\xf1\x81U872\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U872\x00\x00\x00\x00\x00\x00TON4G38NB1\x96z28', - b'\xf1\x87LDKVBN382172KF26\x98\x88\x88\x88\xa8\x88\x88\x88x\x99\xa7\x89\x87\x88\x98x\x98\x99\xa9\x89\xa5_\xf6\xffDDO\xff\xcd\x16\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB2\xafL]\xe7', - b'\xf1\x87LDKVBN424201KF26\xba\xaa\x9a\xa9\x99\x99\x89\x98\x89\x99\xa8\x99\x88\x99\x98\x89\x88\x99\xa8\x89v\x7f\xf7\xffwf_\xffq\xa6\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB2\xafL]\xe7', - b'\xf1\x87LDKVBN540766KF37\x87wgv\x87w\x87xx\x99\x97\x89v\x88\x97h\x88\x88\x88\x88x\x7f\xf6\xffvUo\xff\xd3\x01\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB2\xafL]\xe7', - b'\xf1\x87LDLVAA4225634HH1\x98\x88\x88\x88eUeVx\x88\x87\x88g\x88\x86xx\x88\x87\x88\x86o\xf9\xff\x87w\x7f\xff\xf2\xf7\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00TON4G38NB2[v\\\xb6', - b'\xf1\x87LDLVAA4478824HH1\x87wwwvfvg\x89\x99\xa8\x99w\x88\x87x\x89\x99\xa8\x99\xa6o\xfa\xfffU/\xffu\x92\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00TON4G38NB2[v\\\xb6', - b'\xf1\x87LDLVAA4777834HH1\x98\x88x\x87\x87wwwx\x88\x87\x88x\x99\x97\x89x\x88\x97\x88\x86o\xfa\xff\x86fO\xff\x1d9\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00TON4G38NB2[v\\\xb6', - b'\xf1\x87LDLVAA5194534HH1ffvguUUUx\x88\xa7\x88h\x99\x96\x89x\x88\x97\x88ro\xf9\xff\x98wo\xff\xaaM\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00TON4G38NB2[v\\\xb6', - b'\xf1\x87LDLVAA5949924HH1\xa9\x99y\x97\x87wwwx\x99\x97\x89x\x99\xa7\x89x\x99\xa7\x89\x87_\xfa\xffeD?\xff\xf1\xfd\xf1\x81U903\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U903\x00\x00\x00\x00\x00\x00TON4G38NB2[v\\\xb6', - b'\xf1\x87LDLVBN560098KF26\x86fff\x87vgfg\x88\x96xfw\x86gfw\x86g\x95\xf6\xffeU_\xff\x92c\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB2\xafL]\xe7', - b'\xf1\x87LDLVBN602045KF26\xb9\x99\x89\x98\x97vwgy\xaa\xb7\x9af\x88\x96hw\x99\xa7y\xa9\x7f\xf5\xff\x99w\x7f\xff,\xd3\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN628911KF26\xa9\x99\x89\x98\x98\x88\x88\x88y\x99\xa7\x99fw\x86gw\x88\x87x\x83\x7f\xf6\xff\x98wo\xff2\xda\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN645817KF37\x87www\x98\x87xwx\x99\x97\x89\x99\x99\x99\x99g\x88\x96x\xb6_\xf7\xff\x98fo\xff\xe2\x86\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN662115KF37\x98\x88\x88\x88\xa8\x88\x88\x88x\x99\x97\x89x\x99\xa7\x89\x88\x99\xa8\x89\x88\x7f\xf7\xfffD_\xff\xdc\x84\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN667933KF37\xb9\x99\x89\x98\xb9\x99\x99\x99x\x88\x87\x88w\x88\x87x\x88\x88\x98\x88\xcbo\xf7\xffe3/\xffQ!\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN673087KF37\x97www\x86fvgx\x99\x97\x89\x99\xaa\xa9\x9ag\x88\x86x\xe9_\xf8\xff\x98w\x7f\xff"\xad\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN673841KF37\x98\x88x\x87\x86g\x86xy\x99\xa7\x99\x88\x99\xa8\x89w\x88\x97xdo\xf5\xff\x98\x88\x8f\xffT\xec\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN681363KF37\x98\x88\x88\x88\x97x\x87\x88y\xaa\xa7\x9a\x88\x88\x98\x88\x88\x88\x88\x88vo\xf6\xffvD\x7f\xff%v\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN713782KF37\x99\x99y\x97\x98\x88\x88\x88x\x88\x97\x88\x88\x99\x98\x89\x88\x99\xa8\x89\x87o\xf7\xffeU?\xff7,\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN713890KF26\xb9\x99\x89\x98\xa9\x99\x99\x99x\x99\x97\x89\x88\x99\xa8\x89\x88\x99\xb8\x89Do\xf7\xff\xa9\x88o\xffs\r\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN733215KF37\x99\x98y\x87\x97wwwi\x99\xa6\x99x\x99\xa7\x89V\x88\x95h\x86o\xf7\xffeDO\xff\x12\xe7\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN750044KF37\xca\xa9\x8a\x98\xa7wwwy\xaa\xb7\x9ag\x88\x96x\x88\x99\xa8\x89\xb9\x7f\xf6\xff\xa8w\x7f\xff\xbe\xde\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN752612KF37\xba\xaa\x8a\xa8\x87w\x87xy\xaa\xa7\x9a\x88\x99\x98\x89x\x88\x97\x88\x96o\xf6\xffvU_\xffh\x1b\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN755553KF37\x87xw\x87\x97w\x87xy\x99\xa7\x99\x99\x99\xa9\x99Vw\x95gwo\xf6\xffwUO\xff\xb5T\xf1\x81U891\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U891\x00\x00\x00\x00\x00\x00SLX4G38NB3X\xa8\xc08', - b'\xf1\x87LDLVBN757883KF37\x98\x87xw\x98\x87\x88xy\xaa\xb7\x9ag\x88\x96x\x89\x99\xa8\x99e\x7f\xf6\xff\xa9\x88o\xff5\x15\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB4\xd6\xe8\xd7\xa6', - b'\xf1\x87LDMVBN778156KF37\x87vWe\xa9\x99\x99\x99y\x99\xb7\x99\x99\x99\x99\x99x\x99\x97\x89\xa8\x7f\xf8\xffwf\x7f\xff\x82_\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB4\xd6\xe8\xd7\xa6', - b'\xf1\x87LDMVBN780576KF37\x98\x87hv\x97x\x97\x89x\x99\xa7\x89\x88\x99\x98\x89w\x88\x97x\x98\x7f\xf7\xff\xba\x88\x8f\xff\x1e0\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB4\xd6\xe8\xd7\xa6', - b'\xf1\x87LDMVBN783485KF37\x87www\x87vwgy\x99\xa7\x99\x99\x99\xa9\x99Vw\x95g\x89_\xf6\xff\xa9w_\xff\xc5\xd6\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB4\xd6\xe8\xd7\xa6', - b'\xf1\x87LDMVBN811844KF37\x87vwgvfffx\x99\xa7\x89Vw\x95gg\x88\xa6xe\x8f\xf6\xff\x97wO\xff\t\x80\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB4\xd6\xe8\xd7\xa6', - b'\xf1\x87LDMVBN830601KF37\xa7www\xa8\x87xwx\x99\xa7\x89Uw\x85Ww\x88\x97x\x88o\xf6\xff\x8a\xaa\x7f\xff\xe2:\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB4\xd6\xe8\xd7\xa6', - b'\xf1\x87LDMVBN848789KF37\x87w\x87x\x87w\x87xy\x99\xb7\x99\x87\x88\x98x\x88\x99\xa8\x89\x87\x7f\xf6\xfffUo\xff\xe3!\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN851595KF37\x97wgvvfffx\x99\xb7\x89\x88\x99\x98\x89\x87\x88\x98x\x99\x7f\xf7\xff\x97w\x7f\xff@\xf3\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN871852KF37\xb9\x99\x99\x99\xa8\x88\x88\x88y\x99\xa7\x99x\x99\xa7\x89\x88\x88\x98\x88\x89o\xf7\xff\xaa\x88o\xff\x0e\xed\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN873175KF26\xa8\x88\x88\x88vfVex\x99\xb7\x89\x88\x99\x98\x89x\x88\x97\x88f\x7f\xf7\xff\xbb\xaa\x8f\xff,\x04\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN879401KF26veVU\xa8\x88\x88\x88g\x88\xa6xVw\x95gx\x88\xa7\x88v\x8f\xf9\xff\xdd\xbb\xbf\xff\xb3\x99\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN881314KF37\xa8\x88h\x86\x97www\x89\x99\xa8\x99w\x88\x97xx\x99\xa7\x89\xca\x7f\xf8\xff\xba\x99\x8f\xff\xd8v\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN888651KF37\xa9\x99\x89\x98vfff\x88\x99\x98\x89w\x99\xa7y\x88\x88\x98\x88D\x8f\xf9\xff\xcb\x99\x8f\xff\xa5\x1e\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN889419KF37\xa9\x99y\x97\x87w\x87xx\x88\x97\x88w\x88\x97x\x88\x99\x98\x89e\x9f\xf9\xffeUo\xff\x901\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN895969KF37vefV\x87vgfx\x99\xa7\x89\x99\x99\xb9\x99f\x88\x96he_\xf7\xffxwo\xff\x14\xf9\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN899222KF37\xa8\x88x\x87\x97www\x98\x99\x99\x89\x88\x99\x98\x89f\x88\x96hdo\xf7\xff\xbb\xaa\x9f\xff\xe2U\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - b'\xf1\x87LDMVBN950669KF37\x97www\x96fffy\x99\xa7\x99\xa9\x99\xaa\x99g\x88\x96x\xb8\x8f\xf9\xffTD/\xff\xa7\xcb\xf1\x81U922\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U922\x00\x00\x00\x00\x00\x00SLX4G38NB5\xb9\x94\xe8\x89', - ], }, CAR.HYUNDAI_VELOSTER: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -801,11 +460,6 @@ FW_VERSIONS = { b'\xf1\x00\x00\x00\x00\x00\x00\x00', b'\xf1\x816V8RAC00121.ELF\xf1\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'\x01TJS-JDK06F200H0A', - b'\x01TJS-JNU06F200H0A', - b'391282BJF5 ', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00JSL MDPS C 1.00 1.03 56340-J3000 8308', ], @@ -813,30 +467,18 @@ FW_VERSIONS = { b'\xf1\x00JS LKAS AT KOR LHD 1.00 1.03 95740-J3000 K33', b'\xf1\x00JS LKAS AT USA LHD 1.00 1.02 95740-J3000 K32', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x816U2V8051\x00\x00\xf1\x006U2V0_C2\x00\x006U2V8051\x00\x00DJS0T16KS2\x0e\xba\x1e\xa2', - b'\xf1\x816U2V8051\x00\x00\xf1\x006U2V0_C2\x00\x006U2V8051\x00\x00DJS0T16NS1\x00\x00\x00\x00', - b'\xf1\x816U2V8051\x00\x00\xf1\x006U2V0_C2\x00\x006U2V8051\x00\x00DJS0T16NS1\xba\x02\xb8\x80', - ], }, CAR.GENESIS_G70: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00IK__ SCC F-CUP 1.00 1.01 96400-G9100 ', b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 ', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81640F0051\x00\x00\x00\x00\x00\x00\x00\x00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00IK MDPS R 1.00 1.06 57700-G9420 4I4VL106', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00IK MFC AT USA LHD 1.00 1.01 95740-G9000 170920', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T33NB2\x11\x1am\xda', - b'\xf1\x87VDJLT17895112DN4\x88fVf\x99\x88\x88\x88\x87fVe\x88vhwwUFU\x97eFex\x99\x7f\xff\xb7\x82\xf1\x81E25\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T33NB2\x11\x1am\xda', - ], }, CAR.GENESIS_G70_2020: { (Ecu.eps, 0x7d4, None): [ @@ -846,14 +488,6 @@ FW_VERSIONS = { b'\xf1\x00IK MDPS R 1.00 1.08 57700-G9420 4I4VL108', b'\xf1\x00IK MDPS R 1.00 5.09 57700-G9520 4I4VL509', ], - (Ecu.transmission, 0x7e1, None): [ - b'\x00\x00\x00\x00\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T33NB4\xecE\xefL', - b'\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T20KB3Wuvz', - b'\xf1\x00bcsh8p54 E31\x00\x00\x00\x00\x00\x00\x00SIK0T33NH0\x0f\xa3Y*', - b'\xf1\x87VCJLP18407832DN3\x88vXfvUVT\x97eFU\x87d7v\x88eVeveFU\x89\x98\x7f\xff\xb2\xb0\xf1\x81E25\x00\x00\x00', - b'\xf1\x87VDJLC18480772DK9\x88eHfwfff\x87eFUeDEU\x98eFe\x86T5DVyo\xff\x87s\xf1\x81E25\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T33KB5\x9f\xa5&\x81', - b'\xf1\x87VDKLT18912362DN4wfVfwefeveVUwfvw\x88vWfvUFU\x89\xa9\x8f\xff\x87w\xf1\x81E25\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SIK0T33NB4\xecE\xefL', - ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 ', b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 \xf1\xa01.02', @@ -865,12 +499,6 @@ FW_VERSIONS = { b'\xf1\x00IK MFC AT USA LHD 1.00 1.01 95740-G9000 170920', b'\xf1\x00IK MFC AT USA LHD 1.00 1.04 99211-G9000 220401', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81606G2051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81640H0051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81640J0051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81640N2051\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.GENESIS_G80: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -885,26 +513,8 @@ FW_VERSIONS = { b'\xf1\x00DH LKAS AT USA LHD 1.01 1.03 95895-B1500 180713', b'\xf1\x00DH LKAS AT USA LHD 1.01 1.04 95895-B1500 181213', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00bcsh8p54 E18\x00\x00\x00\x00\x00\x00\x00SDH0G33KH2\xae\xde\xd5!', - b'\xf1\x00bcsh8p54 E18\x00\x00\x00\x00\x00\x00\x00SDH0G38NH2j\x9dA\x1c', - b'\xf1\x00bcsh8p54 E18\x00\x00\x00\x00\x00\x00\x00SDH0G38NH3\xaf\x1a7\xe2', - b'\xf1\x00bcsh8p54 E18\x00\x00\x00\x00\x00\x00\x00SDH0T33NH3\x97\xe6\xbc\xb8', - b'\xf1\x00bcsh8p54 E18\x00\x00\x00\x00\x00\x00\x00TDH0G38NH3:-\xa9n', - b'\xf1\x00bcsh8p54 E21\x00\x00\x00\x00\x00\x00\x00SDH0T33NH4\xd7O\x9e\xc9', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81640A4051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81640F0051\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.GENESIS_G90: { - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00bcsh8p54 E25\x00\x00\x00\x00\x00\x00\x00SHI0G50NH0\xff\x80\xc2*', - b'\xf1\x87VDGMD15352242DD3w\x87gxwvgv\x87wvw\x88wXwffVfffUfw\x88o\xff\x06J\xf1\x81E14\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcshcm49 E14\x00\x00\x00\x00\x00\x00\x00SHI0G50NB1tc5\xb7', - b'\xf1\x87VDGMD15866192DD3x\x88x\x89wuFvvfUf\x88vWwgwwwvfVgx\x87o\xff\xbc^\xf1\x81E14\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcshcm49 E14\x00\x00\x00\x00\x00\x00\x00SHI0G50NB1tc5\xb7', - b'\xf1\x87VDHMD16446682DD3WwwxxvGw\x88\x88\x87\x88\x88whxx\x87\x87\x87\x85fUfwu_\xffT\xf8\xf1\x81E14\x00\x00\x00\x00\x00\x00\x00\xf1\x00bcshcm49 E14\x00\x00\x00\x00\x00\x00\x00SHI0G50NB1tc5\xb7', - ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00HI__ SCC F-CUP 1.00 1.01 96400-D2100 ', b'\xf1\x00HI__ SCC FHCUP 1.00 1.02 99110-D2100 ', @@ -914,9 +524,6 @@ FW_VERSIONS = { b'\xf1\x00HI LKAS AT USA LHD 1.00 1.00 95895-D2030 170208', b'\xf1\x00HI MFC AT USA LHD 1.00 1.03 99211-D2000 190831', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x810000000000\x00', - ], }, CAR.HYUNDAI_KONA: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -925,18 +532,12 @@ FW_VERSIONS = { (Ecu.abs, 0x7d1, None): [ b'\xf1\x816V5RAK00018.ELF\xf1\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'"\x01TOS-0NU06F301J02', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00OS MDPS C 1.00 1.05 56310J9030\x00 4OSDC105', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00OS9 LKAS AT USA LHD 1.00 1.00 95740-J9300 g21', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x816U2VE051\x00\x00\xf1\x006U2V0_C2\x00\x006U2VE051\x00\x00DOS4T16NS3\x00\x00\x00\x00', - ], }, CAR.KIA_CEED: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -948,13 +549,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00CD LKAS AT EUR LHD 1.00 1.01 99211-J7000 B40', ], - (Ecu.engine, 0x7e0, None): [ - b'\x01TCD-JECU4F202H0K', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x816U2V7051\x00\x00\xf1\x006U2V0_C2\x00\x006U2V7051\x00\x00DCD0T14US1\x00\x00\x00\x00', - b'\xf1\x816U2V7051\x00\x00\xf1\x006U2V0_C2\x00\x006U2V7051\x00\x00DCD0T14US1U\x867Z', - ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00CD ESC \x03 102\x18\x08\x05 58920-J7350', ], @@ -975,22 +569,11 @@ FW_VERSIONS = { b'\xf1\x00BDPE_SCC FHCUPC 1.00 1.04 99110-M6500\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'\xf1\x00BD__ SCC H-CUP 1.00 1.02 99110-M6000 ', ], - (Ecu.engine, 0x7e0, None): [ - b'\x01TBDM1NU06F200H01', - b'391182B945\x00', - b'\xf1\x81616F2051\x00\x00\x00\x00\x00\x00\x00\x00', - ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00\x00\x00\x00\x00\x00\x00', b'\xf1\x816VGRAH00018.ELF\xf1\x00\x00\x00\x00\x00\x00\x00', b'\xf1\x8758900-M7AB0 \xf1\x816VQRAD00127.ELF\xf1\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006V2B0_C2\x00\x006V2C6051\x00\x00CBD0N20NL1\x00\x00\x00\x00', - b'\xf1\x006V2B0_C2\x00\x006V2C6051\x00\x00CBD0N20NL1\x90@\xc6\xae', - b'\xf1\x816U2VC051\x00\x00\xf1\x006U2V0_C2\x00\x006U2VC051\x00\x00DBD0T16SS0\x00\x00\x00\x00', - b"\xf1\x816U2VC051\x00\x00\xf1\x006U2V0_C2\x00\x006U2VC051\x00\x00DBD0T16SS0\xcf\x1e'\xc3", - ], }, CAR.KIA_K5_2021: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -1025,23 +608,6 @@ FW_VERSIONS = { b'\xf1\x8758910-L3600\xf1\x00DL ESC \x03 100 \x08\x02 58910-L3600', b'\xf1\x8758910-L3800\xf1\x00DL ESC \t 101 \x07\x02 58910-L3800', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81HM6M2_0a0_DQ0', - b'\xf1\x870\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x82DLDWN5TMDCXXXJ1B', - b'\xf1\x87391212MKT0', - b'\xf1\x87391212MKT3', - b'\xf1\x87391212MKV0', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00HT6TA261BLHT6TAB00A1SDL0C20KS0\x00\x00\x00\x00\x00\x00\\\x9f\xa5\x15', - b'\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00TDL2T16NB1ia\x0b\xb8', - b'\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00TDL2T16NB2.\x13\xf6\xed', - b'\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00TDL4T16NB05\x94t\x18', - b'\xf1\x87954A02N300\x00\x00\x00\x00\x00\xf1\x81T02730A1 \xf1\x00T02601BL T02730A1 WDL3T25XXX730NS2b\x1f\xb8%', - b'\xf1\x87SALFEA5652514GK2UUeV\x88\x87\x88xxwg\x87ww\x87wwfwvd/\xfb\xffvU_\xff\x93\xd3\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00TDL2T16NB1ia\x0b\xb8', - b'\xf1\x87SALFEA6046104GK2wvwgeTeFg\x88\x96xwwwwffvfe?\xfd\xff\x86fo\xff\x97A\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00TDL2T16NB1ia\x0b\xb8', - b'\xf1\x87SCMSAA8572454GK1\x87x\x87\x88Vf\x86hgwvwvwwgvwwgT?\xfb\xff\x97fo\xffH\xb8\xf1\x81U913\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U913\x00\x00\x00\x00\x00\x00TDL4T16NB05\x94t\x18', - ], }, CAR.KIA_K5_HEV_2020: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -1055,13 +621,6 @@ FW_VERSIONS = { b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.02 99210-L2000 200309', b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.04 99210-L2000 210527', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x87391162JLA0', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00PSBG2323 E08\x00\x00\x00\x00\x00\x00\x00TDL2H20KA2\xe3\xc6cz', - b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TDL2H20KA5T\xf2\xc9\xc2', - ], }, CAR.HYUNDAI_KONA_EV: { (Ecu.abs, 0x7d1, None): [ @@ -1167,20 +726,6 @@ FW_VERSIONS = { ], }, CAR.KIA_NIRO_PHEV: { - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6D0051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816H6D1051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816H6F4051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816H6F6051\x00\x00\x00\x00\x00\x00\x00\x00', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006U3H0_C2\x00\x006U3G0051\x00\x00HDE0G16NS2\x00\x00\x00\x00', - b'\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00PDE0G16NL2&[\xc3\x01', - b'\xf1\x816U3H3051\x00\x00\xf1\x006U3H0_C2\x00\x006U3H3051\x00\x00PDE0G16NS1\x00\x00\x00\x00', - b'\xf1\x816U3H3051\x00\x00\xf1\x006U3H0_C2\x00\x006U3H3051\x00\x00PDE0G16NS1\x13\xcd\x88\x92', - b'\xf1\x816U3J2051\x00\x00\xf1\x006U3H0_C2\x00\x006U3J2051\x00\x00PDE0G16NS2\x00\x00\x00\x00', - b"\xf1\x816U3J2051\x00\x00\xf1\x006U3H0_C2\x00\x006U3J2051\x00\x00PDE0G16NS2\xf4'\\\x91", - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101', b'\xf1\x00DE MDPS C 1.00 1.09 56310G5301\x00 4DEHC109', @@ -1197,14 +742,6 @@ FW_VERSIONS = { ], }, CAR.KIA_NIRO_PHEV_2022: { - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6G5051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816H6G6051\x00\x00\x00\x00\x00\x00\x00\x00', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00PDE0G16NL3\x00\x00\x00\x00', - b'\xf1\x816U3J9051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00PDE0G16NL3\x00\x00\x00\x00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101', ], @@ -1217,13 +754,6 @@ FW_VERSIONS = { ], }, CAR.KIA_NIRO_HEV_2021: { - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6G5051\x00\x00\x00\x00\x00\x00\x00\x00', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x816U3J9051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00HDE0G16NL3\x00\x00\x00\x00', - b'\xf1\x816U3J9051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00HDE0G16NL3\xb9\xd3\xfaW', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101', ], @@ -1243,12 +773,6 @@ FW_VERSIONS = { b'\xf1\x8758910-Q5450\xf1\x00SP ESC \x07 101\x19\t\x05 58910-Q5450', b'\xf1\x8758910-Q5450\xf1\x00SP ESC \t 101\x19\t\x05 58910-Q5450', ], - (Ecu.engine, 0x7e0, None): [ - b'\x01TSP2KNL06F100J0K', - b'\x01TSP2KNL06F200J0K', - b'\xf1\x81616D2051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x81616D5051\x00\x00\x00\x00\x00\x00\x00\x00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00SP2 MDPS C 1.00 1.04 56300Q5200 ', b'\xf1\x00SP2 MDPS C 1.01 1.05 56300Q5200 ', @@ -1257,11 +781,6 @@ FW_VERSIONS = { b'\xf1\x00SP2 MFC AT USA LHD 1.00 1.04 99210-Q5000 191114', b'\xf1\x00SP2 MFC AT USA LHD 1.00 1.05 99210-Q5000 201012', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x87954A22D200\xf1\x81T01950A1 \xf1\x00T0190XBL T01950A1 DSP2T16X4X950NS6\xd30\xa5\xb9', - b'\xf1\x87954A22D200\xf1\x81T01950A1 \xf1\x00T0190XBL T01950A1 DSP2T16X4X950NS8\r\xfe\x9c\x8b', - b'\xf1\x87CZLUB49370612JF7h\xa8y\x87\x99\xa7hv\x99\x97fv\x88\x87x\x89x\x96O\xff\x88\xff\xff\xff.@\xf1\x816V2C2051\x00\x00\xf1\x006V2B0_C2\x00\x006V2C2051\x00\x00CSP4N20NS3\x00\x00\x00\x00', - ], }, CAR.KIA_OPTIMA_G4: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -1273,9 +792,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00JFWGN LDWS AT USA LHD 1.00 1.02 95895-D4100 G21', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x87\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf1\x816T6J0051\x00\x00\xf1\x006T6J0_C2\x00\x006T6J0051\x00\x00TJF0T20NSB\x00\x00\x00\x00', - ], }, CAR.KIA_OPTIMA_G4_FL: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -1289,17 +805,6 @@ FW_VERSIONS = { b'\xf1\x00JFA LKAS AT USA LHD 1.00 1.00 95895-D5001 h32', b'\xf1\x00JFA LKAS AT USA LHD 1.00 1.00 95895-D5100 h32', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006U2V0_C2\x00\x006U2V8051\x00\x00DJF0T16NL0\t\xd2GW', - b'\xf1\x006U2V0_C2\x00\x006U2VA051\x00\x00DJF0T16NL1\x00\x00\x00\x00', - b'\xf1\x006U2V0_C2\x00\x006U2VA051\x00\x00DJF0T16NL1\xca3\xeb.', - b'\xf1\x006U2V0_C2\x00\x006U2VC051\x00\x00DJF0T16NL2\x9eA\x80\x01', - b'\xf1\x816U2V8051\x00\x00\xf1\x006U2V0_C2\x00\x006U2V8051\x00\x00DJF0T16NL0\t\xd2GW', - b'\xf1\x816U2VA051\x00\x00\xf1\x006U2V0_C2\x00\x006U2VA051\x00\x00DJF0T16NL1\x00\x00\x00\x00', - b'\xf1\x816U2VA051\x00\x00\xf1\x006U2V0_C2\x00\x006U2VA051\x00\x00DJF0T16NL1\xca3\xeb.', - b'\xf1\x816U2VC051\x00\x00\xf1\x006U2V0_C2\x00\x006U2VC051\x00\x00DJF0T16NL2\x9eA\x80\x01', - b'\xf1\x87\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf1\x816T6B8051\x00\x00\xf1\x006T6H0_C2\x00\x006T6B8051\x00\x00TJFSG24NH27\xa7\xc2\xb4', - ], }, CAR.KIA_OPTIMA_H: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -1316,28 +821,12 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00JFH MFC AT KOR LHD 1.00 1.01 95895-A8200 180323', ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6D1051\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_ELANTRA: { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00AD LKAS AT USA LHD 1.01 1.01 95895-F2000 251', b'\xf1\x00ADP LKAS AT USA LHD 1.00 1.03 99211-F2000 X31', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006T6J0_C2\x00\x006T6F0051\x00\x00TAD0N20NS2\x00\x00\x00\x00', - b'\xf1\x006T6J0_C2\x00\x006T6F0051\x00\x00TAD0N20NS2\xc5\x92\x9e\x8a', - b'\xf1\x006T6J0_C2\x00\x006T6F0051\x00\x00TAD0N20SS2.~\x90\x87', - b'\xf1\x006T6K0_C2\x00\x006T6S2051\x00\x00TAD0N20NSD\x00\x00\x00\x00', - b'\xf1\x006T6K0_C2\x00\x006T6S2051\x00\x00TAD0N20NSD(\xfcA\x9d', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x8161657051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816165D051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816165E051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x8161698051\x00\x00\x00\x00\x00\x00\x00\x00', - ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00AD ESC \x11 11 \x18\x05\x06 58910-F2840', b'\xf1\x00AD ESC \x11 12 \x15\t\t 58920-F2810', @@ -1353,12 +842,6 @@ FW_VERSIONS = { b'\xf1\x00PD LKAS AT USA LHD 1.00 1.02 95740-G3000 A51', b'\xf1\x00PD LKAS AT USA LHD 1.01 1.01 95740-G3100 A54', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006U2U0_C2\x00\x006U2T0051\x00\x00DPD0D16KS0u\xce\x1fk', - b'\xf1\x006U2V0_C2\x00\x006U2V8051\x00\x00DPD0T16NS4\x00\x00\x00\x00', - b'\xf1\x006U2V0_C2\x00\x006U2V8051\x00\x00DPD0T16NS4\xda\x7f\xd6\xa7', - b'\xf1\x006U2V0_C2\x00\x006U2VA051\x00\x00DPD0H16NS0e\x0e\xcd\x8e', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00PD MDPS C 1.00 1.00 56310G3300\x00 4PDDC100', b'\xf1\x00PD MDPS C 1.00 1.03 56310/G3300 4PDDC103', @@ -1400,22 +883,6 @@ FW_VERSIONS = { b'\xf1\x8758910-AA800\xf1\x00CN ESC \t 105 \x10\x03 58910-AA800', b'\xf1\x8758910-AB800\xf1\x00CN ESC \t 101 \x10\x03 58910-AB800\xf1\xa01.01', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00HT6WA280BLHT6VA640A1CCN0N20NS5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x00HT6WA280BLHT6VA640A1CCN0N20NS5\x00\x00\x00\x00\x00\x00\xe8\xba\xce\xfa', - b'\xf1\x87CXLQF40189012JL2f\x88\x86\x88\x88vUex\xb8\x88\x88\x88\x87\x88\x89fh?\xffz\xff\xff\xff\x08z\xf1\x89HT6VA640A1\xf1\x82CCN0N20NS5\x00\x00\x00\x00\x00\x00', - b'\xf1\x87CXMQFM1916035JB2\x88vvgg\x87Wuwgev\xa9\x98\x88\x98h\x99\x9f\xffh\xff\xff\xff\xa5\xee\xf1\x89HT6VA640A1\xf1\x82CCN0N20NS5\x00\x00\x00\x00\x00\x00', - b'\xf1\x87CXMQFM2135005JB2E\xb9\x89\x98W\xa9y\x97h\xa9\x98\x99wxvwh\x87\x7f\xffx\xff\xff\xff,,\xf1\x89HT6VA640A1\xf1\x82CCN0N20NS5\x00\x00\x00\x00\x00\x00', - b'\xf1\x87CXMQFM2728305JB2E\x97\x87xw\x87vwgw\x84x\x88\x88w\x89EI\xbf\xff{\xff\xff\xff\xe6\x0e\xf1\x89HT6VA640A1\xf1\x82CCN0N20NS5\x00\x00\x00\x00\x00\x00', - b'\xf1\x87CXMQFM3806705JB2\x89\x87wwx\x88g\x86\x99\x87\x86xwwv\x88yv\x7f\xffz\xff\xff\xffV\x15\xf1\x89HT6VA640A1\xf1\x82CCN0N20NS5\x00\x00\x00\x00\x00\x00', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81HM6M2_0a0_FF0', - b'\xf1\x82CNCVD0AMFCXCSFFB', - b'\xf1\x82CNCWD0AMFCXCSFFA', - b'\xf1\x870\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x81HM6M2_0a0_G80', - b'\xf1\x870\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x81HM6M2_0a0_HC0', - ], }, CAR.HYUNDAI_ELANTRA_HEV_2021: { (Ecu.fwdCamera, 0x7c4, None): [ @@ -1435,18 +902,6 @@ FW_VERSIONS = { b'\xf1\x8756310/BY050\xf1\x00CN7 MDPS C 1.00 1.02 56310/BY050 4CNHC102', b'\xf1\x8756310/BY050\xf1\x00CN7 MDPS C 1.00 1.03 56310/BY050 4CNHC103', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006U3L0_C2\x00\x006U3K3051\x00\x00HCN0G16NS0\x00\x00\x00\x00', - b'\xf1\x006U3L0_C2\x00\x006U3K3051\x00\x00HCN0G16NS0\xb9?A\xaa', - b'\xf1\x006U3L0_C2\x00\x006U3K9051\x00\x00HCN0G16NS1\x00\x00\x00\x00', - b'\xf1\x816U3K3051\x00\x00\xf1\x006U3L0_C2\x00\x006U3K3051\x00\x00HCN0G16NS0\x00\x00\x00\x00', - b'\xf1\x816U3K3051\x00\x00\xf1\x006U3L0_C2\x00\x006U3K3051\x00\x00HCN0G16NS0\xb9?A\xaa', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6G5051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816H6G6051\x00\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816H6G8051\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_KONA_HEV: { (Ecu.abs, 0x7d1, None): [ @@ -1461,12 +916,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00OSH LKAS AT KOR LHD 1.00 1.01 95740-CM000 l31', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x816U3J9051\x00\x00\xf1\x006U3H1_C2\x00\x006U3J9051\x00\x00HOS0G16DS1\x16\xc7\xb0\xd9', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6F6051\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.HYUNDAI_SONATA_HYBRID: { (Ecu.fwdRadar, 0x7d0, None): [ @@ -1491,22 +940,6 @@ FW_VERSIONS = { b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.06 99211-L1000 210325', b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.07 99211-L1000 211223', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00PSBG2314 E07\x00\x00\x00\x00\x00\x00\x00TDN2H20KA5\xba\x82\xc7\xc3', - b'\xf1\x00PSBG2323 E09\x00\x00\x00\x00\x00\x00\x00TDN2H20SA5\x97R\x88\x9e', - b'\xf1\x00PSBG2333 E14\x00\x00\x00\x00\x00\x00\x00TDN2H20SA6N\xc2\xeeW', - b'\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TDN2H20SA7\x1a3\xf9\xab', - b'\xf1\x87959102T250\x00\x00\x00\x00\x00\xf1\x81E09\x00\x00\x00\x00\x00\x00\x00\xf1\x00PSBG2323 E09\x00\x00\x00\x00\x00\x00\x00TDN2H20SA5\x97R\x88\x9e', - b'\xf1\x87959102T250\x00\x00\x00\x00\x00\xf1\x81E14\x00\x00\x00\x00\x00\x00\x00\xf1\x00PSBG2333 E14\x00\x00\x00\x00\x00\x00\x00TDN2H20SA6N\xc2\xeeW', - b'\xf1\x87PCU\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x81E16\x00\x00\x00\x00\x00\x00\x00\xf1\x00PSBG2333 E16\x00\x00\x00\x00\x00\x00\x00TDN2H20SA7\x1a3\xf9\xab', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x87391062J002', - b'\xf1\x87391162J011', - b'\xf1\x87391162J012', - b'\xf1\x87391162J013', - b'\xf1\x87391162J014', - ], }, CAR.KIA_SORENTO: { (Ecu.fwdCamera, 0x7c4, None): [ @@ -1520,13 +953,6 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00UM__ SCC F-CUP 1.00 1.00 96400-C6500 ', ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00bcsh8p54 U834\x00\x00\x00\x00\x00\x00TUM2G33NL7K\xae\xdd\x1d', - b'\xf1\x87LDKUAA0348164HE3\x87www\x87www\x88\x88\xa8\x88w\x88\x97xw\x88\x97x\x86o\xf8\xff\x87f\x7f\xff\x15\xe0\xf1\x81U811\x00\x00\x00\x00\x00\x00\xf1\x00bcsh8p54 U811\x00\x00\x00\x00\x00\x00TUM4G33NL3V|DG', - ], - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x81640F0051\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.KIA_EV6: { (Ecu.fwdRadar, 0x7d0, None): [ diff --git a/selfdrive/car/hyundai/tests/test_hyundai.py b/selfdrive/car/hyundai/tests/test_hyundai.py index c9ec972313..30cc598a09 100755 --- a/selfdrive/car/hyundai/tests/test_hyundai.py +++ b/selfdrive/car/hyundai/tests/test_hyundai.py @@ -85,7 +85,7 @@ class TestHyundaiFingerprint(unittest.TestCase): for car_model, ecus in FW_VERSIONS.items(): with self.subTest(car_model=car_model.value): for ecu, fws in ecus.items(): - # TODO: enable for Ecu.fwdRadar, Ecu.abs, Ecu.eps, Ecu.transmission + # TODO: enable for Ecu.fwdRadar, Ecu.abs, Ecu.eps if ecu[0] in (Ecu.fwdCamera,): self.assertTrue(all(fw.startswith(expected_fw_prefix) for fw in fws), f"FW from unexpected request in database: {(ecu, fws)}") diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 37d18d2427..57ec0a31cc 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -647,8 +647,8 @@ PLATFORM_CODE_ECUS = [Ecu.fwdRadar, Ecu.fwdCamera, Ecu.eps] # TODO: there are date codes in the ABS firmware versions in hex DATE_FW_ECUS = [Ecu.fwdCamera] -ALL_HYUNDAI_ECUS = [Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.engine, Ecu.parkingAdas, - Ecu.transmission, Ecu.adas, Ecu.hvac, Ecu.cornerRadar, Ecu.combinationMeter] +ALL_HYUNDAI_ECUS = [Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.parkingAdas, + Ecu.adas, Ecu.hvac, Ecu.cornerRadar, Ecu.combinationMeter] FW_QUERY_CONFIG = FwQueryConfig( requests=[ @@ -657,12 +657,12 @@ FW_QUERY_CONFIG = FwQueryConfig( Request( [HYUNDAI_VERSION_REQUEST_LONG], [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.transmission, Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera], + whitelist_ecus=[Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera], ), Request( [HYUNDAI_VERSION_REQUEST_MULTI], [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.engine, Ecu.transmission, Ecu.eps, Ecu.abs, Ecu.fwdRadar], + whitelist_ecus=[Ecu.eps, Ecu.abs, Ecu.fwdRadar], ), # CAN-FD queries (from camera) @@ -743,14 +743,6 @@ FW_QUERY_CONFIG = FwQueryConfig( # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present non_essential_ecus={ - Ecu.transmission: [CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, - CAR.GENESIS_G70, CAR.KIA_K5_2021, CAR.HYUNDAI_SONATA_HYBRID, CAR.HYUNDAI_ELANTRA_2021, CAR.HYUNDAI_ELANTRA_HEV_2021, - CAR.HYUNDAI_SANTA_FE, CAR.KIA_STINGER, CAR.KIA_NIRO_PHEV_2022, CAR.GENESIS_G70_2020, CAR.KIA_NIRO_HEV_2021, - CAR.KIA_FORTE, CAR.HYUNDAI_IONIQ_PHEV, CAR.KIA_STINGER_2022, CAR.GENESIS_G90], - Ecu.engine: [CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, - CAR.GENESIS_G70, CAR.KIA_K5_2021, CAR.HYUNDAI_SONATA_HYBRID, CAR.HYUNDAI_ELANTRA_2021, CAR.HYUNDAI_ELANTRA_HEV_2021, - CAR.HYUNDAI_SANTA_FE, CAR.KIA_STINGER, CAR.KIA_NIRO_PHEV_2022, CAR.GENESIS_G70_2020, CAR.KIA_NIRO_HEV_2021, CAR.KIA_FORTE, - CAR.HYUNDAI_IONIQ_PHEV, CAR.KIA_STINGER_2022, CAR.GENESIS_G90, CAR.KIA_OPTIMA_H_G4_FL], Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_ELANTRA_2021, CAR.HYUNDAI_SANTA_FE, CAR.KIA_FORTE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV], }, From 14de326e95d7cc201c6864cef97fbbf76e176c04 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 25 Mar 2024 01:48:23 +0800 Subject: [PATCH 138/384] =?UTF-8?q?ui/settings:=20uppercase=20=E2=80=9CPai?= =?UTF-8?q?r"=20(#31991)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit uppercase Pair --- selfdrive/ui/qt/offroad/settings.cc | 2 +- selfdrive/ui/translations/main_ar.ts | 2 +- selfdrive/ui/translations/main_de.ts | 2 +- selfdrive/ui/translations/main_fr.ts | 2 +- selfdrive/ui/translations/main_ja.ts | 2 +- selfdrive/ui/translations/main_ko.ts | 2 +- selfdrive/ui/translations/main_pt-BR.ts | 2 +- selfdrive/ui/translations/main_th.ts | 2 +- selfdrive/ui/translations/main_tr.ts | 2 +- selfdrive/ui/translations/main_zh-CHS.ts | 2 +- selfdrive/ui/translations/main_zh-CHT.ts | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index af32a9b10b..1c4e144468 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -207,7 +207,7 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { addItem(new LabelControl(tr("Dongle ID"), getDongleId().value_or(tr("N/A")))); addItem(new LabelControl(tr("Serial"), params.get("HardwareSerial").c_str())); - pair_device = new ButtonControl(tr("Pair Device"), tr("Pair"), + pair_device = new ButtonControl(tr("Pair Device"), tr("PAIR"), tr("Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer.")); connect(pair_device, &ButtonControl::clicked, [=]() { PairingPopup popup(this); diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 024ca0d4f6..79e31c7552 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -302,7 +302,7 @@ - Pair + PAIR diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index d849b27103..b3fa645217 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -302,7 +302,7 @@ - Pair + PAIR diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index 2294ba7af9..cc9c95acd4 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -302,7 +302,7 @@ - Pair + PAIR diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 7b07866efc..13c2083bce 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -302,7 +302,7 @@ - Pair + PAIR diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index e8fcb44228..a3fd82f610 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -302,7 +302,7 @@ - Pair + PAIR diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index adab93eff9..27231a9dc4 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -302,7 +302,7 @@ Parear Dispositivo - Pair + PAIR PAREAR diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index eae564d645..1451e3b419 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -302,7 +302,7 @@ - Pair + PAIR diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index 33773af16b..cb20532b47 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -302,7 +302,7 @@ - Pair + PAIR diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index fa858b8a8c..5625c73b97 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -302,7 +302,7 @@ - Pair + PAIR diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 12ae9fbe13..b5e36620ab 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -302,7 +302,7 @@ - Pair + PAIR From 61b38bd4ff78ce0e84ebb15b74242363c16ec255 Mon Sep 17 00:00:00 2001 From: royjr Date: Mon, 25 Mar 2024 11:59:24 -0400 Subject: [PATCH 139/384] ui: update arabic translations (#31994) --- selfdrive/ui/translations/main_ar.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 79e31c7552..4f83dc18de 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -299,11 +299,11 @@ Pair Device - + إقران الجهاز PAIR - + إقران @@ -629,7 +629,7 @@ now - + الآن @@ -670,7 +670,7 @@ This may take up to a minute. System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot. - + تم تفعيل إعادة ضبط النظام. اضغط على تأكيد لمسح جميع المحتويات والإعدادات. اضغط على إلغاء لاستئناف التمهيد. @@ -780,15 +780,15 @@ This may take up to a minute. Choose Software to Install - + اختر البرنامج للتثبيت openpilot - openpilot + openpilot Custom Software - + البرمجيات المخصصة @@ -1033,7 +1033,7 @@ This may take up to a minute. TogglesPanel Enable openpilot - تمكين + تمكين openpilot Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off. @@ -1165,7 +1165,7 @@ This may take up to a minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. - + يوصى بالمعيار. في الوضع العدواني، سيتبع الطيار المفتوح السيارات الرائدة بشكل أقرب ويكون أكثر عدوانية مع البنزين والفرامل. في الوضع المريح، سيبقى openpilot بعيدًا عن السيارات الرائدة. في السيارات المدعومة، يمكنك التنقل بين هذه الشخصيات باستخدام زر مسافة عجلة القيادة. From de8df59748505799aceb8c822697c93c59b0922e Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 25 Mar 2024 08:59:56 -0700 Subject: [PATCH 140/384] [bot] Update Python packages and pre-commit hooks (#31998) Update Python packages and pre-commit hooks Co-authored-by: jnewb1 --- .pre-commit-config.yaml | 2 +- poetry.lock | 89 +++++++++++++++++++++-------------------- 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1d152fee2a..d5e958371b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: - -L bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints - --builtins clear,rare,informal,usage,code,names,en-GB_to_en-US - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.3 + rev: v0.3.4 hooks: - id: ruff exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' diff --git a/poetry.lock b/poetry.lock index c2e0baad9c..e7f0429253 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1611,13 +1611,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.2" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.2-py3-none-any.whl", hash = "sha256:f4bc4c0c070c490abf4ce96d715f68e95923320370efb66143df00199bb6c100"}, - {file = "importlib_metadata-7.0.2.tar.gz", hash = "sha256:198f568f3230878cb1b44fbd7975f87906c22336dba2e4a7f05278c281fbd792"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] @@ -1626,7 +1626,7 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -2282,13 +2282,13 @@ tests = ["pytest (>=4.6)"] [[package]] name = "msal" -version = "1.27.0" +version = "1.28.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false -python-versions = ">=2.7" +python-versions = ">=3.7" files = [ - {file = "msal-1.27.0-py2.py3-none-any.whl", hash = "sha256:572d07149b83e7343a85a3bcef8e581167b4ac76befcbbb6eef0c0e19643cdc0"}, - {file = "msal-1.27.0.tar.gz", hash = "sha256:3109503c038ba6b307152b0e8d34f98113f2e7a78986e28d0baf5b5303afda52"}, + {file = "msal-1.28.0-py3-none-any.whl", hash = "sha256:3064f80221a21cd535ad8c3fafbb3a3582cd9c7e9af0bb789ae14f726a0ca99b"}, + {file = "msal-1.28.0.tar.gz", hash = "sha256:80bbabe34567cb734efd2ec1869b2d98195c927455369d8077b3c542088c5c9d"}, ] [package.dependencies] @@ -2827,13 +2827,13 @@ panda3d-simplepbr = ">=0.6" [[package]] name = "panda3d-simplepbr" -version = "0.11.2" -description = "A simple, lightweight PBR render pipeline for Panda3D" +version = "0.12.0" +description = "A straight-forward, easy-to-use, drop-in, PBR replacement for Panda3D's builtin auto shader" optional = false python-versions = ">=3.8" files = [ - {file = "panda3d-simplepbr-0.11.2.tar.gz", hash = "sha256:89469f9be0e15fd8888a277f60ba08eb31b90354dcba80fc5aa7ccccee56be2a"}, - {file = "panda3d_simplepbr-0.11.2-py3-none-any.whl", hash = "sha256:eca198004ed4a6635ac9180695440390d52c73eec0b6e02c317d000e1e4d1518"}, + {file = "panda3d-simplepbr-0.12.0.tar.gz", hash = "sha256:c71d490afeeb3a90455dcfde1d30c41f321a38742a97d18834e5c31016331ed5"}, + {file = "panda3d_simplepbr-0.12.0-py3-none-any.whl", hash = "sha256:6c43d1990ff07840cf1c557561d6122fd1250d8e76aacf227b61c3789149bcf9"}, ] [package.dependencies] @@ -3087,13 +3087,13 @@ files = [ [[package]] name = "pre-commit" -version = "3.6.2" +version = "3.7.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.6.2-py2.py3-none-any.whl", hash = "sha256:ba637c2d7a670c10daedc059f5c49b5bd0aadbccfcd7ec15592cf9665117532c"}, - {file = "pre_commit-3.6.2.tar.gz", hash = "sha256:c3ef34f463045c88658c5b99f38c1e297abdcc0ff13f98d3370055fbbfabc67e"}, + {file = "pre_commit-3.7.0-py2.py3-none-any.whl", hash = "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab"}, + {file = "pre_commit-3.7.0.tar.gz", hash = "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060"}, ] [package.dependencies] @@ -6511,13 +6511,13 @@ testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygm [[package]] name = "pytest-cov" -version = "4.1.0" +version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] @@ -6525,7 +6525,7 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-cpp" @@ -6645,13 +6645,13 @@ files = [ [[package]] name = "pytools" -version = "2023.1.1" +version = "2024.1.1" description = "A collection of tools for Python" optional = false python-versions = "~=3.8" files = [ - {file = "pytools-2023.1.1-py2.py3-none-any.whl", hash = "sha256:53b98e5d6c01a90e343f8be2f5271e94204a210ef3e74fbefa3d47ec7480f150"}, - {file = "pytools-2023.1.1.tar.gz", hash = "sha256:80637873d206f6bcedf7cdb46ad93e868acb4ea2256db052dfcca872bdd0321f"}, + {file = "pytools-2024.1.1-py2.py3-none-any.whl", hash = "sha256:9f1d03040d78d9d2a607d08de64ec4e350aecdf4ee019f627ce1f1f0c2a4400d"}, + {file = "pytools-2024.1.1.tar.gz", hash = "sha256:2c88edfa990c8e325167c37659fb1e10a3c1133dfaf752bbd7d8456402b8dcff"}, ] [package.dependencies] @@ -6947,28 +6947,28 @@ docs = ["furo (==2023.9.10)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx [[package]] name = "ruff" -version = "0.3.3" +version = "0.3.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.3-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:973a0e388b7bc2e9148c7f9be8b8c6ae7471b9be37e1cc732f8f44a6f6d7720d"}, - {file = "ruff-0.3.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cfa60d23269d6e2031129b053fdb4e5a7b0637fc6c9c0586737b962b2f834493"}, - {file = "ruff-0.3.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eca7ff7a47043cf6ce5c7f45f603b09121a7cc047447744b029d1b719278eb5"}, - {file = "ruff-0.3.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7d3f6762217c1da954de24b4a1a70515630d29f71e268ec5000afe81377642d"}, - {file = "ruff-0.3.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b24c19e8598916d9c6f5a5437671f55ee93c212a2c4c569605dc3842b6820386"}, - {file = "ruff-0.3.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5a6cbf216b69c7090f0fe4669501a27326c34e119068c1494f35aaf4cc683778"}, - {file = "ruff-0.3.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352e95ead6964974b234e16ba8a66dad102ec7bf8ac064a23f95371d8b198aab"}, - {file = "ruff-0.3.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d6ab88c81c4040a817aa432484e838aaddf8bfd7ca70e4e615482757acb64f8"}, - {file = "ruff-0.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79bca3a03a759cc773fca69e0bdeac8abd1c13c31b798d5bb3c9da4a03144a9f"}, - {file = "ruff-0.3.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2700a804d5336bcffe063fd789ca2c7b02b552d2e323a336700abb8ae9e6a3f8"}, - {file = "ruff-0.3.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fd66469f1a18fdb9d32e22b79f486223052ddf057dc56dea0caaf1a47bdfaf4e"}, - {file = "ruff-0.3.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45817af234605525cdf6317005923bf532514e1ea3d9270acf61ca2440691376"}, - {file = "ruff-0.3.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0da458989ce0159555ef224d5b7c24d3d2e4bf4c300b85467b08c3261c6bc6a8"}, - {file = "ruff-0.3.3-py3-none-win32.whl", hash = "sha256:f2831ec6a580a97f1ea82ea1eda0401c3cdf512cf2045fa3c85e8ef109e87de0"}, - {file = "ruff-0.3.3-py3-none-win_amd64.whl", hash = "sha256:be90bcae57c24d9f9d023b12d627e958eb55f595428bafcb7fec0791ad25ddfc"}, - {file = "ruff-0.3.3-py3-none-win_arm64.whl", hash = "sha256:0171aab5fecdc54383993389710a3d1227f2da124d76a2784a7098e818f92d61"}, - {file = "ruff-0.3.3.tar.gz", hash = "sha256:38671be06f57a2f8aba957d9f701ea889aa5736be806f18c0cd03d6ff0cbca8d"}, + {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:60c870a7d46efcbc8385d27ec07fe534ac32f3b251e4fc44b3cbfd9e09609ef4"}, + {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6fc14fa742e1d8f24910e1fff0bd5e26d395b0e0e04cc1b15c7c5e5fe5b4af91"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3ee7880f653cc03749a3bfea720cf2a192e4f884925b0cf7eecce82f0ce5854"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf133dd744f2470b347f602452a88e70dadfbe0fcfb5fd46e093d55da65f82f7"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f3860057590e810c7ffea75669bdc6927bfd91e29b4baa9258fd48b540a4365"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:986f2377f7cf12efac1f515fc1a5b753c000ed1e0a6de96747cdf2da20a1b369"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fd98e85869603e65f554fdc5cddf0712e352fe6e61d29d5a6fe087ec82b76c"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64abeed785dad51801b423fa51840b1764b35d6c461ea8caef9cf9e5e5ab34d9"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df52972138318bc7546d92348a1ee58449bc3f9eaf0db278906eb511889c4b50"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:98e98300056445ba2cc27d0b325fd044dc17fcc38e4e4d2c7711585bd0a958ed"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:519cf6a0ebed244dce1dc8aecd3dc99add7a2ee15bb68cf19588bb5bf58e0488"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bb0acfb921030d00070539c038cd24bb1df73a2981e9f55942514af8b17be94e"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cf187a7e7098233d0d0c71175375c5162f880126c4c716fa28a8ac418dcf3378"}, + {file = "ruff-0.3.4-py3-none-win32.whl", hash = "sha256:af27ac187c0a331e8ef91d84bf1c3c6a5dea97e912a7560ac0cef25c526a4102"}, + {file = "ruff-0.3.4-py3-none-win_amd64.whl", hash = "sha256:de0d5069b165e5a32b3c6ffbb81c350b1e3d3483347196ffdf86dc0ef9e37dd6"}, + {file = "ruff-0.3.4-py3-none-win_arm64.whl", hash = "sha256:6810563cc08ad0096b57c717bd78aeac888a1bfd38654d9113cb3dc4d3f74232"}, + {file = "ruff-0.3.4.tar.gz", hash = "sha256:f0f4484c6541a99862b693e13a151435a279b271cff20e37101116a21e2a1ad1"}, ] [[package]] @@ -7047,13 +7047,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.42.0" +version = "1.43.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.42.0.tar.gz", hash = "sha256:4a8364b8f7edbf47f95f7163e48334c96100d9c098f0ae6606e2e18183c223e6"}, - {file = "sentry_sdk-1.42.0-py2.py3-none-any.whl", hash = "sha256:a654ee7e497a3f5f6368b36d4f04baeab1fe92b3105f7f6965d6ef0de35a9ba4"}, + {file = "sentry-sdk-1.43.0.tar.gz", hash = "sha256:41df73af89d22921d8733714fb0fc5586c3461907e06688e6537d01a27e0e0f6"}, + {file = "sentry_sdk-1.43.0-py2.py3-none-any.whl", hash = "sha256:8d768724839ca18d7b4c7463ef7528c40b7aa2bfbf7fe554d5f9a7c044acfd36"}, ] [package.dependencies] @@ -7067,6 +7067,7 @@ asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] chalice = ["chalice (>=1.16.0)"] clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] django = ["django (>=1.8)"] From 79ae276bbff27790afce25ee66df8c7172d3c6e5 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 25 Mar 2024 09:01:09 -0700 Subject: [PATCH 141/384] [bot] Bump submodules (#31997) bump submodules Co-authored-by: jnewb1 --- opendbc | 2 +- panda | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/opendbc b/opendbc index ff1f1ff335..3c926e88e8 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit ff1f1ff335261c469635c57c81817afd04663eab +Subproject commit 3c926e88e87594e788ab96d32ecdd8f66cb01aed diff --git a/panda b/panda index dd82382d5f..01c54d1199 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit dd82382d5f9fcfbf9958238ee33739693fd3f6fa +Subproject commit 01c54d11990fb82b85acc322a6e2e34a4b7ee389 From 86acfbb4f22231e0208434a4ea7de5cee7a893d1 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 25 Mar 2024 09:21:23 -0700 Subject: [PATCH 142/384] stale bot: ignore all car stuff for now --- .github/workflows/stale.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 2d60d2f0e9..157cab69d1 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -20,7 +20,7 @@ jobs: stale-pr-message: 'This PR has had no activity for ${{ env.DAYS_BEFORE_PR_STALE }} days. It will be automatically closed in ${{ env.DAYS_BEFORE_PR_CLOSE }} days if there is no activity.' close-pr-message: 'This PR has been automatically closed due to inactivity. Feel free to re-open once activity resumes.' delete-branch: ${{ github.event.pull_request.head.repo.full_name == 'commaai/openpilot' }} # only delete branches on the main repo - exempt-pr-labels: "ignore stale,needs testing,car port" # if wip or it needs testing from the community, don't mark as stale + exempt-pr-labels: "ignore stale,needs testing,car port,car" # if wip or it needs testing from the community, don't mark as stale days-before-pr-stale: ${{ env.DAYS_BEFORE_PR_STALE }} days-before-pr-close: ${{ env.DAYS_BEFORE_PR_CLOSE }} From 245cbe97c758f86c21e28d8edd6390b8c9da29db Mon Sep 17 00:00:00 2001 From: Andrei Radulescu Date: Mon, 25 Mar 2024 18:26:19 +0200 Subject: [PATCH 143/384] third_party: build scripts for libyuv and maplibre-native-qt (#31988) * updated maplibre build.sh * refactored libyuv build.sh --- third_party/libyuv/.gitignore | 1 + third_party/libyuv/build.sh | 33 ++++++++++++++++++++++--- third_party/maplibre-native-qt/build.sh | 12 ++++----- tools/install_ubuntu_dependencies.sh | 1 + 4 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 third_party/libyuv/.gitignore diff --git a/third_party/libyuv/.gitignore b/third_party/libyuv/.gitignore new file mode 100644 index 0000000000..450712e47d --- /dev/null +++ b/third_party/libyuv/.gitignore @@ -0,0 +1 @@ +libyuv/ diff --git a/third_party/libyuv/build.sh b/third_party/libyuv/build.sh index e044312d05..b960f60ef5 100755 --- a/third_party/libyuv/build.sh +++ b/third_party/libyuv/build.sh @@ -1,12 +1,39 @@ #!/usr/bin/env bash set -e -git clone https://chromium.googlesource.com/libyuv/libyuv +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" + +ARCHNAME=$(uname -m) +if [ -f /TICI ]; then + ARCHNAME="larch64" +fi + +if [[ "$OSTYPE" == "darwin"* ]]; then + ARCHNAME="Darwin" +fi + +cd $DIR +if [ ! -d libyuv ]; then + git clone --single-branch https://chromium.googlesource.com/libyuv/libyuv +fi + cd libyuv -git reset --hard 4a14cb2e81235ecd656e799aecaaf139db8ce4a2 +git checkout 4a14cb2e81235ecd656e799aecaaf139db8ce4a2 + +# build cmake . +make -j$(nproc) + +INSTALL_DIR="$DIR/$ARCHNAME" +rm -rf $INSTALL_DIR +mkdir -p $INSTALL_DIR + +rm -rf $DIR/include +mkdir -p $INSTALL_DIR/lib +cp $DIR/libyuv/libyuv.a $INSTALL_DIR/lib +cp -r $DIR/libyuv/include $DIR ## To create universal binary on Darwin: ## ``` ## lipo -create -output Darwin/libyuv.a path-to-x64/libyuv.a path-to-arm64/libyuv.a -## ``` \ No newline at end of file +## ``` diff --git a/third_party/maplibre-native-qt/build.sh b/third_party/maplibre-native-qt/build.sh index c64f0fc649..a368026f0f 100755 --- a/third_party/maplibre-native-qt/build.sh +++ b/third_party/maplibre-native-qt/build.sh @@ -3,35 +3,33 @@ set -e DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -ARCHNAME="x86_64" +ARCHNAME=$(uname -m) MAPLIBRE_FLAGS="-DMLN_QT_WITH_LOCATION=OFF" -if [ -f /AGNOS ]; then +if [ -f /TICI ]; then ARCHNAME="larch64" #MAPLIBRE_FLAGS="$MAPLIBRE_FLAGS -DCMAKE_SYSTEM_NAME=Android -DANDROID_ABI=arm64-v8a" fi cd $DIR if [ ! -d maplibre ]; then - git clone git@github.com:maplibre/maplibre-native-qt.git $DIR/maplibre + git clone --single-branch https://github.com/maplibre/maplibre-native-qt.git $DIR/maplibre fi cd maplibre -git fetch --all git checkout 3726266e127c1f94ad64837c9dbe03d238255816 git submodule update --depth=1 --recursive --init # build mkdir -p build cd build -set -x cmake $MAPLIBRE_FLAGS $DIR/maplibre -make -j$(nproc) || make -j2 || make -j1 +make -j$(nproc) INSTALL_DIR="$DIR/$ARCHNAME" rm -rf $INSTALL_DIR mkdir -p $INSTALL_DIR -rm -rf $INSTALL_DIR/lib $DIR/include +rm -rf $DIR/include mkdir -p $INSTALL_DIR/lib $INSTALL_DIR/include $DIR/include cp -r $DIR/maplibre/build/src/core/*.so* $INSTALL_DIR/lib cp -r $DIR/maplibre/build/src/core/include/* $INSTALL_DIR/include diff --git a/tools/install_ubuntu_dependencies.sh b/tools/install_ubuntu_dependencies.sh index 78a01f2b75..28e6bf8ccf 100755 --- a/tools/install_ubuntu_dependencies.sh +++ b/tools/install_ubuntu_dependencies.sh @@ -75,6 +75,7 @@ function install_ubuntu_common_requirements() { libqt5charts5-dev \ libqt5serialbus5-dev \ libqt5x11extras5-dev \ + libqt5opengl5-dev \ libreadline-dev \ libdw1 \ valgrind From 484f50725e2794211a0c76702abcc8ed5e8e4022 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 25 Mar 2024 14:11:26 -0700 Subject: [PATCH 144/384] [bot] Fingerprints: add missing FW versions from new users (#32001) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 1 + selfdrive/car/mazda/fingerprints.py | 2 +- selfdrive/car/toyota/fingerprints.py | 1 + selfdrive/car/volkswagen/fingerprints.py | 6 +++--- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 81533e6629..8f48a45a53 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -81,6 +81,7 @@ FW_VERSIONS = { b'68277370AJ', b'68277370AM', b'68277372AD', + b'68277372AE', b'68277372AN', b'68277374AA', b'68277374AB', diff --git a/selfdrive/car/mazda/fingerprints.py b/selfdrive/car/mazda/fingerprints.py index f30bc1b5cd..75d6884e73 100644 --- a/selfdrive/car/mazda/fingerprints.py +++ b/selfdrive/car/mazda/fingerprints.py @@ -10,8 +10,8 @@ FW_VERSIONS = { ], (Ecu.engine, 0x7e0, None): [ b'PEW5-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PX2D-188K2-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PW67-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2D-188K2-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2G-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2H-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2H-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 1803b00255..2be153dea0 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -727,6 +727,7 @@ FW_VERSIONS = { b'\x018966353M7000\x00\x00\x00\x00', b'\x018966353M7100\x00\x00\x00\x00', b'\x018966353Q2000\x00\x00\x00\x00', + b'\x018966353Q2100\x00\x00\x00\x00', b'\x018966353Q2300\x00\x00\x00\x00', b'\x018966353Q4000\x00\x00\x00\x00', b'\x018966353R1100\x00\x00\x00\x00', diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 96d721bd56..aa7affda76 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -1068,8 +1068,8 @@ FW_VERSIONS = { b'\xf1\x8704L906021ER\xf1\x898361', b'\xf1\x8704L906026BP\xf1\x897608', b'\xf1\x8704L906026BS\xf1\x891541', - b'\xf1\x875G0906259C \xf1\x890002', b'\xf1\x8704L906026BT\xf1\x897612', + b'\xf1\x875G0906259C \xf1\x890002', ], (Ecu.transmission, 0x7e1, None): [ b'\xf1\x870CW300041L \xf1\x891601', @@ -1077,11 +1077,11 @@ FW_VERSIONS = { b'\xf1\x870CW300043B \xf1\x891601', b'\xf1\x870CW300043P \xf1\x891605', b'\xf1\x870D9300012H \xf1\x894518', + b'\xf1\x870D9300014T \xf1\x895221', b'\xf1\x870D9300041C \xf1\x894936', b'\xf1\x870D9300041H \xf1\x895220', b'\xf1\x870D9300041J \xf1\x894902', b'\xf1\x870D9300041P \xf1\x894507', - b'\xf1\x870D9300014T \xf1\x895221', ], (Ecu.srs, 0x715, None): [ b'\xf1\x873Q0959655AC\xf1\x890200\xf1\x82\r11120011100010022212110200', @@ -1098,10 +1098,10 @@ FW_VERSIONS = { b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566A01513A1', b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521T00403A1', b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521T00403A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521T00603A1', b'\xf1\x875Q0909144R \xf1\x891061\xf1\x82\x0516A00604A1', b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521T00601A1', b'\xf1\x875QD909144E \xf1\x891081\xf1\x82\x0521T00503A1', - b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521T00603A1', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x875Q0907567P \xf1\x890100\xf1\x82\x0101', From 0a8fa9921cd1442ad9d06a5f5e331350e77ec8ac Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 25 Mar 2024 15:11:54 -0700 Subject: [PATCH 145/384] [bot] Fingerprints: add missing FW versions from new users (#32002) Export fingerprints --- selfdrive/car/honda/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 8068c63308..c1714fe810 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -576,6 +576,7 @@ FW_VERSIONS = { b'37805-5PA-AB10\x00\x00', b'37805-5PA-AD10\x00\x00', b'37805-5PA-AF20\x00\x00', + b'37805-5PA-AF30\x00\x00', b'37805-5PA-AH20\x00\x00', b'37805-5PA-BF10\x00\x00', b'37805-5PA-C680\x00\x00', @@ -1030,6 +1031,7 @@ FW_VERSIONS = { b'78109-TG7-AS20\x00\x00', b'78109-TG7-AT20\x00\x00', b'78109-TG7-AU20\x00\x00', + b'78109-TG7-AW20\x00\x00', b'78109-TG7-AX20\x00\x00', b'78109-TG7-D020\x00\x00', b'78109-TG7-DJ10\x00\x00', From 50ae0350b28b871bac47ceb12c7a14edbf61a7b7 Mon Sep 17 00:00:00 2001 From: ggeer8 Date: Mon, 25 Mar 2024 18:43:05 -0400 Subject: [PATCH 146/384] Add missing fwdRadar for 2023 Kia Sportage Hybrid SX Prestige #31993 (#32000) * Update fingerprints.py Added missing ECUs and fingerprints for 2023 Kia Sportage Hybrid SX Prestige * remove logging ecus * logging too --------- Co-authored-by: Shane Smiskol --- selfdrive/car/hyundai/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 68598b65ff..4440e9acfc 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1043,6 +1043,7 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00NQ5__ 1.00 1.02 99110-P1000 ', b'\xf1\x00NQ5__ 1.00 1.03 99110-P1000 ', + b'\xf1\x00NQ5__ 1.00 1.03 99110-CH000 ', b'\xf1\x00NQ5__ 1.01 1.03 99110-CH000 ', b'\xf1\x00NQ5__ 1.01 1.03 99110-P1000 ', ], From 5fcb54f71357617f69a755836add21be6657c7fd Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 25 Mar 2024 16:11:28 -0700 Subject: [PATCH 147/384] lowercase stale (#32004) --- .github/workflows/stale.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 157cab69d1..46649a9d5f 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -19,6 +19,7 @@ jobs: # pull request config stale-pr-message: 'This PR has had no activity for ${{ env.DAYS_BEFORE_PR_STALE }} days. It will be automatically closed in ${{ env.DAYS_BEFORE_PR_CLOSE }} days if there is no activity.' close-pr-message: 'This PR has been automatically closed due to inactivity. Feel free to re-open once activity resumes.' + stale-pr-label: stale delete-branch: ${{ github.event.pull_request.head.repo.full_name == 'commaai/openpilot' }} # only delete branches on the main repo exempt-pr-labels: "ignore stale,needs testing,car port,car" # if wip or it needs testing from the community, don't mark as stale days-before-pr-stale: ${{ env.DAYS_BEFORE_PR_STALE }} From b88be7981453078ebc81420de1c71fd63de3fa03 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 25 Mar 2024 19:23:56 -0700 Subject: [PATCH 148/384] VW: simplify cruiseState (#32003) * simplify * simplify * jyoung suggestion * acc ready --- selfdrive/car/volkswagen/carstate.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 9107d41eb3..8139fbbf21 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -114,21 +114,15 @@ class CarState(CarStateBase): # Update ACC radar status. self.acc_type = ext_cp.vl["ACC_06"]["ACC_Typ"] - if pt_cp.vl["TSK_06"]["TSK_Status"] == 2: - # ACC okay and enabled, but not currently engaged - ret.cruiseState.available = True - ret.cruiseState.enabled = False - elif pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5): - # ACC okay and enabled, currently regulating speed (3) or driver accel override (4) or brake only (5) - ret.cruiseState.available = True - ret.cruiseState.enabled = True - else: - # ACC okay but disabled (1), or a radar visibility or other fault/disruption (6 or 7) - ret.cruiseState.available = False - ret.cruiseState.enabled = False + + # ACC okay but disabled (1), ACC ready (2), a radar visibility or other fault/disruption (6 or 7) + # currently regulating speed (3), driver accel override (4), brake only (5) + ret.cruiseState.available = pt_cp.vl["TSK_06"]["TSK_Status"] in (2, 3, 4, 5) + ret.cruiseState.enabled = pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5) + ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) + self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation - ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) # Update ACC setpoint. When the setpoint is zero or there's an error, the # radar sends a set-speed of ~90.69 m/s / 203mph. From 62a5b0671e927ec93641e36c33b4d314f9c30ad7 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 25 Mar 2024 19:44:03 -0700 Subject: [PATCH 149/384] Hyundai: remove bad abs responses (#32007) rm bad abs --- selfdrive/car/hyundai/fingerprints.py | 12 ------------ selfdrive/car/hyundai/values.py | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 4440e9acfc..306a7e75ec 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -456,10 +456,6 @@ FW_VERSIONS = { b'\xf1\x00JS__ SCC H-CUP 1.00 1.02 95650-J3200 ', b'\xf1\x00JS__ SCC HNCUP 1.00 1.02 95650-J3100 ', ], - (Ecu.abs, 0x7d1, None): [ - b'\xf1\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816V8RAC00121.ELF\xf1\x00\x00\x00\x00\x00\x00\x00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00JSL MDPS C 1.00 1.03 56340-J3000 8308', ], @@ -529,9 +525,6 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00OS__ SCC F-CUP 1.00 1.00 95655-J9200 ', ], - (Ecu.abs, 0x7d1, None): [ - b'\xf1\x816V5RAK00018.ELF\xf1\x00\x00\x00\x00\x00\x00\x00', - ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00OS MDPS C 1.00 1.05 56310J9030\x00 4OSDC105', ], @@ -569,11 +562,6 @@ FW_VERSIONS = { b'\xf1\x00BDPE_SCC FHCUPC 1.00 1.04 99110-M6500\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'\xf1\x00BD__ SCC H-CUP 1.00 1.02 99110-M6000 ', ], - (Ecu.abs, 0x7d1, None): [ - b'\xf1\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x816VGRAH00018.ELF\xf1\x00\x00\x00\x00\x00\x00\x00', - b'\xf1\x8758900-M7AB0 \xf1\x816VQRAD00127.ELF\xf1\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.KIA_K5_2021: { (Ecu.fwdRadar, 0x7d0, None): [ diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 57ec0a31cc..75bb98aba8 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -744,7 +744,7 @@ FW_QUERY_CONFIG = FwQueryConfig( # Note that we still attempt to match with them when they are present non_essential_ecus={ Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_ELANTRA_2021, - CAR.HYUNDAI_SANTA_FE, CAR.KIA_FORTE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV], + CAR.HYUNDAI_SANTA_FE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV], }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms From bbd08baacd4898f1f78cdd7e72709cae7fce73cc Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 25 Mar 2024 22:43:48 -0700 Subject: [PATCH 150/384] Hyundai: remove outdated abs FW (#32008) * rm from ed882557605319f9 * rm from ffce4a1d578827ee * rm from 700d37ccd12315cf * can't find, but probably same * rm from 15755effe9d073b1 * rm from 5b7caafa7ec1a5cf * rm from ec07911a91f863f3 * rm from 7627c16a16a6f69b * rm from 007d5e4ad9f86d13 * rm from 06a3b9e474ce581d * rm from 22203eb8892a6f28 * rm from ff973b941a69366f * rm from 3ea622c3c0ec3055 * rm from https://github.com/commaai/openpilot/pull/23517 * rm from b0e1cdf87262c7ad * old format FW version * rm from 54f0bbcb6527012e & 4cbcc16b655c1591 * test abs * format --- selfdrive/car/hyundai/fingerprints.py | 28 ++++++--------------- selfdrive/car/hyundai/tests/test_hyundai.py | 4 +-- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 306a7e75ec..a95ddab5d2 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -190,10 +190,6 @@ FW_VERSIONS = { b'\xf1\x00DN ESC \x07 106 \x07\x01 58910-L0100', b'\xf1\x00DN ESC \x07 107"\x08\x07 58910-L0100', b'\xf1\x00DN ESC \x08 103\x19\x06\x01 58910-L1300', - b'\xf1\x8758910-L0100\xf1\x00DN ESC \x06 104\x19\x08\x01 58910-L0100', - b'\xf1\x8758910-L0100\xf1\x00DN ESC \x06 106 \x07\x01 58910-L0100', - b'\xf1\x8758910-L0100\xf1\x00DN ESC \x07 104\x19\x08\x01 58910-L0100', - b'\xf1\x8758910-L0100\xf1\x00DN ESC \x07 106 \x07\x01 58910-L0100', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DN8 MDPS C 1,00 1,01 56310L0010\x00 4DNAC101', @@ -291,11 +287,8 @@ FW_VERSIONS = { b'\xf1\x00TM ESC \x03 101 \x08\x02 58910-S2DA0', b'\xf1\x00TM ESC \x04 101 \x08\x04 58910-S2GA0', b'\xf1\x00TM ESC \x04 102!\x04\x05 58910-S2GA0', + b'\xf1\x00TM ESC \x1e 102 \x08\x08 58910-S1DA0', b'\xf1\x00TM ESC 103!\x030 58910-S1MA0', - b'\xf1\x8758910-S1DA0\xf1\x00TM ESC \x1e 102 \x08\x08 58910-S1DA0', - b'\xf1\x8758910-S2DA0\xf1\x00TM ESC \x03 101 \x08\x02 58910-S2DA0', - b'\xf1\x8758910-S2GA0\xf1\x00TM ESC \x02 101 \x08\x04 58910-S2GA0', - b'\xf1\x8758910-S2GA0\xf1\x00TM ESC \x04 102!\x04\x05 58910-S2GA0', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00TM MDPS C 1.00 1.01 56310-S1AB0 4TSDC101', @@ -592,9 +585,7 @@ FW_VERSIONS = { b'\xf1\x00DL ESC \x06 101 \x04\x02 58910-L3200', b'\xf1\x00DL ESC \x06 103"\x08\x06 58910-L3200', b'\xf1\x00DL ESC \t 100 \x06\x02 58910-L3800', - b'\xf1\x8758910-L3200\xf1\x00DL ESC \x06 101 \x04\x02 58910-L3200', - b'\xf1\x8758910-L3600\xf1\x00DL ESC \x03 100 \x08\x02 58910-L3600', - b'\xf1\x8758910-L3800\xf1\x00DL ESC \t 101 \x07\x02 58910-L3800', + b'\xf1\x00DL ESC \t 101 \x07\x02 58910-L3800', ], }, CAR.KIA_K5_HEV_2020: { @@ -641,11 +632,9 @@ FW_VERSIONS = { CAR.HYUNDAI_KONA_EV_2022: { (Ecu.abs, 0x7d1, None): [ b'\xf1\x00OS IEB \x02 102"\x05\x16 58520-K4010', + b'\xf1\x00OS IEB \x03 101 \x11\x13 58520-K4010', b'\xf1\x00OS IEB \x03 102"\x05\x16 58520-K4010', b'\xf1\x00OS IEB \r 102"\x05\x16 58520-K4010', - b'\xf1\x8758520-K4010\xf1\x00OS IEB \x02 101 \x11\x13 58520-K4010', - b'\xf1\x8758520-K4010\xf1\x00OS IEB \x03 101 \x11\x13 58520-K4010', - b'\xf1\x8758520-K4010\xf1\x00OS IEB \x04 101 \x11\x13 58520-K4010', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00OSP LKA AT AUS RHD 1.00 1.04 99211-J9200 904', @@ -758,8 +747,8 @@ FW_VERSIONS = { b'\xf1\x8799110Q5100\xf1\x00SP2_ SCC FHCUP 1.01 1.05 99110-Q5100 ', ], (Ecu.abs, 0x7d1, None): [ - b'\xf1\x8758910-Q5450\xf1\x00SP ESC \x07 101\x19\t\x05 58910-Q5450', - b'\xf1\x8758910-Q5450\xf1\x00SP ESC \t 101\x19\t\x05 58910-Q5450', + b'\xf1\x00SP ESC \x07 101\x19\t\x05 58910-Q5450', + b'\xf1\x00SP ESC \t 101\x19\t\x05 58910-Q5450', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00SP2 MDPS C 1.00 1.04 56300Q5200 ', @@ -867,9 +856,8 @@ FW_VERSIONS = { ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00CN ESC \t 101 \x10\x03 58910-AB800', - b'\xf1\x8758910-AA800\xf1\x00CN ESC \t 104 \x08\x03 58910-AA800', - b'\xf1\x8758910-AA800\xf1\x00CN ESC \t 105 \x10\x03 58910-AA800', - b'\xf1\x8758910-AB800\xf1\x00CN ESC \t 101 \x10\x03 58910-AB800\xf1\xa01.01', + b'\xf1\x00CN ESC \t 104 \x08\x03 58910-AA800', + b'\xf1\x00CN ESC \t 105 \x10\x03 58910-AA800', ], }, CAR.HYUNDAI_ELANTRA_HEV_2021: { @@ -1030,8 +1018,8 @@ FW_VERSIONS = { ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00NQ5__ 1.00 1.02 99110-P1000 ', - b'\xf1\x00NQ5__ 1.00 1.03 99110-P1000 ', b'\xf1\x00NQ5__ 1.00 1.03 99110-CH000 ', + b'\xf1\x00NQ5__ 1.00 1.03 99110-P1000 ', b'\xf1\x00NQ5__ 1.01 1.03 99110-CH000 ', b'\xf1\x00NQ5__ 1.01 1.03 99110-P1000 ', ], diff --git a/selfdrive/car/hyundai/tests/test_hyundai.py b/selfdrive/car/hyundai/tests/test_hyundai.py index 30cc598a09..000cb14a6d 100755 --- a/selfdrive/car/hyundai/tests/test_hyundai.py +++ b/selfdrive/car/hyundai/tests/test_hyundai.py @@ -85,8 +85,8 @@ class TestHyundaiFingerprint(unittest.TestCase): for car_model, ecus in FW_VERSIONS.items(): with self.subTest(car_model=car_model.value): for ecu, fws in ecus.items(): - # TODO: enable for Ecu.fwdRadar, Ecu.abs, Ecu.eps - if ecu[0] in (Ecu.fwdCamera,): + # TODO: enable for Ecu.fwdRadar, Ecu.eps + if ecu[0] in (Ecu.fwdCamera, Ecu.abs): self.assertTrue(all(fw.startswith(expected_fw_prefix) for fw in fws), f"FW from unexpected request in database: {(ecu, fws)}") From d05c19b9f4b70b3ef1c5c39734cf5175c8c5c020 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 27 Mar 2024 01:56:02 +0800 Subject: [PATCH 151/384] util: safer `ends_with` (#31943) * safer ends_with * improve --- common/util.cc | 5 +++-- common/util.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/common/util.cc b/common/util.cc index 8af9f5884c..b6097bf28f 100644 --- a/common/util.cc +++ b/common/util.cc @@ -256,8 +256,9 @@ bool starts_with(const std::string &s1, const std::string &s2) { return strncmp(s1.c_str(), s2.c_str(), s2.size()) == 0; } -bool ends_with(const std::string &s1, const std::string &s2) { - return strcmp(s1.c_str() + (s1.size() - s2.size()), s2.c_str()) == 0; +bool ends_with(const std::string& s, const std::string& suffix) { + return s.size() >= suffix.size() && + strcmp(s.c_str() + (s.size() - suffix.size()), suffix.c_str()) == 0; } std::string check_output(const std::string& command) { diff --git a/common/util.h b/common/util.h index 0cbad5bd31..3bf5a690a6 100644 --- a/common/util.h +++ b/common/util.h @@ -77,7 +77,7 @@ float getenv(const char* key, float default_val); std::string hexdump(const uint8_t* in, const size_t size); std::string dir_name(std::string const& path); bool starts_with(const std::string &s1, const std::string &s2); -bool ends_with(const std::string &s1, const std::string &s2); +bool ends_with(const std::string &s, const std::string &suffix); // ***** random helpers ***** int random_int(int min, int max); From 81fae3d8077e7efd29c837a303421595b0e3d906 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 26 Mar 2024 16:43:09 -0700 Subject: [PATCH 152/384] More fingerprint migration fixes (#32018) * fix migration * another --- selfdrive/debug/cycle_alerts.py | 2 +- tools/sim/launch_openpilot.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/debug/cycle_alerts.py b/selfdrive/debug/cycle_alerts.py index db845ed58f..d66f83ad5d 100755 --- a/selfdrive/debug/cycle_alerts.py +++ b/selfdrive/debug/cycle_alerts.py @@ -52,7 +52,7 @@ def cycle_alerts(duration=200, is_metric=False): cameras = ['roadCameraState', 'wideRoadCameraState', 'driverCameraState'] CS = car.CarState.new_message() - CP = CarInterface.get_non_essential_params("CIVIC") + CP = CarInterface.get_non_essential_params("HONDA_CIVIC") sm = messaging.SubMaster(['deviceState', 'pandaStates', 'roadCameraState', 'modelV2', 'liveCalibration', 'driverMonitoringState', 'longitudinalPlan', 'liveLocationKalman', 'managerState'] + cameras) diff --git a/tools/sim/launch_openpilot.sh b/tools/sim/launch_openpilot.sh index 06984b690b..a2d7841e7b 100755 --- a/tools/sim/launch_openpilot.sh +++ b/tools/sim/launch_openpilot.sh @@ -4,7 +4,7 @@ export PASSIVE="0" export NOBOARD="1" export SIMULATION="1" export SKIP_FW_QUERY="1" -export FINGERPRINT="CIVIC" +export FINGERPRINT="HONDA_CIVIC" export BLOCK="${BLOCK},camerad,loggerd,encoderd,micd,logmessaged" if [[ "$CI" ]]; then From 76c5c58d540db580d7b09c2489a6e3ff7ae3c2cc Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 26 Mar 2024 17:04:05 -0700 Subject: [PATCH 153/384] navd: generate new JWT for each request (#32017) * navd: generate new JWT for each request * no api with token --- selfdrive/navd/navd.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/selfdrive/navd/navd.py b/selfdrive/navd/navd.py index 2be703cdb2..8cfc495f27 100755 --- a/selfdrive/navd/navd.py +++ b/selfdrive/navd/navd.py @@ -48,15 +48,14 @@ class RouteEngine: self.reroute_counter = 0 + + self.api = None + self.mapbox_token = None if "MAPBOX_TOKEN" in os.environ: self.mapbox_token = os.environ["MAPBOX_TOKEN"] self.mapbox_host = "https://api.mapbox.com" else: - try: - self.mapbox_token = Api(self.params.get("DongleId", encoding='utf8')).get_token(expiry_hours=4 * 7 * 24) - except FileNotFoundError: - cloudlog.exception("Failed to generate mapbox token due to missing private key. Ensure device is registered.") - self.mapbox_token = "" + self.api = Api(self.params.get("DongleId", encoding='utf8')) self.mapbox_host = "https://maps.comma.ai" def update(self): @@ -122,8 +121,12 @@ class RouteEngine: if lang is not None: lang = lang.replace('main_', '') + token = self.mapbox_token + if token is None: + token = self.api.get_token() + params = { - 'access_token': self.mapbox_token, + 'access_token': token, 'annotations': 'maxspeed', 'geometries': 'geojson', 'overview': 'full', From 6b710a5d893f621062842737efda8df97b69cd06 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 26 Mar 2024 17:49:14 -0700 Subject: [PATCH 154/384] Hyundai: remove outdated fwdRadar FW (#32019) * rm from e8421f268ea89d79 * rm from 9d4fa1c83653b90b * rm from 3f77febac29e35d5 * rm from 979eb0f6c3682a58 * rm from 077309a26bf98013 * rm from ef8d357a38dc4cf2 * these are probably fine * rm from 54f0bbcb6527012e * rm from 051378e6086bc3ef * rm from 561e5f3991916e4b * rm from 3fd9853538e1bca9 * rm from c8f86b163152d2c5 * rm from 40725113b3e20872 * rm from 3c8bfd637f561f13 * rm from 129db7c75bce8445 * format and test radar * eps! --- selfdrive/car/hyundai/fingerprints.py | 23 +++++++-------------- selfdrive/car/hyundai/tests/test_hyundai.py | 4 ++-- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index a95ddab5d2..14143be7e3 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -328,8 +328,8 @@ FW_VERSIONS = { CAR.HYUNDAI_SANTA_FE_PHEV_2022: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00TMhe SCC F-CUP 1.00 1.00 99110-CL500 ', + b'\xf1\x00TMhe SCC FHCUP 1.00 1.00 99110-CL500 ', b'\xf1\x00TMhe SCC FHCUP 1.00 1.01 99110-CL500 ', - b'\xf1\x8799110CL500\xf1\x00TMhe SCC FHCUP 1.00 1.00 99110-CL500 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102', @@ -562,9 +562,6 @@ FW_VERSIONS = { b'\xf1\x00DL3_ SCC FHCUP 1.00 1.03 99110-L2000 ', b'\xf1\x00DL3_ SCC FHCUP 1.00 1.03 99110-L2100 ', b'\xf1\x00DL3_ SCC FHCUP 1.00 1.04 99110-L2100 ', - b'\xf1\x8799110L2000\xf1\x00DL3_ SCC FHCUP 1.00 1.03 99110-L2000 ', - b'\xf1\x8799110L2100\xf1\x00DL3_ SCC F-CUP 1.00 1.03 99110-L2100 ', - b'\xf1\x8799110L2100\xf1\x00DL3_ SCC FHCUP 1.00 1.03 99110-L2100 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101', @@ -667,16 +664,15 @@ FW_VERSIONS = { CAR.KIA_NIRO_EV: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4000 ', + b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4100 ', + b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4500 ', + b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4600 ', b'\xf1\x00DEev SCC F-CUP 1.00 1.02 96400-Q4000 ', b'\xf1\x00DEev SCC F-CUP 1.00 1.02 96400-Q4100 ', b'\xf1\x00DEev SCC F-CUP 1.00 1.03 96400-Q4100 ', + b'\xf1\x00DEev SCC FHCUP 1.00 1.00 99110-Q4600 ', b'\xf1\x00DEev SCC FHCUP 1.00 1.03 96400-Q4000 ', - b'\xf1\x8799110Q4000\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4000 ', - b'\xf1\x8799110Q4100\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4100 ', - b'\xf1\x8799110Q4500\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4500 ', - b'\xf1\x8799110Q4600\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4600 ', - b'\xf1\x8799110Q4600\xf1\x00DEev SCC FHCUP 1.00 1.00 99110-Q4600 ', - b'\xf1\x8799110Q4600\xf1\x00DEev SCC FNCUP 1.00 1.00 99110-Q4600 ', + b'\xf1\x00DEev SCC FNCUP 1.00 1.00 99110-Q4600 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DE MDPS C 1.00 1.04 56310Q4100\x00 4DEEC104', @@ -744,7 +740,7 @@ FW_VERSIONS = { }, CAR.KIA_SELTOS: { (Ecu.fwdRadar, 0x7d0, None): [ - b'\xf1\x8799110Q5100\xf1\x00SP2_ SCC FHCUP 1.01 1.05 99110-Q5100 ', + b'\xf1\x00SP2_ SCC FHCUP 1.01 1.05 99110-Q5100 ', ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00SP ESC \x07 101\x19\t\x05 58910-Q5450', @@ -840,8 +836,6 @@ FW_VERSIONS = { b'\xf1\x00CN7_ SCC F-CUP 1.00 1.01 99110-AA000 ', b'\xf1\x00CN7_ SCC FHCUP 1.00 1.01 99110-AA000 ', b'\xf1\x00CN7_ SCC FNCUP 1.00 1.01 99110-AA000 ', - b'\xf1\x8799110AA000\xf1\x00CN7_ SCC F-CUP 1.00 1.01 99110-AA000 ', - b'\xf1\x8799110AA000\xf1\x00CN7_ SCC FHCUP 1.00 1.01 99110-AA000 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00CN7 MDPS C 1.00 1.06 56310/AA070 4CNDC106', @@ -870,7 +864,6 @@ FW_VERSIONS = { ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00CNhe SCC FHCUP 1.00 1.01 99110-BY000 ', - b'\xf1\x8799110BY000\xf1\x00CNhe SCC FHCUP 1.00 1.01 99110-BY000 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00CN7 MDPS C 1.00 1.03 56310BY0500 4CNHC103', @@ -898,8 +891,6 @@ FW_VERSIONS = { b'\xf1\x00DNhe SCC F-CUP 1.00 1.02 99110-L5000 ', b'\xf1\x00DNhe SCC FHCUP 1.00 1.00 99110-L5000 ', b'\xf1\x00DNhe SCC FHCUP 1.00 1.02 99110-L5000 ', - b'\xf1\x8799110L5000\xf1\x00DNhe SCC F-CUP 1.00 1.02 99110-L5000 ', - b'\xf1\x8799110L5000\xf1\x00DNhe SCC FHCUP 1.00 1.02 99110-L5000 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L5000 4DNHC101', diff --git a/selfdrive/car/hyundai/tests/test_hyundai.py b/selfdrive/car/hyundai/tests/test_hyundai.py index 000cb14a6d..baa4408b6b 100755 --- a/selfdrive/car/hyundai/tests/test_hyundai.py +++ b/selfdrive/car/hyundai/tests/test_hyundai.py @@ -85,8 +85,8 @@ class TestHyundaiFingerprint(unittest.TestCase): for car_model, ecus in FW_VERSIONS.items(): with self.subTest(car_model=car_model.value): for ecu, fws in ecus.items(): - # TODO: enable for Ecu.fwdRadar, Ecu.eps - if ecu[0] in (Ecu.fwdCamera, Ecu.abs): + # TODO: enable for Ecu.eps + if ecu[0] in (Ecu.fwdCamera, Ecu.fwdRadar, Ecu.abs): self.assertTrue(all(fw.startswith(expected_fw_prefix) for fw in fws), f"FW from unexpected request in database: {(ecu, fws)}") From ae6761f508aa6f9735be330eda57b7ab7bffb97f Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 26 Mar 2024 18:12:35 -0700 Subject: [PATCH 155/384] Hyundai: remove outdated eps FW (#32020) * rm from ed882557605319f9 * rm from 310cf131d28b30d8 * rm from e6dd11f4969e1f74 * rm from 145908dabb729ad9 * rm from b938870bef07f799 * rm from b0af2fff166d80fe * unknown about these, but safe to do this * rm from 077309a26bf98013 * rm from 01d4ba35f8288743 * rm from b5374bdeea21f5ce * rm from 979eb0f6c3682a58 * rm from eb5a50f9e98f50b9 * rm from 786fc028c014be71 * rm from 3f77febac29e35d5 * these also unknown, but should be safe * format! * test all ecus --- selfdrive/car/hyundai/fingerprints.py | 28 ++++++++------------- selfdrive/car/hyundai/tests/test_hyundai.py | 6 ++--- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 14143be7e3..ed9a500148 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -194,21 +194,17 @@ FW_VERSIONS = { (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DN8 MDPS C 1,00 1,01 56310L0010\x00 4DNAC101', b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC101', b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC102', b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0010\x00 4DNAC101', b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0200\x00 4DNAC102', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0210\x00 4DNAC101', b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0210\x00 4DNAC102', + b'\xf1\x00DN8 MDPS C 1.00 1.03 56310-L1010 4DNDC103', + b'\xf1\x00DN8 MDPS C 1.00 1.03 56310-L1030 4DNDC103', b'\xf1\x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP100', b'\xf1\x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP101', b'\xf1\x00DN8 MDPS R 1.00 1.02 57700-L1000 4DNDP105', - b'\xf1\x8756310-L0010\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101', - b'\xf1\x8756310-L0210\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC101', - b'\xf1\x8756310-L1010\xf1\x00DN8 MDPS C 1.00 1.03 56310-L1010 4DNDC103', - b'\xf1\x8756310-L1030\xf1\x00DN8 MDPS C 1.00 1.03 56310-L1030 4DNDC103', - b'\xf1\x8756310L0010\x00\xf1\x00DN8 MDPS C 1,00 1,01 56310L0010\x00 4DNAC101', - b'\xf1\x8756310L0010\x00\xf1\x00DN8 MDPS C 1.00 1.01 56310L0010\x00 4DNAC101', - b'\xf1\x8756310L0210\x00\xf1\x00DN8 MDPS C 1.00 1.01 56310L0210\x00 4DNAC101', - b'\xf1\x8757700-L0000\xf1\x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP100', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00DN8 MFC AT KOR LHD 1.00 1.02 99211-L1000 190422', @@ -564,12 +560,11 @@ FW_VERSIONS = { b'\xf1\x00DL3_ SCC FHCUP 1.00 1.04 99110-L2100 ', ], (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00DL3 MDPS C 1.00 1.01 56310-L3110 4DLAC101', b'\xf1\x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101', b'\xf1\x00DL3 MDPS C 1.00 1.02 56310-L2220 4DLDC102', b'\xf1\x00DL3 MDPS C 1.00 1.02 56310L3220\x00 4DLAC102', - b'\xf1\x8756310-L3110\xf1\x00DL3 MDPS C 1.00 1.01 56310-L3110 4DLAC101', - b'\xf1\x8756310-L3220\xf1\x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101', - b'\xf1\x8757700-L3000\xf1\x00DL3 MDPS R 1.00 1.02 57700-L3000 4DLAP102', + b'\xf1\x00DL3 MDPS R 1.00 1.02 57700-L3000 4DLAP102', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00DL3 MFC AT KOR LHD 1.00 1.04 99210-L2000 210527', @@ -866,10 +861,10 @@ FW_VERSIONS = { b'\xf1\x00CNhe SCC FHCUP 1.00 1.01 99110-BY000 ', ], (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00CN7 MDPS C 1.00 1.02 56310/BY050 4CNHC102', + b'\xf1\x00CN7 MDPS C 1.00 1.03 56310/BY050 4CNHC103', b'\xf1\x00CN7 MDPS C 1.00 1.03 56310BY0500 4CNHC103', b'\xf1\x00CN7 MDPS C 1.00 1.04 56310BY050\x00 4CNHC104', - b'\xf1\x8756310/BY050\xf1\x00CN7 MDPS C 1.00 1.02 56310/BY050 4CNHC102', - b'\xf1\x8756310/BY050\xf1\x00CN7 MDPS C 1.00 1.03 56310/BY050 4CNHC103', ], }, CAR.HYUNDAI_KONA_HEV: { @@ -894,11 +889,10 @@ FW_VERSIONS = { ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L5000 4DNHC101', + b'\xf1\x00DN8 MDPS C 1.00 1.02 56310-L5450 4DNHC102', + b'\xf1\x00DN8 MDPS C 1.00 1.02 56310-L5500 4DNHC102', + b'\xf1\x00DN8 MDPS C 1.00 1.03 56310-L5450 4DNHC103', b'\xf1\x00DN8 MDPS C 1.00 1.03 56310L5450\x00 4DNHC104', - b'\xf1\x8756310-L5450\xf1\x00DN8 MDPS C 1.00 1.02 56310-L5450 4DNHC102', - b'\xf1\x8756310-L5450\xf1\x00DN8 MDPS C 1.00 1.03 56310-L5450 4DNHC103', - b'\xf1\x8756310-L5500\xf1\x00DN8 MDPS C 1.00 1.02 56310-L5500 4DNHC102', - b'\xf1\x8756310L5450\x00\xf1\x00DN8 MDPS C 1.00 1.03 56310L5450\x00 4DNHC104', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00DN8HMFC AT KOR LHD 1.00 1.03 99211-L1000 190705', diff --git a/selfdrive/car/hyundai/tests/test_hyundai.py b/selfdrive/car/hyundai/tests/test_hyundai.py index baa4408b6b..2bd17232ea 100755 --- a/selfdrive/car/hyundai/tests/test_hyundai.py +++ b/selfdrive/car/hyundai/tests/test_hyundai.py @@ -85,10 +85,8 @@ class TestHyundaiFingerprint(unittest.TestCase): for car_model, ecus in FW_VERSIONS.items(): with self.subTest(car_model=car_model.value): for ecu, fws in ecus.items(): - # TODO: enable for Ecu.eps - if ecu[0] in (Ecu.fwdCamera, Ecu.fwdRadar, Ecu.abs): - self.assertTrue(all(fw.startswith(expected_fw_prefix) for fw in fws), - f"FW from unexpected request in database: {(ecu, fws)}") + self.assertTrue(all(fw.startswith(expected_fw_prefix) for fw in fws), + f"FW from unexpected request in database: {(ecu, fws)}") @settings(max_examples=100) @given(data=st.data()) From 8b07dc5c9c7e0c5e04e745733a2a16ebad4084b8 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 26 Mar 2024 18:29:50 -0700 Subject: [PATCH 156/384] Hyundai: update G70 2022+ harness (#32021) * fix * update docs --- docs/CARS.md | 5 +++-- selfdrive/car/hyundai/values.py | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 570c373f33..93c5f5fa46 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -4,7 +4,7 @@ A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. -# 290 Supported Cars +# 291 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -51,7 +51,8 @@ A supported vehicle is one that just works when you install a comma device. All |Ford|Maverick Hybrid 2022|LARIAT Luxury|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Maverick Hybrid 2023-24|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G70 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G70 2020-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G70 2020-21|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G70 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G90 2017-20|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 75bb98aba8..a76be305bc 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -508,7 +508,12 @@ class CAR(Platforms): flags=HyundaiFlags.LEGACY, ) GENESIS_G70_2020 = HyundaiPlatformConfig( - [HyundaiCarDocs("Genesis G70 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], + [ + # TODO: 2021 MY harness is unknown + HyundaiCarDocs("Genesis G70 2020-21", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + # TODO: From 3.3T Sport Advanced 2022 & Prestige 2023 Trim, 2.0T is unknown + HyundaiCarDocs("Genesis G70 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), + ], CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9), flags=HyundaiFlags.MANDO_RADAR, ) From 1306edd0859886b741ac718deefeae363c60f9b9 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 26 Mar 2024 20:49:08 -0700 Subject: [PATCH 157/384] Hyundai: clean up FW queries (#32022) * mark MULTI as logging * rm whitelists * rm MULTI * major clean up :D * faster refs :D * wow this was a broken test (can fd can be without aux, and this allowed eps) * expected * only for camera (needs test change) * Revert "only for camera (needs test change)" This reverts commit 6156bcd674f856e9a6476277d2b14b14b659f597. * better msg * yes we do --- selfdrive/car/hyundai/tests/test_hyundai.py | 12 ++--- selfdrive/car/hyundai/values.py | 53 ++------------------- selfdrive/car/tests/test_fw_fingerprint.py | 6 +-- 3 files changed, 12 insertions(+), 59 deletions(-) diff --git a/selfdrive/car/hyundai/tests/test_hyundai.py b/selfdrive/car/hyundai/tests/test_hyundai.py index 2bd17232ea..2e4edcffc6 100755 --- a/selfdrive/car/hyundai/tests/test_hyundai.py +++ b/selfdrive/car/hyundai/tests/test_hyundai.py @@ -36,6 +36,8 @@ NO_DATES_PLATFORMS = { CAR.HYUNDAI_VELOSTER, } +CANFD_EXPECTED_ECUS = {Ecu.fwdCamera, Ecu.fwdRadar} + class TestHyundaiFingerprint(unittest.TestCase): def test_can_features(self): @@ -51,16 +53,14 @@ class TestHyundaiFingerprint(unittest.TestCase): self.assertEqual(HYBRID_CAR & EV_CAR, set(), "Shared cars between hybrid and EV") self.assertEqual(CANFD_CAR & HYBRID_CAR, set(), "Hard coding CAN FD cars as hybrid is no longer supported") - def test_auxiliary_request_ecu_whitelist(self): - # Asserts only auxiliary Ecus can exist in database for CAN-FD cars - whitelisted_ecus = {ecu for r in FW_QUERY_CONFIG.requests for ecu in r.whitelist_ecus if r.auxiliary} - + def test_canfd_ecu_whitelist(self): + # Asserts only expected Ecus can exist in database for CAN-FD cars for car_model in CANFD_CAR: ecus = {fw[0] for fw in FW_VERSIONS[car_model].keys()} - ecus_not_in_whitelist = ecus - whitelisted_ecus + ecus_not_in_whitelist = ecus - CANFD_EXPECTED_ECUS ecu_strings = ", ".join([f"Ecu.{ECU_NAME[ecu]}" for ecu in ecus_not_in_whitelist]) self.assertEqual(len(ecus_not_in_whitelist), 0, - f"{car_model}: Car model has ECUs not in auxiliary request whitelists: {ecu_strings}") + f"{car_model}: Car model has unexpected ECUs: {ecu_strings}") def test_blacklisted_parts(self): # Asserts no ECUs known to be shared across platforms exist in the database. diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index a76be305bc..1477f1b3af 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -624,11 +624,6 @@ HYUNDAI_VERSION_REQUEST_LONG = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) HYUNDAI_VERSION_REQUEST_ALT = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ p16(0xf110) # Alt long description -HYUNDAI_VERSION_REQUEST_MULTI = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ - p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_SPARE_PART_NUMBER) + \ - p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_SOFTWARE_IDENTIFICATION) + \ - p16(0xf100) - HYUNDAI_ECU_MANUFACTURING_DATE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ p16(uds.DATA_IDENTIFIER_TYPE.ECU_MANUFACTURING_DATE) @@ -652,37 +647,25 @@ PLATFORM_CODE_ECUS = [Ecu.fwdRadar, Ecu.fwdCamera, Ecu.eps] # TODO: there are date codes in the ABS firmware versions in hex DATE_FW_ECUS = [Ecu.fwdCamera] -ALL_HYUNDAI_ECUS = [Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.parkingAdas, - Ecu.adas, Ecu.hvac, Ecu.cornerRadar, Ecu.combinationMeter] - FW_QUERY_CONFIG = FwQueryConfig( requests=[ - # TODO: minimize shared whitelists for CAN and cornerRadar for CAN-FD + # TODO: add back whitelists # CAN queries (OBD-II port) Request( [HYUNDAI_VERSION_REQUEST_LONG], [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera], - ), - Request( - [HYUNDAI_VERSION_REQUEST_MULTI], - [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.eps, Ecu.abs, Ecu.fwdRadar], ), - # CAN-FD queries (from camera) - # TODO: combine shared whitelists with CAN requests + # CAN & CAN-FD queries (from camera) Request( [HYUNDAI_VERSION_REQUEST_LONG], [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.fwdCamera, Ecu.fwdRadar, Ecu.cornerRadar, Ecu.hvac, Ecu.eps], bus=0, auxiliary=True, ), Request( [HYUNDAI_VERSION_REQUEST_LONG], [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.fwdCamera, Ecu.adas, Ecu.cornerRadar, Ecu.hvac], bus=1, auxiliary=True, obd_multiplexing=False, @@ -693,44 +676,15 @@ FW_QUERY_CONFIG = FwQueryConfig( Request( [HYUNDAI_ECU_MANUFACTURING_DATE], [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.fwdCamera], - bus=0, - auxiliary=True, - logging=True, - ), - - # CAN & CAN FD logging queries (from camera) - Request( - [HYUNDAI_VERSION_REQUEST_LONG], - [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=ALL_HYUNDAI_ECUS, bus=0, auxiliary=True, logging=True, ), - Request( - [HYUNDAI_VERSION_REQUEST_MULTI], - [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=ALL_HYUNDAI_ECUS, - bus=0, - auxiliary=True, - logging=True, - ), - Request( - [HYUNDAI_VERSION_REQUEST_LONG], - [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=ALL_HYUNDAI_ECUS, - bus=1, - auxiliary=True, - obd_multiplexing=False, - logging=True, - ), - # CAN-FD alt request logging queries + # CAN-FD alt request logging queries for hvac and parkingAdas Request( [HYUNDAI_VERSION_REQUEST_ALT], [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.parkingAdas, Ecu.hvac], bus=0, auxiliary=True, logging=True, @@ -738,7 +692,6 @@ FW_QUERY_CONFIG = FwQueryConfig( Request( [HYUNDAI_VERSION_REQUEST_ALT], [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.parkingAdas, Ecu.hvac], bus=1, auxiliary=True, logging=True, diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 17ffc358f1..eaef1677e7 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -263,7 +263,7 @@ class TestFwFingerprintTiming(unittest.TestCase): print(f'get_vin {name} case, query time={self.total_time / self.N} seconds') def test_fw_query_timing(self): - total_ref_time = {1: 8.5, 2: 9.4} + total_ref_time = {1: 8.1, 2: 8.7} brand_ref_times = { 1: { 'gm': 1.0, @@ -271,7 +271,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'chrysler': 0.3, 'ford': 1.5, 'honda': 0.45, - 'hyundai': 1.05, + 'hyundai': 0.65, 'mazda': 0.1, 'nissan': 0.8, 'subaru': 0.65, @@ -281,7 +281,7 @@ class TestFwFingerprintTiming(unittest.TestCase): }, 2: { 'ford': 1.6, - 'hyundai': 1.85, + 'hyundai': 1.15, 'tesla': 0.3, } } From 89f1483ac910c438719ca27fbff6b684e9922185 Mon Sep 17 00:00:00 2001 From: steilz Date: Wed, 27 Mar 2024 05:18:10 +0100 Subject: [PATCH 158/384] Added my VW Passat B8 2018 Fingerprint (#31939) * Added Fingerprint for my Passat MK8 * removed duplicated entry --- selfdrive/car/volkswagen/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index aa7affda76..95441b13b1 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -391,6 +391,7 @@ FW_VERSIONS = { b'\xf1\x873G0906259 \xf1\x890004', b'\xf1\x873G0906259B \xf1\x890002', b'\xf1\x873G0906264 \xf1\x890004', + b'\xf1\x8704L906026GK\xf1\x899971', ], (Ecu.transmission, 0x7e1, None): [ b'\xf1\x870CW300042H \xf1\x891601', @@ -408,6 +409,7 @@ FW_VERSIONS = { b'\xf1\x870GC300042H \xf1\x891404', b'\xf1\x870GC300043 \xf1\x892301', b'\xf1\x870GC300046P \xf1\x892805', + b'\xf1\x870CW300041E \xf1\x891006', ], (Ecu.srs, 0x715, None): [ b'\xf1\x873Q0959655AE\xf1\x890195\xf1\x82\r56140056130012416612124111', @@ -438,6 +440,7 @@ FW_VERSIONS = { b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521B00703A1', b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563B0000600', b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567B0020600', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820531B0062105', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x873Q0907572A \xf1\x890126', From 0a2a3dfab7106e40a3934e1e80bc6573223276d8 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 28 Mar 2024 00:47:18 +0800 Subject: [PATCH 159/384] replay/cabana : support segment range (#32026) * support segment range * include --- tools/replay/replay.cc | 2 +- tools/replay/route.cc | 55 ++++++++++++++++++++++++++++++------------ tools/replay/route.h | 3 ++- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index 7c8c1ad43f..3d5d3219c6 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -81,7 +81,7 @@ bool Replay::load() { } void Replay::start(int seconds) { - seekTo(route_->identifier().segment_id * 60 + seconds, false); + seekTo(route_->identifier().begin_segment * 60 + seconds, false); } void Replay::updateEvents(const std::function &lambda) { diff --git a/tools/replay/route.cc b/tools/replay/route.cc index d5847a94b8..0a57ee7d4a 100644 --- a/tools/replay/route.cc +++ b/tools/replay/route.cc @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include @@ -18,11 +18,24 @@ Route::Route(const QString &route, const QString &data_dir) : data_dir_(data_dir } RouteIdentifier Route::parseRoute(const QString &str) { - QRegExp rx(R"(^(?:([a-z0-9]{16})([|_/]))?(.{20})(?:(--|/)(\d*))?$)"); - if (rx.indexIn(str) == -1) return {}; - - const QStringList list = rx.capturedTexts(); - return {.dongle_id = list[1], .timestamp = list[3], .segment_id = list[5].toInt(), .str = list[1] + "|" + list[3]}; + RouteIdentifier identifier = {}; + QRegularExpression rx(R"(^((?[a-z0-9]{16})[|_/])?(?.{20})((?--|/)(?((-?\d+(:(-?\d+)?)?)|(:-?\d+))))?$)"); + if (auto match = rx.match(str); match.hasMatch()) { + identifier.dongle_id = match.captured("dongle_id"); + identifier.timestamp = match.captured("timestamp"); + identifier.str = identifier.dongle_id + "|" + identifier.timestamp; + auto range_str = match.captured("range"); + if (auto separator = match.captured("separator"); separator == "/" && !range_str.isEmpty()) { + auto range = range_str.split(":"); + identifier.begin_segment = identifier.end_segment = range[0].toInt(); + if (range.size() == 2) { + identifier.end_segment = range[1].isEmpty() ? -1 : range[1].toInt(); + } + } else if (separator == "--") { + identifier.begin_segment = range_str.toInt(); + } + } + return identifier; } bool Route::load() { @@ -31,7 +44,19 @@ bool Route::load() { return false; } date_time_ = QDateTime::fromString(route_.timestamp, "yyyy-MM-dd--HH-mm-ss"); - return data_dir_.isEmpty() ? loadFromServer() : loadFromLocal(); + bool ret = data_dir_.isEmpty() ? loadFromServer() : loadFromLocal(); + if (ret) { + if (route_.begin_segment == -1) route_.begin_segment = segments_.rbegin()->first; + if (route_.end_segment == -1) route_.end_segment = segments_.rbegin()->first; + for (auto it = segments_.begin(); it != segments_.end(); /**/) { + if (it->first < route_.begin_segment || it->first > route_.end_segment) { + it = segments_.erase(it); + } else { + ++it; + } + } + } + return !segments_.empty(); } bool Route::loadFromServer() { @@ -62,15 +87,13 @@ bool Route::loadFromJson(const QString &json) { } bool Route::loadFromLocal() { - QDir log_dir(data_dir_); - for (const auto &folder : log_dir.entryList(QDir::Dirs | QDir::NoDot | QDir::NoDotDot, QDir::NoSort)) { - int pos = folder.lastIndexOf("--"); - if (pos != -1 && folder.left(pos) == route_.timestamp) { - const int seg_num = folder.mid(pos + 2).toInt(); - QDir segment_dir(log_dir.filePath(folder)); - for (const auto &f : segment_dir.entryList(QDir::Files)) { - addFileToSegment(seg_num, segment_dir.absoluteFilePath(f)); - } + QDirIterator it(data_dir_, {QString("%1--*").arg(route_.timestamp)}, QDir::Dirs | QDir::NoDotAndDotDot); + while (it.hasNext()) { + QString segment = it.next(); + const int seg_num = segment.mid(segment.lastIndexOf("--") + 2).toInt(); + QDir segment_dir(segment); + for (const auto &f : segment_dir.entryList(QDir::Files)) { + addFileToSegment(seg_num, segment_dir.absoluteFilePath(f)); } } return !segments_.empty(); diff --git a/tools/replay/route.h b/tools/replay/route.h index 4dad7a1f37..33e5bcb1ba 100644 --- a/tools/replay/route.h +++ b/tools/replay/route.h @@ -14,7 +14,8 @@ struct RouteIdentifier { QString dongle_id; QString timestamp; - int segment_id; + int begin_segment = 0; + int end_segment = -1; QString str; }; From 1637265ad3953cc2307b6f7422aeb5c64d9d9635 Mon Sep 17 00:00:00 2001 From: Michel Le Bihan Date: Wed, 27 Mar 2024 17:47:29 +0100 Subject: [PATCH 160/384] simulator: Remove comma pedal sensor (#32030) --- tools/sim/lib/simulated_car.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tools/sim/lib/simulated_car.py b/tools/sim/lib/simulated_car.py index 746886ba43..1d56189728 100644 --- a/tools/sim/lib/simulated_car.py +++ b/tools/sim/lib/simulated_car.py @@ -49,13 +49,6 @@ class SimulatedCar: msg.append(self.packer.make_can_msg("SCM_BUTTONS", 0, {"CRUISE_BUTTONS": simulator_state.cruise_button})) - values = { - "COUNTER_PEDAL": self.idx & 0xF, - "INTERCEPTOR_GAS": simulator_state.user_gas * 2**12, - "INTERCEPTOR_GAS2": simulator_state.user_gas * 2**12, - } - msg.append(self.packer.make_can_msg("GAS_SENSOR", 0, values)) - msg.append(self.packer.make_can_msg("GEARBOX", 0, {"GEAR": 4, "GEAR_SHIFTER": 8})) msg.append(self.packer.make_can_msg("GAS_PEDAL_2", 0, {})) msg.append(self.packer.make_can_msg("SEATBELT_STATUS", 0, {"SEATBELT_DRIVER_LATCHED": 1})) From fad9edf344ad27775716a087580e78230ad5e6dd Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 28 Mar 2024 06:34:38 +0800 Subject: [PATCH 161/384] ui: move struct Alert into OnroadAlerts (#32024) * move Alert into OnroadAlerts * multi-lang --- selfdrive/ui/qt/onroad.cc | 53 ++++++++++++++++++--- selfdrive/ui/qt/onroad.h | 23 ++++++++- selfdrive/ui/translations/main_ar.ts | 23 +++++++++ selfdrive/ui/translations/main_de.ts | 23 +++++++++ selfdrive/ui/translations/main_fr.ts | 23 +++++++++ selfdrive/ui/translations/main_ja.ts | 23 +++++++++ selfdrive/ui/translations/main_ko.ts | 23 +++++++++ selfdrive/ui/translations/main_pt-BR.ts | 23 +++++++++ selfdrive/ui/translations/main_th.ts | 23 +++++++++ selfdrive/ui/translations/main_tr.ts | 23 +++++++++ selfdrive/ui/translations/main_zh-CHS.ts | 23 +++++++++ selfdrive/ui/translations/main_zh-CHT.ts | 23 +++++++++ selfdrive/ui/ui.h | 60 ------------------------ 13 files changed, 298 insertions(+), 68 deletions(-) diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 40ae436c65..5d562d6e23 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -73,18 +73,16 @@ void OnroadWindow::updateState(const UIState &s) { return; } - QColor bgColor = bg_colors[s.status]; - Alert alert = Alert::get(*(s.sm), s.scene.started_frame); - alerts->updateAlert(alert); - if (s.scene.map_on_left) { split->setDirection(QBoxLayout::LeftToRight); } else { split->setDirection(QBoxLayout::RightToLeft); } + alerts->updateState(s); nvg->updateState(s); + QColor bgColor = bg_colors[s.status]; if (bg != bgColor) { // repaint border bg = bgColor; @@ -128,7 +126,7 @@ void OnroadWindow::offroadTransition(bool offroad) { } } #endif - alerts->updateAlert({}); + alerts->clear(); } void OnroadWindow::primeChanged(bool prime) { @@ -152,13 +150,56 @@ void OnroadWindow::paintEvent(QPaintEvent *event) { // ***** onroad widgets ***** // OnroadAlerts -void OnroadAlerts::updateAlert(const Alert &a) { + +void OnroadAlerts::updateState(const UIState &s) { + Alert a = getAlert(*(s.sm), s.scene.started_frame); if (!alert.equal(a)) { alert = a; update(); } } +void OnroadAlerts::clear() { + alert = {}; + update(); +} + +OnroadAlerts::Alert OnroadAlerts::getAlert(const SubMaster &sm, uint64_t started_frame) { + const cereal::ControlsState::Reader &cs = sm["controlsState"].getControlsState(); + const uint64_t controls_frame = sm.rcv_frame("controlsState"); + + Alert a = {}; + if (controls_frame >= started_frame) { // Don't get old alert. + a = {cs.getAlertText1().cStr(), cs.getAlertText2().cStr(), + cs.getAlertType().cStr(), cs.getAlertSize(), cs.getAlertStatus()}; + } + + if (!sm.updated("controlsState") && (sm.frame - started_frame) > 5 * UI_FREQ) { + const int CONTROLS_TIMEOUT = 5; + const int controls_missing = (nanos_since_boot() - sm.rcv_time("controlsState")) / 1e9; + + // Handle controls timeout + if (controls_frame < started_frame) { + // car is started, but controlsState hasn't been seen at all + a = {tr("openpilot Unavailable"), tr("Waiting for controls to start"), + "controlsWaiting", cereal::ControlsState::AlertSize::MID, + cereal::ControlsState::AlertStatus::NORMAL}; + } else if (controls_missing > CONTROLS_TIMEOUT && !Hardware::PC()) { + // car is started, but controls is lagging or died + if (cs.getEnabled() && (controls_missing - CONTROLS_TIMEOUT) < 10) { + a = {tr("TAKE CONTROL IMMEDIATELY"), tr("Controls Unresponsive"), + "controlsUnresponsive", cereal::ControlsState::AlertSize::FULL, + cereal::ControlsState::AlertStatus::CRITICAL}; + } else { + a = {tr("Controls Unresponsive"), tr("Reboot Device"), + "controlsUnresponsivePermanent", cereal::ControlsState::AlertSize::MID, + cereal::ControlsState::AlertStatus::NORMAL}; + } + } + } + return a; +} + void OnroadAlerts::paintEvent(QPaintEvent *event) { if (alert.size == cereal::ControlsState::AlertSize::NONE) { return; diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index c72d1225e6..c2c2c326db 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -21,12 +21,31 @@ class OnroadAlerts : public QWidget { public: OnroadAlerts(QWidget *parent = 0) : QWidget(parent) {} - void updateAlert(const Alert &a); + void updateState(const UIState &s); + void clear(); protected: + struct Alert { + QString text1; + QString text2; + QString type; + cereal::ControlsState::AlertSize size; + cereal::ControlsState::AlertStatus status; + + bool equal(const Alert &other) const { + return text1 == other.text1 && other.text2 == other.text2 && type == other.type; + } + }; + + const QMap alert_colors = { + {cereal::ControlsState::AlertStatus::NORMAL, QColor(0x15, 0x15, 0x15, 0xf1)}, + {cereal::ControlsState::AlertStatus::USER_PROMPT, QColor(0xDA, 0x6F, 0x25, 0xf1)}, + {cereal::ControlsState::AlertStatus::CRITICAL, QColor(0xC9, 0x22, 0x31, 0xf1)}, + }; + void paintEvent(QPaintEvent*) override; + OnroadAlerts::Alert getAlert(const SubMaster &sm, uint64_t started_frame); -private: QColor bg; Alert alert = {}; }; diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 4f83dc18de..3acbba0c9d 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -492,6 +492,29 @@ تنبيه
+ + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index b3fa645217..bc2d685c4d 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -487,6 +487,29 @@ HINWEIS + + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index cc9c95acd4..55cb1b29aa 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -488,6 +488,29 @@ ALERTE + + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 13c2083bce..92238d6beb 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -486,6 +486,29 @@ 警告 + + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index a3fd82f610..e2f4b4c7bb 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -487,6 +487,29 @@ 알림 + + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index 27231a9dc4..e5a0c23f40 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -488,6 +488,29 @@ ALERTA + + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index 1451e3b419..14fb40d21f 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -487,6 +487,29 @@ การแจ้งเตือน + + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index cb20532b47..9fce4793ca 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -486,6 +486,29 @@ UYARI + + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 5625c73b97..6b040dac26 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -487,6 +487,29 @@ 警报 + + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index b5e36620ab..dd3f600254 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -487,6 +487,29 @@ 提醒 + + OnroadAlerts + + openpilot Unavailable + + + + Waiting for controls to start + + + + TAKE CONTROL IMMEDIATELY + + + + Controls Unresponsive + + + + Reboot Device + + + PairingPopup diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 6efb72af9a..d639d85eeb 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include @@ -22,7 +21,6 @@ const int UI_HEADER_HEIGHT = 420; const int UI_FREQ = 20; // Hz const int BACKLIGHT_OFFROAD = 50; -typedef cereal::CarControl::HUDControl::AudibleAlert AudibleAlert; const float MIN_DRAW_DISTANCE = 10.0; const float MAX_DRAW_DISTANCE = 100.0; @@ -47,59 +45,6 @@ constexpr vec3 default_face_kpts_3d[] = { {18.02, -49.14, 8.00}, {6.36, -51.20, 8.00}, {-5.98, -51.20, 8.00}, }; -struct Alert { - QString text1; - QString text2; - QString type; - cereal::ControlsState::AlertSize size; - cereal::ControlsState::AlertStatus status; - AudibleAlert sound; - - bool equal(const Alert &a2) { - return text1 == a2.text1 && text2 == a2.text2 && type == a2.type && sound == a2.sound; - } - - static Alert get(const SubMaster &sm, uint64_t started_frame) { - const cereal::ControlsState::Reader &cs = sm["controlsState"].getControlsState(); - const uint64_t controls_frame = sm.rcv_frame("controlsState"); - - Alert alert = {}; - if (controls_frame >= started_frame) { // Don't get old alert. - alert = {cs.getAlertText1().cStr(), cs.getAlertText2().cStr(), - cs.getAlertType().cStr(), cs.getAlertSize(), - cs.getAlertStatus(), - cs.getAlertSound()}; - } - - if (!sm.updated("controlsState") && (sm.frame - started_frame) > 5 * UI_FREQ) { - const int CONTROLS_TIMEOUT = 5; - const int controls_missing = (nanos_since_boot() - sm.rcv_time("controlsState")) / 1e9; - - // Handle controls timeout - if (controls_frame < started_frame) { - // car is started, but controlsState hasn't been seen at all - alert = {"openpilot Unavailable", "Waiting for controls to start", - "controlsWaiting", cereal::ControlsState::AlertSize::MID, - cereal::ControlsState::AlertStatus::NORMAL, - AudibleAlert::NONE}; - } else if (controls_missing > CONTROLS_TIMEOUT && !Hardware::PC()) { - // car is started, but controls is lagging or died - if (cs.getEnabled() && (controls_missing - CONTROLS_TIMEOUT) < 10) { - alert = {"TAKE CONTROL IMMEDIATELY", "Controls Unresponsive", - "controlsUnresponsive", cereal::ControlsState::AlertSize::FULL, - cereal::ControlsState::AlertStatus::CRITICAL, - AudibleAlert::WARNING_IMMEDIATE}; - } else { - alert = {"Controls Unresponsive", "Reboot Device", - "controlsUnresponsivePermanent", cereal::ControlsState::AlertSize::MID, - cereal::ControlsState::AlertStatus::NORMAL, - AudibleAlert::NONE}; - } - } - } - return alert; - } -}; typedef enum UIStatus { STATUS_DISENGAGED, @@ -123,11 +68,6 @@ const QColor bg_colors [] = { [STATUS_ENGAGED] = QColor(0x17, 0x86, 0x44, 0xf1), }; -static std::map alert_colors = { - {cereal::ControlsState::AlertStatus::NORMAL, QColor(0x15, 0x15, 0x15, 0xf1)}, - {cereal::ControlsState::AlertStatus::USER_PROMPT, QColor(0xDA, 0x6F, 0x25, 0xf1)}, - {cereal::ControlsState::AlertStatus::CRITICAL, QColor(0xC9, 0x22, 0x31, 0xf1)}, -}; typedef struct UIScene { bool calibration_valid = false; From bd7b72e861bafb71d0ec15d4efa15abb2f696c25 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 28 Mar 2024 06:35:28 +0800 Subject: [PATCH 162/384] ui/initApp(): remove temporary QApplication object (#32011) remove temporary QApplication object --- selfdrive/ui/qt/util.cc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/selfdrive/ui/qt/util.cc b/selfdrive/ui/qt/util.cc index 9138f8bca5..0bf5f2865e 100644 --- a/selfdrive/ui/qt/util.cc +++ b/selfdrive/ui/qt/util.cc @@ -105,20 +105,21 @@ void initApp(int argc, char *argv[], bool disable_hidpi) { std::signal(SIGINT, sigTermHandler); std::signal(SIGTERM, sigTermHandler); - if (disable_hidpi) { + QString app_dir; #ifdef __APPLE__ - // Get the devicePixelRatio, and scale accordingly to maintain 1:1 rendering - QApplication tmp(argc, argv); - qputenv("QT_SCALE_FACTOR", QString::number(1.0 / tmp.devicePixelRatio() ).toLocal8Bit()); -#endif + // Get the devicePixelRatio, and scale accordingly to maintain 1:1 rendering + QApplication tmp(argc, argv); + app_dir = QCoreApplication::applicationDirPath(); + if (disable_hidpi) { + qputenv("QT_SCALE_FACTOR", QString::number(1.0 / tmp.devicePixelRatio()).toLocal8Bit()); } +#else + app_dir = QFileInfo(util::readlink("/proc/self/exe").c_str()).path(); +#endif qputenv("QT_DBL_CLICK_DIST", QByteArray::number(150)); - // ensure the current dir matches the exectuable's directory - QApplication tmp(argc, argv); - QString appDir = QCoreApplication::applicationDirPath(); - QDir::setCurrent(appDir); + QDir::setCurrent(app_dir); setQtSurfaceFormat(); } From fa77d57e7cd3393f5910013d0bc9c1c326647d44 Mon Sep 17 00:00:00 2001 From: Lee Jong Mun <43285072+crwusiz@users.noreply.github.com> Date: Fri, 29 Mar 2024 02:37:08 +0900 Subject: [PATCH 163/384] Multilang: kor translation update (#32036) --- selfdrive/ui/translations/main_ko.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index e2f4b4c7bb..21f8f39fb1 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -299,11 +299,11 @@ Pair Device - + 장치 동기화 PAIR - + 동기화 @@ -491,30 +491,30 @@ OnroadAlerts openpilot Unavailable - + 오픈파일럿을 사용할수없습니다 Waiting for controls to start - + 프로세스가 준비중입니다 TAKE CONTROL IMMEDIATELY - + 핸들을 잡아주세요 Controls Unresponsive - + 프로세스가 응답하지않습니다 Reboot Device - + 장치를 재부팅하세요 PairingPopup Pair your device to your comma account - 장치를 comma 계정에 페어링합니다 + 장치를 comma 계정에 동기화합니다 Go to https://connect.comma.ai on your phone @@ -632,7 +632,7 @@ now - + now From d6d8e459319bfc2ce10d8dabf82b44c5401fbf2f Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 28 Mar 2024 16:26:16 -0700 Subject: [PATCH 164/384] Simplify cabana dbc dict (#32041) * so needlessly complex! * inside generate_dbc_json * this is good * clean up! * spaces * so much clean up --- selfdrive/car/fingerprints.py | 14 -------------- tools/cabana/dbc/generate_dbc_json.py | 9 +++++++-- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/selfdrive/car/fingerprints.py b/selfdrive/car/fingerprints.py index e25b5486a0..977df6bc9f 100644 --- a/selfdrive/car/fingerprints.py +++ b/selfdrive/car/fingerprints.py @@ -1,4 +1,3 @@ -from typing import Any, Callable from openpilot.selfdrive.car.interfaces import get_interface_attr from openpilot.selfdrive.car.body.values import CAR as BODY from openpilot.selfdrive.car.chrysler.values import CAR as CHRYSLER @@ -11,7 +10,6 @@ from openpilot.selfdrive.car.nissan.values import CAR as NISSAN from openpilot.selfdrive.car.subaru.values import CAR as SUBARU from openpilot.selfdrive.car.tesla.values import CAR as TESLA from openpilot.selfdrive.car.toyota.values import CAR as TOYOTA -from openpilot.selfdrive.car.values import PLATFORMS, Platform from openpilot.selfdrive.car.volkswagen.values import CAR as VW FW_VERSIONS = get_interface_attr('FW_VERSIONS', combine_brands=True, ignore_none=True) @@ -338,15 +336,3 @@ MIGRATION = { "SKODA SCALA 1ST GEN": VW.SKODA_SCALA_MK1, "SKODA SUPERB 3RD GEN": VW.SKODA_SUPERB_MK3, } - - -MapFunc = Callable[[Platform], Any] - - -def create_platform_map(func: MapFunc): - ret = {str(platform): func(platform) for platform in PLATFORMS.values() if func(platform) is not None} - - for m in MIGRATION: - ret[m] = ret[MIGRATION[m]] - - return ret diff --git a/tools/cabana/dbc/generate_dbc_json.py b/tools/cabana/dbc/generate_dbc_json.py index deda0909c4..dfb96bad7a 100755 --- a/tools/cabana/dbc/generate_dbc_json.py +++ b/tools/cabana/dbc/generate_dbc_json.py @@ -2,11 +2,16 @@ import argparse import json -from openpilot.selfdrive.car.fingerprints import create_platform_map +from openpilot.selfdrive.car.fingerprints import MIGRATION +from openpilot.selfdrive.car.values import PLATFORMS def generate_dbc_json() -> str: - dbc_map = create_platform_map(lambda platform: platform.config.dbc_dict["pt"] if platform != "MOCK" else None) + dbc_map = {platform.name: platform.config.dbc_dict['pt'] for platform in PLATFORMS.values() if platform != "MOCK"} + + for m in MIGRATION: + dbc_map[m] = dbc_map[MIGRATION[m]] + return json.dumps(dict(sorted(dbc_map.items())), indent=2) From 903cc225ebac1742517068b787f7dff91f7f7823 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 28 Mar 2024 16:40:31 -0700 Subject: [PATCH 165/384] juggle.py: migrate platform name (#32042) * fix formatting! * migrate plotjuggler platform for dbc * test with can * temp * Revert "temp" This reverts commit 9d740bf3bddc8a7833ca8c293a6fb4b692a30bb8. Revert "test with can" This reverts commit d6cf2304895d00f83e737f3f749089ce9c5f836e. * fix test --- .github/workflows/tools_tests.yaml | 4 ++-- tools/plotjuggler/juggle.py | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tools_tests.yaml b/.github/workflows/tools_tests.yaml index a051cb1241..ff0e29e9e2 100644 --- a/.github/workflows/tools_tests.yaml +++ b/.github/workflows/tools_tests.yaml @@ -31,7 +31,7 @@ jobs: - uses: ./.github/workflows/setup-with-retry - name: Build openpilot timeout-minutes: 5 - run: ${{ env.RUN }} "scons -j$(nproc) cereal/ common/ --minimal" + run: ${{ env.RUN }} "scons -j$(nproc) cereal/ common/ opendbc/ --minimal" - name: Test PlotJuggler timeout-minutes: 2 run: | @@ -99,4 +99,4 @@ jobs: - name: Test notebooks timeout-minutes: 3 run: | - ${{ env.RUN }} "pip install nbmake && pytest --nbmake tools/car_porting/examples/" \ No newline at end of file + ${{ env.RUN }} "pip install nbmake && pytest --nbmake tools/car_porting/examples/" diff --git a/tools/plotjuggler/juggle.py b/tools/plotjuggler/juggle.py index 0caf5a18ff..1d1612a1cd 100755 --- a/tools/plotjuggler/juggle.py +++ b/tools/plotjuggler/juggle.py @@ -11,19 +11,20 @@ import argparse from functools import partial from openpilot.common.basedir import BASEDIR +from openpilot.selfdrive.car.fingerprints import MIGRATION from openpilot.tools.lib.helpers import save_log - from openpilot.tools.lib.logreader import LogReader, ReadMode juggle_dir = os.path.dirname(os.path.realpath(__file__)) DEMO_ROUTE = "a2a0ccea32023010|2023-07-27--13-01-19" -RELEASES_URL="https://github.com/commaai/PlotJuggler/releases/download/latest" +RELEASES_URL = "https://github.com/commaai/PlotJuggler/releases/download/latest" INSTALL_DIR = os.path.join(juggle_dir, "bin") PLOTJUGGLER_BIN = os.path.join(juggle_dir, "bin/plotjuggler") MINIMUM_PLOTJUGGLER_VERSION = (3, 5, 2) MAX_STREAMING_BUFFER_SIZE = 1000 + def install(): m = f"{platform.system()}-{platform.machine()}" supported = ("Linux-x86_64", "Linux-aarch64", "Darwin-arm64", "Darwin-x86_64") @@ -38,7 +39,7 @@ def install(): with requests.get(url, stream=True, timeout=10) as r, tempfile.NamedTemporaryFile() as tmp: r.raise_for_status() with open(tmp.name, 'wb') as tmpf: - for chunk in r.iter_content(chunk_size=1024*1024): + for chunk in r.iter_content(chunk_size=1024 * 1024): tmpf.write(chunk) with tarfile.open(tmp.name) as tar: @@ -69,9 +70,11 @@ def start_juggler(fn=None, dbc=None, layout=None, route_or_segment_name=None): cmd = f'{PLOTJUGGLER_BIN} --buffer_size {MAX_STREAMING_BUFFER_SIZE} --plugin_folders {INSTALL_DIR}{extra_args}' subprocess.call(cmd, shell=True, env=env, cwd=juggle_dir) + def process(can, lr): return [d for d in lr if can or d.which() not in ['can', 'sendcan']] + def juggle_route(route_or_segment_name, can, layout, dbc=None): sr = LogReader(route_or_segment_name, default_mode=ReadMode.AUTO_INTERACTIVE) @@ -82,7 +85,8 @@ def juggle_route(route_or_segment_name, can, layout, dbc=None): for cp in [m for m in all_data if m.which() == 'carParams']: try: DBC = __import__(f"openpilot.selfdrive.car.{cp.carParams.carName}.values", fromlist=['DBC']).DBC - dbc = DBC[cp.carParams.carFingerprint]['pt'] + fingerprint = cp.carParams.carFingerprint + dbc = DBC[MIGRATION.get(fingerprint, fingerprint)]['pt'] except Exception: pass break From 2637294ff266b531c1f5bb801e8650b0559cdf1b Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 28 Mar 2024 20:09:26 -0700 Subject: [PATCH 166/384] [bot] Fingerprints: add missing FW versions from new users (#32039) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 5 +++++ selfdrive/car/toyota/fingerprints.py | 1 + selfdrive/car/volkswagen/fingerprints.py | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 8f48a45a53..e761e18c33 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -100,6 +100,7 @@ FW_VERSIONS = { b'68436250AE', b'68529067AA', b'68594993AB', + b'68594994AB', ], (Ecu.srs, 0x744, None): [ b'68405565AB', @@ -123,6 +124,7 @@ FW_VERSIONS = { b'68540436AC', b'68540436AD', b'68598670AB', + b'68598670AC', ], (Ecu.eps, 0x75a, None): [ b'68416742AA', @@ -132,6 +134,7 @@ FW_VERSIONS = { b'68524936AA', b'68524936AB', b'68525338AB', + b'68594337AB', b'68594340AB', ], (Ecu.engine, 0x7e0, None): [ @@ -148,6 +151,7 @@ FW_VERSIONS = { b'68526752AE ', b'68526754AE ', b'68536264AE ', + b'68700304AB ', b'68700306AB ', ], (Ecu.transmission, 0x7e1, None): [ @@ -161,6 +165,7 @@ FW_VERSIONS = { b'68527221AB', b'68527223AB', b'68586231AD', + b'68586233AD', ], }, CAR.CHRYSLER_PACIFICA_2018_HYBRID: { diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 2be153dea0..b55316f2e9 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -377,6 +377,7 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x750, 0xf): [ b'\x018821FF410200\x00\x00\x00\x00', b'\x018821FF410300\x00\x00\x00\x00', + b'\x018821FF410400\x00\x00\x00\x00', b'\x018821FF410500\x00\x00\x00\x00', ], (Ecu.fwdCamera, 0x750, 0x6d): [ diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 95441b13b1..39fc910ae9 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -386,14 +386,15 @@ FW_VERSIONS = { b'\xf1\x8704L906026ET\xf1\x891990', b'\xf1\x8704L906026FP\xf1\x892012', b'\xf1\x8704L906026GA\xf1\x892013', + b'\xf1\x8704L906026GK\xf1\x899971', b'\xf1\x8704L906026KD\xf1\x894798', b'\xf1\x8705L906022A \xf1\x890827', b'\xf1\x873G0906259 \xf1\x890004', b'\xf1\x873G0906259B \xf1\x890002', b'\xf1\x873G0906264 \xf1\x890004', - b'\xf1\x8704L906026GK\xf1\x899971', ], (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300041E \xf1\x891006', b'\xf1\x870CW300042H \xf1\x891601', b'\xf1\x870CW300042H \xf1\x891607', b'\xf1\x870CW300043H \xf1\x891601', @@ -409,7 +410,6 @@ FW_VERSIONS = { b'\xf1\x870GC300042H \xf1\x891404', b'\xf1\x870GC300043 \xf1\x892301', b'\xf1\x870GC300046P \xf1\x892805', - b'\xf1\x870CW300041E \xf1\x891006', ], (Ecu.srs, 0x715, None): [ b'\xf1\x873Q0959655AE\xf1\x890195\xf1\x82\r56140056130012416612124111', @@ -434,13 +434,13 @@ FW_VERSIONS = { b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522B0060803', b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522B0080803', b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820526B0060905', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820531B0062105', b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521B00606A1', b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516B00501A1', b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521B00603A1', b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521B00703A1', b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563B0000600', b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567B0020600', - b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820531B0062105', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x873Q0907572A \xf1\x890126', From 677aee941fa81852c4d34cbc6653268656906a68 Mon Sep 17 00:00:00 2001 From: Josh Schroeder Date: Thu, 28 Mar 2024 23:17:50 -0400 Subject: [PATCH 167/384] Fingerprint: 2022 Kia Stinger EPS fw (#32045) +EPS fw for 2023 Kia Stinger --- selfdrive/car/hyundai/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index ed9a500148..9d5ac6b6d6 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -382,6 +382,7 @@ FW_VERSIONS = { (Ecu.eps, 0x7d4, None): [ b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503', b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5320 4C2VL503', + b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5520 4C4VL503', b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5380 4C2VR503', b'\xf1\x00CK MDPS R 1.00 5.04 57700-J5520 4C4VL504', ], From a1d538b4eb147fc2aed8f80d7664b25bcd063c56 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 28 Mar 2024 20:41:49 -0700 Subject: [PATCH 168/384] Migration dict: add missing platforms (#32046) missing platforms --- selfdrive/car/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/fingerprints.py b/selfdrive/car/fingerprints.py index 977df6bc9f..877957aa2f 100644 --- a/selfdrive/car/fingerprints.py +++ b/selfdrive/car/fingerprints.py @@ -134,6 +134,8 @@ MIGRATION = { "CHRYSLER PACIFICA 2018": CHRYSLER.CHRYSLER_PACIFICA_2018, "CHRYSLER PACIFICA 2020": CHRYSLER.CHRYSLER_PACIFICA_2020, "DODGE DURANGO 2021": CHRYSLER.DODGE_DURANGO, + "JEEP GRAND CHEROKEE V6 2018": CHRYSLER.JEEP_GRAND_CHEROKEE, + "JEEP GRAND CHEROKEE 2019": CHRYSLER.JEEP_GRAND_CHEROKEE_2019, "RAM 1500 5TH GEN": CHRYSLER.RAM_1500_5TH_GEN, "RAM HD 5TH GEN": CHRYSLER.RAM_HD_5TH_GEN, "FORD BRONCO SPORT 1ST GEN": FORD.FORD_BRONCO_SPORT_MK1, @@ -253,6 +255,7 @@ MIGRATION = { "MAZDA CX-5 2022": MAZDA.MAZDA_CX5_2022, "NISSAN X-TRAIL 2017": NISSAN.NISSAN_XTRAIL, "NISSAN LEAF 2018": NISSAN.NISSAN_LEAF, + "NISSAN LEAF 2018 Instrument Cluster": NISSAN.NISSAN_LEAF_IC, "NISSAN ROGUE 2019": NISSAN.NISSAN_ROGUE, "NISSAN ALTIMA 2020": NISSAN.NISSAN_ALTIMA, "SUBARU ASCENT LIMITED 2019": SUBARU.SUBARU_ASCENT, From c9685dd297f682cdbf877deec209f1b5c98f234b Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Fri, 29 Mar 2024 03:21:40 -0400 Subject: [PATCH 169/384] VW MQB: Speed limiter is nonAdaptive (#31954) * VW MQB: Speed limiter is nonAdaptive * revise * Update selfdrive/car/volkswagen/carstate.py * Update selfdrive/car/volkswagen/carstate.py --------- Co-authored-by: Shane Smiskol --- selfdrive/car/volkswagen/carstate.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 8139fbbf21..fac9de3dc7 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -119,6 +119,8 @@ class CarState(CarStateBase): # currently regulating speed (3), driver accel override (4), brake only (5) ret.cruiseState.available = pt_cp.vl["TSK_06"]["TSK_Status"] in (2, 3, 4, 5) ret.cruiseState.enabled = pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5) + # Speed limiter mode; ECM faults if we command ACC while not pcmCruise + ret.cruiseState.nonAdaptive = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"]) ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) From 0ba96bd1fa4382c416cc6f1c3b098210240d75ec Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 29 Mar 2024 00:24:38 -0700 Subject: [PATCH 170/384] Hyundai CAN: allow fingerprinting without comma power for more platforms (#31983) * including old data and forks * CAR.HYUNDAI_SANTA_FE_HEV_2022 * CAR.HYUNDAI_IONIQ * CAR.HYUNDAI_CUSTIN_1ST_GEN * CAR.KIA_NIRO_PHEV * CAR.HYUNDAI_IONIQ_HEV_2022 * CAR.GENESIS_G80 * CAR.KIA_SORENTO --- selfdrive/car/hyundai/values.py | 187 +++++++++++++++++++++++++++++++- 1 file changed, 186 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 1477f1b3af..a0d9bd9da7 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -700,9 +700,194 @@ FW_QUERY_CONFIG = FwQueryConfig( ], # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present + # KIA_NIRO_EV + # ('fwdCamera', 'fwdRadar'): routes: 540, dongles: 13 + # --- + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 482, dongles: 32 + # --- + # + # HYUNDAI_SANTA_FE + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 554, dongles: 19 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 369, dongles: 10 + # --- + # ('fwdCamera',): routes: 163, dongles: 1 + # --- + # + # HYUNDAI_ELANTRA_HEV_2021 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 435, dongles: 11 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 396, dongles: 7 + # --- + # + # HYUNDAI_PALISADE + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 2034, dongles: 54 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 594, dongles: 13 + # --- + # + # HYUNDAI_SANTA_FE_2022 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 865, dongles: 17 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 430, dongles: 9 + # --- + # + # HYUNDAI_SONATA + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 1550, dongles: 47 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 885, dongles: 22 + # --- + # ('fwdRadar',): routes: 2, dongles: 1 + # --- + # (): routes: 1, dongles: 1 + # --- + # + # HYUNDAI_SANTA_FE_PHEV_2022 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 292, dongles: 6 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 69, dongles: 2 + # --- + # + # HYUNDAI_SANTA_FE_HEV_2022 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 209, dongles: 4 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 71, dongles: 3 + # --- + # + # HYUNDAI_KONA_EV + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 242, dongles: 12 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 13, dongles: 2 + # --- + # ('eps', 'fwdCamera'): routes: 2, dongles: 1 + # --- + # + # HYUNDAI_IONIQ_EV_2020 + # ('fwdCamera', 'fwdRadar'): routes: 227, dongles: 2 + # --- + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 195, dongles: 4 + # --- + # + # HYUNDAI_ELANTRA_2021 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 257, dongles: 9 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 41, dongles: 4 + # --- + # + # HYUNDAI_SONATA_HYBRID + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 495, dongles: 19 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 182, dongles: 12 + # --- + # + # HYUNDAI_KONA_EV_2022 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 176, dongles: 6 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 173, dongles: 3 + # --- + # ('eps', 'fwdCamera'): routes: 1, dongles: 1 + # --- + # + # KIA_FORTE + # ('fwdCamera', 'fwdRadar'): routes: 193, dongles: 3 + # --- + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 24, dongles: 4 + # --- + # ('fwdCamera',): routes: 6, dongles: 2 + # --- + # ('eps', 'fwdCamera'): routes: 4, dongles: 1 + # --- + # + # GENESIS_G70 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 131, dongles: 2 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 97, dongles: 1 + # --- + # + # KIA_NIRO_PHEV_2022 + # ('fwdCamera', 'fwdRadar'): routes: 221, dongles: 1 + # --- + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 88, dongles: 1 + # --- + # + # HYUNDAI_IONIQ_PHEV + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 272, dongles: 14 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 121, dongles: 5 + # --- + # + # KIA_NIRO_HEV_2021 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 171, dongles: 4 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 2, dongles: 1 + # --- + # + # KIA_K5_2021 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 91, dongles: 7 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 61, dongles: 3 + # --- + # + # HYUNDAI_IONIQ + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 96, dongles: 3 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 13, dongles: 1 + # --- + # + # KIA_STINGER + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 184, dongles: 8 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 9, dongles: 3 + # --- + # + # GENESIS_G70_2020 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 45, dongles: 5 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 2, dongles: 1 + # --- + # + # HYUNDAI_AZERA_HEV_6TH_GEN + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 29, dongles: 2 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 11, dongles: 2 + # --- + # ('fwdRadar',): routes: 2, dongles: 1 + # --- + # + # HYUNDAI_CUSTIN_1ST_GEN + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 10, dongles: 1 + # --- + # ('fwdCamera', 'fwdRadar'): routes: 3, dongles: 1 + # --- + # ('fwdCamera',): routes: 2, dongles: 1 + # --- + # ('eps', 'fwdCamera'): routes: 1, dongles: 1 + # --- + # + # KIA_NIRO_PHEV + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 40, dongles: 1 + # --- + # + # HYUNDAI_ELANTRA_GT_I30 + # ('abs', 'eps', 'fwdCamera', 'fwdRadar', 'transmission'): routes: 34, dongles: 1 + # --- + # + # HYUNDAI_IONIQ_EV_LTD + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 14, dongles: 1 + # --- + # + # KIA_STINGER_2022 + # ('fwdCamera', 'fwdRadar'): routes: 10, dongles: 1 + # --- + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 2, dongles: 1 + # --- + # + # HYUNDAI_IONIQ_HEV_2022 + # ('eps', 'fwdCamera', 'fwdRadar'): routes: 5, dongles: 1 + # --- non_essential_ecus={ Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_ELANTRA_2021, - CAR.HYUNDAI_SANTA_FE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV], + CAR.HYUNDAI_SANTA_FE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV, CAR.HYUNDAI_CUSTIN_1ST_GEN, CAR.KIA_SORENTO], }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms From 05f1298044264028dcdeda463a60176889eccbef Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 29 Mar 2024 01:24:34 -0700 Subject: [PATCH 171/384] Revert "Hyundai CAN: allow fingerprinting without comma power for more platforms" (#32050) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revert "Hyundai CAN: allow fingerprinting without comma power for more platfo…" This reverts commit 0ba96bd1fa4382c416cc6f1c3b098210240d75ec. --- selfdrive/car/hyundai/values.py | 187 +------------------------------- 1 file changed, 1 insertion(+), 186 deletions(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index a0d9bd9da7..1477f1b3af 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -700,194 +700,9 @@ FW_QUERY_CONFIG = FwQueryConfig( ], # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present - # KIA_NIRO_EV - # ('fwdCamera', 'fwdRadar'): routes: 540, dongles: 13 - # --- - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 482, dongles: 32 - # --- - # - # HYUNDAI_SANTA_FE - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 554, dongles: 19 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 369, dongles: 10 - # --- - # ('fwdCamera',): routes: 163, dongles: 1 - # --- - # - # HYUNDAI_ELANTRA_HEV_2021 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 435, dongles: 11 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 396, dongles: 7 - # --- - # - # HYUNDAI_PALISADE - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 2034, dongles: 54 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 594, dongles: 13 - # --- - # - # HYUNDAI_SANTA_FE_2022 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 865, dongles: 17 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 430, dongles: 9 - # --- - # - # HYUNDAI_SONATA - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 1550, dongles: 47 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 885, dongles: 22 - # --- - # ('fwdRadar',): routes: 2, dongles: 1 - # --- - # (): routes: 1, dongles: 1 - # --- - # - # HYUNDAI_SANTA_FE_PHEV_2022 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 292, dongles: 6 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 69, dongles: 2 - # --- - # - # HYUNDAI_SANTA_FE_HEV_2022 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 209, dongles: 4 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 71, dongles: 3 - # --- - # - # HYUNDAI_KONA_EV - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 242, dongles: 12 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 13, dongles: 2 - # --- - # ('eps', 'fwdCamera'): routes: 2, dongles: 1 - # --- - # - # HYUNDAI_IONIQ_EV_2020 - # ('fwdCamera', 'fwdRadar'): routes: 227, dongles: 2 - # --- - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 195, dongles: 4 - # --- - # - # HYUNDAI_ELANTRA_2021 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 257, dongles: 9 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 41, dongles: 4 - # --- - # - # HYUNDAI_SONATA_HYBRID - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 495, dongles: 19 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 182, dongles: 12 - # --- - # - # HYUNDAI_KONA_EV_2022 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 176, dongles: 6 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 173, dongles: 3 - # --- - # ('eps', 'fwdCamera'): routes: 1, dongles: 1 - # --- - # - # KIA_FORTE - # ('fwdCamera', 'fwdRadar'): routes: 193, dongles: 3 - # --- - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 24, dongles: 4 - # --- - # ('fwdCamera',): routes: 6, dongles: 2 - # --- - # ('eps', 'fwdCamera'): routes: 4, dongles: 1 - # --- - # - # GENESIS_G70 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 131, dongles: 2 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 97, dongles: 1 - # --- - # - # KIA_NIRO_PHEV_2022 - # ('fwdCamera', 'fwdRadar'): routes: 221, dongles: 1 - # --- - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 88, dongles: 1 - # --- - # - # HYUNDAI_IONIQ_PHEV - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 272, dongles: 14 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 121, dongles: 5 - # --- - # - # KIA_NIRO_HEV_2021 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 171, dongles: 4 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 2, dongles: 1 - # --- - # - # KIA_K5_2021 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 91, dongles: 7 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 61, dongles: 3 - # --- - # - # HYUNDAI_IONIQ - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 96, dongles: 3 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 13, dongles: 1 - # --- - # - # KIA_STINGER - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 184, dongles: 8 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 9, dongles: 3 - # --- - # - # GENESIS_G70_2020 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 45, dongles: 5 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 2, dongles: 1 - # --- - # - # HYUNDAI_AZERA_HEV_6TH_GEN - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 29, dongles: 2 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 11, dongles: 2 - # --- - # ('fwdRadar',): routes: 2, dongles: 1 - # --- - # - # HYUNDAI_CUSTIN_1ST_GEN - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 10, dongles: 1 - # --- - # ('fwdCamera', 'fwdRadar'): routes: 3, dongles: 1 - # --- - # ('fwdCamera',): routes: 2, dongles: 1 - # --- - # ('eps', 'fwdCamera'): routes: 1, dongles: 1 - # --- - # - # KIA_NIRO_PHEV - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 40, dongles: 1 - # --- - # - # HYUNDAI_ELANTRA_GT_I30 - # ('abs', 'eps', 'fwdCamera', 'fwdRadar', 'transmission'): routes: 34, dongles: 1 - # --- - # - # HYUNDAI_IONIQ_EV_LTD - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 14, dongles: 1 - # --- - # - # KIA_STINGER_2022 - # ('fwdCamera', 'fwdRadar'): routes: 10, dongles: 1 - # --- - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 2, dongles: 1 - # --- - # - # HYUNDAI_IONIQ_HEV_2022 - # ('eps', 'fwdCamera', 'fwdRadar'): routes: 5, dongles: 1 - # --- non_essential_ecus={ Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_ELANTRA_2021, - CAR.HYUNDAI_SANTA_FE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV, CAR.HYUNDAI_CUSTIN_1ST_GEN, CAR.KIA_SORENTO], + CAR.HYUNDAI_SANTA_FE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV], }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms From 6f223fc1c183ed3758e879f09da05feae0ab7b8c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 29 Mar 2024 01:51:56 -0700 Subject: [PATCH 172/384] Hyundai CAN: allow fingerprinting without comma power (#32051) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "Revert "Hyundai CAN: allow fingerprinting without comma power for mor…" This reverts commit 05f1298044264028dcdeda463a60176889eccbef. * CAR.KIA_CEED * CAR.KIA_SELTOS * latest dump * cleaN Up --- selfdrive/car/hyundai/values.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 1477f1b3af..67345a9da1 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -702,7 +702,8 @@ FW_QUERY_CONFIG = FwQueryConfig( # Note that we still attempt to match with them when they are present non_essential_ecus={ Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_ELANTRA_2021, - CAR.HYUNDAI_SANTA_FE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV], + CAR.HYUNDAI_SANTA_FE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV, CAR.HYUNDAI_CUSTIN_1ST_GEN, CAR.KIA_SORENTO, + CAR.KIA_CEED, CAR.KIA_SELTOS], }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms From 178cc8747c5b365490abaa0fc594e009309c661f Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sat, 30 Mar 2024 01:17:39 +0800 Subject: [PATCH 173/384] debug/check_can_parser_performance: remove overhead of capnp conversion (#32048) --- selfdrive/debug/check_can_parser_performance.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/selfdrive/debug/check_can_parser_performance.py b/selfdrive/debug/check_can_parser_performance.py index c4b688ce29..604a1df124 100755 --- a/selfdrive/debug/check_can_parser_performance.py +++ b/selfdrive/debug/check_can_parser_performance.py @@ -25,11 +25,12 @@ if __name__ == '__main__': CC = car.CarControl.new_message() ets = [] for _ in tqdm(range(N_RUNS)): + msgs = [(m.as_builder().to_bytes(),) for m in tm.can_msgs] start_t = time.process_time_ns() - for msg in tm.can_msgs: + for msg in msgs: for cp in tm.CI.can_parsers: if cp is not None: - cp.update_strings((msg.as_builder().to_bytes(),)) + cp.update_strings(msg) ets.append((time.process_time_ns() - start_t) * 1e-6) print(f'{len(tm.can_msgs)} CAN packets, {N_RUNS} runs') From 8f4a5d7700cb32ba6601ebc0093a1afa0d934a33 Mon Sep 17 00:00:00 2001 From: Hunter Jackson Date: Fri, 29 Mar 2024 17:18:53 -0400 Subject: [PATCH 174/384] Update Ford Maverick fingerprints (#32043) * update maverick fingerprints * Update selfdrive/car/ford/fingerprints.py --------- Co-authored-by: Shane Smiskol --- selfdrive/car/ford/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index 32d331b2db..da321ec2d0 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -132,12 +132,14 @@ FW_VERSIONS = { CAR.FORD_MAVERICK_MK1: { (Ecu.eps, 0x730, None): [ b'NZ6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NZ6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.abs, 0x760, None): [ b'NZ6C-2D053-AG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PZ6C-2D053-ED\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PZ6C-2D053-EE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PZ6C-2D053-EF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NZ6C-2D053-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ b'NZ6T-14D049-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', From 8671e6217bce2ee87953be64d643b6fe9867f2e3 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 29 Mar 2024 14:25:14 -0700 Subject: [PATCH 175/384] [bot] Fingerprints: add missing FW versions from new users (#32055) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 1 + selfdrive/car/ford/fingerprints.py | 4 ++-- selfdrive/car/hyundai/fingerprints.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index e761e18c33..1386089a18 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -266,6 +266,7 @@ FW_VERSIONS = { b'68331511AC', b'68331574AC', b'68331687AC', + b'68331690AC', b'68340272AD', ], (Ecu.srs, 0x744, None): [ diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index da321ec2d0..deba38c205 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -131,15 +131,15 @@ FW_VERSIONS = { }, CAR.FORD_MAVERICK_MK1: { (Ecu.eps, 0x730, None): [ - b'NZ6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'NZ6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NZ6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.abs, 0x760, None): [ + b'NZ6C-2D053-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'NZ6C-2D053-AG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PZ6C-2D053-ED\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PZ6C-2D053-EE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PZ6C-2D053-EF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'NZ6C-2D053-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ b'NZ6T-14D049-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 9d5ac6b6d6..3c6e55a87c 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -382,8 +382,8 @@ FW_VERSIONS = { (Ecu.eps, 0x7d4, None): [ b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503', b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5320 4C2VL503', - b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5520 4C4VL503', b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5380 4C2VR503', + b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5520 4C4VL503', b'\xf1\x00CK MDPS R 1.00 5.04 57700-J5520 4C4VL504', ], (Ecu.fwdCamera, 0x7c4, None): [ From 4a9a82b6647f5b788d9e26fa4672805ec7d6a93c Mon Sep 17 00:00:00 2001 From: candreacchio Date: Sat, 30 Mar 2024 12:43:54 +1030 Subject: [PATCH 176/384] Updated Fingerprints for Hyundai PHEV 2019 for Australian Model (#31990) Update fingerprints.py Extended ECUs for PHEV 2019 for Australian Model --- selfdrive/car/hyundai/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 3c6e55a87c..c693e71d1c 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -92,12 +92,15 @@ FW_VERSIONS = { }, CAR.HYUNDAI_IONIQ_PHEV_2019: { (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 ', b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2100 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2501 4AEHC107', + b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2551 4AEHC107', ], (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00AEP MFC AT AUS RHD 1.00 1.00 95740-G2400 180222', b'\xf1\x00AEP MFC AT USA LHD 1.00 1.00 95740-G2400 180222', ], }, From fb1cb01c5ae95a7223f0df0ad9caf16bbb4dd017 Mon Sep 17 00:00:00 2001 From: royjr Date: Fri, 29 Mar 2024 23:53:51 -0400 Subject: [PATCH 177/384] ui: update arabic translations (#32058) Update main_ar.ts --- selfdrive/ui/translations/main_ar.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 3acbba0c9d..2aea017c78 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -496,23 +496,23 @@ OnroadAlerts openpilot Unavailable - + openpilot غير متوفر Waiting for controls to start - + في انتظار بدء عناصر التحكم TAKE CONTROL IMMEDIATELY - + تحكم على الفور Controls Unresponsive - + الضوابط غير مستجيبة Reboot Device - + إعادة التشغيل From 493c81076b230facec12de3065e877847a671ec7 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 29 Mar 2024 20:56:40 -0700 Subject: [PATCH 178/384] VW: check cruise control (#32049) * VW: check cruise control! * fix that * fix that * Update ref_commit --- selfdrive/car/volkswagen/carstate.py | 11 +++++++++-- selfdrive/test/process_replay/ref_commit | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index fac9de3dc7..b169970fed 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -119,8 +119,15 @@ class CarState(CarStateBase): # currently regulating speed (3), driver accel override (4), brake only (5) ret.cruiseState.available = pt_cp.vl["TSK_06"]["TSK_Status"] in (2, 3, 4, 5) ret.cruiseState.enabled = pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5) - # Speed limiter mode; ECM faults if we command ACC while not pcmCruise - ret.cruiseState.nonAdaptive = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"]) + + if self.CP.pcmCruise: + # Cruise Control mode; check for distance UI setting from the radar. + # ECM does not manage this, so do not need to check for openpilot longitudinal + ret.cruiseState.nonAdaptive = ext_cp.vl["ACC_02"]["ACC_Gesetzte_Zeitluecke"] == 0 + else: + # Speed limiter mode; ECM faults if we command ACC while not pcmCruise + ret.cruiseState.nonAdaptive = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"]) + ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 4bb8cd01e9..1156aefeb2 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -f77699bfd783ab0c9a419f2af883b36aed20cc68 \ No newline at end of file +28001018eae89eb4906717bebf892345ad590b5a From 90a59de1440e6a58f3991578a141709ca99ec94d Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 30 Mar 2024 10:16:40 -0700 Subject: [PATCH 179/384] [bot] Car docs: update model years from new users (#32060) Update car docs --- docs/CARS.md | 2 +- selfdrive/car/honda/values.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 93c5f5fa46..31560fffb0 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -72,7 +72,7 @@ A supported vehicle is one that just works when you install a comma device. All |Honda|Civic Hatchback 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch B connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|CR-V 2015-16|Touring Trim|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|CR-V 2017-22|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|CR-V Hybrid 2017-20|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|CR-V Hybrid 2017-21|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|e 2020|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Fit 2018-20|Honda Sensing|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Freed 2020|Honda Sensing|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 36cdbc8732..4b0745a7cc 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -156,7 +156,7 @@ class CAR(Platforms): flags=HondaFlags.BOSCH_ALT_BRAKE, ) HONDA_CRV_HYBRID = HondaBoschPlatformConfig( - [HondaCarDocs("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS)], + [HondaCarDocs("Honda CR-V Hybrid 2017-21", min_steer_speed=12. * CV.MPH_TO_MS)], # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), dbc_dict('honda_accord_2018_can_generated', None), From b8f5f50d39881388fa4dcf3137693b948c2cf070 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sun, 31 Mar 2024 08:37:14 +0800 Subject: [PATCH 180/384] replay/route: adds retry on network failures (#31948) --- tools/replay/route.cc | 31 ++++++++++++++++++++----------- tools/replay/route.h | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/tools/replay/route.cc b/tools/replay/route.cc index 0a57ee7d4a..db7a959595 100644 --- a/tools/replay/route.cc +++ b/tools/replay/route.cc @@ -59,18 +59,27 @@ bool Route::load() { return !segments_.empty(); } -bool Route::loadFromServer() { - QEventLoop loop; - HttpRequest http(nullptr, !Hardware::PC()); - QObject::connect(&http, &HttpRequest::requestDone, [&](const QString &json, bool success, QNetworkReply::NetworkError error) { - if (error == QNetworkReply::ContentAccessDenied || error == QNetworkReply::AuthenticationRequiredError) { - qWarning() << ">> Unauthorized. Authenticate with tools/lib/auth.py <<"; +bool Route::loadFromServer(int retries) { + for (int i = 1; i <= retries; ++i) { + QString result; + QEventLoop loop; + HttpRequest http(nullptr, !Hardware::PC()); + QObject::connect(&http, &HttpRequest::requestDone, [&loop, &result](const QString &json, bool success, QNetworkReply::NetworkError err) { + result = json; + loop.exit((int)err); + }); + http.sendRequest(CommaApi::BASE_URL + "/v1/route/" + route_.str + "/files"); + auto err = (QNetworkReply::NetworkError)loop.exec(); + if (err == QNetworkReply::NoError) { + return loadFromJson(result); + } else if (err == QNetworkReply::ContentAccessDenied || err == QNetworkReply::AuthenticationRequiredError) { + rWarning(">> Unauthorized. Authenticate with tools/lib/auth.py <<"); + return false; } - - loop.exit(success ? loadFromJson(json) : 0); - }); - http.sendRequest(CommaApi::BASE_URL + "/v1/route/" + route_.str + "/files"); - return loop.exec(); + rWarning("Retrying %d/%d", i, retries); + util::sleep_for(500); + } + return false; } bool Route::loadFromJson(const QString &json) { diff --git a/tools/replay/route.h b/tools/replay/route.h index 33e5bcb1ba..654c084ff2 100644 --- a/tools/replay/route.h +++ b/tools/replay/route.h @@ -42,7 +42,7 @@ public: protected: bool loadFromLocal(); - bool loadFromServer(); + bool loadFromServer(int retries = 3); bool loadFromJson(const QString &json); void addFileToSegment(int seg_num, const QString &file); RouteIdentifier route_ = {}; From 43832335b8e44e40683ffe6afa226a2d2de0d6ff Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 30 Mar 2024 17:47:21 -0700 Subject: [PATCH 181/384] timed: set valid flag (#32061) * timed: set valid flag * oops --- common/time.py | 13 +++++++++++-- system/timed.py | 4 +++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/common/time.py b/common/time.py index f2e49eb546..5379faf22a 100644 --- a/common/time.py +++ b/common/time.py @@ -1,6 +1,15 @@ import datetime +from pathlib import Path -MIN_DATE = datetime.datetime(year=2024, month=1, day=28) +_MIN_DATE = datetime.datetime(year=2024, month=3, day=30) + +def min_date(): + # on systemd systems, the default time is the systemd build time + systemd_path = Path("/lib/systemd/systemd") + if systemd_path.exists(): + d = datetime.datetime.fromtimestamp(systemd_path.stat().st_mtime) + return d + datetime.timedelta(days=1) + return _MIN_DATE def system_time_valid(): - return datetime.datetime.now() > MIN_DATE + return datetime.datetime.now() > min_date() diff --git a/system/timed.py b/system/timed.py index ab82f8c72d..2b9a42c455 100755 --- a/system/timed.py +++ b/system/timed.py @@ -8,6 +8,7 @@ from typing import NoReturn from timezonefinder import TimezoneFinder import cereal.messaging as messaging +from openpilot.common.time import system_time_valid from openpilot.common.params import Params from openpilot.common.swaglog import cloudlog from openpilot.system.hardware import AGNOS @@ -69,7 +70,8 @@ def main() -> NoReturn: while True: sm.update(1000) - msg = messaging.new_message('clocks', valid=True) + msg = messaging.new_message('clocks') + msg.valid = system_time_valid() msg.clocks.wallTimeNanos = time.time_ns() pm.send('clocks', msg) From fc9f50c90d166ce8bef7a711b2e391071fb0fe02 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 1 Apr 2024 13:01:50 -0400 Subject: [PATCH 182/384] fix logreader after `segment_numbers` api removal (#32073) fix --- tools/lib/route.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/lib/route.py b/tools/lib/route.py index 06a3596d69..d5fd41108b 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -4,7 +4,6 @@ from functools import cache from urllib.parse import urlparse from collections import defaultdict from itertools import chain -from typing import cast from openpilot.tools.lib.auth_config import get_token from openpilot.tools.lib.api import CommaApi @@ -240,7 +239,9 @@ class SegmentName: def get_max_seg_number_cached(sr: 'SegmentRange') -> int: try: api = CommaApi(get_token()) - return cast(int, api.get("/v1/route/" + sr.route_name.replace("/", "|"))["segment_numbers"][-1]) + max_seg_number = api.get("/v1/route/" + sr.route_name.replace("/", "|"))["maxqlog"] + assert isinstance(max_seg_number, int) + return max_seg_number except Exception as e: raise Exception("unable to get max_segment_number. ensure you have access to this route or the route is public.") from e From c2f593f69ae558eec5d46056468e9e1a99c062d2 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 1 Apr 2024 10:03:04 -0700 Subject: [PATCH 183/384] [bot] Bump submodules (#32069) bump submodules Co-authored-by: jnewb1 --- cereal | 2 +- opendbc | 2 +- panda | 2 +- teleoprtc_repo | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cereal b/cereal index 6bfd39a506..b9871482a3 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 6bfd39a506c5123949ecf58831bfe48f938e6143 +Subproject commit b9871482a3cba70c2ab40ab80017019313dc3f31 diff --git a/opendbc b/opendbc index 3c926e88e8..5821bd94d0 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 3c926e88e87594e788ab96d32ecdd8f66cb01aed +Subproject commit 5821bd94d0cb9017d274b4499f2a0525ac317dc2 diff --git a/panda b/panda index 01c54d1199..18f0bdff4b 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 01c54d11990fb82b85acc322a6e2e34a4b7ee389 +Subproject commit 18f0bdff4bfb178c5cb5613fe91f0bb424791a93 diff --git a/teleoprtc_repo b/teleoprtc_repo index ab2f09706e..3116a5053b 160000 --- a/teleoprtc_repo +++ b/teleoprtc_repo @@ -1 +1 @@ -Subproject commit ab2f09706e8f64390e196f079ac69e67131b07f5 +Subproject commit 3116a5053bc22b912254f1f7000ab9e267916cd5 From b743e5cff588b8d80aa18758bdeb0e13c1f3e874 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 1 Apr 2024 10:03:26 -0700 Subject: [PATCH 184/384] [bot] Update Python packages and pre-commit hooks (#32071) Update Python packages and pre-commit hooks Co-authored-by: jnewb1 Co-authored-by: Justin Newberry --- .pre-commit-config.yaml | 2 +- poetry.lock | 591 +++++++++++++++++++++------------------- 2 files changed, 318 insertions(+), 275 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d5e958371b..02af4473bd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -98,6 +98,6 @@ repos: args: - --lock - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.28.0 + rev: 0.28.1 hooks: - id: check-github-workflows diff --git a/poetry.lock b/poetry.lock index e7f0429253..08fd51c18d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -730,19 +730,19 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "control" -version = "0.9.4" +version = "0.10.0" description = "Python Control Systems Library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "control-0.9.4-py3-none-any.whl", hash = "sha256:ab68980abd8d35ae5015ffa090865cbbd926deea7e66d0b9a41cfd12577e63ff"}, - {file = "control-0.9.4.tar.gz", hash = "sha256:0fa57d2216b7ac4e9339c09eab6827660318a641779335864feee940bd19c9ce"}, + {file = "control-0.10.0-py3-none-any.whl", hash = "sha256:ed1e0eb73f1e2945fc9af9d7b9121ef328fe980e7903b2a14b149d4f1855a808"}, + {file = "control-0.10.0.tar.gz", hash = "sha256:2c18b767537f45c7fd07b2e4afe8fbe5964019499b5f52f888edb5d8560bab53"}, ] [package.dependencies] -matplotlib = "*" -numpy = "*" -scipy = ">=1.3" +matplotlib = ">=3.6" +numpy = ">=1.23" +scipy = ">=1.8" [package.extras] cvxopt = ["cvxopt (>=1.2.0)"] @@ -894,69 +894,69 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "cython" -version = "3.0.9" +version = "3.0.10" description = "The Cython compiler for writing C extensions in the Python language." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Cython-3.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:296bd30d4445ac61b66c9d766567f6e81a6e262835d261e903c60c891a6729d3"}, - {file = "Cython-3.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f496b52845cb45568a69d6359a2c335135233003e708ea02155c10ce3548aa89"}, - {file = "Cython-3.0.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:858c3766b9aa3ab8a413392c72bbab1c144a9766b7c7bfdef64e2e414363fa0c"}, - {file = "Cython-3.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0eb1e6ef036028a52525fd9a012a556f6dd4788a0e8755fe864ba0e70cde2ff"}, - {file = "Cython-3.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c8191941073ea5896321de3c8c958fd66e5f304b0cd1f22c59edd0b86c4dd90d"}, - {file = "Cython-3.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e32b016030bc72a8a22a1f21f470a2f57573761a4f00fbfe8347263f4fbdb9f1"}, - {file = "Cython-3.0.9-cp310-cp310-win32.whl", hash = "sha256:d6f3ff1cd6123973fe03e0fb8ee936622f976c0c41138969975824d08886572b"}, - {file = "Cython-3.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:56f3b643dbe14449248bbeb9a63fe3878a24256664bc8c8ef6efd45d102596d8"}, - {file = "Cython-3.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:35e6665a20d6b8a152d72b7fd87dbb2af6bb6b18a235b71add68122d594dbd41"}, - {file = "Cython-3.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92f4960c40ad027bd8c364c50db11104eadc59ffeb9e5b7f605ca2f05946e20"}, - {file = "Cython-3.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38df37d0e732fbd9a2fef898788492e82b770c33d1e4ed12444bbc8a3b3f89c0"}, - {file = "Cython-3.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad7fd88ebaeaf2e76fd729a8919fae80dab3d6ac0005e28494261d52ff347a8f"}, - {file = "Cython-3.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1365d5f76bf4d19df3d19ce932584c9bb76e9fb096185168918ef9b36e06bfa4"}, - {file = "Cython-3.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c232e7f279388ac9625c3e5a5a9f0078a9334959c5d6458052c65bbbba895e1e"}, - {file = "Cython-3.0.9-cp311-cp311-win32.whl", hash = "sha256:357e2fad46a25030b0c0496487e01a9dc0fdd0c09df0897f554d8ba3c1bc4872"}, - {file = "Cython-3.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:1315aee506506e8d69cf6631d8769e6b10131fdcc0eb66df2698f2a3ddaeeff2"}, - {file = "Cython-3.0.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:157973807c2796addbed5fbc4d9c882ab34bbc60dc297ca729504901479d5df7"}, - {file = "Cython-3.0.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00b105b5d050645dd59e6767bc0f18b48a4aa11c85f42ec7dd8181606f4059e3"}, - {file = "Cython-3.0.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac5536d09bef240cae0416d5a703d298b74c7bbc397da803ac9d344e732d4369"}, - {file = "Cython-3.0.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09c44501d476d16aaa4cbc29c87f8c0f54fc20e69b650d59cbfa4863426fc70c"}, - {file = "Cython-3.0.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cc9c3b9f20d8e298618e5ccd32083ca386e785b08f9893fbec4c50b6b85be772"}, - {file = "Cython-3.0.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a30d96938c633e3ec37000ac3796525da71254ef109e66bdfd78f29891af6454"}, - {file = "Cython-3.0.9-cp312-cp312-win32.whl", hash = "sha256:757ca93bdd80702546df4d610d2494ef2e74249cac4d5ba9464589fb464bd8a3"}, - {file = "Cython-3.0.9-cp312-cp312-win_amd64.whl", hash = "sha256:1dc320a9905ab95414013f6de805efbff9e17bb5fb3b90bbac533f017bec8136"}, - {file = "Cython-3.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4ae349960ebe0da0d33724eaa7f1eb866688fe5434cc67ce4dbc06d6a719fbfc"}, - {file = "Cython-3.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63d2537bf688247f76ded6dee28ebd26274f019309aef1eb4f2f9c5c482fde2d"}, - {file = "Cython-3.0.9-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36f5a2dfc724bea1f710b649f02d802d80fc18320c8e6396684ba4a48412445a"}, - {file = "Cython-3.0.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deaf4197d4b0bcd5714a497158ea96a2bd6d0f9636095437448f7e06453cc83d"}, - {file = "Cython-3.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:000af6deb7412eb7ac0c635ff5e637fb8725dd0a7b88cc58dfc2b3de14e701c4"}, - {file = "Cython-3.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:15c7f5c2d35bed9aa5f2a51eaac0df23ae72f2dbacf62fc672dd6bfaa75d2d6f"}, - {file = "Cython-3.0.9-cp36-cp36m-win32.whl", hash = "sha256:f49aa4970cd3bec66ac22e701def16dca2a49c59cceba519898dd7526e0be2c0"}, - {file = "Cython-3.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:4558814fa025b193058d42eeee498a53d6b04b2980d01339fc2444b23fd98e58"}, - {file = "Cython-3.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:539cd1d74fd61f6cfc310fa6bbbad5adc144627f2b7486a07075d4e002fd6aad"}, - {file = "Cython-3.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3232926cd406ee02eabb732206f6e882c3aed9d58f0fea764013d9240405bcf"}, - {file = "Cython-3.0.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33b6ac376538a7fc8c567b85d3c71504308a9318702ec0485dd66c059f3165cb"}, - {file = "Cython-3.0.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2cc92504b5d22ac66031ffb827bd3a967fc75a5f0f76ab48bce62df19be6fdfd"}, - {file = "Cython-3.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:22b8fae756c5c0d8968691bed520876de452f216c28ec896a00739a12dba3bd9"}, - {file = "Cython-3.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9cda0d92a09f3520f29bd91009f1194ba9600777c02c30c6d2d4ac65fb63e40d"}, - {file = "Cython-3.0.9-cp37-cp37m-win32.whl", hash = "sha256:ec612418490941ed16c50c8d3784c7bdc4c4b2a10c361259871790b02ec8c1db"}, - {file = "Cython-3.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:976c8d2bedc91ff6493fc973d38b2dc01020324039e2af0e049704a8e1b22936"}, - {file = "Cython-3.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5055988b007c92256b6e9896441c3055556038c3497fcbf8c921a6c1fce90719"}, - {file = "Cython-3.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9360606d964c2d0492a866464efcf9d0a92715644eede3f6a2aa696de54a137"}, - {file = "Cython-3.0.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c6e809f060bed073dc7cba1648077fe3b68208863d517c8b39f3920eecf9dd"}, - {file = "Cython-3.0.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95ed792c966f969cea7489c32ff90150b415c1f3567db8d5a9d489c7c1602dac"}, - {file = "Cython-3.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8edd59d22950b400b03ca78d27dc694d2836a92ef0cac4f64cb4b2ff902f7e25"}, - {file = "Cython-3.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4cf0ed273bf60e97922fcbbdd380c39693922a597760160b4b4355e6078ca188"}, - {file = "Cython-3.0.9-cp38-cp38-win32.whl", hash = "sha256:5eb9bd4ae12ebb2bc79a193d95aacf090fbd8d7013e11ed5412711650cb34934"}, - {file = "Cython-3.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:44457279da56e0f829bb1fc5a5dc0836e5d498dbcf9b2324f32f7cc9d2ec6569"}, - {file = "Cython-3.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4b419a1adc2af43f4660e2f6eaf1e4fac2dbac59490771eb8ac3d6063f22356"}, - {file = "Cython-3.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f836192140f033b2319a0128936367c295c2b32e23df05b03b672a6015757ea"}, - {file = "Cython-3.0.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fd198c1a7f8e9382904d622cc0efa3c184605881fd5262c64cbb7168c4c1ec5"}, - {file = "Cython-3.0.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a274fe9ca5c53fafbcf5c8f262f8ad6896206a466f0eeb40aaf36a7951e957c0"}, - {file = "Cython-3.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:158c38360bbc5063341b1e78d3737f1251050f89f58a3df0d10fb171c44262be"}, - {file = "Cython-3.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8bf30b045f7deda0014b042c1b41c1d272facc762ab657529e3b05505888e878"}, - {file = "Cython-3.0.9-cp39-cp39-win32.whl", hash = "sha256:9a001fd95c140c94d934078544ff60a3c46aca2dc86e75a76e4121d3cd1f4b33"}, - {file = "Cython-3.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:530c01c4aebba709c0ec9c7ecefe07177d0b9fd7ffee29450a118d92192ccbdf"}, - {file = "Cython-3.0.9-py2.py3-none-any.whl", hash = "sha256:bf96417714353c5454c2e3238fca9338599330cf51625cdc1ca698684465646f"}, - {file = "Cython-3.0.9.tar.gz", hash = "sha256:a2d354f059d1f055d34cfaa62c5b68bc78ac2ceab6407148d47fb508cf3ba4f3"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "Cython-3.0.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e876272548d73583e90babda94c1299537006cad7a34e515a06c51b41f8657aa"}, + {file = "Cython-3.0.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adc377aa33c3309191e617bf675fdbb51ca727acb9dc1aa23fc698d8121f7e23"}, + {file = "Cython-3.0.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:401aba1869a57aba2922ccb656a6320447e55ace42709b504c2f8e8b166f46e1"}, + {file = "Cython-3.0.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:541fbe725d6534a90b93f8c577eb70924d664b227a4631b90a6e0506d1469591"}, + {file = "Cython-3.0.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:86998b01f6a6d48398df8467292c7637e57f7e3a2ca68655367f13f66fed7734"}, + {file = "Cython-3.0.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d092c0ddba7e9e530a5c5be4ac06db8360258acc27675d1fc86294a5dc8994c5"}, + {file = "Cython-3.0.10-cp310-cp310-win32.whl", hash = "sha256:3cffb666e649dba23810732497442fb339ee67ba4e0be1f0579991e83fcc2436"}, + {file = "Cython-3.0.10-cp310-cp310-win_amd64.whl", hash = "sha256:9ea31184c7b3a728ef1f81fccb161d8948c05aa86c79f63b74fb6f3ddec860ec"}, + {file = "Cython-3.0.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:051069638abfb076900b0c2bcb6facf545655b3f429e80dd14365192074af5a4"}, + {file = "Cython-3.0.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712760879600907189c7d0d346851525545484e13cd8b787e94bfd293da8ccf0"}, + {file = "Cython-3.0.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38d40fa1324ac47c04483d151f5e092406a147eac88a18aec789cf01c089c3f2"}, + {file = "Cython-3.0.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bd49a3a9fdff65446a3e1c2bfc0ec85c6ce4c3cad27cd4ad7ba150a62b7fb59"}, + {file = "Cython-3.0.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e8df79b596633b8295eaa48b1157d796775c2bb078f32267d32f3001b687f2fd"}, + {file = "Cython-3.0.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bcc9795990e525c192bc5c0775e441d7d56d7a7d02210451e9e13c0448dba51b"}, + {file = "Cython-3.0.10-cp311-cp311-win32.whl", hash = "sha256:09f2000041db482cad3bfce94e1fa3a4c82b0e57390a164c02566cbbda8c4f12"}, + {file = "Cython-3.0.10-cp311-cp311-win_amd64.whl", hash = "sha256:3919a55ec9b6c7db6f68a004c21c05ed540c40dbe459ced5d801d5a1f326a053"}, + {file = "Cython-3.0.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8f2864ab5fcd27a346f0b50f901ebeb8f60b25a60a575ccfd982e7f3e9674914"}, + {file = "Cython-3.0.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:407840c56385b9c085826fe300213e0e76ba15d1d47daf4b58569078ecb94446"}, + {file = "Cython-3.0.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a036d00caa73550a3a976432ef21c1e3fa12637e1616aab32caded35331ae96"}, + {file = "Cython-3.0.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc6a0e7e23a96dec3f3c9d39690d4281beabd5297855140d0d30855f950275e"}, + {file = "Cython-3.0.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a5e14a8c6a8157d2b0cdc2e8e3444905d20a0e78e19d2a097e89fb8b04b51f6b"}, + {file = "Cython-3.0.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f8a2b8fa0fd8358bccb5f3304be563c4750aae175100463d212d5ea0ec74cbe0"}, + {file = "Cython-3.0.10-cp312-cp312-win32.whl", hash = "sha256:2d29e617fd23cf4b83afe8f93f2966566c9f565918ad1e86a4502fe825cc0a79"}, + {file = "Cython-3.0.10-cp312-cp312-win_amd64.whl", hash = "sha256:6c5af936940a38c300977b81598d9c0901158f220a58c177820e17e1774f1cf1"}, + {file = "Cython-3.0.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5f465443917d5c0f69825fca3b52b64c74ac3de0143b1fff6db8ba5b48c9fb4a"}, + {file = "Cython-3.0.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fadb84193c25641973666e583df8df4e27c52cdc05ddce7c6f6510d690ba34a"}, + {file = "Cython-3.0.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fa9e7786083b6aa61594c16979d621b62e61fcd9c2edd4761641b95c7fb34b2"}, + {file = "Cython-3.0.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4780d0f98ce28191c4d841c4358b5d5e79d96520650910cd59904123821c52d"}, + {file = "Cython-3.0.10-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:32fbad02d1189be75eb96456d9c73f5548078e5338d8fa153ecb0115b6ee279f"}, + {file = "Cython-3.0.10-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:90e2f514fc753b55245351305a399463103ec18666150bb1c36779b9862388e9"}, + {file = "Cython-3.0.10-cp36-cp36m-win32.whl", hash = "sha256:a9c976e9ec429539a4367cb4b24d15a1e46b925976f4341143f49f5f161171f5"}, + {file = "Cython-3.0.10-cp36-cp36m-win_amd64.whl", hash = "sha256:a9bb402674788a7f4061aeef8057632ec440123e74ed0fb425308a59afdfa10e"}, + {file = "Cython-3.0.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:206e803598010ecc3813db8748ed685f7beeca6c413f982df9f8a505fce56563"}, + {file = "Cython-3.0.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15b6d397f4ee5ad54e373589522af37935a32863f1b23fa8c6922adf833e28e2"}, + {file = "Cython-3.0.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a181144c2f893ed8e6a994d43d0b96300bc99873f21e3b7334ca26c61c37b680"}, + {file = "Cython-3.0.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74b700d6a793113d03fb54b63bdbadba6365379424bac7c0470605672769260"}, + {file = "Cython-3.0.10-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:076e9fd4e0ca33c5fa00a7479180dbfb62f17fe928e2909f82da814536e96d2b"}, + {file = "Cython-3.0.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:269f06e6961e8591d56e30b46e1a51b6ccb42cab04c29fa3b30d3e8723485fb4"}, + {file = "Cython-3.0.10-cp37-cp37m-win32.whl", hash = "sha256:d4e83a8ceff7af60064da4ccfce0ac82372544dd5392f1b350c34f1b04d0fae6"}, + {file = "Cython-3.0.10-cp37-cp37m-win_amd64.whl", hash = "sha256:40fac59c3a7fbcd9c25aea64c342c890a5e2270ce64a1525e840807800167799"}, + {file = "Cython-3.0.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f43a58bf2434870d2fc42ac2e9ff8138c9e00c6251468de279d93fa279e9ba3b"}, + {file = "Cython-3.0.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e9a885ec63d3955a08cefc4eec39fefa9fe14989c6e5e2382bd4aeb6bdb9bc3"}, + {file = "Cython-3.0.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acfbe0fff364d54906058fc61f2393f38cd7fa07d344d80923937b87e339adcf"}, + {file = "Cython-3.0.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8adcde00a8a88fab27509b558cd8c2959ab0c70c65d3814cfea8c68b83fa6dcd"}, + {file = "Cython-3.0.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2c9c1e3e78909488f3b16fabae02308423fa6369ed96ab1e250807d344cfffd7"}, + {file = "Cython-3.0.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc6e0faf5b57523b073f0cdefadcaef3a51235d519a0594865925cadb3aeadf0"}, + {file = "Cython-3.0.10-cp38-cp38-win32.whl", hash = "sha256:35f6ede7c74024ed1982832ae61c9fad7cf60cc3f5b8c6a63bb34e38bc291936"}, + {file = "Cython-3.0.10-cp38-cp38-win_amd64.whl", hash = "sha256:950c0c7b770d2a7cec74fb6f5ccc321d0b51d151f48c075c0d0db635a60ba1b5"}, + {file = "Cython-3.0.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:077b61ee789e48700e25d4a16daa4258b8e65167136e457174df400cf9b4feab"}, + {file = "Cython-3.0.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f1f8bba9d8f37c0cffc934792b4ac7c42d0891077127c11deebe9fa0a0f7e4"}, + {file = "Cython-3.0.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a15a8534ebfb9b58cb0b87c269c70984b6f9c88bfe65e4f635f0e3f07dfcd"}, + {file = "Cython-3.0.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d10fc9aa82e5e53a0b7fd118f9771199cddac8feb4a6d8350b7d4109085aa775"}, + {file = "Cython-3.0.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f610964ab252a83e573a427e28b103e2f1dd3c23bee54f32319f9e73c3c5499"}, + {file = "Cython-3.0.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c9c4c4f3ab8f8c02817b0e16e8fa7b8cc880f76e9b63fe9c010e60c1a6c2b13"}, + {file = "Cython-3.0.10-cp39-cp39-win32.whl", hash = "sha256:0bac3ccdd4e03924028220c62ae3529e17efa8ca7e9df9330de95de02f582b26"}, + {file = "Cython-3.0.10-cp39-cp39-win_amd64.whl", hash = "sha256:81f356c1c8c0885b8435bfc468025f545c5d764aa9c75ab662616dd1193c331e"}, + {file = "Cython-3.0.10-py2.py3-none-any.whl", hash = "sha256:fcbb679c0b43514d591577fd0d20021c55c240ca9ccafbdb82d3fb95e5edfee2"}, + {file = "Cython-3.0.10.tar.gz", hash = "sha256:dcc96739331fb854dcf503f94607576cfe8488066c61ca50dfd55836f132de99"}, ] [[package]] @@ -1045,18 +1045,18 @@ files = [ [[package]] name = "filelock" -version = "3.13.1" +version = "3.13.3" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.13.3-py3-none-any.whl", hash = "sha256:5ffa845303983e7a0b7ae17636509bc97997d58afeafa72fb141a17b152284cb"}, + {file = "filelock-3.13.3.tar.gz", hash = "sha256:a79895a25bbefdf55d1a2a0a80968f7dbb28edcd6d4234a0afb3f37ecde4b546"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -1119,13 +1119,13 @@ files = [ [[package]] name = "flatbuffers" -version = "24.3.7" +version = "24.3.25" description = "The FlatBuffers serialization format for Python" optional = false python-versions = "*" files = [ - {file = "flatbuffers-24.3.7-py2.py3-none-any.whl", hash = "sha256:80c4f5dcad0ee76b7e349671a0d657f2fbba927a0244f88dd3f5ed6a3694e1fc"}, - {file = "flatbuffers-24.3.7.tar.gz", hash = "sha256:0895c22b9a6019ff2f4de2e5e2f7cd15914043e6e7033a94c0c6369422690f22"}, + {file = "flatbuffers-24.3.25-py2.py3-none-any.whl", hash = "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812"}, + {file = "flatbuffers-24.3.25.tar.gz", hash = "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4"}, ] [[package]] @@ -1931,96 +1931,132 @@ test = ["pytest"] [[package]] name = "lxml" -version = "5.1.0" +version = "5.2.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" files = [ - {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e"}, - {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da"}, - {file = "lxml-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2befa20a13f1a75c751f47e00929fb3433d67eb9923c2c0b364de449121f447c"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22b7ee4c35f374e2c20337a95502057964d7e35b996b1c667b5c65c567d2252a"}, - {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf8443781533b8d37b295016a4b53c1494fa9a03573c09ca5104550c138d5c05"}, - {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147"}, - {file = "lxml-5.1.0-cp310-cp310-win32.whl", hash = "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93"}, - {file = "lxml-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af8920ce4a55ff41167ddbc20077f5698c2e710ad3353d32a07d3264f3a2021e"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cfced4a069003d8913408e10ca8ed092c49a7f6cefee9bb74b6b3e860683b45"}, - {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9e5ac3437746189a9b4121db2a7b86056ac8786b12e88838696899328fc44bb2"}, - {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204"}, - {file = "lxml-5.1.0-cp311-cp311-win32.whl", hash = "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b"}, - {file = "lxml-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16dd953fb719f0ffc5bc067428fc9e88f599e15723a85618c45847c96f11f431"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16018f7099245157564d7148165132c70adb272fb5a17c048ba70d9cc542a1a1"}, - {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82cd34f1081ae4ea2ede3d52f71b7be313756e99b4b5f829f89b12da552d3aa3"}, - {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:19a1bc898ae9f06bccb7c3e1dfd73897ecbbd2c96afe9095a6026016e5ca97b8"}, - {file = "lxml-5.1.0-cp312-cp312-win32.whl", hash = "sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01"}, - {file = "lxml-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ad17c20e3666c035db502c78b86e58ff6b5991906e55bdbef94977700c72623"}, - {file = "lxml-5.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:24ef5a4631c0b6cceaf2dbca21687e29725b7c4e171f33a8f8ce23c12558ded1"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d2900b7f5318bc7ad8631d3d40190b95ef2aa8cc59473b73b294e4a55e9f30f"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:601f4a75797d7a770daed8b42b97cd1bb1ba18bd51a9382077a6a247a12aa38d"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4b68c961b5cc402cbd99cca5eb2547e46ce77260eb705f4d117fd9c3f932b95"}, - {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:afd825e30f8d1f521713a5669b63657bcfe5980a916c95855060048b88e1adb7"}, - {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:262bc5f512a66b527d026518507e78c2f9c2bd9eb5c8aeeb9f0eb43fcb69dc67"}, - {file = "lxml-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:e856c1c7255c739434489ec9c8aa9cdf5179785d10ff20add308b5d673bed5cd"}, - {file = "lxml-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c7257171bb8d4432fe9d6fdde4d55fdbe663a63636a17f7f9aaba9bcb3153ad7"}, - {file = "lxml-5.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9e240ae0ba96477682aa87899d94ddec1cc7926f9df29b1dd57b39e797d5ab5"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96f02ba1bcd330807fc060ed91d1f7a20853da6dd449e5da4b09bfcc08fdcf5"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3898ae2b58eeafedfe99e542a17859017d72d7f6a63de0f04f99c2cb125936"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61c5a7edbd7c695e54fca029ceb351fc45cd8860119a0f83e48be44e1c464862"}, - {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3aeca824b38ca78d9ee2ab82bd9883083d0492d9d17df065ba3b94e88e4d7ee6"}, - {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764"}, - {file = "lxml-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8"}, - {file = "lxml-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b"}, - {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1"}, - {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45"}, - {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:98f3f020a2b736566c707c8e034945c02aa94e124c24f77ca097c446f81b01f1"}, - {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e"}, - {file = "lxml-5.1.0-cp38-cp38-win32.whl", hash = "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a"}, - {file = "lxml-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8b0c78e7aac24979ef09b7f50da871c2de2def043d468c4b41f512d831e912"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bcf86dfc8ff3e992fed847c077bd875d9e0ba2fa25d859c3a0f0f76f07f0c8d"}, - {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:49a9b4af45e8b925e1cd6f3b15bbba2c81e7dba6dce170c677c9cda547411e14"}, - {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:280f3edf15c2a967d923bcfb1f8f15337ad36f93525828b40a0f9d6c2ad24890"}, - {file = "lxml-5.1.0-cp39-cp39-win32.whl", hash = "sha256:ed7326563024b6e91fef6b6c7a1a2ff0a71b97793ac33dbbcf38f6005e51ff6e"}, - {file = "lxml-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d7b4beebb178e9183138f552238f7e6613162a42164233e2bda00cb3afac58f"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9bd0ae7cc2b85320abd5e0abad5ccee5564ed5f0cc90245d2f9a8ef330a8deae"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c1d679df4361408b628f42b26a5d62bd3e9ba7f0c0e7969f925021554755aa"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2ad3a8ce9e8a767131061a22cd28fdffa3cd2dc193f399ff7b81777f3520e372"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:304128394c9c22b6569eba2a6d98392b56fbdfbad58f83ea702530be80d0f9df"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d74fcaf87132ffc0447b3c685a9f862ffb5b43e70ea6beec2fb8057d5d2a1fea"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8cf5877f7ed384dabfdcc37922c3191bf27e55b498fecece9fd5c2c7aaa34c33"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:877efb968c3d7eb2dad540b6cabf2f1d3c0fbf4b2d309a3c141f79c7e0061324"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f14a4fb1c1c402a22e6a341a24c1341b4a3def81b41cd354386dcb795f83897"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:25663d6e99659544ee8fe1b89b1a8c0aaa5e34b103fab124b17fa958c4a324a6"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b9f19df998761babaa7f09e6bc169294eefafd6149aaa272081cbddc7ba4ca3"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e53d7e6a98b64fe54775d23a7c669763451340c3d44ad5e3a3b48a1efbdc96f"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c3cd1fc1dc7c376c54440aeaaa0dcc803d2126732ff5c6b68ccd619f2e64be4f"}, - {file = "lxml-5.1.0.tar.gz", hash = "sha256:3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca"}, + {file = "lxml-5.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c54f8d6160080831a76780d850302fdeb0e8d0806f661777b0714dfb55d9a08a"}, + {file = "lxml-5.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e95ae029396382a0d2e8174e4077f96befcd4a2184678db363ddc074eb4d3b2"}, + {file = "lxml-5.2.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5810fa80e64a0c689262a71af999c5735f48c0da0affcbc9041d1ef5ef3920be"}, + {file = "lxml-5.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae69524fd6a68b288574013f8fadac23cacf089c75cd3fc5b216277a445eb736"}, + {file = "lxml-5.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fadda215e32fe375d65e560b7f7e2a37c7f9c4ecee5315bb1225ca6ac9bf5838"}, + {file = "lxml-5.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:f1f164e4cc6bc646b1fc86664c3543bf4a941d45235797279b120dc740ee7af5"}, + {file = "lxml-5.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:3603a8a41097daf7672cae22cc4a860ab9ea5597f1c5371cb21beca3398b8d6a"}, + {file = "lxml-5.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3b4bb89a785f4fd60e05f3c3a526c07d0d68e3536f17f169ca13bf5b5dd75a5"}, + {file = "lxml-5.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1effc10bf782f0696e76ecfeba0720ea02c0c31d5bffb7b29ba10debd57d1c3d"}, + {file = "lxml-5.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b03531f6cd6ce4b511dcece060ca20aa5412f8db449274b44f4003f282e6272f"}, + {file = "lxml-5.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fac15090bb966719df06f0c4f8139783746d1e60e71016d8a65db2031ca41b8"}, + {file = "lxml-5.2.0-cp310-cp310-win32.whl", hash = "sha256:92bb37c96215c4b2eb26f3c791c0bf02c64dd251effa532b43ca5049000c4478"}, + {file = "lxml-5.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:b0181c22fdb89cc19e70240a850e5480817c3e815b1eceb171b3d7a3aa3e596a"}, + {file = "lxml-5.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ada8ce9e6e1d126ef60d215baaa0c81381ba5841c25f1d00a71cdafdc038bd27"}, + {file = "lxml-5.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3cefb133c859f06dab2ae63885d9f405000c4031ec516e0ed4f9d779f690d8e3"}, + {file = "lxml-5.2.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ede2a7a86a977b0c741654efaeca0af7860a9b1ae39f9268f0936246a977ee0"}, + {file = "lxml-5.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d46df6f0b1a0cda39d12c5c4615a7d92f40342deb8001c7b434d7c8c78352e58"}, + {file = "lxml-5.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2259243ee734cc736e237719037efb86603c891fd363cc7973a2d0ac8a0e3f"}, + {file = "lxml-5.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c53164f29ed3c3868787144e8ea8a399ffd7d8215f59500a20173593c19e96eb"}, + {file = "lxml-5.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:371aab9a397dcc76625ad3b02fa9b21be63406d69237b773156e7d1fc2ce0cae"}, + {file = "lxml-5.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e08784288a179b59115b5e57abf6d387528b39abb61105fe17510a199a277a40"}, + {file = "lxml-5.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c232726f7b6df5143415a06323faaa998ef8abbe1c0ed00d718755231d76f08"}, + {file = "lxml-5.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e4366e58c0508da4dee4c7c70cee657e38553d73abdffa53abbd7d743711ee11"}, + {file = "lxml-5.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c84dce8fb2e900d4fb094e76fdad34a5fd06de53e41bddc1502c146eb11abd74"}, + {file = "lxml-5.2.0-cp311-cp311-win32.whl", hash = "sha256:0947d1114e337dc2aae2fa14bbc9ed5d9ca1a0acd6d2f948df9926aef65305e9"}, + {file = "lxml-5.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1eace37a9f4a1bef0bb5c849434933fd6213008ec583c8e31ee5b8e99c7c8500"}, + {file = "lxml-5.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f2cb157e279d28c66b1c27e0948687dc31dc47d1ab10ce0cd292a8334b7de3d5"}, + {file = "lxml-5.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:53c0e56f41ef68c1ce4e96f27ecdc2df389730391a2fd45439eb3facb02d36c8"}, + {file = "lxml-5.2.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703d60e59ab45c17485c2c14b11880e4f7f0eab07134afa9007573fa5a779a5a"}, + {file = "lxml-5.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaf5e308a5e50bc0548c4fdca0117a31ec9596f8cfc96592db170bcecc71a957"}, + {file = "lxml-5.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af64df85fecd3cf3b2e792f0b5b4d92740905adfa8ce3b24977a55415f1a0c40"}, + {file = "lxml-5.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:df7dfbdef11702fd22c2eaf042d7098d17edbc62d73f2199386ad06cbe466f6d"}, + {file = "lxml-5.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7250030a7835bfd5ba6ca7d1ad483ec90f9cbc29978c5e75c1cc3e031d3c4160"}, + {file = "lxml-5.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:be5faa2d5c8c8294d770cfd09d119fb27b5589acc59635b0cf90f145dbe81dca"}, + {file = "lxml-5.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:347ec08250d5950f5b016caa3e2e13fb2cb9714fe6041d52e3716fb33c208663"}, + {file = "lxml-5.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:dc7b630c4fb428b8a40ddd0bfc4bc19de11bb3c9b031154f77360e48fe8b4451"}, + {file = "lxml-5.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ae550cbd7f229cdf2841d9b01406bcca379a5fb327b9efb53ba620a10452e835"}, + {file = "lxml-5.2.0-cp312-cp312-win32.whl", hash = "sha256:7c61ce3cdd6e6c9f4003ac118be7eb3036d0ce2afdf23929e533e54482780f74"}, + {file = "lxml-5.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f90c36ca95a44d2636bbf55a51ca30583b59b71b6547b88d954e029598043551"}, + {file = "lxml-5.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1cce2eaad7e38b985b0f91f18468dda0d6b91862d32bec945b0e46e2ffe7222e"}, + {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60a3983d32f722a8422c01e4dc4badc7a307ca55c59e2485d0e14244a52c482f"}, + {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60847dfbdfddf08a56c4eefe48234e8c1ab756c7eda4a2a7c1042666a5516564"}, + {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbe335f0d1a86391671d975a1b5e9b08bb72fba6b567c43bdc2e55ca6e6c086"}, + {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_28_aarch64.whl", hash = "sha256:3ac7c8a60b8ad51fe7bca99a634dd625d66492c502fd548dc6dc769ce7d94b6a"}, + {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:73e69762cf740ac3ae81137ef9d6f15f93095f50854e233d50b29e7b8a91dbc6"}, + {file = "lxml-5.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:281ee1ffeb0ab06204dfcd22a90e9003f0bb2dab04101ad983d0b1773bc10588"}, + {file = "lxml-5.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ba3a86b0d5a5c93104cb899dff291e3ae13729c389725a876d00ef9696de5425"}, + {file = "lxml-5.2.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:356f8873b1e27b81793e30144229adf70f6d3e36e5cb7b6d289da690f4398953"}, + {file = "lxml-5.2.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2a34e74ffe92c413f197ff4967fb1611d938ee0691b762d062ef0f73814f3aa4"}, + {file = "lxml-5.2.0-cp36-cp36m-win32.whl", hash = "sha256:6f0d2b97a5a06c00c963d4542793f3e486b1ed3a957f8c19f6006ed39d104bb0"}, + {file = "lxml-5.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:35e39c6fd089ad6674eb52d93aa874d6027b3ae44d2381cca6e9e4c2e102c9c8"}, + {file = "lxml-5.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5f6e4e5a62114ae76690c4a04c5108d067442d0a41fd092e8abd25af1288c450"}, + {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93eede9bcc842f891b2267c7f0984d811940d1bc18472898a1187fe560907a99"}, + {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad364026c2cebacd7e01d1138bd53639822fefa8f7da90fc38cd0e6319a2699"}, + {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f06e4460e76468d99cc36d5b9bc6fc5f43e6662af44960e13e3f4e040aacb35"}, + {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:ca3236f31d565555139d5b00b790ed2a98ac6f0c4470c4032f8b5e5a5dba3c1a"}, + {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:a9b67b850ab1d304cb706cf71814b0e0c3875287083d7ec55ee69504a9c48180"}, + {file = "lxml-5.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5261c858c390ae9a19aba96796948b6a2d56649cbd572968970dc8da2b2b2a42"}, + {file = "lxml-5.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e8359fb610c8c444ac473cfd82dae465f405ff807cabb98a9b9712bbd0028751"}, + {file = "lxml-5.2.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:f9e27841cddfaebc4e3ffbe5dbdff42891051acf5befc9f5323944b2c61cef16"}, + {file = "lxml-5.2.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:641a8da145aca67671205f3e89bfec9815138cf2fe06653c909eab42e486d373"}, + {file = "lxml-5.2.0-cp37-cp37m-win32.whl", hash = "sha256:931a3a13e0f574abce8f3152b207938a54304ccf7a6fd7dff1fdb2f6691d08af"}, + {file = "lxml-5.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:246c93e2503c710cf02c7e9869dc0258223cbefe5e8f9ecded0ac0aa07fd2bf8"}, + {file = "lxml-5.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:11acfcdf5a38cf89c48662123a5d02ae0a7d99142c7ee14ad90de5c96a9b6f06"}, + {file = "lxml-5.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:200f70b5d95fc79eb9ed7f8c4888eef4e274b9bf380b829d3d52e9ed962e9231"}, + {file = "lxml-5.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba4d02aed47c25be6775a40d55c5774327fdedba79871b7c2485e80e45750cb2"}, + {file = "lxml-5.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e283b24c14361fe9e04026a1d06c924450415491b83089951d469509900d9f32"}, + {file = "lxml-5.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:03e3962d6ad13a862dacd5b3a3ea60b4d092a550f36465234b8639311fd60989"}, + {file = "lxml-5.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6e45fd5213e5587a610b7e7c8c5319a77591ab21ead42df46bb342e21bc1418d"}, + {file = "lxml-5.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:27877732946843f4b6bfc56eb40d865653eef34ad2edeed16b015d5c29c248df"}, + {file = "lxml-5.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4d16b44ad0dd8c948129639e34c8d301ad87ebc852568ace6fe9a5ad9ce67ee1"}, + {file = "lxml-5.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b8f842df9ba26135c5414e93214e04fe0af259bb4f96a32f756f89467f7f3b45"}, + {file = "lxml-5.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c74e77df9e36c8c91157853e6cd400f6f9ca7a803ba89981bfe3f3fc7e5651ef"}, + {file = "lxml-5.2.0-cp38-cp38-win32.whl", hash = "sha256:1459a998c10a99711ac532abe5cc24ba354e4396dafef741c7797f8830712d56"}, + {file = "lxml-5.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a00f5931b7cccea775123c3c0a2513aee58afdad8728550cc970bff32280bdd2"}, + {file = "lxml-5.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ddda5ba8831f258ac7e6364be03cb27aa62f50c67fd94bc1c3b6247959cc0369"}, + {file = "lxml-5.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56835b9e9a7767202fae06310c6b67478963e535fe185bed3bf9af5b18d2b67e"}, + {file = "lxml-5.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25fef8794f0dc89f01bdd02df6a7fec4bcb2fbbe661d571e898167a83480185e"}, + {file = "lxml-5.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d44af078485c4da9a7ec460162392d49d996caf89516fa0b75ad0838047122"}, + {file = "lxml-5.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f354d62345acdf22aa3e171bd9723790324a66fafe61bfe3873b86724cf6daaa"}, + {file = "lxml-5.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6a7e0935f05e1cf1a3aa1d49a87505773b04f128660eac2a24a5594ea6b1baa7"}, + {file = "lxml-5.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:75a4117b43694c72a0d89f6c18a28dc57407bde4650927d4ef5fd384bdf6dcc7"}, + {file = "lxml-5.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:57402d6cdd8a897ce21cf8d1ff36683583c17a16322a321184766c89a1980600"}, + {file = "lxml-5.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:56591e477bea531e5e1854f5dfb59309d5708669bc921562a35fd9ca5182bdcd"}, + {file = "lxml-5.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7efbce96719aa275d49ad5357886845561328bf07e1d5ab998f4e3066c5ccf15"}, + {file = "lxml-5.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a3c39def0965e8fb5c8d50973e0c7b4ce429a2fa730f3f9068a7f4f9ce78410b"}, + {file = "lxml-5.2.0-cp39-cp39-win32.whl", hash = "sha256:5188f22c00381cb44283ecb28c8d85c2db4a3035774dd851876c8647cb809c27"}, + {file = "lxml-5.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:ed1fe80e1fcdd1205a443bddb1ad3c3135bb1cd3f36cc996a1f4aed35960fbe8"}, + {file = "lxml-5.2.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d2b339fb790fc923ae2e9345c8633e3d0064d37ea7920c027f20c8ae6f65a91f"}, + {file = "lxml-5.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06036d60fccb21e22dd167f6d0e422b9cbdf3588a7e999a33799f9cbf01e41a5"}, + {file = "lxml-5.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a1611fb9de0a269c05575c024e6d8cdf2186e3fa52b364e3b03dcad82514d57"}, + {file = "lxml-5.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:05fc3720250d221792b6e0d150afc92d20cb10c9cdaa8c8f93c2a00fbdd16015"}, + {file = "lxml-5.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:11e41ffd3cd27b0ca1c76073b27bd860f96431d9b70f383990f1827ca19f2f52"}, + {file = "lxml-5.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0382e6a3eefa3f6699b14fa77c2eb32af2ada261b75120eaf4fc028a20394975"}, + {file = "lxml-5.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be5c8e776ecbcf8c1bce71a7d90e3a3680c9ceae516cac0be08b47e9fac0ca43"}, + {file = "lxml-5.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da12b4efc93d53068888cb3b58e355b31839f2428b8f13654bd25d68b201c240"}, + {file = "lxml-5.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f8033da364bacc74aca5e319509a20bb711c8a133680ca5f35020f9eaf025"}, + {file = "lxml-5.2.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:50a26f68d090594477df8572babac64575cd5c07373f7a8319c527c8e56c0f99"}, + {file = "lxml-5.2.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:57cbadf028727705086047994d2e50124650e63ce5a035b0aa79ab50f001989f"}, + {file = "lxml-5.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8aa11638902ac23f944f16ce45c9f04c9d5d57bb2da66822abb721f4efe5fdbb"}, + {file = "lxml-5.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7150e630b879390e02121e71ceb1807f682b88342e2ea2082e2c8716cf8bd93"}, + {file = "lxml-5.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4add722393c99da4d51c8d9f3e1ddf435b30677f2d9ba9aeaa656f23c1b7b580"}, + {file = "lxml-5.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd0f25a431cd16f70ec1c47c10b413e7ddfe1ccaaddd1a7abd181e507c012374"}, + {file = "lxml-5.2.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:883e382695f346c2ea3ad96bdbdf4ca531788fbeedb4352be3a8fcd169fc387d"}, + {file = "lxml-5.2.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:80cc2b55bb6e35d3cb40936b658837eb131e9f16357241cd9ba106ae1e9c5ecb"}, + {file = "lxml-5.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:59ec2948385336e9901008fdf765780fe30f03e7fdba8090aafdbe5d1b7ea0cd"}, + {file = "lxml-5.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ddbea6e58cce1a640d9d65947f1e259423fc201c9cf9761782f355f53b7f3097"}, + {file = "lxml-5.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52d6cdea438eb7282c41c5ac00bd6d47d14bebb6e8a8d2a1c168ed9e0cacfbab"}, + {file = "lxml-5.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c556bbf88a8b667c849d326dd4dd9c6290ede5a33383ffc12b0ed17777f909d"}, + {file = "lxml-5.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:947fa8bf15d1c62c6db36c6ede9389cac54f59af27010251747f05bddc227745"}, + {file = "lxml-5.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e6cb8f7a332eaa2d876b649a748a445a38522e12f2168e5e838d1505a91cdbb7"}, + {file = "lxml-5.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:16e65223f34fd3d65259b174f0f75a4bb3d9893698e5e7d01e54cd8c5eb98d85"}, + {file = "lxml-5.2.0.tar.gz", hash = "sha256:21dc490cdb33047bc7f7ad76384f3366fa8f5146b86cc04c4af45de901393b90"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.7)"] +source = ["Cython (>=3.0.10)"] [[package]] name = "markdown-it-py" @@ -2568,40 +2604,46 @@ files = [ [[package]] name = "onnx" -version = "1.15.0" +version = "1.16.0" description = "Open Neural Network Exchange" optional = false python-versions = ">=3.8" files = [ - {file = "onnx-1.15.0-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:51cacb6aafba308aaf462252ced562111f6991cdc7bc57a6c554c3519453a8ff"}, - {file = "onnx-1.15.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:0aee26b6f7f7da7e840de75ad9195a77a147d0662c94eaa6483be13ba468ffc1"}, - {file = "onnx-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baf6ef6c93b3b843edb97a8d5b3d229a1301984f3f8dee859c29634d2083e6f9"}, - {file = "onnx-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ed899fe6000edc05bb2828863d3841cfddd5a7cf04c1a771f112e94de75d9f"}, - {file = "onnx-1.15.0-cp310-cp310-win32.whl", hash = "sha256:f1ad3d77fc2f4b4296f0ac2c8cadd8c1dcf765fc586b737462d3a0fe8f7c696a"}, - {file = "onnx-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:ca4ebc4f47109bfb12c8c9e83dd99ec5c9f07d2e5f05976356c6ccdce3552010"}, - {file = "onnx-1.15.0-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:233ffdb5ca8cc2d960b10965a763910c0830b64b450376da59207f454701f343"}, - {file = "onnx-1.15.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:51fa79c9ea9af033638ec51f9177b8e76c55fad65bb83ea96ee88fafade18ee7"}, - {file = "onnx-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f277d4861729f5253a51fa41ce91bfec1c4574ee41b5637056b43500917295ce"}, - {file = "onnx-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8a7c94d2ebead8f739fdb70d1ce5a71726f4e17b3e5b8ad64455ea1b2801a85"}, - {file = "onnx-1.15.0-cp311-cp311-win32.whl", hash = "sha256:17dcfb86a8c6bdc3971443c29b023dd9c90ff1d15d8baecee0747a6b7f74e650"}, - {file = "onnx-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:60a3e28747e305cd2e766e6a53a0a6d952cf9e72005ec6023ce5e07666676a4e"}, - {file = "onnx-1.15.0-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6b5c798d9e0907eaf319e3d3e7c89a2ed9a854bcb83da5fefb6d4c12d5e90721"}, - {file = "onnx-1.15.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:a4f774ff50092fe19bd8f46b2c9b27b1d30fbd700c22abde48a478142d464322"}, - {file = "onnx-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2b0e7f3938f2d994c34616bfb8b4b1cebbc4a0398483344fe5e9f2fe95175e6"}, - {file = "onnx-1.15.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49cebebd0020a4b12c1dd0909d426631212ef28606d7e4d49463d36abe7639ad"}, - {file = "onnx-1.15.0-cp38-cp38-win32.whl", hash = "sha256:1fdf8a3ff75abc2b32c83bf27fb7c18d6b976c9c537263fadd82b9560fe186fa"}, - {file = "onnx-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:763e55c26e8de3a2dce008d55ae81b27fa8fb4acbb01a29b9f3c01f200c4d676"}, - {file = "onnx-1.15.0-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:b2d5e802837629fc9c86f19448d19dd04d206578328bce202aeb3d4bedab43c4"}, - {file = "onnx-1.15.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9a9cfbb5e5d5d88f89d0dfc9df5fb858899db874e1d5ed21e76c481f3cafc90d"}, - {file = "onnx-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f472bbe5cb670a0a4a4db08f41fde69b187a009d0cb628f964840d3f83524e9"}, - {file = "onnx-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf2de9bef64792e5b8080c678023ac7d2b9e05d79a3e17e92cf6a4a624831d2"}, - {file = "onnx-1.15.0-cp39-cp39-win32.whl", hash = "sha256:ef4d9eb44b111e69e4534f3233fc2c13d1e26920d24ae4359d513bd54694bc6d"}, - {file = "onnx-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:95d7a3e2d79d371e272e39ae3f7547e0b116d0c7f774a4004e97febe6c93507f"}, - {file = "onnx-1.15.0.tar.gz", hash = "sha256:b18461a7d38f286618ca2a6e78062a2a9c634ce498e631e708a8041b00094825"}, -] - -[package.dependencies] -numpy = "*" + {file = "onnx-1.16.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:9eadbdce25b19d6216f426d6d99b8bc877a65ed92cbef9707751c6669190ba4f"}, + {file = "onnx-1.16.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:034ae21a2aaa2e9c14119a840d2926d213c27aad29e5e3edaa30145a745048e1"}, + {file = "onnx-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec22a43d74eb1f2303373e2fbe7fbcaa45fb225f4eb146edfed1356ada7a9aea"}, + {file = "onnx-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298f28a2b5ac09145fa958513d3d1e6b349ccf86a877dbdcccad57713fe360b3"}, + {file = "onnx-1.16.0-cp310-cp310-win32.whl", hash = "sha256:66300197b52beca08bc6262d43c103289c5d45fde43fb51922ed1eb83658cf0c"}, + {file = "onnx-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:ae0029f5e47bf70a1a62e7f88c80bca4ef39b844a89910039184221775df5e43"}, + {file = "onnx-1.16.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:f51179d4af3372b4f3800c558d204b592c61e4b4a18b8f61e0eea7f46211221a"}, + {file = "onnx-1.16.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5202559070afec5144332db216c20f2fff8323cf7f6512b0ca11b215eacc5bf3"}, + {file = "onnx-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77579e7c15b4df39d29465b216639a5f9b74026bdd9e4b6306cd19a32dcfe67c"}, + {file = "onnx-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e60ca76ac24b65c25860d0f2d2cdd96d6320d062a01dd8ce87c5743603789b8"}, + {file = "onnx-1.16.0-cp311-cp311-win32.whl", hash = "sha256:81b4ee01bc554e8a2b11ac6439882508a5377a1c6b452acd69a1eebb83571117"}, + {file = "onnx-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:7449241e70b847b9c3eb8dae622df8c1b456d11032a9d7e26e0ee8a698d5bf86"}, + {file = "onnx-1.16.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:03a627488b1a9975d95d6a55582af3e14c7f3bb87444725b999935ddd271d352"}, + {file = "onnx-1.16.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c392faeabd9283ee344ccb4b067d1fea9dfc614fa1f0de7c47589efd79e15e78"}, + {file = "onnx-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0efeb46985de08f0efe758cb54ad3457e821a05c2eaf5ba2ccb8cd1602c08084"}, + {file = "onnx-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddf14a3d32234f23e44abb73a755cb96a423fac7f004e8f046f36b10214151ee"}, + {file = "onnx-1.16.0-cp312-cp312-win32.whl", hash = "sha256:62a2e27ae8ba5fc9b4a2620301446a517b5ffaaf8566611de7a7c2160f5bcf4c"}, + {file = "onnx-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:3e0860fea94efde777e81a6f68f65761ed5e5f3adea2e050d7fbe373a9ae05b3"}, + {file = "onnx-1.16.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:70a90649318f3470985439ea078277c9fb2a2e6e2fd7c8f3f2b279402ad6c7e6"}, + {file = "onnx-1.16.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71839546b7f93be4fa807995b182ab4b4414c9dbf049fee11eaaced16fcf8df2"}, + {file = "onnx-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7665217c45a61eb44718c8e9349d2ad004efa0cb9fbc4be5c6d5e18b9fe12b52"}, + {file = "onnx-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5752bbbd5717304a7643643dba383a2fb31e8eb0682f4e7b7d141206328a73b"}, + {file = "onnx-1.16.0-cp38-cp38-win32.whl", hash = "sha256:257858cbcb2055284f09fa2ae2b1cfd64f5850367da388d6e7e7b05920a40c90"}, + {file = "onnx-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:209fe84995a28038e29ae8369edd35f33e0ef1ebc3bddbf6584629823469deb1"}, + {file = "onnx-1.16.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:8cf3e518b1b1b960be542e7c62bed4e5219e04c85d540817b7027029537dec92"}, + {file = "onnx-1.16.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:30f02beaf081c7d9fa3a8c566a912fc4408e28fc33b1452d58f890851691d364"}, + {file = "onnx-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fb29a9a692b522deef1f6b8f2145da62c0c43ea1ed5b4c0f66f827fdc28847d"}, + {file = "onnx-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7755cbd5f4e47952e37276ea5978a46fc8346684392315902b5ed4a719d87d06"}, + {file = "onnx-1.16.0-cp39-cp39-win32.whl", hash = "sha256:7532343dc5b8b5e7c3e3efa441a3100552f7600155c4db9120acd7574f64ffbf"}, + {file = "onnx-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:d7886c05aa6d583ec42f6287678923c1e343afc4350e49d5b36a0023772ffa22"}, + {file = "onnx-1.16.0.tar.gz", hash = "sha256:237c6987c6c59d9f44b6136f5819af79574f8d96a760a1fa843bede11f3822f7"}, +] + +[package.dependencies] +numpy = ">=1.20" protobuf = ">=3.20.2" [package.extras] @@ -2928,79 +2970,80 @@ dev = ["jinja2"] [[package]] name = "pillow" -version = "10.2.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] @@ -3115,22 +3158,22 @@ files = [ [[package]] name = "protobuf" -version = "5.26.0" +version = "5.26.1" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.26.0-cp310-abi3-win32.whl", hash = "sha256:f9ecc8eb6f18037e0cbf43256db0325d4723f429bca7ef5cd358b7c29d65f628"}, - {file = "protobuf-5.26.0-cp310-abi3-win_amd64.whl", hash = "sha256:dfd29f6eb34107dccf289a93d44fb6b131e68888d090b784b691775ac84e8213"}, - {file = "protobuf-5.26.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:7e47c57303466c867374a17b2b5e99c5a7c8b72a94118e2f28efb599f19b4069"}, - {file = "protobuf-5.26.0-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e184175276edc222e2d5e314a72521e10049938a9a4961fe4bea9b25d073c03f"}, - {file = "protobuf-5.26.0-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:6ee9d1aa02f951c5ce10bf8c6cfb7604133773038e33f913183c8b5201350600"}, - {file = "protobuf-5.26.0-cp38-cp38-win32.whl", hash = "sha256:2c334550e1cb4efac5c8a3987384bf13a4334abaf5ab59e40479e7b70ecd6b19"}, - {file = "protobuf-5.26.0-cp38-cp38-win_amd64.whl", hash = "sha256:8eef61a90631c21b06b4f492a27e199a269827f046de3bb68b61aa84fcf50905"}, - {file = "protobuf-5.26.0-cp39-cp39-win32.whl", hash = "sha256:ca825f4eecb8c342d2ec581e6a5ad1ad1a47bededaecd768e0d3451ae4aaac2b"}, - {file = "protobuf-5.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:efd4f5894c50bd76cbcfdd668cd941021333861ed0f441c78a83d8254a01cc9f"}, - {file = "protobuf-5.26.0-py3-none-any.whl", hash = "sha256:a49b6c5359bf34fb7bf965bf21abfab4476e4527d822ab5289ee3bf73f291159"}, - {file = "protobuf-5.26.0.tar.gz", hash = "sha256:82f5870d74c99addfe4152777bdf8168244b9cf0ac65f8eccf045ddfa9d80d9b"}, + {file = "protobuf-5.26.1-cp310-abi3-win32.whl", hash = "sha256:3c388ea6ddfe735f8cf69e3f7dc7611e73107b60bdfcf5d0f024c3ccd3794e23"}, + {file = "protobuf-5.26.1-cp310-abi3-win_amd64.whl", hash = "sha256:e6039957449cb918f331d32ffafa8eb9255769c96aa0560d9a5bf0b4e00a2a33"}, + {file = "protobuf-5.26.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:38aa5f535721d5bb99861166c445c4105c4e285c765fbb2ac10f116e32dcd46d"}, + {file = "protobuf-5.26.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fbfe61e7ee8c1860855696e3ac6cfd1b01af5498facc6834fcc345c9684fb2ca"}, + {file = "protobuf-5.26.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:f7417703f841167e5a27d48be13389d52ad705ec09eade63dfc3180a959215d7"}, + {file = "protobuf-5.26.1-cp38-cp38-win32.whl", hash = "sha256:d693d2504ca96750d92d9de8a103102dd648fda04540495535f0fec7577ed8fc"}, + {file = "protobuf-5.26.1-cp38-cp38-win_amd64.whl", hash = "sha256:9b557c317ebe6836835ec4ef74ec3e994ad0894ea424314ad3552bc6e8835b4e"}, + {file = "protobuf-5.26.1-cp39-cp39-win32.whl", hash = "sha256:b9ba3ca83c2e31219ffbeb9d76b63aad35a3eb1544170c55336993d7a18ae72c"}, + {file = "protobuf-5.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ee014c2c87582e101d6b54260af03b6596728505c79f17c8586e7523aaa8f8c"}, + {file = "protobuf-5.26.1-py3-none-any.whl", hash = "sha256:da612f2720c0183417194eeaa2523215c4fcc1a1949772dc65f05047e08d5932"}, + {file = "protobuf-5.26.1.tar.gz", hash = "sha256:8ca2a1d97c290ec7b16e4e5dff2e5ae150cc1582f55b5ab300d45cb0dfa90e51"}, ] [[package]] @@ -3246,13 +3289,13 @@ files = [ [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -7047,13 +7090,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.43.0" +version = "1.44.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.43.0.tar.gz", hash = "sha256:41df73af89d22921d8733714fb0fc5586c3461907e06688e6537d01a27e0e0f6"}, - {file = "sentry_sdk-1.43.0-py2.py3-none-any.whl", hash = "sha256:8d768724839ca18d7b4c7463ef7528c40b7aa2bfbf7fe554d5f9a7c044acfd36"}, + {file = "sentry-sdk-1.44.0.tar.gz", hash = "sha256:f7125a9235795811962d52ff796dc032cd1d0dd98b59beaced8380371cd9c13c"}, + {file = "sentry_sdk-1.44.0-py2.py3-none-any.whl", hash = "sha256:eb65289da013ca92fad2694851ad2f086aa3825e808dc285bd7dcaf63602bb18"}, ] [package.dependencies] From 3e99cf4b5e6b74e8671db12935156b09a259b964 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 1 Apr 2024 11:43:45 -0700 Subject: [PATCH 185/384] [bot] Fingerprints: add missing FW versions from new users (#32072) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 1386089a18..29a0cb093b 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -131,6 +131,7 @@ FW_VERSIONS = { b'68460393AA', b'68460393AB', b'68494461AB', + b'68494461AC', b'68524936AA', b'68524936AB', b'68525338AB', @@ -146,6 +147,7 @@ FW_VERSIONS = { b'68443120AE ', b'68443123AC ', b'68443125AC ', + b'68496647AJ ', b'68496650AI ', b'68526752AD ', b'68526752AE ', @@ -162,6 +164,7 @@ FW_VERSIONS = { b'68443155AC', b'68443158AB', b'68501050AD', + b'68501055AD', b'68527221AB', b'68527223AB', b'68586231AD', From 3080aefa3d8395d4842749f629cab92db2e65f56 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 1 Apr 2024 18:24:23 -0400 Subject: [PATCH 186/384] plotjuggler docs remove old options (#32078) * these are no longer options * and this one * qlogs * space --- tools/plotjuggler/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/plotjuggler/README.md b/tools/plotjuggler/README.md index ca9946145d..dcf2bbbac7 100644 --- a/tools/plotjuggler/README.md +++ b/tools/plotjuggler/README.md @@ -12,7 +12,7 @@ Once you've [set up the openpilot environment](../README.md), this command will ``` $ ./juggle.py -h -usage: juggle.py [-h] [--demo] [--qlog] [--ci] [--can] [--stream] [--layout [LAYOUT]] [--install] [--dbc DBC] +usage: juggle.py [-h] [--demo] [--can] [--stream] [--layout [LAYOUT]] [--install] [--dbc DBC] [route_or_segment_name] [segment_count] A helper to run PlotJuggler on openpilot routes @@ -25,8 +25,6 @@ positional arguments: optional arguments: -h, --help show this help message and exit --demo Use the demo route instead of providing one (default: False) - --qlog Use qlogs (default: False) - --ci Download data from openpilot CI bucket (default: False) --can Parse CAN data (default: False) --stream Start PlotJuggler in streaming mode (default: False) --layout [LAYOUT] Run PlotJuggler with a pre-defined layout (default: None) @@ -38,11 +36,13 @@ optional arguments: Examples using route name: -`./juggle.py "a2a0ccea32023010|2023-07-27--13-01-19"` +`./juggle.py "a2a0ccea32023010/2023-07-27--13-01-19"` -Examples using segment name: +Examples using segment range: -`./juggle.py "a2a0ccea32023010|2023-07-27--13-01-19--1"` +`./juggle.py "a2a0ccea32023010/2023-07-27--13-01-19/1"` + +`./juggle.py "a2a0ccea32023010/2023-07-27--13-01-19/1/q" # use qlogs` ## Streaming From dbea6ba7bf2143d7d6cfc7e0be6eb71f8e7b9faa Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 1 Apr 2024 15:25:27 -0700 Subject: [PATCH 187/384] Lexus RC: add missing fwdCamera FW (#32076) add 1e4e217ac337b4bf --- selfdrive/car/toyota/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index b55316f2e9..b8218f2665 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1420,6 +1420,7 @@ FW_VERSIONS = { ], (Ecu.fwdCamera, 0x750, 0x6d): [ b'\x028646F1105200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F1104200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', ], }, CAR.LEXUS_RC: { From 1c0161589b5fa183d7fc87a30692c92865d61065 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 1 Apr 2024 18:27:29 -0400 Subject: [PATCH 188/384] migrate lowercase mock (#32074) * add mock migration * fix * this --- selfdrive/car/fingerprints.py | 3 +++ tools/cabana/dbc/generate_dbc_json.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/fingerprints.py b/selfdrive/car/fingerprints.py index 877957aa2f..978d2260d6 100644 --- a/selfdrive/car/fingerprints.py +++ b/selfdrive/car/fingerprints.py @@ -6,6 +6,7 @@ from openpilot.selfdrive.car.gm.values import CAR as GM from openpilot.selfdrive.car.honda.values import CAR as HONDA from openpilot.selfdrive.car.hyundai.values import CAR as HYUNDAI from openpilot.selfdrive.car.mazda.values import CAR as MAZDA +from openpilot.selfdrive.car.mock.values import CAR as MOCK from openpilot.selfdrive.car.nissan.values import CAR as NISSAN from openpilot.selfdrive.car.subaru.values import CAR as SUBARU from openpilot.selfdrive.car.tesla.values import CAR as TESLA @@ -338,4 +339,6 @@ MIGRATION = { "SKODA OCTAVIA 3RD GEN": VW.SKODA_OCTAVIA_MK3, "SKODA SCALA 1ST GEN": VW.SKODA_SCALA_MK1, "SKODA SUPERB 3RD GEN": VW.SKODA_SUPERB_MK3, + + "mock": MOCK.MOCK, } diff --git a/tools/cabana/dbc/generate_dbc_json.py b/tools/cabana/dbc/generate_dbc_json.py index dfb96bad7a..2d3fbe9fc4 100755 --- a/tools/cabana/dbc/generate_dbc_json.py +++ b/tools/cabana/dbc/generate_dbc_json.py @@ -10,7 +10,8 @@ def generate_dbc_json() -> str: dbc_map = {platform.name: platform.config.dbc_dict['pt'] for platform in PLATFORMS.values() if platform != "MOCK"} for m in MIGRATION: - dbc_map[m] = dbc_map[MIGRATION[m]] + if MIGRATION[m] in dbc_map: + dbc_map[m] = dbc_map[MIGRATION[m]] return json.dumps(dict(sorted(dbc_map.items())), indent=2) From c09cf4983bd5e4b83ce58ac033661e6e79a88770 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 1 Apr 2024 20:43:22 -0400 Subject: [PATCH 189/384] pytest: don't delete logs on-device (#32080) fix log deletion --- common/prefix.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/prefix.py b/common/prefix.py index 4059ac09e2..3292acae86 100644 --- a/common/prefix.py +++ b/common/prefix.py @@ -4,6 +4,7 @@ import uuid from openpilot.common.params import Params +from openpilot.system.hardware import PC from openpilot.system.hardware.hw import Paths from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT @@ -45,7 +46,8 @@ class OpenpilotPrefix: shutil.rmtree(os.path.realpath(symlink_path), ignore_errors=True) os.remove(symlink_path) shutil.rmtree(self.msgq_path, ignore_errors=True) - shutil.rmtree(Paths.log_root(), ignore_errors=True) + if PC: + shutil.rmtree(Paths.log_root(), ignore_errors=True) if not os.environ.get("COMMA_CACHE", False): shutil.rmtree(Paths.download_cache_root(), ignore_errors=True) shutil.rmtree(Paths.comma_home(), ignore_errors=True) From 56e716bf86478857e2bf5e58e9faea0f1c2f95a4 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 1 Apr 2024 19:08:27 -0700 Subject: [PATCH 190/384] fw_versions: add OBD multiplexing to debugging view --- selfdrive/car/fw_versions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index c200528ca6..819f770eb5 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -388,7 +388,7 @@ if __name__ == "__main__": padding = max([len(fw.brand) for fw in fw_vers] or [0]) for version in fw_vers: subaddr = None if version.subAddress == 0 else hex(version.subAddress) - print(f" Brand: {version.brand:{padding}}, bus: {version.bus} - (Ecu.{version.ecu}, {hex(version.address)}, {subaddr}): [{version.fwVersion}]") + print(f" Brand: {version.brand:{padding}}, bus: {version.bus}, OBD: {version.obdMultiplexing} - (Ecu.{version.ecu}, {hex(version.address)}, {subaddr}): [{version.fwVersion}]") print("}") print() From fa5527fc76e9d1f48ea67fba71fcc084ee259865 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 1 Apr 2024 19:09:37 -0700 Subject: [PATCH 191/384] Volkswagen: fix PT bus query (#32081) we need whitelists! --- selfdrive/car/volkswagen/values.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 86b0dbd7aa..a88487f7c4 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -371,7 +371,7 @@ FW_QUERY_CONFIG = FwQueryConfig( Request( [VOLKSWAGEN_VERSION_REQUEST_MULTI], [VOLKSWAGEN_VERSION_RESPONSE], - # whitelist_ecus=[Ecu.srs, Ecu.eps, Ecu.fwdRadar], + whitelist_ecus=[Ecu.srs, Ecu.eps, Ecu.fwdRadar, Ecu.fwdCamera], rx_offset=VOLKSWAGEN_RX_OFFSET, bus=bus, logging=(bus != 1 or not obd_multiplexing), @@ -380,7 +380,7 @@ FW_QUERY_CONFIG = FwQueryConfig( Request( [VOLKSWAGEN_VERSION_REQUEST_MULTI], [VOLKSWAGEN_VERSION_RESPONSE], - # whitelist_ecus=[Ecu.engine, Ecu.transmission], + whitelist_ecus=[Ecu.engine, Ecu.transmission], bus=bus, logging=(bus != 1 or not obd_multiplexing), obd_multiplexing=obd_multiplexing, From 72eb17012db150fa6aa3b7f6189d569cfc3d94e1 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 1 Apr 2024 20:08:22 -0700 Subject: [PATCH 192/384] fix static analysis (#32082) fix ltl --- selfdrive/car/fw_versions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index 819f770eb5..386bbee3ac 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -388,7 +388,8 @@ if __name__ == "__main__": padding = max([len(fw.brand) for fw in fw_vers] or [0]) for version in fw_vers: subaddr = None if version.subAddress == 0 else hex(version.subAddress) - print(f" Brand: {version.brand:{padding}}, bus: {version.bus}, OBD: {version.obdMultiplexing} - (Ecu.{version.ecu}, {hex(version.address)}, {subaddr}): [{version.fwVersion}]") + print(f" Brand: {version.brand:{padding}}, bus: {version.bus}, OBD: {version.obdMultiplexing} - " + + f"(Ecu.{version.ecu}, {hex(version.address)}, {subaddr}): [{version.fwVersion}]") print("}") print() From 44129ad0df5c31c03d78fe591183e9db50c8e6b3 Mon Sep 17 00:00:00 2001 From: Michel Le Bihan Date: Tue, 2 Apr 2024 19:28:19 +0200 Subject: [PATCH 193/384] simulator: Change car to Honda Civic 2022 (#32087) * simulator: Change car to Honda Civic 2022 * simulator: Enable experimental longitudinal control --- tools/sim/bridge/common.py | 1 + tools/sim/launch_openpilot.sh | 2 +- tools/sim/lib/simulated_car.py | 24 +++++++----------------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/tools/sim/bridge/common.py b/tools/sim/bridge/common.py index 34d11bb98c..3bd2f35772 100644 --- a/tools/sim/bridge/common.py +++ b/tools/sim/bridge/common.py @@ -28,6 +28,7 @@ class SimulatorBridge(ABC): def __init__(self, dual_camera, high_quality): set_params_enabled() self.params = Params() + self.params.put_bool("ExperimentalLongitudinalEnabled", True) self.rk = Ratekeeper(100, None) diff --git a/tools/sim/launch_openpilot.sh b/tools/sim/launch_openpilot.sh index a2d7841e7b..86d9607bb0 100755 --- a/tools/sim/launch_openpilot.sh +++ b/tools/sim/launch_openpilot.sh @@ -4,7 +4,7 @@ export PASSIVE="0" export NOBOARD="1" export SIMULATION="1" export SKIP_FW_QUERY="1" -export FINGERPRINT="HONDA_CIVIC" +export FINGERPRINT="HONDA_CIVIC_2022" export BLOCK="${BLOCK},camerad,loggerd,encoderd,micd,logmessaged" if [[ "$CI" ]]; then diff --git a/tools/sim/lib/simulated_car.py b/tools/sim/lib/simulated_car.py index 1d56189728..8c15195dcb 100644 --- a/tools/sim/lib/simulated_car.py +++ b/tools/sim/lib/simulated_car.py @@ -5,12 +5,12 @@ from opendbc.can.parser import CANParser from openpilot.common.params import Params from openpilot.selfdrive.boardd.boardd_api_impl import can_list_to_can_capnp from openpilot.tools.sim.lib.common import SimulatorState +from panda.python import Panda class SimulatedCar: - """Simulates a honda civic 2016 (panda state + can messages) to OpenPilot""" - packer = CANPacker("honda_civic_touring_2016_can_generated") - rpacker = CANPacker("acura_ilx_2016_nidec") + """Simulates a honda civic 2022 (panda state + can messages) to OpenPilot""" + packer = CANPacker("honda_civic_ex_2022_can_generated") def __init__(self): self.pm = messaging.PubMaster(['can', 'pandaStates']) @@ -22,11 +22,8 @@ class SimulatedCar: @staticmethod def get_car_can_parser(): - dbc_f = 'honda_civic_touring_2016_can_generated' + dbc_f = 'honda_civic_ex_2022_can_generated' checks = [ - (0xe4, 100), - (0x1fa, 50), - (0x200, 50), ] return CANParser(dbc_f, checks, 0) @@ -61,6 +58,7 @@ class SimulatedCar: msg.append(self.packer.make_can_msg("DOORS_STATUS", 0, {})) msg.append(self.packer.make_can_msg("CRUISE_PARAMS", 0, {})) msg.append(self.packer.make_can_msg("CRUISE", 0, {})) + msg.append(self.packer.make_can_msg("CRUISE_FAULT_STATUS", 0, {})) msg.append(self.packer.make_can_msg("SCM_FEEDBACK", 0, { "MAIN_ON": 1, @@ -73,20 +71,12 @@ class SimulatedCar: "PEDAL_GAS": simulator_state.user_gas, "BRAKE_PRESSED": simulator_state.user_brake > 0 })) - msg.append(self.packer.make_can_msg("HUD_SETTING", 0, {})) msg.append(self.packer.make_can_msg("CAR_SPEED", 0, {})) # *** cam bus *** msg.append(self.packer.make_can_msg("STEERING_CONTROL", 2, {})) msg.append(self.packer.make_can_msg("ACC_HUD", 2, {})) msg.append(self.packer.make_can_msg("LKAS_HUD", 2, {})) - msg.append(self.packer.make_can_msg("BRAKE_COMMAND", 2, {})) - - # *** radar bus *** - if self.idx % 5 == 0: - msg.append(self.rpacker.make_can_msg("RADAR_DIAGNOSTIC", 1, {"RADAR_STATE": 0x79})) - for i in range(16): - msg.append(self.rpacker.make_can_msg("TRACK_%d" % i, 1, {"LONG_DIST": 255.5})) self.pm.send('can', can_list_to_can_capnp(msg)) @@ -103,9 +93,9 @@ class SimulatedCar: 'ignitionLine': simulator_state.ignition, 'pandaType': "blackPanda", 'controlsAllowed': True, - 'safetyModel': 'hondaNidec', + 'safetyModel': 'hondaBosch', 'alternativeExperience': self.sm["carParams"].alternativeExperience, - 'safetyParam': 0, + 'safetyParam': Panda.FLAG_HONDA_RADARLESS | Panda.FLAG_HONDA_BOSCH_LONG, } self.pm.send('pandaStates', dat) From 67ba1154363c8e4f841836afaa20d57319fe3095 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 2 Apr 2024 15:25:58 -0700 Subject: [PATCH 194/384] [bot] Fingerprints: add missing FW versions from new users (#32086) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 5 +++++ selfdrive/car/toyota/fingerprints.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 29a0cb093b..9809fb47f1 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -396,6 +396,7 @@ FW_VERSIONS = { b'68453491AC', b'68453499AD', b'68453503AC', + b'68453503AD', b'68453505AC', b'68453505AD', b'68453511AC', @@ -422,6 +423,7 @@ FW_VERSIONS = { b'68631938AA', b'68631940AA', b'68631942AA', + b'68631943AB', ], (Ecu.srs, 0x744, None): [ b'68428609AB', @@ -496,6 +498,7 @@ FW_VERSIONS = { b'05036026AB ', b'05036065AE ', b'05036066AE ', + b'05036193AA ', b'05149368AA ', b'05149591AD ', b'05149591AE ', @@ -536,6 +539,7 @@ FW_VERSIONS = { b'68502740AF ', b'68502741AF ', b'68502742AC ', + b'68502742AF ', b'68539650AD', b'68539650AF', b'68539651AD', @@ -549,6 +553,7 @@ FW_VERSIONS = { b'05035706AD', b'05035842AB', b'05036069AA', + b'05036181AA', b'05149536AC', b'05149537AC', b'05149543AC', diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index b8218f2665..d91124e257 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1419,8 +1419,8 @@ FW_VERSIONS = { b'\x018821F6201400\x00\x00\x00\x00', ], (Ecu.fwdCamera, 0x750, 0x6d): [ - b'\x028646F1105200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', b'\x028646F1104200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F1105200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', ], }, CAR.LEXUS_RC: { From 346ab5ce303bb5e7158154e98a2816e190802c87 Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:09:04 -0300 Subject: [PATCH 195/384] Mutilang: update pt-BR translation (#32090) * update pt-BR translation * not today Satan --- selfdrive/ui/translations/main_pt-BR.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index e5a0c23f40..7bc324f29c 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -492,23 +492,23 @@ OnroadAlerts openpilot Unavailable - + openpilot Indisponível Waiting for controls to start - + Aguardando controles para iniciar TAKE CONTROL IMMEDIATELY - + ASSUMA IMEDIATAMENTE Controls Unresponsive - + Controles Não Respondem Reboot Device - + Reinicie o Dispositivo
From 3f81ea2e0ebccadfe3f6499dc8f9904784f19018 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 3 Apr 2024 08:05:51 -0700 Subject: [PATCH 196/384] [bot] Fingerprints: add missing FW versions from new users (#32095) Export fingerprints --- selfdrive/car/mazda/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/mazda/fingerprints.py b/selfdrive/car/mazda/fingerprints.py index 75d6884e73..f460fe9950 100644 --- a/selfdrive/car/mazda/fingerprints.py +++ b/selfdrive/car/mazda/fingerprints.py @@ -254,6 +254,7 @@ FW_VERSIONS = { b'GSH7-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'GSH7-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'GSH7-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-U\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.transmission, 0x7e1, None): [ b'PXM4-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', From d09e77d1aff2a9df096fb519345337379379d9cf Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Thu, 4 Apr 2024 03:19:55 +0100 Subject: [PATCH 197/384] cabana(DBCFile): handle escaped quotes (#31889) * cabana(DBCFile): VAL_ allow empty description Even though this doesn't make much sense, we should still be able to parse it. * cabana(DBCFile): allow escaped quotemarks in signal comment * also message comments * escape/unescape quotes * test empty val desc * test generating DBC with escaped quotes in comment * seperate test case * fix trailing space * remove empty val * trailing whitespace again --- tools/cabana/dbc/dbcfile.cc | 12 ++++++------ tools/cabana/tests/test_cabana.cc | 21 ++++++++++++++++++++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/tools/cabana/dbc/dbcfile.cc b/tools/cabana/dbc/dbcfile.cc index e7f7fdc6ef..bf246fd342 100644 --- a/tools/cabana/dbc/dbcfile.cc +++ b/tools/cabana/dbc/dbcfile.cc @@ -80,8 +80,8 @@ void DBCFile::parse(const QString &content) { static QRegularExpression bo_regexp(R"(^BO_ (\w+) (\w+) *: (\w+) (\w+))"); static QRegularExpression sg_regexp(R"(^SG_ (\w+) : (\d+)\|(\d+)@(\d+)([\+|\-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[([0-9.+\-eE]+)\|([0-9.+\-eE]+)\] \"(.*)\" (.*))"); static QRegularExpression sgm_regexp(R"(^SG_ (\w+) (\w+) *: (\d+)\|(\d+)@(\d+)([\+|\-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[([0-9.+\-eE]+)\|([0-9.+\-eE]+)\] \"(.*)\" (.*))"); - static QRegularExpression msg_comment_regexp(R"(^CM_ BO_ *(\w+) *\"([^"]*)\"\s*;)"); - static QRegularExpression sg_comment_regexp(R"(^CM_ SG_ *(\w+) *(\w+) *\"([^"]*)\"\s*;)"); + static QRegularExpression msg_comment_regexp(R"(^CM_ BO_ *(\w+) *\"((?:[^"\\]|\\.)*)\"\s*;)"); + static QRegularExpression sg_comment_regexp(R"(^CM_ SG_ *(\w+) *(\w+) *\"((?:[^"\\]|\\.)*)\"\s*;)"); static QRegularExpression val_regexp(R"(VAL_ (\w+) (\w+) (\s*[-+]?[0-9]+\s+\".+?\"[^;]*))"); int line_num = 0; @@ -173,7 +173,7 @@ void DBCFile::parse(const QString &content) { auto match = msg_comment_regexp.match(line); dbc_assert(match.hasMatch()); if (auto m = (cabana::Msg *)msg(match.captured(1).toUInt())) { - m->comment = match.captured(2).trimmed(); + m->comment = match.captured(2).trimmed().replace("\\\"", "\""); } } else if (line.startsWith("CM_ SG_ ")) { if (!line.endsWith("\";")) { @@ -183,7 +183,7 @@ void DBCFile::parse(const QString &content) { auto match = sg_comment_regexp.match(line); dbc_assert(match.hasMatch()); if (auto s = get_sig(match.captured(1).toUInt(), match.captured(2))) { - s->comment = match.captured(3).trimmed(); + s->comment = match.captured(3).trimmed().replace("\\\"", "\""); } } else { seen = false; @@ -207,7 +207,7 @@ QString DBCFile::generateDBC() { const QString transmitter = m.transmitter.isEmpty() ? DEFAULT_NODE_NAME : m.transmitter; dbc_string += QString("BO_ %1 %2: %3 %4\n").arg(address).arg(m.name).arg(m.size).arg(transmitter); if (!m.comment.isEmpty()) { - comment += QString("CM_ BO_ %1 \"%2\";\n").arg(address).arg(m.comment); + comment += QString("CM_ BO_ %1 \"%2\";\n").arg(address).arg(QString(m.comment).replace("\"", "\\\"")); } for (auto sig : m.getSignals()) { QString multiplexer_indicator; @@ -230,7 +230,7 @@ QString DBCFile::generateDBC() { .arg(sig->unit) .arg(sig->receiver_name.isEmpty() ? DEFAULT_NODE_NAME : sig->receiver_name); if (!sig->comment.isEmpty()) { - comment += QString("CM_ SG_ %1 %2 \"%3\";\n").arg(address).arg(sig->name).arg(sig->comment); + comment += QString("CM_ SG_ %1 %2 \"%3\";\n").arg(address).arg(sig->name).arg(QString(sig->comment).replace("\"", "\\\"")); } if (!sig->val_desc.empty()) { QStringList text; diff --git a/tools/cabana/tests/test_cabana.cc b/tools/cabana/tests/test_cabana.cc index 98c2de12b6..d9fcae6f21 100644 --- a/tools/cabana/tests/test_cabana.cc +++ b/tools/cabana/tests/test_cabana.cc @@ -65,6 +65,17 @@ CM_ SG_ 160 signal_1 "signal comment"; REQUIRE(dbc.generateDBC() == content); } +TEST_CASE("DBCFile::generateDBC - escaped quotes") { + QString content = R"(BO_ 160 message_1: 8 EON + SG_ signal_1 : 0|12@1+ (1,0) [0|4095] "unit" XXX + +CM_ BO_ 160 "message comment with \"escaped quotes\""; +CM_ SG_ 160 signal_1 "signal comment with \"escaped quotes\""; +)"; + DBCFile dbc("", content); + REQUIRE(dbc.generateDBC() == content); +} + TEST_CASE("parse_dbc") { QString content = R"( BO_ 160 message_1: 8 EON @@ -82,7 +93,11 @@ CM_ SG_ 160 signal_1 "signal comment"; CM_ SG_ 160 signal_2 "multiple line comment 1 2 -";)"; +"; + +CM_ BO_ 162 "message comment with \"escaped quotes\""; +CM_ SG_ 162 signal_1 "signal comment with \"escaped quotes\""; +)"; DBCFile file("", content); auto msg = file.msg(160); @@ -121,6 +136,10 @@ CM_ SG_ 160 signal_2 "multiple line comment REQUIRE(msg->sigs[1]->start_bit == 12); REQUIRE(msg->sigs[1]->size == 1); REQUIRE(msg->sigs[1]->receiver_name == "XXX"); + + // escaped quotes + REQUIRE(msg->comment == "message comment with \"escaped quotes\""); + REQUIRE(msg->sigs[0]->comment == "signal comment with \"escaped quotes\""); } TEST_CASE("parse_opendbc") { From 5892056884885b603d05c0a44d8db89cf07a094a Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 4 Apr 2024 16:47:49 -0400 Subject: [PATCH 198/384] move casync build dir to /data/openpilot (#32104) move here --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index efe598c275..60e3c25008 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -151,7 +151,7 @@ def build_release(String channel_name) { }, "${channel_name} (casync)": { deviceStage("build casync", "tici-needs-can", [], [ - ["build ${channel_name}", "RELEASE=1 OPENPILOT_CHANNEL=${channel_name} BUILD_DIR=/data/openpilot_build CASYNC_DIR=/data/casync $SOURCE_DIR/release/create_casync_build.sh"], + ["build ${channel_name}", "RELEASE=1 OPENPILOT_CHANNEL=${channel_name} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync $SOURCE_DIR/release/create_casync_build.sh"], //["upload ${channel_name}", "OPENPILOT_CHANNEL=${channel_name} $SOURCE_DIR/release/upload_casync_release.sh"], ]) } From d7ea27cbddc304c8f6d9e064017a19d26ae945a2 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 4 Apr 2024 13:51:26 -0700 Subject: [PATCH 199/384] car docs: no experimental mode for alpha long cars (#32079) not alpha --- selfdrive/car/docs_definitions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index fe717d930e..bb1ca6bd42 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -340,7 +340,7 @@ class CarDocs: # experimental mode exp_link = "Experimental mode" - if CP.openpilotLongitudinalControl or CP.experimentalLongitudinalAvailable: + if CP.openpilotLongitudinalControl and not CP.experimentalLongitudinalAvailable: sentence_builder += f" Traffic light and stop sign handling is also available in {exp_link}." return sentence_builder.format(car_model=f"{self.make} {self.model}", alc=alc, acc=acc) From 69982d43cd61e9b085fbd19f1e3ac6c747a51793 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 5 Apr 2024 14:00:45 -0400 Subject: [PATCH 200/384] move casync release creation to use a tarball of files (#32089) * tar archive instead * fix * move this here * migrate these * fix this * update readme * fix that * try to build nightly * Revert "try to build nightly" This reverts commit 4ea680cb6a1f985c0490168724c99bcb45af9899. * caexclude is no longer required * finish up * sorted * need this * and that * context mnager * path based --- release/README.md | 6 +- release/create_casync_release.py | 7 +- release/files_common | 1 - system/hardware/tici/agnos.py | 2 +- .../tici => updated/casync}/casync.py | 50 +++++++- system/updated/casync/common.py | 32 ++--- system/updated/casync/tar.py | 38 ++++++ .../casync}/tests/test_casync.py | 116 +++++++++++++++++- 8 files changed, 221 insertions(+), 31 deletions(-) rename system/{hardware/tici => updated/casync}/casync.py (81%) create mode 100644 system/updated/casync/tar.py rename system/{hardware/tici => updated/casync}/tests/test_casync.py (56%) diff --git a/release/README.md b/release/README.md index 77cd15ad69..7a4b2cde3e 100644 --- a/release/README.md +++ b/release/README.md @@ -3,7 +3,7 @@ ## terms -- `channel` - a named version of openpilot (git branch, casync caidx) which receives updates +- `channel` - a named version of openpilot (git branch, casync caibx) which receives updates - `build` - a release which is already built for the comma 3/3x and contains only required files for running openpilot and identifying the release - `build_style` - type of build, either `debug` or `release` @@ -28,8 +28,8 @@ ```bash # run on a tici, within the directory you want to create the build from. -# creates a prebuilt version of openpilot into BUILD_DIR and outputs the caidx -# and other casync files into CASYNC_DIR for uploading to openpilot-releases. +# creates a prebuilt version of openpilot into BUILD_DIR and outputs the caibx +# of a tarball containing the full prebuilt openpilot release BUILD_DIR=/data/openpilot_build \ CASYNC_DIR=/data/casync \ OPENPILOT_CHANNEL=nightly \ diff --git a/release/create_casync_release.py b/release/create_casync_release.py index 9aa75eca5d..4c90c31909 100755 --- a/release/create_casync_release.py +++ b/release/create_casync_release.py @@ -4,7 +4,7 @@ import argparse import os import pathlib -from openpilot.system.updated.casync.common import create_caexclude_file, create_casync_release, create_build_metadata_file +from openpilot.system.updated.casync.common import create_casync_release, create_build_metadata_file from openpilot.system.version import get_build_metadata @@ -22,8 +22,7 @@ if __name__ == "__main__": build_metadata.openpilot.build_style = "release" if os.environ.get("RELEASE", None) is not None else "debug" create_build_metadata_file(target_dir, build_metadata, args.channel) - create_caexclude_file(target_dir) - digest, caidx = create_casync_release(target_dir, output_dir, build_metadata.canonical) + digest, caibx = create_casync_release(target_dir, output_dir, build_metadata.canonical) - print(f"Created casync release from {target_dir} to {caidx} with digest {digest}") + print(f"Created casync release from {target_dir} to {caibx} with digest {digest}") diff --git a/release/files_common b/release/files_common index b00f99906b..4ba9200d22 100644 --- a/release/files_common +++ b/release/files_common @@ -170,7 +170,6 @@ system/hardware/tici/hardware.h system/hardware/tici/hardware.py system/hardware/tici/pins.py system/hardware/tici/agnos.py -system/hardware/tici/casync.py system/hardware/tici/agnos.json system/hardware/tici/amplifier.py system/hardware/tici/updater diff --git a/system/hardware/tici/agnos.py b/system/hardware/tici/agnos.py index 502295be07..8f09b30850 100755 --- a/system/hardware/tici/agnos.py +++ b/system/hardware/tici/agnos.py @@ -10,7 +10,7 @@ from collections.abc import Generator import requests -import openpilot.system.hardware.tici.casync as casync +import openpilot.system.updated.casync.casync as casync SPARSE_CHUNK_FMT = struct.Struct('H2xI4x') CAIBX_URL = "https://commadist.azureedge.net/agnosupdate/" diff --git a/system/hardware/tici/casync.py b/system/updated/casync/casync.py similarity index 81% rename from system/hardware/tici/casync.py rename to system/updated/casync/casync.py index 986228c1cd..7a3303a9e9 100755 --- a/system/hardware/tici/casync.py +++ b/system/updated/casync/casync.py @@ -2,15 +2,19 @@ import io import lzma import os +import pathlib import struct import sys import time from abc import ABC, abstractmethod from collections import defaultdict, namedtuple from collections.abc import Callable +from typing import IO import requests from Crypto.Hash import SHA512 +from openpilot.system.updated.casync import tar +from openpilot.system.updated.casync.common import create_casync_tar_package CA_FORMAT_INDEX = 0x96824d9c7b129ff9 CA_FORMAT_TABLE = 0xe75b9e112f17417d @@ -37,20 +41,25 @@ class ChunkReader(ABC): ... -class FileChunkReader(ChunkReader): +class BinaryChunkReader(ChunkReader): """Reads chunks from a local file""" - def __init__(self, fn: str) -> None: + def __init__(self, file_like: IO[bytes]) -> None: super().__init__() - self.f = open(fn, 'rb') - - def __del__(self): - self.f.close() + self.f = file_like def read(self, chunk: Chunk) -> bytes: self.f.seek(chunk.offset) return self.f.read(chunk.length) +class FileChunkReader(BinaryChunkReader): + def __init__(self, path: str) -> None: + super().__init__(open(path, 'rb')) + + def __del__(self): + self.f.close() + + class RemoteChunkReader(ChunkReader): """Reads lzma compressed chunks from a remote store""" @@ -83,6 +92,20 @@ class RemoteChunkReader(ChunkReader): return decompressor.decompress(contents) +class DirectoryTarChunkReader(BinaryChunkReader): + """creates a tar archive of a directory and reads chunks from it""" + + def __init__(self, path: str, cache_file: str) -> None: + create_casync_tar_package(pathlib.Path(path), pathlib.Path(cache_file)) + + self.f = open(cache_file, "rb") + return super().__init__(self.f) + + def __del__(self): + self.f.close() + os.unlink(self.f.name) + + def parse_caibx(caibx_path: str) -> list[Chunk]: """Parses the chunks from a caibx file. Can handle both local and remote files. Returns a list of chunks with hash, offset and length""" @@ -181,6 +204,21 @@ def extract(target: list[Chunk], return stats +def extract_directory(target: list[Chunk], + sources: list[tuple[str, ChunkReader, ChunkDict]], + out_path: str, + tmp_file: str, + progress: Callable[[int], None] = None): + """extract a directory stored as a casync tar archive""" + + stats = extract(target, sources, tmp_file, progress) + + with open(tmp_file, "rb") as f: + tar.extract_tar_archive(f, pathlib.Path(out_path)) + + return stats + + def print_stats(stats: dict[str, int]): total_bytes = sum(stats.values()) print(f"Total size: {total_bytes / 1024 / 1024:.2f} MB") diff --git a/system/updated/casync/common.py b/system/updated/casync/common.py index b5fb4d5802..b30494b2bb 100644 --- a/system/updated/casync/common.py +++ b/system/updated/casync/common.py @@ -4,10 +4,11 @@ import pathlib import subprocess from openpilot.system.version import BUILD_METADATA_FILENAME, BuildMetadata +from openpilot.system.updated.casync import tar CASYNC_ARGS = ["--with=symlinks", "--with=permissions", "--compression=xz"] -CASYNC_FILES = [BUILD_METADATA_FILENAME, ".caexclude"] +CASYNC_FILES = [BUILD_METADATA_FILENAME] def run(cmd): @@ -28,16 +29,6 @@ def get_exclude_set(path) -> set[str]: return exclude_set -def create_caexclude_file(path: pathlib.Path): - with open(path / ".caexclude", "w") as f: - # exclude everything except the paths already in the release - f.write("*\n") - f.write(".*\n") - - for file in sorted(get_exclude_set(path)): - f.write(f"!{file}\n") - - def create_build_metadata_file(path: pathlib.Path, build_metadata: BuildMetadata, channel: str): with open(path / BUILD_METADATA_FILENAME, "w") as f: build_metadata_dict = dataclasses.asdict(build_metadata) @@ -46,8 +37,19 @@ def create_build_metadata_file(path: pathlib.Path, build_metadata: BuildMetadata f.write(json.dumps(build_metadata_dict)) -def create_casync_release(target_dir: pathlib.Path, output_dir: pathlib.Path, caidx_name: str): - caidx_file = output_dir / f"{caidx_name}.caidx" - run(["casync", "make", *CASYNC_ARGS, caidx_file, target_dir]) +def is_not_git(path: pathlib.Path) -> bool: + return ".git" not in path.parts + + +def create_casync_tar_package(target_dir: pathlib.Path, output_path: pathlib.Path): + tar.create_tar_archive(output_path, target_dir, is_not_git) + + +def create_casync_release(target_dir: pathlib.Path, output_dir: pathlib.Path, caibx_name: str): + tar_file = output_dir / f"{caibx_name}.tar" + create_casync_tar_package(target_dir, tar_file) + caibx_file = output_dir / f"{caibx_name}.caibx" + run(["casync", "make", *CASYNC_ARGS, caibx_file, str(tar_file)]) + tar_file.unlink() digest = run(["casync", "digest", *CASYNC_ARGS, target_dir]).decode("utf-8").strip() - return digest, caidx_file + return digest, caibx_file diff --git a/system/updated/casync/tar.py b/system/updated/casync/tar.py new file mode 100644 index 0000000000..725ab4251d --- /dev/null +++ b/system/updated/casync/tar.py @@ -0,0 +1,38 @@ +import pathlib +import tarfile +from typing import IO, Callable + + +def include_default(_) -> bool: + return True + + +def create_tar_archive(filename: pathlib.Path, directory: pathlib.Path, include: Callable[[pathlib.Path], bool] = include_default): + """Creates a tar archive of a directory""" + + with tarfile.open(filename, 'w') as tar: + for file in sorted(directory.rglob("*"), key=lambda f: f.stat().st_size if f.is_file() else 0, reverse=True): + if not include(file): + continue + relative_path = str(file.relative_to(directory)) + if file.is_symlink(): + info = tarfile.TarInfo(relative_path) + info.type = tarfile.SYMTYPE + info.linkpath = str(file.readlink()) + tar.addfile(info) + + elif file.is_file(): + info = tarfile.TarInfo(relative_path) + info.size = file.stat().st_size + info.type = tarfile.REGTYPE + with file.open('rb') as f: + tar.addfile(info, f) + + + +def extract_tar_archive(fh: IO[bytes], directory: pathlib.Path): + """Extracts a tar archive to a directory""" + + tar = tarfile.open(fileobj=fh, mode='r') + tar.extractall(str(directory), filter=lambda info, path: info) + tar.close() diff --git a/system/hardware/tici/tests/test_casync.py b/system/updated/casync/tests/test_casync.py similarity index 56% rename from system/hardware/tici/tests/test_casync.py rename to system/updated/casync/tests/test_casync.py index 94b32a9f76..34427d5625 100755 --- a/system/hardware/tici/tests/test_casync.py +++ b/system/updated/casync/tests/test_casync.py @@ -1,10 +1,12 @@ #!/usr/bin/env python3 import os +import pathlib import unittest import tempfile import subprocess -import openpilot.system.hardware.tici.casync as casync +from openpilot.system.updated.casync import casync +from openpilot.system.updated.casync import tar # dd if=/dev/zero of=/tmp/img.raw bs=1M count=2 # sudo losetup -f /tmp/img.raw @@ -149,5 +151,117 @@ class TestCasync(unittest.TestCase): self.assertLess(stats['remote'], len(self.contents)) +class TestCasyncDirectory(unittest.TestCase): + """Tests extracting a directory stored as a casync tar archive""" + + NUM_FILES = 16 + + @classmethod + def setup_cache(cls, directory, files=None): + if files is None: + files = range(cls.NUM_FILES) + + chunk_a = [i % 256 for i in range(1024)] * 512 + chunk_b = [(256 - i) % 256 for i in range(1024)] * 512 + zeroes = [0] * (1024 * 128) + cls.contents = chunk_a + chunk_b + zeroes + chunk_a + cls.contents = bytes(cls.contents) + + for i in files: + with open(os.path.join(directory, f"file_{i}.txt"), "wb") as f: + f.write(cls.contents) + + os.symlink(f"file_{i}.txt", os.path.join(directory, f"link_{i}.txt")) + + @classmethod + def setUpClass(cls): + cls.tmpdir = tempfile.TemporaryDirectory() + + # Create casync files + cls.manifest_fn = os.path.join(cls.tmpdir.name, 'orig.caibx') + cls.store_fn = os.path.join(cls.tmpdir.name, 'store') + + cls.directory_to_extract = tempfile.TemporaryDirectory() + cls.setup_cache(cls.directory_to_extract.name) + + cls.orig_fn = os.path.join(cls.tmpdir.name, 'orig.tar') + tar.create_tar_archive(cls.orig_fn, pathlib.Path(cls.directory_to_extract.name)) + + subprocess.check_output(["casync", "make", "--compression=xz", "--store", cls.store_fn, cls.manifest_fn, cls.orig_fn]) + + @classmethod + def tearDownClass(cls): + cls.tmpdir.cleanup() + cls.directory_to_extract.cleanup() + + def setUp(self): + self.cache_dir = tempfile.TemporaryDirectory() + self.working_dir = tempfile.TemporaryDirectory() + self.out_dir = tempfile.TemporaryDirectory() + + def tearDown(self): + self.cache_dir.cleanup() + self.working_dir.cleanup() + self.out_dir.cleanup() + + def run_test(self): + target = casync.parse_caibx(self.manifest_fn) + + cache_filename = os.path.join(self.working_dir.name, "cache.tar") + tmp_filename = os.path.join(self.working_dir.name, "tmp.tar") + + sources = [('cache', casync.DirectoryTarChunkReader(self.cache_dir.name, cache_filename), casync.build_chunk_dict(target))] + sources += [('remote', casync.RemoteChunkReader(self.store_fn), casync.build_chunk_dict(target))] + + stats = casync.extract_directory(target, sources, pathlib.Path(self.out_dir.name), tmp_filename) + + with open(os.path.join(self.out_dir.name, "file_0.txt"), "rb") as f: + self.assertEqual(f.read(), self.contents) + + with open(os.path.join(self.out_dir.name, "link_0.txt"), "rb") as f: + self.assertEqual(f.read(), self.contents) + self.assertEqual(os.readlink(os.path.join(self.out_dir.name, "link_0.txt")), "file_0.txt") + + return stats + + def test_no_cache(self): + self.setup_cache(self.cache_dir.name, []) + stats = self.run_test() + self.assertGreater(stats['remote'], 0) + self.assertEqual(stats['cache'], 0) + + def test_full_cache(self): + self.setup_cache(self.cache_dir.name, range(self.NUM_FILES)) + stats = self.run_test() + self.assertEqual(stats['remote'], 0) + self.assertGreater(stats['cache'], 0) + + def test_one_file_cache(self): + self.setup_cache(self.cache_dir.name, range(1)) + stats = self.run_test() + self.assertGreater(stats['remote'], 0) + self.assertGreater(stats['cache'], 0) + self.assertLess(stats['cache'], stats['remote']) + + def test_one_file_incorrect_cache(self): + self.setup_cache(self.cache_dir.name, range(self.NUM_FILES)) + with open(os.path.join(self.cache_dir.name, "file_0.txt"), "wb") as f: + f.write(b"1234") + + stats = self.run_test() + self.assertGreater(stats['remote'], 0) + self.assertGreater(stats['cache'], 0) + self.assertGreater(stats['cache'], stats['remote']) + + def test_one_file_missing_cache(self): + self.setup_cache(self.cache_dir.name, range(self.NUM_FILES)) + os.unlink(os.path.join(self.cache_dir.name, "file_12.txt")) + + stats = self.run_test() + self.assertGreater(stats['remote'], 0) + self.assertGreater(stats['cache'], 0) + self.assertGreater(stats['cache'], stats['remote']) + + if __name__ == "__main__": unittest.main() From 8a138f9be8542ef83fd42cbb030b05551af4afdb Mon Sep 17 00:00:00 2001 From: savojovic <74861870+savojovic@users.noreply.github.com> Date: Fri, 5 Apr 2024 20:03:00 +0200 Subject: [PATCH 201/384] Adding foxglove support (#31907) * Adding foxglove support, demo version * Adding image/thumbnail support * Adding foxglove map support * Adding foxglove map support * Updating title in jsonschemas according to rlog attribute names * Remove shemas folder, add dynamic schema creation * Update identation to 2 spaces, code refactored * Fix, jsonToSchema() recursion returns 0 when an empty arr found * Update, empty arrays data type set to dummy value of type string * Enable logs download * Adding foxglove install functionality * Adding, transform json lists into json obj * Adding, pip install mcap library * format it * Refactoring msg adding to mcap writer by utilizing pool of worker processes Disabling compression --------- Co-authored-by: Justin Newberry --- tools/foxglove/fox.py | 303 +++++++++++++++++++++++++++++ tools/foxglove/install_foxglove.sh | 3 + 2 files changed, 306 insertions(+) create mode 100644 tools/foxglove/fox.py create mode 100755 tools/foxglove/install_foxglove.sh diff --git a/tools/foxglove/fox.py b/tools/foxglove/fox.py new file mode 100644 index 0000000000..02ee56aa10 --- /dev/null +++ b/tools/foxglove/fox.py @@ -0,0 +1,303 @@ +import sys +import json +import base64 +import os +import subprocess +from multiprocessing import Pool +from openpilot.tools.lib.route import Route +from openpilot.tools.lib.logreader import LogReader + +try: + from mcap.writer import Writer, CompressionType +except ImportError: + print("mcap module not found. Attempting to install...") + subprocess.run([sys.executable, "-m", "pip", "install", "mcap"]) + # Attempt to import again after installation + try: + from mcap.writer import Writer, CompressionType + except ImportError: + print("Failed to install mcap module. Exiting.") + sys.exit(1) + + +FOXGLOVE_IMAGE_SCHEME_TITLE = "foxglove.CompressedImage" +FOXGLOVE_GEOJSON_TITLE = "foxglove.GeoJSON" +FOXGLOVE_IMAGE_ENCODING = "base64" +OUT_MCAP_FILE_NAME = "json_log.mcap" +RLOG_FOLDER = "rlogs" +SCHEMAS_FOLDER = "schemas" +SCHEMA_EXTENSION = ".json" + +schemas: dict[str, int] = {} +channels: dict[str, int] = {} +writer: Writer + + +def convertBytesToString(data): + if isinstance(data, bytes): + return data.decode('latin-1') # Assuming UTF-8 encoding, adjust if needed + elif isinstance(data, list): + return [convertBytesToString(item) for item in data] + elif isinstance(data, dict): + return {key: convertBytesToString(value) for key, value in data.items()} + else: + return data + + +# Load jsonscheme for every Event +def loadSchema(schemaName): + with open(os.path.join(SCHEMAS_FOLDER, schemaName + SCHEMA_EXTENSION), "r") as file: + return json.loads(file.read()) + + +# Foxglove creates one graph of an array, and not one for each item of an array +# This can be avoided by transforming array to separate objects +def transformListsToJsonDict(json_data): + def convert_array_to_dict(array): + new_dict = {} + for index, item in enumerate(array): + if isinstance(item, dict): + new_dict[index] = transformListsToJsonDict(item) + else: + new_dict[index] = item + return new_dict + + new_data = {} + for key, value in json_data.items(): + if isinstance(value, list): + new_data[key] = convert_array_to_dict(value) + elif isinstance(value, dict): + new_data[key] = transformListsToJsonDict(value) + else: + new_data[key] = value + return new_data + + +# Transform openpilot thumbnail to foxglove compressedImage +def transformToFoxgloveSchema(jsonMsg): + bytesImgData = jsonMsg.get("thumbnail").get("thumbnail").encode('latin1') + base64ImgData = base64.b64encode(bytesImgData) + base64_string = base64ImgData.decode('utf-8') + foxMsg = { + "timestamp": {"sec": "0", "nsec": jsonMsg.get("logMonoTime")}, + "frame_id": str(jsonMsg.get("thumbnail").get("frameId")), + "data": base64_string, + "format": "jpeg", + } + return foxMsg + + +# TODO: Check if there is a tool to build GEOJson +def transformMapCoordinates(jsonMsg): + coordinates = [] + for jsonCoords in jsonMsg.get("navRoute").get("coordinates"): + coordinates.append([jsonCoords.get("longitude"), jsonCoords.get("latitude")]) + + # Define the GeoJSON + geojson_data = { + "type": "FeatureCollection", + "features": [{"type": "Feature", "geometry": {"type": "LineString", "coordinates": coordinates}, "logMonoTime": jsonMsg.get("logMonoTime")}], + } + + # Create the final JSON with the GeoJSON data encoded as a string + geoJson = {"geojson": json.dumps(geojson_data)} + + return geoJson + + +def jsonToScheme(jsonData): + zeroArray = False + schema = {"type": "object", "properties": {}, "required": []} + for key, value in jsonData.items(): + if isinstance(value, dict): + tempScheme, zeroArray = jsonToScheme(value) + if tempScheme == 0: + return 0 + schema["properties"][key] = tempScheme + schema["required"].append(key) + elif isinstance(value, list): + if all(isinstance(item, dict) for item in value) and len(value) > 0: # Handle zero value arrays + # Handle array of objects + tempScheme, zeroArray = jsonToScheme(value[0]) + schema["properties"][key] = {"type": "array", "items": tempScheme if value else {}} + schema["required"].append(key) + else: + if len(value) == 0: + zeroArray = True + # Handle array of primitive types + schema["properties"][key] = {"type": "array", "items": {"type": "string"}} + schema["required"].append(key) + else: + typeName = type(value).__name__ + if typeName == "str": + typeName = "string" + elif typeName == "bool": + typeName = "boolean" + elif typeName == "float": + typeName = "number" + elif typeName == "int": + typeName = "integer" + schema["properties"][key] = {"type": typeName} + schema["required"].append(key) + + return schema, zeroArray + + +def saveScheme(scheme, schemaFileName): + schemaFileName = schemaFileName + SCHEMA_EXTENSION + # Create the new schemas folder + os.makedirs(SCHEMAS_FOLDER, exist_ok=True) + with open(os.path.join(SCHEMAS_FOLDER, schemaFileName), 'w') as json_file: + json.dump(convertBytesToString(scheme), json_file) + + +def convertToFoxGloveFormat(jsonData, rlogTopic): + jsonData["title"] = rlogTopic + if rlogTopic == "thumbnail": + jsonData = transformToFoxgloveSchema(jsonData) + jsonData["title"] = FOXGLOVE_IMAGE_SCHEME_TITLE + elif rlogTopic == "navRoute": + jsonData = transformMapCoordinates(jsonData) + jsonData["title"] = FOXGLOVE_GEOJSON_TITLE + else: + jsonData = transformListsToJsonDict(jsonData) + return jsonData + + +def generateSchemas(): + listOfDirs = os.listdir(RLOG_FOLDER) + # Open every dir in rlogs + for directory in listOfDirs: + # List every file in every rlog dir + dirPath = os.path.join(RLOG_FOLDER, directory) + listOfFiles = os.listdir(dirPath) + lastIteration = len(listOfFiles) + for iteration, file in enumerate(listOfFiles): + # Load json data from every file until found one without empty arrays + filePath = os.path.join(dirPath, file) + with open(filePath, 'r') as jsonFile: + jsonData = json.load(jsonFile) + scheme, zerroArray = jsonToScheme(jsonData) + # If array of len 0 has been found, type of its data can not be parsed, skip to the next log + # in search for a non empty array. If there is not an non empty array in logs, put a dummy string type + if zerroArray and not iteration == lastIteration - 1: + continue + title = jsonData.get("title") + scheme["title"] = title + # Add contentEncoding type, hardcoded in foxglove format + if title == FOXGLOVE_IMAGE_SCHEME_TITLE: + scheme["properties"]["data"]["contentEncoding"] = FOXGLOVE_IMAGE_ENCODING + saveScheme(scheme, directory) + break + + +def downloadLogs(logPaths): + segment_counter = 0 + for logPath in logPaths: + segment_counter += 1 + msg_counter = 1 + print(segment_counter) + rlog = LogReader(logPath) + for msg in rlog: + jsonMsg = json.loads(json.dumps(convertBytesToString(msg.to_dict()))) + jsonMsg = convertToFoxGloveFormat(jsonMsg, msg.which()) + rlog_dir_path = os.path.join(RLOG_FOLDER, msg.which()) + if not os.path.exists(rlog_dir_path): + os.makedirs(rlog_dir_path) + file_path = os.path.join(rlog_dir_path, str(segment_counter) + "," + str(msg_counter)) + with open(file_path, 'w') as json_file: + json.dump(jsonMsg, json_file) + msg_counter += 1 + + +def getLogMonoTime(jsonMsg): + if jsonMsg.get("title") == FOXGLOVE_IMAGE_SCHEME_TITLE: + logMonoTime = jsonMsg.get("timestamp").get("nsec") + elif jsonMsg.get("title") == FOXGLOVE_GEOJSON_TITLE: + logMonoTime = json.loads(jsonMsg.get("geojson")).get("features")[0].get("logMonoTime") + else: + logMonoTime = jsonMsg.get("logMonoTime") + return logMonoTime + + +def processMsgs(args): + msgFile, rlogTopicPath, rlogTopic = args + msgFilePath = os.path.join(rlogTopicPath, msgFile) + with open(msgFilePath, "r") as file: + jsonMsg = json.load(file) + logMonoTime = getLogMonoTime(jsonMsg) + return {'channel_id': channels[rlogTopic], 'log_time': logMonoTime, 'data': json.dumps(jsonMsg).encode("utf-8"), 'publish_time': logMonoTime} + + +# Get logs from a path, and convert them into mcap +def createMcap(logPaths): + print(f"Downloading logs [{len(logPaths)}]") + downloadLogs(logPaths) + print("Creating schemas") + generateSchemas() + print("Creating mcap file") + + listOfRlogTopics = os.listdir(RLOG_FOLDER) + print(f"Registering schemas and channels [{len(listOfRlogTopics)}]") + for counter, rlogTopic in enumerate(listOfRlogTopics): + print(counter) + schema = loadSchema(rlogTopic) + schema_id = writer.register_schema(name=schema.get("title"), encoding="jsonschema", data=json.dumps(schema).encode()) + schemas[rlogTopic] = schema_id + channel_id = writer.register_channel(schema_id=schemas[rlogTopic], topic=rlogTopic, message_encoding="json") + channels[rlogTopic] = channel_id + rlogTopicPath = os.path.join(RLOG_FOLDER, rlogTopic) + msgFiles = os.listdir(rlogTopicPath) + pool = Pool() + results = pool.map(processMsgs, [(msgFile, rlogTopicPath, rlogTopic) for msgFile in msgFiles]) + pool.close() + pool.join() + for result in results: + writer.add_message(channel_id=result['channel_id'], log_time=result['log_time'], data=result['data'], publish_time=result['publish_time']) + + +def is_program_installed(program_name): + try: + # Check if the program is installed using dpkg (for traditional Debian packages) + subprocess.run(["dpkg", "-l", program_name], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return True + except subprocess.CalledProcessError: + # Check if the program is installed using snap + try: + subprocess.run(["snap", "list", program_name], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return True + except subprocess.CalledProcessError: + return False + + +if __name__ == '__main__': + # Example usage: + program_name = "foxglove-studio" # Change this to the program you want to check + if is_program_installed(program_name): + print(f"{program_name} detected.") + else: + print(f"{program_name} could not be detected.") + installFoxglove = input("Would you like to install it? YES/NO? - ") + if installFoxglove.lower() == "yes": + try: + subprocess.run(['./install_foxglove.sh'], check=True) + print("Installation completed successfully.") + except subprocess.CalledProcessError as e: + print(f"Installation failed with return code {e.returncode}.") + # Get a route + if len(sys.argv) == 1: + route_name = "a2a0ccea32023010|2023-07-27--13-01-19" + print("No route was provided, using demo route") + else: + route_name = sys.argv[1] + # Get logs for a route + print("Getting route log paths") + route = Route(route_name) + logPaths = route.log_paths() + # Start mcap writer + with open(OUT_MCAP_FILE_NAME, "wb") as stream: + writer = Writer(stream, compression=CompressionType.NONE) + writer.start() + createMcap(logPaths) + writer.finish() + print(f"File {OUT_MCAP_FILE_NAME} has been successfully created. Please import it into foxglove studio to continue.") diff --git a/tools/foxglove/install_foxglove.sh b/tools/foxglove/install_foxglove.sh new file mode 100755 index 0000000000..0f401549a2 --- /dev/null +++ b/tools/foxglove/install_foxglove.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "Installing foxglvoe studio..." +sudo snap install foxglove-studio From 910e32270bc0e216a3443803bb177e0f4963e00b Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 5 Apr 2024 14:06:11 -0400 Subject: [PATCH 202/384] casync: larger chunk sizes and include file mode (#32110) add mode --- system/updated/casync/common.py | 2 +- system/updated/casync/tar.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/updated/casync/common.py b/system/updated/casync/common.py index b30494b2bb..db9b4b1e10 100644 --- a/system/updated/casync/common.py +++ b/system/updated/casync/common.py @@ -7,7 +7,7 @@ from openpilot.system.version import BUILD_METADATA_FILENAME, BuildMetadata from openpilot.system.updated.casync import tar -CASYNC_ARGS = ["--with=symlinks", "--with=permissions", "--compression=xz"] +CASYNC_ARGS = ["--with=symlinks", "--with=permissions", "--compression=xz", "--chunk-size=16M"] CASYNC_FILES = [BUILD_METADATA_FILENAME] diff --git a/system/updated/casync/tar.py b/system/updated/casync/tar.py index 725ab4251d..5c547e73a2 100644 --- a/system/updated/casync/tar.py +++ b/system/updated/casync/tar.py @@ -25,11 +25,11 @@ def create_tar_archive(filename: pathlib.Path, directory: pathlib.Path, include: info = tarfile.TarInfo(relative_path) info.size = file.stat().st_size info.type = tarfile.REGTYPE + info.mode = file.stat().st_mode with file.open('rb') as f: tar.addfile(info, f) - def extract_tar_archive(fh: IO[bytes], directory: pathlib.Path): """Extracts a tar archive to a directory""" From bbb31184ab869619944fbd4ad5667f8bc4ca6d3d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 5 Apr 2024 17:11:38 -0400 Subject: [PATCH 203/384] fix nightly casync build (#32111) fix casync build --- release/create_casync_build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/release/create_casync_build.sh b/release/create_casync_build.sh index d41909a6ab..a851123556 100755 --- a/release/create_casync_build.sh +++ b/release/create_casync_build.sh @@ -10,6 +10,7 @@ BUILD_DIR="${BUILD_DIR:=$(mktemp -d)}" echo "Creating casync release from $SOURCE_DIR to $CASYNC_DIR" +cd $SOURCE_DIR mkdir -p $CASYNC_DIR rm -rf $BUILD_DIR mkdir -p $BUILD_DIR From ab744b73447f2b50a09d734edfa16a6a9eb04073 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 5 Apr 2024 15:04:38 -0700 Subject: [PATCH 204/384] make fox.py executable --- tools/foxglove/fox.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tools/foxglove/fox.py diff --git a/tools/foxglove/fox.py b/tools/foxglove/fox.py old mode 100644 new mode 100755 From 1c6924ac675baaaceb8be0b7154be15c2c45c413 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 5 Apr 2024 15:10:14 -0700 Subject: [PATCH 205/384] missing shebang --- tools/foxglove/fox.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/foxglove/fox.py b/tools/foxglove/fox.py index 02ee56aa10..a1e930d893 100755 --- a/tools/foxglove/fox.py +++ b/tools/foxglove/fox.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import sys import json import base64 From 8be1a0ea360a63d8dd2120e628b3b349e1db02b8 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 5 Apr 2024 15:32:45 -0700 Subject: [PATCH 206/384] [bot] Fingerprints: add missing FW versions from new users (#32108) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 9809fb47f1..e4a4bcdfa4 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -148,6 +148,7 @@ FW_VERSIONS = { b'68443123AC ', b'68443125AC ', b'68496647AJ ', + b'68496650AH ', b'68496650AI ', b'68526752AD ', b'68526752AE ', From c95404d564a9a8d168f8f587887e9c33f96db861 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 5 Apr 2024 19:28:21 -0400 Subject: [PATCH 207/384] add ui description helper to build_metadata (#32113) add ui_description --- system/version.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/system/version.py b/system/version.py index 902f013469..3aa35455e5 100755 --- a/system/version.py +++ b/system/version.py @@ -108,6 +108,10 @@ class BuildMetadata: def canonical(self) -> str: return f"{self.openpilot.version}-{self.openpilot.git_commit}-{self.openpilot.build_style}" + @property + def ui_description(self) -> str: + return f"{self.openpilot.version} / {self.openpilot.git_commit[:6]} / {self.channel}" + def build_metadata_from_dict(build_metadata: dict) -> BuildMetadata: channel = build_metadata.get("channel", "unknown") From b8fdb3e01ded282659de68bc436304cb770d0bb0 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 8 Apr 2024 10:01:58 -0700 Subject: [PATCH 208/384] [bot] Bump submodules (#32122) bump submodules Co-authored-by: jnewb1 --- opendbc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendbc b/opendbc index 5821bd94d0..83884c2b20 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 5821bd94d0cb9017d274b4499f2a0525ac317dc2 +Subproject commit 83884c2b2022e4a16ae535d1ed72aca4711324b7 From 44bb4eb521b3d0fcb00e9df5eb7c74741946ebe4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 8 Apr 2024 11:34:05 -0700 Subject: [PATCH 209/384] add tool to create casync agnos updates from existing manifest (#32124) * wip * wip * add agnos prefix * add mkdir * tool to create agnos updates --- release/create_casync_agnos_release.py | 52 ++++++++++++++++++++++++++ system/updated/casync/common.py | 10 ++++- 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 release/create_casync_agnos_release.py diff --git a/release/create_casync_agnos_release.py b/release/create_casync_agnos_release.py new file mode 100644 index 0000000000..2dff1f515d --- /dev/null +++ b/release/create_casync_agnos_release.py @@ -0,0 +1,52 @@ +import argparse +import json +import pathlib +import tempfile +from openpilot.common.basedir import BASEDIR +from openpilot.system.hardware.tici.agnos import StreamingDecompressor +from openpilot.system.updated.casync.common import create_casync_from_file + + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="creates a casync release") + parser.add_argument("output_dir", type=str, help="output directory for the channel") + parser.add_argument("version", type=str, help="version of agnos this is") + parser.add_argument("--manifest", type=str, help="json manifest to create agnos release from", \ + default=str(pathlib.Path(BASEDIR) / "system/hardware/tici/agnos.json")) + args = parser.parse_args() + + output_dir = pathlib.Path(args.output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + + manifest_file = pathlib.Path(args.manifest) + + with tempfile.NamedTemporaryFile() as entry_file: + entry_path = pathlib.Path(entry_file.name) + + with open(manifest_file) as f: + manifest = json.load(f) + + for entry in manifest: + print(f"creating casync agnos build from {entry}") + downloader = StreamingDecompressor(entry['url']) + + CHUNK_SIZE=16*1024*1024 # 16mb + + size = entry["size"] + + cur = 0 + with open(entry_path, "wb") as f: + while True: + to_read = min((size - cur), CHUNK_SIZE) + + print(f"{cur/size*100:06.2f}% {to_read}") + + if not to_read: + break + + f.write(downloader.read(to_read)) + + cur += to_read + + create_casync_from_file(entry_path, output_dir, f"agnos-{args.version}-{entry['name']}") diff --git a/system/updated/casync/common.py b/system/updated/casync/common.py index db9b4b1e10..d1c795657d 100644 --- a/system/updated/casync/common.py +++ b/system/updated/casync/common.py @@ -45,11 +45,17 @@ def create_casync_tar_package(target_dir: pathlib.Path, output_path: pathlib.Pat tar.create_tar_archive(output_path, target_dir, is_not_git) +def create_casync_from_file(file: pathlib.Path, output_dir: pathlib.Path, caibx_name: str): + caibx_file = output_dir / f"{caibx_name}.caibx" + run(["casync", "make", *CASYNC_ARGS, caibx_file, str(file)]) + + return caibx_file + + def create_casync_release(target_dir: pathlib.Path, output_dir: pathlib.Path, caibx_name: str): tar_file = output_dir / f"{caibx_name}.tar" create_casync_tar_package(target_dir, tar_file) - caibx_file = output_dir / f"{caibx_name}.caibx" - run(["casync", "make", *CASYNC_ARGS, caibx_file, str(tar_file)]) + caibx_file = create_casync_from_file(tar_file, output_dir, caibx_name) tar_file.unlink() digest = run(["casync", "digest", *CASYNC_ARGS, target_dir]).decode("utf-8").strip() return digest, caibx_file From 16e0864f3808ca4ef0e05873c42705cf0d5dd60c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 8 Apr 2024 11:35:04 -0700 Subject: [PATCH 210/384] [bot] Update Python packages and pre-commit hooks (#32123) Update Python packages and pre-commit hooks Co-authored-by: jnewb1 --- .pre-commit-config.yaml | 4 +- poetry.lock | 654 +++++++++++++++++++++------------------- 2 files changed, 350 insertions(+), 308 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02af4473bd..e4109b8bf8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: - id: check-hooks-apply - id: check-useless-excludes - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v4.6.0 hooks: - id: check-ast exclude: '^(third_party)/' @@ -33,7 +33,7 @@ repos: - -L bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints - --builtins clear,rare,informal,usage,code,names,en-GB_to_en-US - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.4 + rev: v0.3.5 hooks: - id: ruff exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' diff --git a/poetry.lock b/poetry.lock index 08fd51c18d..453ba46e7d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -667,64 +667,64 @@ cron = ["capturer (>=2.4)"] [[package]] name = "contourpy" -version = "1.2.0" +version = "1.2.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.9" files = [ - {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, - {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, - {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, - {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, - {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, - {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, - {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, - {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, - {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, - {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, - {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, -] - -[package.dependencies] -numpy = ">=1.20,<2.0" + {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, + {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, + {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, + {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, + {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, + {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, + {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, + {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, + {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, + {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, +] + +[package.dependencies] +numpy = ">=1.20" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] @@ -1020,13 +1020,13 @@ files = [ [[package]] name = "execnet" -version = "2.0.2" +version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, - {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, ] [package.extras] @@ -1130,53 +1130,53 @@ files = [ [[package]] name = "fonttools" -version = "4.50.0" +version = "4.51.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effd303fb422f8ce06543a36ca69148471144c534cc25f30e5be752bc4f46736"}, - {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7913992ab836f621d06aabac118fc258b9947a775a607e1a737eb3a91c360335"}, - {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0a1c5bd2f63da4043b63888534b52c5a1fd7ae187c8ffc64cbb7ae475b9dab"}, - {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40fc98540fa5360e7ecf2c56ddf3c6e7dd04929543618fd7b5cc76e66390562"}, - {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fff65fbb7afe137bac3113827855e0204482727bddd00a806034ab0d3951d0d"}, - {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1aeae3dd2ee719074a9372c89ad94f7c581903306d76befdaca2a559f802472"}, - {file = "fonttools-4.50.0-cp310-cp310-win32.whl", hash = "sha256:e9623afa319405da33b43c85cceb0585a6f5d3a1d7c604daf4f7e1dd55c03d1f"}, - {file = "fonttools-4.50.0-cp310-cp310-win_amd64.whl", hash = "sha256:778c5f43e7e654ef7fe0605e80894930bc3a7772e2f496238e57218610140f54"}, - {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3dfb102e7f63b78c832e4539969167ffcc0375b013080e6472350965a5fe8048"}, - {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e58fe34cb379ba3d01d5d319d67dd3ce7ca9a47ad044ea2b22635cd2d1247fc"}, - {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c673ab40d15a442a4e6eb09bf007c1dda47c84ac1e2eecbdf359adacb799c24"}, - {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b3ac35cdcd1a4c90c23a5200212c1bb74fa05833cc7c14291d7043a52ca2aaa"}, - {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8844e7a2c5f7ecf977e82eb6b3014f025c8b454e046d941ece05b768be5847ae"}, - {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f849bd3c5c2249b49c98eca5aaebb920d2bfd92b3c69e84ca9bddf133e9f83f0"}, - {file = "fonttools-4.50.0-cp311-cp311-win32.whl", hash = "sha256:39293ff231b36b035575e81c14626dfc14407a20de5262f9596c2cbb199c3625"}, - {file = "fonttools-4.50.0-cp311-cp311-win_amd64.whl", hash = "sha256:c33d5023523b44d3481624f840c8646656a1def7630ca562f222eb3ead16c438"}, - {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b4a886a6dbe60100ba1cd24de962f8cd18139bd32808da80de1fa9f9f27bf1dc"}, - {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b2ca1837bfbe5eafa11313dbc7edada79052709a1fffa10cea691210af4aa1fa"}, - {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0493dd97ac8977e48ffc1476b932b37c847cbb87fd68673dee5182004906828"}, - {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77844e2f1b0889120b6c222fc49b2b75c3d88b930615e98893b899b9352a27ea"}, - {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3566bfb8c55ed9100afe1ba6f0f12265cd63a1387b9661eb6031a1578a28bad1"}, - {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:35e10ddbc129cf61775d58a14f2d44121178d89874d32cae1eac722e687d9019"}, - {file = "fonttools-4.50.0-cp312-cp312-win32.whl", hash = "sha256:cc8140baf9fa8f9b903f2b393a6c413a220fa990264b215bf48484f3d0bf8710"}, - {file = "fonttools-4.50.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ccc85fd96373ab73c59833b824d7a73846670a0cb1f3afbaee2b2c426a8f931"}, - {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e270a406219af37581d96c810172001ec536e29e5593aa40d4c01cca3e145aa6"}, - {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac2463de667233372e9e1c7e9de3d914b708437ef52a3199fdbf5a60184f190c"}, - {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47abd6669195abe87c22750dbcd366dc3a0648f1b7c93c2baa97429c4dc1506e"}, - {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:074841375e2e3d559aecc86e1224caf78e8b8417bb391e7d2506412538f21adc"}, - {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0743fd2191ad7ab43d78cd747215b12033ddee24fa1e088605a3efe80d6984de"}, - {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3d7080cce7be5ed65bee3496f09f79a82865a514863197ff4d4d177389e981b0"}, - {file = "fonttools-4.50.0-cp38-cp38-win32.whl", hash = "sha256:a467ba4e2eadc1d5cc1a11d355abb945f680473fbe30d15617e104c81f483045"}, - {file = "fonttools-4.50.0-cp38-cp38-win_amd64.whl", hash = "sha256:f77e048f805e00870659d6318fd89ef28ca4ee16a22b4c5e1905b735495fc422"}, - {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b6245eafd553c4e9a0708e93be51392bd2288c773523892fbd616d33fd2fda59"}, - {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a4062cc7e8de26f1603323ef3ae2171c9d29c8a9f5e067d555a2813cd5c7a7e0"}, - {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34692850dfd64ba06af61e5791a441f664cb7d21e7b544e8f385718430e8f8e4"}, - {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678dd95f26a67e02c50dcb5bf250f95231d455642afbc65a3b0bcdacd4e4dd38"}, - {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f2ce7b0b295fe64ac0a85aef46a0f2614995774bd7bc643b85679c0283287f9"}, - {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d346f4dc2221bfb7ab652d1e37d327578434ce559baf7113b0f55768437fe6a0"}, - {file = "fonttools-4.50.0-cp39-cp39-win32.whl", hash = "sha256:a51eeaf52ba3afd70bf489be20e52fdfafe6c03d652b02477c6ce23c995222f4"}, - {file = "fonttools-4.50.0-cp39-cp39-win_amd64.whl", hash = "sha256:8639be40d583e5d9da67795aa3eeeda0488fb577a1d42ae11a5036f18fb16d93"}, - {file = "fonttools-4.50.0-py3-none-any.whl", hash = "sha256:48fa36da06247aa8282766cfd63efff1bb24e55f020f29a335939ed3844d20d3"}, - {file = "fonttools-4.50.0.tar.gz", hash = "sha256:fa5cf61058c7dbb104c2ac4e782bf1b2016a8cf2f69de6e4dd6a865d2c969bb5"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, + {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, + {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, + {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, + {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, + {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, + {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, + {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, + {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, + {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, + {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, + {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, + {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, ] [package.extras] @@ -1931,124 +1931,166 @@ test = ["pytest"] [[package]] name = "lxml" -version = "5.2.0" +version = "5.2.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" files = [ - {file = "lxml-5.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c54f8d6160080831a76780d850302fdeb0e8d0806f661777b0714dfb55d9a08a"}, - {file = "lxml-5.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e95ae029396382a0d2e8174e4077f96befcd4a2184678db363ddc074eb4d3b2"}, - {file = "lxml-5.2.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5810fa80e64a0c689262a71af999c5735f48c0da0affcbc9041d1ef5ef3920be"}, - {file = "lxml-5.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae69524fd6a68b288574013f8fadac23cacf089c75cd3fc5b216277a445eb736"}, - {file = "lxml-5.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fadda215e32fe375d65e560b7f7e2a37c7f9c4ecee5315bb1225ca6ac9bf5838"}, - {file = "lxml-5.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:f1f164e4cc6bc646b1fc86664c3543bf4a941d45235797279b120dc740ee7af5"}, - {file = "lxml-5.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:3603a8a41097daf7672cae22cc4a860ab9ea5597f1c5371cb21beca3398b8d6a"}, - {file = "lxml-5.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3b4bb89a785f4fd60e05f3c3a526c07d0d68e3536f17f169ca13bf5b5dd75a5"}, - {file = "lxml-5.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1effc10bf782f0696e76ecfeba0720ea02c0c31d5bffb7b29ba10debd57d1c3d"}, - {file = "lxml-5.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b03531f6cd6ce4b511dcece060ca20aa5412f8db449274b44f4003f282e6272f"}, - {file = "lxml-5.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fac15090bb966719df06f0c4f8139783746d1e60e71016d8a65db2031ca41b8"}, - {file = "lxml-5.2.0-cp310-cp310-win32.whl", hash = "sha256:92bb37c96215c4b2eb26f3c791c0bf02c64dd251effa532b43ca5049000c4478"}, - {file = "lxml-5.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:b0181c22fdb89cc19e70240a850e5480817c3e815b1eceb171b3d7a3aa3e596a"}, - {file = "lxml-5.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ada8ce9e6e1d126ef60d215baaa0c81381ba5841c25f1d00a71cdafdc038bd27"}, - {file = "lxml-5.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3cefb133c859f06dab2ae63885d9f405000c4031ec516e0ed4f9d779f690d8e3"}, - {file = "lxml-5.2.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ede2a7a86a977b0c741654efaeca0af7860a9b1ae39f9268f0936246a977ee0"}, - {file = "lxml-5.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d46df6f0b1a0cda39d12c5c4615a7d92f40342deb8001c7b434d7c8c78352e58"}, - {file = "lxml-5.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2259243ee734cc736e237719037efb86603c891fd363cc7973a2d0ac8a0e3f"}, - {file = "lxml-5.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c53164f29ed3c3868787144e8ea8a399ffd7d8215f59500a20173593c19e96eb"}, - {file = "lxml-5.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:371aab9a397dcc76625ad3b02fa9b21be63406d69237b773156e7d1fc2ce0cae"}, - {file = "lxml-5.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e08784288a179b59115b5e57abf6d387528b39abb61105fe17510a199a277a40"}, - {file = "lxml-5.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c232726f7b6df5143415a06323faaa998ef8abbe1c0ed00d718755231d76f08"}, - {file = "lxml-5.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e4366e58c0508da4dee4c7c70cee657e38553d73abdffa53abbd7d743711ee11"}, - {file = "lxml-5.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c84dce8fb2e900d4fb094e76fdad34a5fd06de53e41bddc1502c146eb11abd74"}, - {file = "lxml-5.2.0-cp311-cp311-win32.whl", hash = "sha256:0947d1114e337dc2aae2fa14bbc9ed5d9ca1a0acd6d2f948df9926aef65305e9"}, - {file = "lxml-5.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1eace37a9f4a1bef0bb5c849434933fd6213008ec583c8e31ee5b8e99c7c8500"}, - {file = "lxml-5.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f2cb157e279d28c66b1c27e0948687dc31dc47d1ab10ce0cd292a8334b7de3d5"}, - {file = "lxml-5.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:53c0e56f41ef68c1ce4e96f27ecdc2df389730391a2fd45439eb3facb02d36c8"}, - {file = "lxml-5.2.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703d60e59ab45c17485c2c14b11880e4f7f0eab07134afa9007573fa5a779a5a"}, - {file = "lxml-5.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaf5e308a5e50bc0548c4fdca0117a31ec9596f8cfc96592db170bcecc71a957"}, - {file = "lxml-5.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af64df85fecd3cf3b2e792f0b5b4d92740905adfa8ce3b24977a55415f1a0c40"}, - {file = "lxml-5.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:df7dfbdef11702fd22c2eaf042d7098d17edbc62d73f2199386ad06cbe466f6d"}, - {file = "lxml-5.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7250030a7835bfd5ba6ca7d1ad483ec90f9cbc29978c5e75c1cc3e031d3c4160"}, - {file = "lxml-5.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:be5faa2d5c8c8294d770cfd09d119fb27b5589acc59635b0cf90f145dbe81dca"}, - {file = "lxml-5.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:347ec08250d5950f5b016caa3e2e13fb2cb9714fe6041d52e3716fb33c208663"}, - {file = "lxml-5.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:dc7b630c4fb428b8a40ddd0bfc4bc19de11bb3c9b031154f77360e48fe8b4451"}, - {file = "lxml-5.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ae550cbd7f229cdf2841d9b01406bcca379a5fb327b9efb53ba620a10452e835"}, - {file = "lxml-5.2.0-cp312-cp312-win32.whl", hash = "sha256:7c61ce3cdd6e6c9f4003ac118be7eb3036d0ce2afdf23929e533e54482780f74"}, - {file = "lxml-5.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f90c36ca95a44d2636bbf55a51ca30583b59b71b6547b88d954e029598043551"}, - {file = "lxml-5.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1cce2eaad7e38b985b0f91f18468dda0d6b91862d32bec945b0e46e2ffe7222e"}, - {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60a3983d32f722a8422c01e4dc4badc7a307ca55c59e2485d0e14244a52c482f"}, - {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60847dfbdfddf08a56c4eefe48234e8c1ab756c7eda4a2a7c1042666a5516564"}, - {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbe335f0d1a86391671d975a1b5e9b08bb72fba6b567c43bdc2e55ca6e6c086"}, - {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_28_aarch64.whl", hash = "sha256:3ac7c8a60b8ad51fe7bca99a634dd625d66492c502fd548dc6dc769ce7d94b6a"}, - {file = "lxml-5.2.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:73e69762cf740ac3ae81137ef9d6f15f93095f50854e233d50b29e7b8a91dbc6"}, - {file = "lxml-5.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:281ee1ffeb0ab06204dfcd22a90e9003f0bb2dab04101ad983d0b1773bc10588"}, - {file = "lxml-5.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ba3a86b0d5a5c93104cb899dff291e3ae13729c389725a876d00ef9696de5425"}, - {file = "lxml-5.2.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:356f8873b1e27b81793e30144229adf70f6d3e36e5cb7b6d289da690f4398953"}, - {file = "lxml-5.2.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2a34e74ffe92c413f197ff4967fb1611d938ee0691b762d062ef0f73814f3aa4"}, - {file = "lxml-5.2.0-cp36-cp36m-win32.whl", hash = "sha256:6f0d2b97a5a06c00c963d4542793f3e486b1ed3a957f8c19f6006ed39d104bb0"}, - {file = "lxml-5.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:35e39c6fd089ad6674eb52d93aa874d6027b3ae44d2381cca6e9e4c2e102c9c8"}, - {file = "lxml-5.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5f6e4e5a62114ae76690c4a04c5108d067442d0a41fd092e8abd25af1288c450"}, - {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93eede9bcc842f891b2267c7f0984d811940d1bc18472898a1187fe560907a99"}, - {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad364026c2cebacd7e01d1138bd53639822fefa8f7da90fc38cd0e6319a2699"}, - {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f06e4460e76468d99cc36d5b9bc6fc5f43e6662af44960e13e3f4e040aacb35"}, - {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:ca3236f31d565555139d5b00b790ed2a98ac6f0c4470c4032f8b5e5a5dba3c1a"}, - {file = "lxml-5.2.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:a9b67b850ab1d304cb706cf71814b0e0c3875287083d7ec55ee69504a9c48180"}, - {file = "lxml-5.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5261c858c390ae9a19aba96796948b6a2d56649cbd572968970dc8da2b2b2a42"}, - {file = "lxml-5.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e8359fb610c8c444ac473cfd82dae465f405ff807cabb98a9b9712bbd0028751"}, - {file = "lxml-5.2.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:f9e27841cddfaebc4e3ffbe5dbdff42891051acf5befc9f5323944b2c61cef16"}, - {file = "lxml-5.2.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:641a8da145aca67671205f3e89bfec9815138cf2fe06653c909eab42e486d373"}, - {file = "lxml-5.2.0-cp37-cp37m-win32.whl", hash = "sha256:931a3a13e0f574abce8f3152b207938a54304ccf7a6fd7dff1fdb2f6691d08af"}, - {file = "lxml-5.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:246c93e2503c710cf02c7e9869dc0258223cbefe5e8f9ecded0ac0aa07fd2bf8"}, - {file = "lxml-5.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:11acfcdf5a38cf89c48662123a5d02ae0a7d99142c7ee14ad90de5c96a9b6f06"}, - {file = "lxml-5.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:200f70b5d95fc79eb9ed7f8c4888eef4e274b9bf380b829d3d52e9ed962e9231"}, - {file = "lxml-5.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba4d02aed47c25be6775a40d55c5774327fdedba79871b7c2485e80e45750cb2"}, - {file = "lxml-5.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e283b24c14361fe9e04026a1d06c924450415491b83089951d469509900d9f32"}, - {file = "lxml-5.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:03e3962d6ad13a862dacd5b3a3ea60b4d092a550f36465234b8639311fd60989"}, - {file = "lxml-5.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6e45fd5213e5587a610b7e7c8c5319a77591ab21ead42df46bb342e21bc1418d"}, - {file = "lxml-5.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:27877732946843f4b6bfc56eb40d865653eef34ad2edeed16b015d5c29c248df"}, - {file = "lxml-5.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4d16b44ad0dd8c948129639e34c8d301ad87ebc852568ace6fe9a5ad9ce67ee1"}, - {file = "lxml-5.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b8f842df9ba26135c5414e93214e04fe0af259bb4f96a32f756f89467f7f3b45"}, - {file = "lxml-5.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c74e77df9e36c8c91157853e6cd400f6f9ca7a803ba89981bfe3f3fc7e5651ef"}, - {file = "lxml-5.2.0-cp38-cp38-win32.whl", hash = "sha256:1459a998c10a99711ac532abe5cc24ba354e4396dafef741c7797f8830712d56"}, - {file = "lxml-5.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a00f5931b7cccea775123c3c0a2513aee58afdad8728550cc970bff32280bdd2"}, - {file = "lxml-5.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ddda5ba8831f258ac7e6364be03cb27aa62f50c67fd94bc1c3b6247959cc0369"}, - {file = "lxml-5.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56835b9e9a7767202fae06310c6b67478963e535fe185bed3bf9af5b18d2b67e"}, - {file = "lxml-5.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25fef8794f0dc89f01bdd02df6a7fec4bcb2fbbe661d571e898167a83480185e"}, - {file = "lxml-5.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d44af078485c4da9a7ec460162392d49d996caf89516fa0b75ad0838047122"}, - {file = "lxml-5.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f354d62345acdf22aa3e171bd9723790324a66fafe61bfe3873b86724cf6daaa"}, - {file = "lxml-5.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6a7e0935f05e1cf1a3aa1d49a87505773b04f128660eac2a24a5594ea6b1baa7"}, - {file = "lxml-5.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:75a4117b43694c72a0d89f6c18a28dc57407bde4650927d4ef5fd384bdf6dcc7"}, - {file = "lxml-5.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:57402d6cdd8a897ce21cf8d1ff36683583c17a16322a321184766c89a1980600"}, - {file = "lxml-5.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:56591e477bea531e5e1854f5dfb59309d5708669bc921562a35fd9ca5182bdcd"}, - {file = "lxml-5.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7efbce96719aa275d49ad5357886845561328bf07e1d5ab998f4e3066c5ccf15"}, - {file = "lxml-5.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a3c39def0965e8fb5c8d50973e0c7b4ce429a2fa730f3f9068a7f4f9ce78410b"}, - {file = "lxml-5.2.0-cp39-cp39-win32.whl", hash = "sha256:5188f22c00381cb44283ecb28c8d85c2db4a3035774dd851876c8647cb809c27"}, - {file = "lxml-5.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:ed1fe80e1fcdd1205a443bddb1ad3c3135bb1cd3f36cc996a1f4aed35960fbe8"}, - {file = "lxml-5.2.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d2b339fb790fc923ae2e9345c8633e3d0064d37ea7920c027f20c8ae6f65a91f"}, - {file = "lxml-5.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06036d60fccb21e22dd167f6d0e422b9cbdf3588a7e999a33799f9cbf01e41a5"}, - {file = "lxml-5.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a1611fb9de0a269c05575c024e6d8cdf2186e3fa52b364e3b03dcad82514d57"}, - {file = "lxml-5.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:05fc3720250d221792b6e0d150afc92d20cb10c9cdaa8c8f93c2a00fbdd16015"}, - {file = "lxml-5.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:11e41ffd3cd27b0ca1c76073b27bd860f96431d9b70f383990f1827ca19f2f52"}, - {file = "lxml-5.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0382e6a3eefa3f6699b14fa77c2eb32af2ada261b75120eaf4fc028a20394975"}, - {file = "lxml-5.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be5c8e776ecbcf8c1bce71a7d90e3a3680c9ceae516cac0be08b47e9fac0ca43"}, - {file = "lxml-5.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da12b4efc93d53068888cb3b58e355b31839f2428b8f13654bd25d68b201c240"}, - {file = "lxml-5.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f8033da364bacc74aca5e319509a20bb711c8a133680ca5f35020f9eaf025"}, - {file = "lxml-5.2.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:50a26f68d090594477df8572babac64575cd5c07373f7a8319c527c8e56c0f99"}, - {file = "lxml-5.2.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:57cbadf028727705086047994d2e50124650e63ce5a035b0aa79ab50f001989f"}, - {file = "lxml-5.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8aa11638902ac23f944f16ce45c9f04c9d5d57bb2da66822abb721f4efe5fdbb"}, - {file = "lxml-5.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7150e630b879390e02121e71ceb1807f682b88342e2ea2082e2c8716cf8bd93"}, - {file = "lxml-5.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4add722393c99da4d51c8d9f3e1ddf435b30677f2d9ba9aeaa656f23c1b7b580"}, - {file = "lxml-5.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd0f25a431cd16f70ec1c47c10b413e7ddfe1ccaaddd1a7abd181e507c012374"}, - {file = "lxml-5.2.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:883e382695f346c2ea3ad96bdbdf4ca531788fbeedb4352be3a8fcd169fc387d"}, - {file = "lxml-5.2.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:80cc2b55bb6e35d3cb40936b658837eb131e9f16357241cd9ba106ae1e9c5ecb"}, - {file = "lxml-5.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:59ec2948385336e9901008fdf765780fe30f03e7fdba8090aafdbe5d1b7ea0cd"}, - {file = "lxml-5.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ddbea6e58cce1a640d9d65947f1e259423fc201c9cf9761782f355f53b7f3097"}, - {file = "lxml-5.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52d6cdea438eb7282c41c5ac00bd6d47d14bebb6e8a8d2a1c168ed9e0cacfbab"}, - {file = "lxml-5.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c556bbf88a8b667c849d326dd4dd9c6290ede5a33383ffc12b0ed17777f909d"}, - {file = "lxml-5.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:947fa8bf15d1c62c6db36c6ede9389cac54f59af27010251747f05bddc227745"}, - {file = "lxml-5.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e6cb8f7a332eaa2d876b649a748a445a38522e12f2168e5e838d1505a91cdbb7"}, - {file = "lxml-5.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:16e65223f34fd3d65259b174f0f75a4bb3d9893698e5e7d01e54cd8c5eb98d85"}, - {file = "lxml-5.2.0.tar.gz", hash = "sha256:21dc490cdb33047bc7f7ad76384f3366fa8f5146b86cc04c4af45de901393b90"}, + {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1"}, + {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1"}, + {file = "lxml-5.2.1-cp310-cp310-win32.whl", hash = "sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5"}, + {file = "lxml-5.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f"}, + {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867"}, + {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534"}, + {file = "lxml-5.2.1-cp311-cp311-win32.whl", hash = "sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be"}, + {file = "lxml-5.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102"}, + {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851"}, + {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4"}, + {file = "lxml-5.2.1-cp312-cp312-win32.whl", hash = "sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134"}, + {file = "lxml-5.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a"}, + {file = "lxml-5.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461"}, + {file = "lxml-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0"}, + {file = "lxml-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289"}, + {file = "lxml-5.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029"}, + {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af"}, + {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0"}, + {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8"}, + {file = "lxml-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd"}, + {file = "lxml-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c"}, + {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3e183c6e3298a2ed5af9d7a356ea823bccaab4ec2349dc9ed83999fd289d14d5"}, + {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637"}, + {file = "lxml-5.2.1-cp38-cp38-win32.whl", hash = "sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da"}, + {file = "lxml-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806"}, + {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd"}, + {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188"}, + {file = "lxml-5.2.1-cp39-cp39-win32.whl", hash = "sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708"}, + {file = "lxml-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704"}, + {file = "lxml-5.2.1.tar.gz", hash = "sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306"}, ] [package.extras] @@ -2153,39 +2195,39 @@ files = [ [[package]] name = "matplotlib" -version = "3.8.3" +version = "3.8.4" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.8.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cf60138ccc8004f117ab2a2bad513cc4d122e55864b4fe7adf4db20ca68a078f"}, - {file = "matplotlib-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f557156f7116be3340cdeef7f128fa99b0d5d287d5f41a16e169819dcf22357"}, - {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f386cf162b059809ecfac3bcc491a9ea17da69fa35c8ded8ad154cd4b933d5ec"}, - {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c5f96f57b0369c288bf6f9b5274ba45787f7e0589a34d24bdbaf6d3344632f"}, - {file = "matplotlib-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:83e0f72e2c116ca7e571c57aa29b0fe697d4c6425c4e87c6e994159e0c008635"}, - {file = "matplotlib-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c5c8290074ba31a41db1dc332dc2b62def469ff33766cbe325d32a3ee291aea"}, - {file = "matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900"}, - {file = "matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e"}, - {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04b36ad07eac9740fc76c2aa16edf94e50b297d6eb4c081e3add863de4bb19a7"}, - {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65"}, - {file = "matplotlib-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf5932eee0d428192c40b7eac1399d608f5d995f975cdb9d1e6b48539a5ad8d0"}, - {file = "matplotlib-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407"}, - {file = "matplotlib-3.8.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09074f8057917d17ab52c242fdf4916f30e99959c1908958b1fc6032e2d0f6d4"}, - {file = "matplotlib-3.8.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5745f6d0fb5acfabbb2790318db03809a253096e98c91b9a31969df28ee604aa"}, - {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97653d869a71721b639714b42d87cda4cfee0ee74b47c569e4874c7590c55c5"}, - {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:242489efdb75b690c9c2e70bb5c6550727058c8a614e4c7716f363c27e10bba1"}, - {file = "matplotlib-3.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:83c0653c64b73926730bd9ea14aa0f50f202ba187c307a881673bad4985967b7"}, - {file = "matplotlib-3.8.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef6c1025a570354297d6c15f7d0f296d95f88bd3850066b7f1e7b4f2f4c13a39"}, - {file = "matplotlib-3.8.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c4af3f7317f8a1009bbb2d0bf23dfaba859eb7dd4ccbd604eba146dccaaaf0a4"}, - {file = "matplotlib-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c6e00a65d017d26009bac6808f637b75ceade3e1ff91a138576f6b3065eeeba"}, - {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7b49ab49a3bea17802df6872f8d44f664ba8f9be0632a60c99b20b6db2165b7"}, - {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6728dde0a3997396b053602dbd907a9bd64ec7d5cf99e728b404083698d3ca01"}, - {file = "matplotlib-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:813925d08fb86aba139f2d31864928d67511f64e5945ca909ad5bc09a96189bb"}, - {file = "matplotlib-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:cd3a0c2be76f4e7be03d34a14d49ded6acf22ef61f88da600a18a5cd8b3c5f3c"}, - {file = "matplotlib-3.8.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fa93695d5c08544f4a0dfd0965f378e7afc410d8672816aff1e81be1f45dbf2e"}, - {file = "matplotlib-3.8.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9764df0e8778f06414b9d281a75235c1e85071f64bb5d71564b97c1306a2afc"}, - {file = "matplotlib-3.8.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5e431a09e6fab4012b01fc155db0ce6dccacdbabe8198197f523a4ef4805eb26"}, - {file = "matplotlib-3.8.3.tar.gz", hash = "sha256:7b416239e9ae38be54b028abbf9048aff5054a9aba5416bef0bd17f9162ce161"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0"}, + {file = "matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef"}, + {file = "matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71"}, + {file = "matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b"}, + {file = "matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30"}, + {file = "matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25"}, + {file = "matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9"}, + {file = "matplotlib-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54"}, + {file = "matplotlib-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94"}, + {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"}, ] [package.dependencies] @@ -2193,7 +2235,7 @@ contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" kiwisolver = ">=1.3.1" -numpy = ">=1.21,<2" +numpy = ">=1.21" packaging = ">=20.0" pillow = ">=8" pyparsing = ">=2.3.1" @@ -6975,86 +7017,86 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rubicon-objc" -version = "0.4.7" +version = "0.4.8" description = "A bridge between an Objective C runtime environment and Python." optional = false python-versions = ">=3.8" files = [ - {file = "rubicon-objc-0.4.7.tar.gz", hash = "sha256:be937d864bd1229f860defabb89b40c53634eedc36448d89ad3c14eb3286e509"}, - {file = "rubicon_objc-0.4.7-py3-none-any.whl", hash = "sha256:f37108e35d5da1a78ab3eed2d03b095934f5f618329a939e4bd2ada9894eff6e"}, + {file = "rubicon-objc-0.4.8.tar.gz", hash = "sha256:f7bede0f0e73dde07083785984c75b3acf76116298743758ea5c51b3ebb81978"}, + {file = "rubicon_objc-0.4.8-py3-none-any.whl", hash = "sha256:59633f622e3c6e740bd9b3c4b60d0258fc2d30632b05d46cba12fae69539cfd3"}, ] [package.extras] -dev = ["pre-commit (==3.5.0)", "pytest (==7.4.2)", "pytest-tldr (==0.2.5)", "setuptools-scm[toml] (==8.0.4)", "tox (==4.11.3)"] -docs = ["furo (==2023.9.10)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx (==7.2.6)", "sphinx-autobuild (==2021.3.14)", "sphinx-copybutton (==0.5.2)", "sphinx-tabs (==3.4.1)", "sphinxcontrib-spelling (==8.0.0)"] +dev = ["pre-commit (==3.5.0)", "pre-commit (==3.7.0)", "pytest (==8.1.1)", "pytest-tldr (==0.2.5)", "setuptools-scm (==8.0.4)", "tox (==4.14.2)"] +docs = ["furo (==2024.1.29)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx (==7.2.6)", "sphinx-autobuild (==2021.3.14)", "sphinx-autobuild (==2024.2.4)", "sphinx-copybutton (==0.5.2)", "sphinx-tabs (==3.4.5)", "sphinxcontrib-spelling (==8.0.0)"] [[package]] name = "ruff" -version = "0.3.4" +version = "0.3.5" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:60c870a7d46efcbc8385d27ec07fe534ac32f3b251e4fc44b3cbfd9e09609ef4"}, - {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6fc14fa742e1d8f24910e1fff0bd5e26d395b0e0e04cc1b15c7c5e5fe5b4af91"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3ee7880f653cc03749a3bfea720cf2a192e4f884925b0cf7eecce82f0ce5854"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf133dd744f2470b347f602452a88e70dadfbe0fcfb5fd46e093d55da65f82f7"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f3860057590e810c7ffea75669bdc6927bfd91e29b4baa9258fd48b540a4365"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:986f2377f7cf12efac1f515fc1a5b753c000ed1e0a6de96747cdf2da20a1b369"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fd98e85869603e65f554fdc5cddf0712e352fe6e61d29d5a6fe087ec82b76c"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64abeed785dad51801b423fa51840b1764b35d6c461ea8caef9cf9e5e5ab34d9"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df52972138318bc7546d92348a1ee58449bc3f9eaf0db278906eb511889c4b50"}, - {file = "ruff-0.3.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:98e98300056445ba2cc27d0b325fd044dc17fcc38e4e4d2c7711585bd0a958ed"}, - {file = "ruff-0.3.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:519cf6a0ebed244dce1dc8aecd3dc99add7a2ee15bb68cf19588bb5bf58e0488"}, - {file = "ruff-0.3.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bb0acfb921030d00070539c038cd24bb1df73a2981e9f55942514af8b17be94e"}, - {file = "ruff-0.3.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cf187a7e7098233d0d0c71175375c5162f880126c4c716fa28a8ac418dcf3378"}, - {file = "ruff-0.3.4-py3-none-win32.whl", hash = "sha256:af27ac187c0a331e8ef91d84bf1c3c6a5dea97e912a7560ac0cef25c526a4102"}, - {file = "ruff-0.3.4-py3-none-win_amd64.whl", hash = "sha256:de0d5069b165e5a32b3c6ffbb81c350b1e3d3483347196ffdf86dc0ef9e37dd6"}, - {file = "ruff-0.3.4-py3-none-win_arm64.whl", hash = "sha256:6810563cc08ad0096b57c717bd78aeac888a1bfd38654d9113cb3dc4d3f74232"}, - {file = "ruff-0.3.4.tar.gz", hash = "sha256:f0f4484c6541a99862b693e13a151435a279b271cff20e37101116a21e2a1ad1"}, + {file = "ruff-0.3.5-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:aef5bd3b89e657007e1be6b16553c8813b221ff6d92c7526b7e0227450981eac"}, + {file = "ruff-0.3.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:89b1e92b3bd9fca249153a97d23f29bed3992cff414b222fcd361d763fc53f12"}, + {file = "ruff-0.3.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e55771559c89272c3ebab23326dc23e7f813e492052391fe7950c1a5a139d89"}, + {file = "ruff-0.3.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dabc62195bf54b8a7876add6e789caae0268f34582333cda340497c886111c39"}, + {file = "ruff-0.3.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a05f3793ba25f194f395578579c546ca5d83e0195f992edc32e5907d142bfa3"}, + {file = "ruff-0.3.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:dfd3504e881082959b4160ab02f7a205f0fadc0a9619cc481982b6837b2fd4c0"}, + {file = "ruff-0.3.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87258e0d4b04046cf1d6cc1c56fadbf7a880cc3de1f7294938e923234cf9e498"}, + {file = "ruff-0.3.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:712e71283fc7d9f95047ed5f793bc019b0b0a29849b14664a60fd66c23b96da1"}, + {file = "ruff-0.3.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a532a90b4a18d3f722c124c513ffb5e5eaff0cc4f6d3aa4bda38e691b8600c9f"}, + {file = "ruff-0.3.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:122de171a147c76ada00f76df533b54676f6e321e61bd8656ae54be326c10296"}, + {file = "ruff-0.3.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d80a6b18a6c3b6ed25b71b05eba183f37d9bc8b16ace9e3d700997f00b74660b"}, + {file = "ruff-0.3.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a7b6e63194c68bca8e71f81de30cfa6f58ff70393cf45aab4c20f158227d5936"}, + {file = "ruff-0.3.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a759d33a20c72f2dfa54dae6e85e1225b8e302e8ac655773aff22e542a300985"}, + {file = "ruff-0.3.5-py3-none-win32.whl", hash = "sha256:9d8605aa990045517c911726d21293ef4baa64f87265896e491a05461cae078d"}, + {file = "ruff-0.3.5-py3-none-win_amd64.whl", hash = "sha256:dc56bb16a63c1303bd47563c60482a1512721053d93231cf7e9e1c6954395a0e"}, + {file = "ruff-0.3.5-py3-none-win_arm64.whl", hash = "sha256:faeeae9905446b975dcf6d4499dc93439b131f1443ee264055c5716dd947af55"}, + {file = "ruff-0.3.5.tar.gz", hash = "sha256:a067daaeb1dc2baf9b82a32dae67d154d95212080c80435eb052d95da647763d"}, ] [[package]] name = "scipy" -version = "1.12.0" +version = "1.13.0" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, - {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, - {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, - {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, - {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, - {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, - {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, - {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, - {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, - {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, - {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, - {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, - {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, - {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, - {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, - {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, - {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, - {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, - {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, - {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, - {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, - {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, - {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, - {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, - {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, -] - -[package.dependencies] -numpy = ">=1.22.4,<1.29.0" + {file = "scipy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba419578ab343a4e0a77c0ef82f088238a93eef141b2b8017e46149776dfad4d"}, + {file = "scipy-1.13.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:22789b56a999265431c417d462e5b7f2b487e831ca7bef5edeb56efe4c93f86e"}, + {file = "scipy-1.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f1432ba070e90d42d7fd836462c50bf98bd08bed0aa616c359eed8a04e3922"}, + {file = "scipy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8434f6f3fa49f631fae84afee424e2483289dfc30a47755b4b4e6b07b2633a4"}, + {file = "scipy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dcbb9ea49b0167de4167c40eeee6e167caeef11effb0670b554d10b1e693a8b9"}, + {file = "scipy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:1d2f7bb14c178f8b13ebae93f67e42b0a6b0fc50eba1cd8021c9b6e08e8fb1cd"}, + {file = "scipy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fbcf8abaf5aa2dc8d6400566c1a727aed338b5fe880cde64907596a89d576fa"}, + {file = "scipy-1.13.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5e4a756355522eb60fcd61f8372ac2549073c8788f6114449b37e9e8104f15a5"}, + {file = "scipy-1.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5acd8e1dbd8dbe38d0004b1497019b2dbbc3d70691e65d69615f8a7292865d7"}, + {file = "scipy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ff7dad5d24a8045d836671e082a490848e8639cabb3dbdacb29f943a678683d"}, + {file = "scipy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4dca18c3ffee287ddd3bc8f1dabaf45f5305c5afc9f8ab9cbfab855e70b2df5c"}, + {file = "scipy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:a2f471de4d01200718b2b8927f7d76b5d9bde18047ea0fa8bd15c5ba3f26a1d6"}, + {file = "scipy-1.13.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0de696f589681c2802f9090fff730c218f7c51ff49bf252b6a97ec4a5d19e8b"}, + {file = "scipy-1.13.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:b2a3ff461ec4756b7e8e42e1c681077349a038f0686132d623fa404c0bee2551"}, + {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf9fe63e7a4bf01d3645b13ff2aa6dea023d38993f42aaac81a18b1bda7a82a"}, + {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e7626dfd91cdea5714f343ce1176b6c4745155d234f1033584154f60ef1ff42"}, + {file = "scipy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:109d391d720fcebf2fbe008621952b08e52907cf4c8c7efc7376822151820820"}, + {file = "scipy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8930ae3ea371d6b91c203b1032b9600d69c568e537b7988a3073dfe4d4774f21"}, + {file = "scipy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5407708195cb38d70fd2d6bb04b1b9dd5c92297d86e9f9daae1576bd9e06f602"}, + {file = "scipy-1.13.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ac38c4c92951ac0f729c4c48c9e13eb3675d9986cc0c83943784d7390d540c78"}, + {file = "scipy-1.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c74543c4fbeb67af6ce457f6a6a28e5d3739a87f62412e4a16e46f164f0ae5"}, + {file = "scipy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28e286bf9ac422d6beb559bc61312c348ca9b0f0dae0d7c5afde7f722d6ea13d"}, + {file = "scipy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33fde20efc380bd23a78a4d26d59fc8704e9b5fd9b08841693eb46716ba13d86"}, + {file = "scipy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:45c08bec71d3546d606989ba6e7daa6f0992918171e2a6f7fbedfa7361c2de1e"}, + {file = "scipy-1.13.0.tar.gz", hash = "sha256:58569af537ea29d3f78e5abd18398459f195546bb3be23d16677fb26616cc11e"}, +] + +[package.dependencies] +numpy = ">=1.22.4,<2.3" [package.extras] -dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] +test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scons" @@ -7090,13 +7132,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.44.0" +version = "1.44.1" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.44.0.tar.gz", hash = "sha256:f7125a9235795811962d52ff796dc032cd1d0dd98b59beaced8380371cd9c13c"}, - {file = "sentry_sdk-1.44.0-py2.py3-none-any.whl", hash = "sha256:eb65289da013ca92fad2694851ad2f086aa3825e808dc285bd7dcaf63602bb18"}, + {file = "sentry-sdk-1.44.1.tar.gz", hash = "sha256:24e6a53eeabffd2f95d952aa35ca52f0f4201d17f820ac9d3ff7244c665aaf68"}, + {file = "sentry_sdk-1.44.1-py2.py3-none-any.whl", hash = "sha256:5f75eb91d8ab6037c754a87b8501cc581b2827e923682f593bed3539ce5b3999"}, ] [package.dependencies] @@ -7659,13 +7701,13 @@ telegram = ["requests"] [[package]] name = "types-requests" -version = "2.31.0.20240311" +version = "2.31.0.20240406" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.31.0.20240311.tar.gz", hash = "sha256:b1c1b66abfb7fa79aae09097a811c4aa97130eb8831c60e47aee4ca344731ca5"}, - {file = "types_requests-2.31.0.20240311-py3-none-any.whl", hash = "sha256:47872893d65a38e282ee9f277a4ee50d1b28bd592040df7d1fdaffdf3779937d"}, + {file = "types-requests-2.31.0.20240406.tar.gz", hash = "sha256:4428df33c5503945c74b3f42e82b181e86ec7b724620419a2966e2de604ce1a1"}, + {file = "types_requests-2.31.0.20240406-py3-none-any.whl", hash = "sha256:6216cdac377c6b9a040ac1c0404f7284bd13199c0e1bb235f4324627e8898cf5"}, ] [package.dependencies] @@ -7684,13 +7726,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.10.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] From 325dab639333dac36ca2115a97a56e1d43a556e6 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 8 Apr 2024 11:51:12 -0700 Subject: [PATCH 211/384] [bot] Fingerprints: add missing FW versions from new users (#32115) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index e4a4bcdfa4..6f8d6474e2 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -487,6 +487,7 @@ FW_VERSIONS = { b'68552790AA', b'68552791AB', b'68552794AA', + b'68552794AD', b'68585106AB', b'68585107AB', b'68585108AB', @@ -496,6 +497,7 @@ FW_VERSIONS = { (Ecu.engine, 0x7e0, None): [ b'05035699AG ', b'05035841AC ', + b'05035841AD ', b'05036026AB ', b'05036065AE ', b'05036066AE ', From 354cbe5a26502bf08370d5386400c0efb72fc9e9 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 9 Apr 2024 02:59:17 +0800 Subject: [PATCH 212/384] replay: use `clock_nanosleep` for precise waiting on the scale of nanoseconds (#32125) use clock_nanosleep --- tools/replay/util.cc | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/tools/replay/util.cc b/tools/replay/util.cc index b4f72d0530..acc018fdb4 100644 --- a/tools/replay/util.cc +++ b/tools/replay/util.cc @@ -304,20 +304,11 @@ std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic } void precise_nano_sleep(long sleep_ns) { - const long estimate_ns = 1 * 1e6; // 1ms - struct timespec req = {.tv_nsec = estimate_ns}; - uint64_t start_sleep = nanos_since_boot(); - while (sleep_ns > estimate_ns) { - nanosleep(&req, nullptr); - uint64_t end_sleep = nanos_since_boot(); - sleep_ns -= (end_sleep - start_sleep); - start_sleep = end_sleep; - } - // spin wait - if (sleep_ns > 0) { - while ((nanos_since_boot() - start_sleep) <= sleep_ns) { - std::this_thread::yield(); - } + struct timespec req = {.tv_sec = 0, .tv_nsec = sleep_ns}; + struct timespec rem = {}; + while (clock_nanosleep(CLOCK_MONOTONIC, 0, &req, &rem) && errno == EINTR) { + // Retry sleep if interrupted by a signal + req = rem; } } From 1788ecf7b1281e6b3d4325226860a513a0f6eab8 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 8 Apr 2024 12:25:33 -0700 Subject: [PATCH 213/384] unsparsify the agnos casync images (#32126) unsparse --- release/create_casync_agnos_release.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/release/create_casync_agnos_release.py b/release/create_casync_agnos_release.py index 2dff1f515d..c7f34ab154 100644 --- a/release/create_casync_agnos_release.py +++ b/release/create_casync_agnos_release.py @@ -3,7 +3,7 @@ import json import pathlib import tempfile from openpilot.common.basedir import BASEDIR -from openpilot.system.hardware.tici.agnos import StreamingDecompressor +from openpilot.system.hardware.tici.agnos import StreamingDecompressor, unsparsify, noop from openpilot.system.updated.casync.common import create_casync_from_file @@ -31,22 +31,15 @@ if __name__ == "__main__": print(f"creating casync agnos build from {entry}") downloader = StreamingDecompressor(entry['url']) - CHUNK_SIZE=16*1024*1024 # 16mb + parse_func = unsparsify if entry['sparse'] else noop + + parsed_chunks = parse_func(downloader) size = entry["size"] cur = 0 with open(entry_path, "wb") as f: - while True: - to_read = min((size - cur), CHUNK_SIZE) - - print(f"{cur/size*100:06.2f}% {to_read}") - - if not to_read: - break - - f.write(downloader.read(to_read)) - - cur += to_read + for chunk in parsed_chunks: + f.write(chunk) create_casync_from_file(entry_path, output_dir, f"agnos-{args.version}-{entry['name']}") From 3c9bf992a5998dde51e626ddd6998611011e44ef Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 8 Apr 2024 14:05:18 -0700 Subject: [PATCH 214/384] more helpers for e2e testing updated (#32128) casync test prereq --- selfdrive/test/helpers.py | 12 ++++++ selfdrive/updated/tests/test_base.py | 56 +++++++++++++++------------- selfdrive/updated/tests/test_git.py | 4 +- system/updated/common.py | 16 ++++++++ 4 files changed, 60 insertions(+), 28 deletions(-) create mode 100644 system/updated/common.py diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index 43eadd38f4..ce8918aec3 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -118,6 +118,18 @@ def with_http_server(func, handler=http.server.BaseHTTPRequestHandler, setup=Non def DirectoryHttpServer(directory) -> type[http.server.SimpleHTTPRequestHandler]: # creates an http server that serves files from directory class Handler(http.server.SimpleHTTPRequestHandler): + API_NO_RESPONSE = False + API_BAD_RESPONSE = False + + def do_GET(self): + if self.API_NO_RESPONSE: + return + + if self.API_BAD_RESPONSE: + self.send_response(500, "") + return + super().do_GET() + def __init__(self, *args, **kwargs): super().__init__(*args, directory=str(directory), **kwargs) diff --git a/selfdrive/updated/tests/test_base.py b/selfdrive/updated/tests/test_base.py index 1d81459883..1107a2d3b1 100644 --- a/selfdrive/updated/tests/test_base.py +++ b/selfdrive/updated/tests/test_base.py @@ -15,10 +15,11 @@ from openpilot.selfdrive.manager.process import ManagerProcess from openpilot.selfdrive.test.helpers import processes_context from openpilot.common.params import Params +from openpilot.system.updated.common import get_consistent_flag def run(args, **kwargs): - return subprocess.run(args, **kwargs, check=True) + return subprocess.check_output(args, **kwargs) def update_release(directory, name, version, agnos_version, release_notes): @@ -47,11 +48,6 @@ def get_version(path: str) -> str: return f.read().split('"')[1] -def get_consistent_flag(path: str) -> bool: - consistent_file = pathlib.Path(os.path.join(path, ".overlay_consistent")) - return consistent_file.is_file() - - @pytest.mark.slow # TODO: can we test overlayfs in GHA? class BaseUpdateTest(unittest.TestCase): @classmethod @@ -112,20 +108,20 @@ class BaseUpdateTest(unittest.TestCase): except Exception: print("cleanup failed...") - def send_check_for_updates_signal(self, updated: ManagerProcess): - updated.signal(signal.SIGUSR1.value) + def wait_for_condition(self, condition, timeout=12): + start = time.monotonic() + while True: + waited = time.monotonic() - start + if condition(): + print(f"waited {waited}s for condition ") + return waited - def send_download_signal(self, updated: ManagerProcess): - updated.signal(signal.SIGHUP.value) + if waited > timeout: + raise TimeoutError("timed out waiting for condition") - def _test_params(self, branch, fetch_available, update_available): - self.assertEqual(self.params.get("UpdaterTargetBranch", encoding="utf-8"), branch) - self.assertEqual(self.params.get_bool("UpdaterFetchAvailable"), fetch_available) - self.assertEqual(self.params.get_bool("UpdateAvailable"), update_available) + time.sleep(1) def _test_finalized_update(self, branch, version, agnos_version, release_notes): - self.assertTrue(self.params.get("UpdaterNewDescription", encoding="utf-8").startswith(f"{version} / {branch}")) - self.assertEqual(self.params.get("UpdaterNewReleaseNotes", encoding="utf-8"), f"

{release_notes}

\n") self.assertEqual(get_version(str(self.staging_root / "finalized")), version) self.assertEqual(get_consistent_flag(str(self.staging_root / "finalized")), True) self.assertTrue(os.access(str(self.staging_root / "finalized" / "launch_env.sh"), os.X_OK)) @@ -133,22 +129,30 @@ class BaseUpdateTest(unittest.TestCase): with open(self.staging_root / "finalized" / "test_symlink") as f: self.assertIn(version, f.read()) - def wait_for_condition(self, condition, timeout=12): - start = time.monotonic() - while True: - waited = time.monotonic() - start - if condition(): - print(f"waited {waited}s for condition ") - return waited +class ParamsBaseUpdateTest(BaseUpdateTest): + def _test_finalized_update(self, branch, version, agnos_version, release_notes): + self.assertTrue(self.params.get("UpdaterNewDescription", encoding="utf-8").startswith(f"{version} / {branch}")) + self.assertEqual(self.params.get("UpdaterNewReleaseNotes", encoding="utf-8"), f"

{release_notes}

\n") + super()._test_finalized_update(branch, version, agnos_version, release_notes) - if waited > timeout: - raise TimeoutError("timed out waiting for condition") + def send_check_for_updates_signal(self, updated: ManagerProcess): + updated.signal(signal.SIGUSR1.value) - time.sleep(1) + def send_download_signal(self, updated: ManagerProcess): + updated.signal(signal.SIGHUP.value) + + def _test_params(self, branch, fetch_available, update_available): + self.assertEqual(self.params.get("UpdaterTargetBranch", encoding="utf-8"), branch) + self.assertEqual(self.params.get_bool("UpdaterFetchAvailable"), fetch_available) + self.assertEqual(self.params.get_bool("UpdateAvailable"), update_available) def wait_for_idle(self): self.wait_for_condition(lambda: self.params.get("UpdaterState", encoding="utf-8") == "idle") + def wait_for_failed(self): + self.wait_for_condition(lambda: self.params.get("UpdateFailedCount", encoding="utf-8") is not None and \ + int(self.params.get("UpdateFailedCount", encoding="utf-8")) > 0) + def wait_for_fetch_available(self): self.wait_for_condition(lambda: self.params.get_bool("UpdaterFetchAvailable")) diff --git a/selfdrive/updated/tests/test_git.py b/selfdrive/updated/tests/test_git.py index 1a9c78242d..51ea77fb81 100644 --- a/selfdrive/updated/tests/test_git.py +++ b/selfdrive/updated/tests/test_git.py @@ -1,8 +1,8 @@ import contextlib -from openpilot.selfdrive.updated.tests.test_base import BaseUpdateTest, run, update_release +from openpilot.selfdrive.updated.tests.test_base import ParamsBaseUpdateTest, run, update_release -class TestUpdateDGitStrategy(BaseUpdateTest): +class TestUpdateDGitStrategy(ParamsBaseUpdateTest): def update_remote_release(self, release): update_release(self.remote_dir, release, *self.MOCK_RELEASES[release]) run(["git", "add", "."], cwd=self.remote_dir) diff --git a/system/updated/common.py b/system/updated/common.py new file mode 100644 index 0000000000..6bb745f6b0 --- /dev/null +++ b/system/updated/common.py @@ -0,0 +1,16 @@ +import os +import pathlib + + +def get_consistent_flag(path: str) -> bool: + consistent_file = pathlib.Path(os.path.join(path, ".overlay_consistent")) + return consistent_file.is_file() + +def set_consistent_flag(path: str, consistent: bool) -> None: + os.sync() + consistent_file = pathlib.Path(os.path.join(path, ".overlay_consistent")) + if consistent: + consistent_file.touch() + elif not consistent: + consistent_file.unlink(missing_ok=True) + os.sync() From 5352d6c7ab5381047349f95edb2c0941b86eb8a4 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 8 Apr 2024 14:18:36 -0700 Subject: [PATCH 215/384] Honda: remove combination meter (#32127) remove combination meter --- selfdrive/car/honda/fingerprints.py | 292 ---------------------------- selfdrive/car/honda/values.py | 3 +- 2 files changed, 1 insertion(+), 294 deletions(-) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index c1714fe810..cae5c44bc9 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -121,52 +121,6 @@ FW_VERSIONS = { b'77959-TWA-L420\x00\x00', b'77959-TWB-H220\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TBX-H310\x00\x00', - b'78109-TVA-A010\x00\x00', - b'78109-TVA-A020\x00\x00', - b'78109-TVA-A030\x00\x00', - b'78109-TVA-A110\x00\x00', - b'78109-TVA-A120\x00\x00', - b'78109-TVA-A130\x00\x00', - b'78109-TVA-A210\x00\x00', - b'78109-TVA-A220\x00\x00', - b'78109-TVA-A230\x00\x00', - b'78109-TVA-A310\x00\x00', - b'78109-TVA-C010\x00\x00', - b'78109-TVA-C130\x00\x00', - b'78109-TVA-L010\x00\x00', - b'78109-TVA-L210\x00\x00', - b'78109-TVA-R310\x00\x00', - b'78109-TVC-A010\x00\x00', - b'78109-TVC-A020\x00\x00', - b'78109-TVC-A030\x00\x00', - b'78109-TVC-A110\x00\x00', - b'78109-TVC-A130\x00\x00', - b'78109-TVC-A210\x00\x00', - b'78109-TVC-A220\x00\x00', - b'78109-TVC-A230\x00\x00', - b'78109-TVC-C010\x00\x00', - b'78109-TVC-C110\x00\x00', - b'78109-TVC-L010\x00\x00', - b'78109-TVC-L210\x00\x00', - b'78109-TVC-M510\x00\x00', - b'78109-TVC-YF10\x00\x00', - b'78109-TVE-H610\x00\x00', - b'78109-TWA-A010\x00\x00', - b'78109-TWA-A020\x00\x00', - b'78109-TWA-A030\x00\x00', - b'78109-TWA-A110\x00\x00', - b'78109-TWA-A120\x00\x00', - b'78109-TWA-A130\x00\x00', - b'78109-TWA-A210\x00\x00', - b'78109-TWA-A220\x00\x00', - b'78109-TWA-A230\x00\x00', - b'78109-TWA-A610\x00\x00', - b'78109-TWA-H210\x00\x00', - b'78109-TWA-L010\x00\x00', - b'78109-TWA-L210\x00\x00', - ], (Ecu.hud, 0x18da61f1, None): [ b'78209-TVA-A010\x00\x00', b'78209-TVA-A110\x00\x00', @@ -271,25 +225,6 @@ FW_VERSIONS = { b'77959-TBG-A030\x00\x00', b'77959-TEA-Q820\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TBA-A510\x00\x00', - b'78109-TBA-A520\x00\x00', - b'78109-TBA-A530\x00\x00', - b'78109-TBA-C310\x00\x00', - b'78109-TBA-C520\x00\x00', - b'78109-TBC-A310\x00\x00', - b'78109-TBC-A320\x00\x00', - b'78109-TBC-A510\x00\x00', - b'78109-TBC-A520\x00\x00', - b'78109-TBC-A530\x00\x00', - b'78109-TBC-C510\x00\x00', - b'78109-TBC-C520\x00\x00', - b'78109-TBC-C530\x00\x00', - b'78109-TBH-A510\x00\x00', - b'78109-TBH-A530\x00\x00', - b'78109-TED-Q510\x00\x00', - b'78109-TEG-A310\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36161-TBA-A020\x00\x00', b'36161-TBA-A030\x00\x00', @@ -420,40 +355,6 @@ FW_VERSIONS = { b'77959-TGG-J320\x00\x00', b'77959-TGG-Z820\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TBA-A110\x00\x00', - b'78109-TBA-A910\x00\x00', - b'78109-TBA-C340\x00\x00', - b'78109-TBA-C910\x00\x00', - b'78109-TBC-A740\x00\x00', - b'78109-TBC-C540\x00\x00', - b'78109-TBG-A110\x00\x00', - b'78109-TBH-A710\x00\x00', - b'78109-TEG-A720\x00\x00', - b'78109-TFJ-G020\x00\x00', - b'78109-TGG-9020\x00\x00', - b'78109-TGG-A210\x00\x00', - b'78109-TGG-A220\x00\x00', - b'78109-TGG-A310\x00\x00', - b'78109-TGG-A320\x00\x00', - b'78109-TGG-A330\x00\x00', - b'78109-TGG-A610\x00\x00', - b'78109-TGG-A620\x00\x00', - b'78109-TGG-A810\x00\x00', - b'78109-TGG-A820\x00\x00', - b'78109-TGG-C010\x00\x00', - b'78109-TGG-C220\x00\x00', - b'78109-TGG-E110\x00\x00', - b'78109-TGG-G030\x00\x00', - b'78109-TGG-G230\x00\x00', - b'78109-TGG-G410\x00\x00', - b'78109-TGK-Z410\x00\x00', - b'78109-TGL-G120\x00\x00', - b'78109-TGL-G130\x00\x00', - b'78109-TGL-G210\x00\x00', - b'78109-TGL-G230\x00\x00', - b'78109-TGL-GM10\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36802-TBA-A150\x00\x00', b'36802-TBA-A160\x00\x00', @@ -509,10 +410,6 @@ FW_VERSIONS = { b'77959-TFK-G210\x00\x00', b'77959-TGN-G220\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TFK-G020\x00\x00', - b'78109-TGN-G120\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36802-TFK-G130\x00\x00', b'36802-TGN-G130\x00\x00', @@ -537,11 +434,6 @@ FW_VERSIONS = { (Ecu.srs, 0x18da53f1, None): [ b'77959-T0A-A230\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-T1W-A210\x00\x00', - b'78109-T1W-C210\x00\x00', - b'78109-T1X-A210\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36161-T1W-A830\x00\x00', b'36161-T1W-C830\x00\x00', @@ -622,25 +514,6 @@ FW_VERSIONS = { b'46114-TLA-A930\x00\x00', b'46114-TMC-U020\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TLA-A020\x00\x00', - b'78109-TLA-A110\x00\x00', - b'78109-TLA-A120\x00\x00', - b'78109-TLA-A210\x00\x00', - b'78109-TLA-A220\x00\x00', - b'78109-TLA-C020\x00\x00', - b'78109-TLA-C110\x00\x00', - b'78109-TLA-C210\x00\x00', - b'78109-TLA-C310\x00\x00', - b'78109-TLB-A020\x00\x00', - b'78109-TLB-A110\x00\x00', - b'78109-TLB-A120\x00\x00', - b'78109-TLB-A210\x00\x00', - b'78109-TLB-A220\x00\x00', - b'78109-TMC-Q210\x00\x00', - b'78109-TMM-F210\x00\x00', - b'78109-TMM-M110\x00\x00', - ], (Ecu.gateway, 0x18daeff1, None): [ b'38897-TLA-A010\x00\x00', b'38897-TLA-A110\x00\x00', @@ -695,10 +568,6 @@ FW_VERSIONS = { b'28101-5LH-E120\x00\x00', b'28103-5LH-E100\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-T1B-3050\x00\x00', - b'78109-T1V-G020\x00\x00', - ], (Ecu.srs, 0x18da53f1, None): [ b'77959-T1G-G940\x00\x00', ], @@ -729,12 +598,6 @@ FW_VERSIONS = { b'36161-TPG-A030\x00\x00', b'36161-TPG-A040\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TMB-H220\x00\x00', - b'78109-TPA-G520\x00\x00', - b'78109-TPG-A110\x00\x00', - b'78109-TPG-A210\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36802-TMB-H040\x00\x00', b'36802-TPA-E040\x00\x00', @@ -760,12 +623,6 @@ FW_VERSIONS = { (Ecu.gateway, 0x18daeff1, None): [ b'38897-T5A-J010\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-T5A-A210\x00\x00', - b'78109-T5A-A410\x00\x00', - b'78109-T5A-A420\x00\x00', - b'78109-T5A-A910\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36161-T5R-A040\x00\x00', b'36161-T5R-A240\x00\x00', @@ -787,10 +644,6 @@ FW_VERSIONS = { b'57114-TDK-J120\x00\x00', b'57114-TDK-J330\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TDK-J310\x00\x00', - b'78109-TDK-J320\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36161-TDK-J070\x00\x00', b'36161-TDK-J080\x00\x00', @@ -863,39 +716,6 @@ FW_VERSIONS = { b'57114-THR-A040\x00\x00', b'57114-THR-A110\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-THR-A220\x00\x00', - b'78109-THR-A230\x00\x00', - b'78109-THR-A420\x00\x00', - b'78109-THR-A430\x00\x00', - b'78109-THR-A720\x00\x00', - b'78109-THR-A730\x00\x00', - b'78109-THR-A820\x00\x00', - b'78109-THR-A830\x00\x00', - b'78109-THR-AB20\x00\x00', - b'78109-THR-AB30\x00\x00', - b'78109-THR-AB40\x00\x00', - b'78109-THR-AC20\x00\x00', - b'78109-THR-AC30\x00\x00', - b'78109-THR-AC40\x00\x00', - b'78109-THR-AC50\x00\x00', - b'78109-THR-AD30\x00\x00', - b'78109-THR-AE20\x00\x00', - b'78109-THR-AE30\x00\x00', - b'78109-THR-AE40\x00\x00', - b'78109-THR-AK10\x00\x00', - b'78109-THR-AL10\x00\x00', - b'78109-THR-AN10\x00\x00', - b'78109-THR-C220\x00\x00', - b'78109-THR-C320\x00\x00', - b'78109-THR-C330\x00\x00', - b'78109-THR-CE20\x00\x00', - b'78109-THR-CL10\x00\x00', - b'78109-THR-DA20\x00\x00', - b'78109-THR-DA30\x00\x00', - b'78109-THR-DA40\x00\x00', - b'78109-THR-K120\x00\x00', - ], (Ecu.shiftByWire, 0x18da0bf1, None): [ b'54008-THR-A020\x00\x00', ], @@ -907,9 +727,6 @@ FW_VERSIONS = { (Ecu.gateway, 0x18daeff1, None): [ b'38897-T6A-J010\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-T6A-F310\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36161-T6A-P040\x00\x00', ], @@ -1015,44 +832,6 @@ FW_VERSIONS = { b'77959-TGS-A010\x00\x00', b'77959-TGS-A110\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TG7-A040\x00\x00', - b'78109-TG7-A050\x00\x00', - b'78109-TG7-A420\x00\x00', - b'78109-TG7-A520\x00\x00', - b'78109-TG7-A720\x00\x00', - b'78109-TG7-AJ10\x00\x00', - b'78109-TG7-AJ20\x00\x00', - b'78109-TG7-AK10\x00\x00', - b'78109-TG7-AK20\x00\x00', - b'78109-TG7-AM20\x00\x00', - b'78109-TG7-AP10\x00\x00', - b'78109-TG7-AP20\x00\x00', - b'78109-TG7-AS20\x00\x00', - b'78109-TG7-AT20\x00\x00', - b'78109-TG7-AU20\x00\x00', - b'78109-TG7-AW20\x00\x00', - b'78109-TG7-AX20\x00\x00', - b'78109-TG7-D020\x00\x00', - b'78109-TG7-DJ10\x00\x00', - b'78109-TG7-YK20\x00\x00', - b'78109-TG8-A420\x00\x00', - b'78109-TG8-A520\x00\x00', - b'78109-TG8-AJ10\x00\x00', - b'78109-TG8-AJ20\x00\x00', - b'78109-TG8-AK20\x00\x00', - b'78109-TG8-AS20\x00\x00', - b'78109-TGS-AB10\x00\x00', - b'78109-TGS-AC10\x00\x00', - b'78109-TGS-AD10\x00\x00', - b'78109-TGS-AJ20\x00\x00', - b'78109-TGS-AK20\x00\x00', - b'78109-TGS-AP20\x00\x00', - b'78109-TGS-AT20\x00\x00', - b'78109-TGS-AX20\x00\x00', - b'78109-TGT-AJ20\x00\x00', - b'78109-TGT-AK30\x00\x00', - ], (Ecu.vsa, 0x18da28f1, None): [ b'57114-TG7-A130\x00\x00', b'57114-TG7-A140\x00\x00', @@ -1083,12 +862,6 @@ FW_VERSIONS = { b'77959-TX4-C010\x00\x00', b'77959-TX4-C020\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TX4-A210\x00\x00', - b'78109-TX4-A310\x00\x00', - b'78109-TX5-A210\x00\x00', - b'78109-TX5-A310\x00\x00', - ], }, CAR.ACURA_RDX_3G: { (Ecu.programmedFuelInjection, 0x18da10f1, None): [ @@ -1138,24 +911,6 @@ FW_VERSIONS = { b'28102-5YL-A700\x00\x00', b'28102-5YL-A711\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TJB-A140\x00\x00', - b'78109-TJB-A240\x00\x00', - b'78109-TJB-A420\x00\x00', - b'78109-TJB-AB10\x00\x00', - b'78109-TJB-AD10\x00\x00', - b'78109-TJB-AF10\x00\x00', - b'78109-TJB-AQ20\x00\x00', - b'78109-TJB-AR10\x00\x00', - b'78109-TJB-AS10\x00\x00', - b'78109-TJB-AU10\x00\x00', - b'78109-TJB-AW10\x00\x00', - b'78109-TJC-A240\x00\x00', - b'78109-TJC-A420\x00\x00', - b'78109-TJC-AA10\x00\x00', - b'78109-TJC-AD10\x00\x00', - b'78109-TJC-AF10\x00\x00', - ], (Ecu.srs, 0x18da53f1, None): [ b'77959-TJB-A040\x00\x00', b'77959-TJB-A120\x00\x00', @@ -1200,18 +955,6 @@ FW_VERSIONS = { b'38897-T6Z-A010\x00\x00', b'38897-T6Z-A110\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78108-T6Z-AF10\x00\x00', - b'78109-T6Z-A420\x00\x00', - b'78109-T6Z-A510\x00\x00', - b'78109-T6Z-A710\x00\x00', - b'78109-T6Z-A810\x00\x00', - b'78109-T6Z-A910\x00\x00', - b'78109-T6Z-AA10\x00\x00', - b'78109-T6Z-C620\x00\x00', - b'78109-T6Z-C910\x00\x00', - b'78109-TJZ-A510\x00\x00', - ], (Ecu.srs, 0x18da53f1, None): [ b'77959-T6Z-A020\x00\x00', ], @@ -1248,13 +991,6 @@ FW_VERSIONS = { (Ecu.gateway, 0x18daeff1, None): [ b'38897-TXM-A020\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-TXM-A010\x00\x00', - b'78109-TXM-A020\x00\x00', - b'78109-TXM-A030\x00\x00', - b'78109-TXM-A110\x00\x00', - b'78109-TXM-C010\x00\x00', - ], }, CAR.HONDA_HRV: { (Ecu.gateway, 0x18daeff1, None): [ @@ -1273,14 +1009,6 @@ FW_VERSIONS = { (Ecu.srs, 0x18da53f1, None): [ b'77959-T7A-A230\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-THW-A110\x00\x00', - b'78109-THX-A110\x00\x00', - b'78109-THX-A120\x00\x00', - b'78109-THX-A210\x00\x00', - b'78109-THX-A220\x00\x00', - b'78109-THX-C220\x00\x00', - ], }, CAR.HONDA_HRV_3G: { (Ecu.eps, 0x18da30f1, None): [ @@ -1292,9 +1020,6 @@ FW_VERSIONS = { (Ecu.srs, 0x18da53f1, None): [ b'77959-3V0-A820\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78108-3V1-A220\x00\x00', - ], (Ecu.vsa, 0x18da28f1, None): [ b'57114-3W0-A040\x00\x00', ], @@ -1320,11 +1045,6 @@ FW_VERSIONS = { b'77959-TX6-A230\x00\x00', b'77959-TX6-C210\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78109-T3R-A120\x00\x00', - b'78109-T3R-A410\x00\x00', - b'78109-TV9-A510\x00\x00', - ], }, CAR.HONDA_E: { (Ecu.eps, 0x18da30f1, None): [ @@ -1339,9 +1059,6 @@ FW_VERSIONS = { (Ecu.srs, 0x18da53f1, None): [ b'77959-TYF-G430\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78108-TYF-G610\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36802-TYF-E030\x00\x00', ], @@ -1373,15 +1090,6 @@ FW_VERSIONS = { b'77959-T47-A940\x00\x00', b'77959-T47-A950\x00\x00', ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - b'78108-T21-A220\x00\x00', - b'78108-T21-A230\x00\x00', - b'78108-T21-A620\x00\x00', - b'78108-T21-A740\x00\x00', - b'78108-T21-MB10\x00\x00', - b'78108-T22-A020\x00\x00', - b'78108-T23-A110\x00\x00', - ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36161-T20-A060\x00\x00', b'36161-T20-A070\x00\x00', diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 4b0745a7cc..79a76ee2ac 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -307,8 +307,6 @@ FW_QUERY_CONFIG = FwQueryConfig( Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E], Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT], - Ecu.combinationMeter: [CAR.ACURA_ILX, CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_FIT, - CAR.HONDA_HRV, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY_CHN], Ecu.gateway: [CAR.ACURA_ILX, CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_FIT, CAR.HONDA_FREED, CAR.HONDA_HRV, CAR.HONDA_RIDGELINE, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_PILOT], @@ -319,6 +317,7 @@ FW_QUERY_CONFIG = FwQueryConfig( Ecu.hud: [CAR.HONDA_ACCORD], }, extra_ecus=[ + (Ecu.combinationMeter, 0x18da60f1, None), # The only other ECU on PT bus accessible by camera on radarless Civic # This is likely a manufacturer-specific sub-address implementation: the camera responds to this and 0x18dab0f1 # Unclear what the part number refers to: 8S103 is 'Camera Set Mono', while 36160 is 'Camera Monocular - Honda' From db10f9be640a858674cedb79937049d1bafc05f3 Mon Sep 17 00:00:00 2001 From: kesteve <33303520+kesteve@users.noreply.github.com> Date: Tue, 9 Apr 2024 06:29:09 +0800 Subject: [PATCH 216/384] Update Fingerprints for Kia Carnival 2023 in Taiwan (#32064) This is the 8 seater Kia Carnival (2023 Premium version) in Taiwan. Co-authored-by: Shane Smiskol --- selfdrive/car/hyundai/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index c693e71d1c..f3704524fc 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1080,6 +1080,7 @@ FW_VERSIONS = { }, CAR.KIA_CARNIVAL_4TH_GEN: { (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00KA4 MFC AT EUR LHD 1.00 1.06 99210-R0000 220221', b'\xf1\x00KA4 MFC AT KOR LHD 1.00 1.06 99210-R0000 220221', b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.00 99210-R0100 230105', b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.05 99210-R0000 201221', @@ -1087,6 +1088,7 @@ FW_VERSIONS = { b'\xf1\x00KA4CMFC AT CHN LHD 1.00 1.01 99211-I4000 210525', ], (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00KA4_ SCC F-CUP 1.00 1.03 99110-R0000 ', b'\xf1\x00KA4_ SCC FHCUP 1.00 1.00 99110-R0100 ', b'\xf1\x00KA4_ SCC FHCUP 1.00 1.03 99110-R0000 ', b'\xf1\x00KA4c SCC FHCUP 1.00 1.01 99110-I4000 ', From 16a473b3aadabfa9f9d0fa3988efeb7aea01affe Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 8 Apr 2024 15:42:31 -0700 Subject: [PATCH 217/384] debug: set OBD multiplexing mode for VIN (#32130) --- selfdrive/car/fw_versions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index 386bbee3ac..d7444ebf7d 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -373,6 +373,7 @@ if __name__ == "__main__": t = time.time() print("Getting vin...") + set_obd_multiplexing(params, True) vin_rx_addr, vin_rx_bus, vin = get_vin(logcan, sendcan, (0, 1), retry=10, debug=args.debug) print(f'RX: {hex(vin_rx_addr)}, BUS: {vin_rx_bus}, VIN: {vin}') print(f"Getting VIN took {time.time() - t:.3f} s") From d114924a2c8494b8dadc0c0419e668980abce7c9 Mon Sep 17 00:00:00 2001 From: mitchellgoffpc Date: Mon, 8 Apr 2024 16:34:01 -0700 Subject: [PATCH 218/384] Added optional timeout on map_renderer.wait_ready --- selfdrive/navd/map_renderer.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/selfdrive/navd/map_renderer.py b/selfdrive/navd/map_renderer.py index 8d525ac73e..e44b883436 100755 --- a/selfdrive/navd/map_renderer.py +++ b/selfdrive/navd/map_renderer.py @@ -31,7 +31,8 @@ void map_renderer_free_image(void *inst, uint8_t *buf); return ffi, ffi.dlopen(lib) -def wait_ready(lib, renderer): +def wait_ready(lib, renderer, timeout=None): + st = time.time() while not lib.map_renderer_loaded(renderer): lib.map_renderer_update(renderer) @@ -40,6 +41,9 @@ def wait_ready(lib, renderer): time.sleep(0.01) + if timeout is not None and time.time() - st > timeout: + raise TimeoutError("Timeout waiting for map renderer to be ready") + def get_image(lib, renderer): buf = lib.map_renderer_get_image(renderer) From 22aa9a436dcd6434706931a78d6381e2fc66d78b Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 8 Apr 2024 16:36:13 -0700 Subject: [PATCH 219/384] VW: get VIN from camera without comma power (#31851) * add VW camera to VIN addrs * correct VW query * consistent * update refs --- selfdrive/car/tests/test_fw_fingerprint.py | 2 +- selfdrive/car/vin.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index eaef1677e7..4a17fc34ec 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -236,7 +236,7 @@ class TestFwFingerprintTiming(unittest.TestCase): def test_startup_timing(self): # Tests worse-case VIN query time and typical present ECU query time - vin_ref_times = {'worst': 1.2, 'best': 0.6} # best assumes we go through all queries to get a match + vin_ref_times = {'worst': 1.4, 'best': 0.7} # best assumes we go through all queries to get a match present_ecu_ref_time = 0.75 def fake_get_ecu_addrs(*_, timeout): diff --git a/selfdrive/car/vin.py b/selfdrive/car/vin.py index e668c35f7d..e8c9c58042 100755 --- a/selfdrive/car/vin.py +++ b/selfdrive/car/vin.py @@ -23,6 +23,7 @@ def get_vin(logcan, sendcan, buses, timeout=0.1, retry=2, debug=False): (StdQueries.OBD_VIN_REQUEST, StdQueries.OBD_VIN_RESPONSE, (0, 1), STANDARD_VIN_ADDRS, FUNCTIONAL_ADDRS, 0x8), (StdQueries.GM_VIN_REQUEST, StdQueries.GM_VIN_RESPONSE, (0,), [0x24b], None, 0x400), # Bolt fwdCamera (StdQueries.KWP_VIN_REQUEST, StdQueries.KWP_VIN_RESPONSE, (0,), [0x797], None, 0x3), # Nissan Leaf VCM + (StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE, (0,), [0x74f], None, 0x6a), # Volkswagen fwdCamera ): if bus not in valid_buses: continue From b331e4a15b4d720bba59adbda51e8f78ab127382 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 8 Apr 2024 16:54:14 -0700 Subject: [PATCH 220/384] tool to create casync manifest (#32131) * manifest tool * newline * add to jenkins --- Jenkinsfile | 1 + release/create_casync_agnos_release.py | 4 +- release/create_release_manifest.py | 65 ++++++++++++++++++++++++++ system/hardware/tici/agnos.py | 2 + 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 release/create_release_manifest.py diff --git a/Jenkinsfile b/Jenkinsfile index 60e3c25008..8fe0e76ec0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -152,6 +152,7 @@ def build_release(String channel_name) { "${channel_name} (casync)": { deviceStage("build casync", "tici-needs-can", [], [ ["build ${channel_name}", "RELEASE=1 OPENPILOT_CHANNEL=${channel_name} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync $SOURCE_DIR/release/create_casync_build.sh"], + ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/manifest.json && cat /data/manifest.json"], //["upload ${channel_name}", "OPENPILOT_CHANNEL=${channel_name} $SOURCE_DIR/release/upload_casync_release.sh"], ]) } diff --git a/release/create_casync_agnos_release.py b/release/create_casync_agnos_release.py index c7f34ab154..7f46f10129 100644 --- a/release/create_casync_agnos_release.py +++ b/release/create_casync_agnos_release.py @@ -3,7 +3,7 @@ import json import pathlib import tempfile from openpilot.common.basedir import BASEDIR -from openpilot.system.hardware.tici.agnos import StreamingDecompressor, unsparsify, noop +from openpilot.system.hardware.tici.agnos import StreamingDecompressor, unsparsify, noop, AGNOS_MANIFEST_FILE from openpilot.system.updated.casync.common import create_casync_from_file @@ -13,7 +13,7 @@ if __name__ == "__main__": parser.add_argument("output_dir", type=str, help="output directory for the channel") parser.add_argument("version", type=str, help="version of agnos this is") parser.add_argument("--manifest", type=str, help="json manifest to create agnos release from", \ - default=str(pathlib.Path(BASEDIR) / "system/hardware/tici/agnos.json")) + default=str(pathlib.Path(BASEDIR) / AGNOS_MANIFEST_FILE)) args = parser.parse_args() output_dir = pathlib.Path(args.output_dir) diff --git a/release/create_release_manifest.py b/release/create_release_manifest.py new file mode 100644 index 0000000000..8d2e1241df --- /dev/null +++ b/release/create_release_manifest.py @@ -0,0 +1,65 @@ +import argparse +import dataclasses +import json +import pathlib + +from openpilot.common.run import run_cmd +from openpilot.system.hardware.tici.agnos import AGNOS_MANIFEST_FILE +from openpilot.system.version import get_build_metadata + + +BASE_URL = "https://commadist.blob.core.windows.net" + +CHANNEL_DATA = pathlib.Path(__file__).parent / "channel_data" / "agnos" + +OPENPILOT_RELEASES = f"{BASE_URL}/openpilot-releases" +AGNOS_RELEASES = f"{BASE_URL}/agnos-releases" + + +def create_partition_manifest(agnos_version, partition): + return { + "type": "partition", + "casync": { + "caibx": f"{AGNOS_RELEASES}/agnos-{agnos_version}-{partition['name']}.caibx" + }, + "name": partition["name"], + "size": partition["size"], + "full_check": partition["full_check"], + "hash_raw": partition["hash_raw"] + } + + +def create_openpilot_manifest(build_metadata): + return { + "type": "path_tarred", + "path": "/data/openpilot", + "casync": { + "caibx": f"{OPENPILOT_RELEASES}/{build_metadata.canonical}.caibx" + } + } + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="creates a casync release") + parser.add_argument("target_dir", type=str, help="directory of the channel to create manifest from") + parser.add_argument("output_file", type=str, help="output file to put the manifest") + args = parser.parse_args() + + with open(pathlib.Path(args.target_dir) / AGNOS_MANIFEST_FILE) as f: + agnos_manifest = json.load(f) + + agnos_version = run_cmd(["bash", "-c", r"unset AGNOS_VERSION && source launch_env.sh && \ + echo -n $AGNOS_VERSION"], args.target_dir).strip() + + build_metadata = get_build_metadata(args.target_dir) + + ret = { + "build_metadata": dataclasses.asdict(build_metadata), + "manifest": [ + *[create_partition_manifest(agnos_version, entry) for entry in agnos_manifest], + create_openpilot_manifest(build_metadata) + ] + } + + with open(args.output_file, "w") as f: + f.write(json.dumps(ret, indent=2)) diff --git a/system/hardware/tici/agnos.py b/system/hardware/tici/agnos.py index 8f09b30850..7e3536f775 100755 --- a/system/hardware/tici/agnos.py +++ b/system/hardware/tici/agnos.py @@ -15,6 +15,8 @@ import openpilot.system.updated.casync.casync as casync SPARSE_CHUNK_FMT = struct.Struct('H2xI4x') CAIBX_URL = "https://commadist.azureedge.net/agnosupdate/" +AGNOS_MANIFEST_FILE = "system/hardware/tici/agnos.json" + class StreamingDecompressor: def __init__(self, url: str) -> None: From e18ec9bbd7860166d9a74da90566c9e98e1b74e7 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 9 Apr 2024 09:19:05 -0700 Subject: [PATCH 221/384] jenkins: set pythonpath for casync build (#32139) * set pythonpath * quotes --- release/create_casync_build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/release/create_casync_build.sh b/release/create_casync_build.sh index a851123556..8448801189 100755 --- a/release/create_casync_build.sh +++ b/release/create_casync_build.sh @@ -7,6 +7,7 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" CASYNC_DIR="${CASYNC_DIR:=/tmp/casync}" SOURCE_DIR="$(git -C $DIR rev-parse --show-toplevel)" BUILD_DIR="${BUILD_DIR:=$(mktemp -d)}" +PYTHONPATH="$SOURCE_DIR" echo "Creating casync release from $SOURCE_DIR to $CASYNC_DIR" From 97db26b6a94a21e0dbe223f91ec8762347d493c2 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 9 Apr 2024 10:15:28 -0700 Subject: [PATCH 222/384] make manifest script executable (#32140) --- release/create_release_manifest.py | 1 + 1 file changed, 1 insertion(+) mode change 100644 => 100755 release/create_release_manifest.py diff --git a/release/create_release_manifest.py b/release/create_release_manifest.py old mode 100644 new mode 100755 index 8d2e1241df..8e39f2b31c --- a/release/create_release_manifest.py +++ b/release/create_release_manifest.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import argparse import dataclasses import json From 754dd45ffa82bf3d7f2d3413c4132eb65551ebd5 Mon Sep 17 00:00:00 2001 From: YassineYousfi Date: Tue, 9 Apr 2024 10:40:38 -0700 Subject: [PATCH 223/384] disable navigate on openpilot (#32106) * 2eedcd90-b7db-46cb-86be-740f48ded7ab/700 * noop ciao * here too * mapsd too * update translations * disable mapsd test from test onroad * disable mapRenderState test from timings * lint * fix exp mode toggle panel * update tr * french done * dont build mapd * only no nav * just comment * deprecate nav fields * rm not comment * dont deprecate too much * remove from services * merge cereal --- .gitignore | 1 - cereal | 2 +- release/files_common | 3 - selfdrive/manager/process_config.py | 2 - selfdrive/modeld/fill_model_msg.py | 5 +- selfdrive/modeld/modeld.py | 31 +---- selfdrive/modeld/models/README.md | 4 - selfdrive/modeld/models/navmodel.onnx | 3 - selfdrive/modeld/models/navmodel_q.dlc | 3 - selfdrive/modeld/navmodeld.py | 117 ------------------ selfdrive/navd/README.md | 2 +- selfdrive/navd/SConscript | 2 +- selfdrive/navd/tests/test_map_renderer.py | 1 + selfdrive/test/process_replay/model_replay.py | 74 +---------- selfdrive/test/test_onroad.py | 4 - selfdrive/ui/qt/maps/map.cc | 18 +-- selfdrive/ui/qt/maps/map.h | 5 - selfdrive/ui/qt/offroad/settings.cc | 11 +- selfdrive/ui/qt/onroad.cc | 3 +- selfdrive/ui/qt/window.cc | 4 - selfdrive/ui/translations/main_ar.ts | 16 +-- selfdrive/ui/translations/main_de.ts | 16 +-- selfdrive/ui/translations/main_fr.ts | 16 +-- selfdrive/ui/translations/main_ja.ts | 16 +-- selfdrive/ui/translations/main_ko.ts | 16 +-- selfdrive/ui/translations/main_pt-BR.ts | 16 +-- selfdrive/ui/translations/main_th.ts | 16 +-- selfdrive/ui/translations/main_tr.ts | 16 +-- selfdrive/ui/translations/main_zh-CHS.ts | 14 +-- selfdrive/ui/translations/main_zh-CHT.ts | 14 +-- selfdrive/ui/ui.h | 1 - system/hardware/tici/tests/test_power_draw.py | 1 - 32 files changed, 53 insertions(+), 400 deletions(-) delete mode 100644 selfdrive/modeld/models/navmodel.onnx delete mode 100644 selfdrive/modeld/models/navmodel_q.dlc delete mode 100755 selfdrive/modeld/navmodeld.py diff --git a/.gitignore b/.gitignore index 3da75aaea4..98fc70d029 100644 --- a/.gitignore +++ b/.gitignore @@ -52,7 +52,6 @@ selfdrive/car/tests/cars_dump system/camerad/camerad system/camerad/test/ae_gray_test selfdrive/modeld/_modeld -selfdrive/modeld/_navmodeld selfdrive/modeld/_dmonitoringmodeld /src/ diff --git a/cereal b/cereal index b9871482a3..db1359ec22 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit b9871482a3cba70c2ab40ab80017019313dc3f31 +Subproject commit db1359ec22f6ab60c6e76abc4531bc843345d6b5 diff --git a/release/files_common b/release/files_common index 4ba9200d22..641e084d30 100644 --- a/release/files_common +++ b/release/files_common @@ -316,7 +316,6 @@ selfdrive/modeld/modeld.py selfdrive/modeld/parse_model_outputs.py selfdrive/modeld/fill_model_msg.py selfdrive/modeld/get_model_metadata.py -selfdrive/modeld/navmodeld.py selfdrive/modeld/dmonitoringmodeld.py selfdrive/modeld/constants.py selfdrive/modeld/modeld @@ -332,8 +331,6 @@ selfdrive/modeld/models/supercombo.onnx selfdrive/modeld/models/dmonitoring_model_q.dlc -selfdrive/modeld/models/navmodel_q.dlc - selfdrive/modeld/transforms/loadyuv.cc selfdrive/modeld/transforms/loadyuv.h selfdrive/modeld/transforms/loadyuv.cl diff --git a/selfdrive/manager/process_config.py b/selfdrive/manager/process_config.py index 8b616b7874..4c34e7339e 100644 --- a/selfdrive/manager/process_config.py +++ b/selfdrive/manager/process_config.py @@ -56,8 +56,6 @@ procs = [ NativeProcess("stream_encoderd", "system/loggerd", ["./encoderd", "--stream"], notcar), NativeProcess("loggerd", "system/loggerd", ["./loggerd"], logging), NativeProcess("modeld", "selfdrive/modeld", ["./modeld"], only_onroad), - NativeProcess("mapsd", "selfdrive/navd", ["./mapsd"], only_onroad), - PythonProcess("navmodeld", "selfdrive.modeld.navmodeld", only_onroad), NativeProcess("sensord", "system/sensord", ["./sensord"], only_onroad, enabled=not PC), NativeProcess("ui", "selfdrive/ui", ["./ui"], always_run, watchdog_max_dt=(5 if not PC else None)), PythonProcess("soundd", "selfdrive.ui.soundd", only_onroad), diff --git a/selfdrive/modeld/fill_model_msg.py b/selfdrive/modeld/fill_model_msg.py index c39ec2da3d..f6a57f1a40 100644 --- a/selfdrive/modeld/fill_model_msg.py +++ b/selfdrive/modeld/fill_model_msg.py @@ -43,8 +43,7 @@ def fill_xyvat(builder, t, x, y, v, a, x_std=None, y_std=None, v_std=None, a_std def fill_model_msg(msg: capnp._DynamicStructBuilder, net_output_data: dict[str, np.ndarray], publish_state: PublishState, vipc_frame_id: int, vipc_frame_id_extra: int, frame_id: int, frame_drop: float, - timestamp_eof: int, timestamp_llk: int, model_execution_time: float, - nav_enabled: bool, valid: bool) -> None: + timestamp_eof: int, model_execution_time: float, valid: bool) -> None: frame_age = frame_id - vipc_frame_id if frame_id > vipc_frame_id else 0 msg.valid = valid @@ -54,9 +53,7 @@ def fill_model_msg(msg: capnp._DynamicStructBuilder, net_output_data: dict[str, modelV2.frameAge = frame_age modelV2.frameDropPerc = frame_drop * 100 modelV2.timestampEof = timestamp_eof - modelV2.locationMonoTime = timestamp_llk modelV2.modelExecutionTime = model_execution_time - modelV2.navEnabled = nav_enabled # plan position = modelV2.position diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index c3b3918903..9083f8585e 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -154,7 +154,7 @@ def main(demo=False): # messaging pm = PubMaster(["modelV2", "cameraOdometry"]) - sm = SubMaster(["deviceState", "carState", "roadCameraState", "liveCalibration", "driverMonitoringState", "navModel", "navInstruction", "carControl"]) + sm = SubMaster(["deviceState", "carState", "roadCameraState", "liveCalibration", "driverMonitoringState", "carControl"]) publish_state = PublishState() params = Params() @@ -240,30 +240,6 @@ def main(demo=False): if desire >= 0 and desire < ModelConstants.DESIRE_LEN: vec_desire[desire] = 1 - # Enable/disable nav features - timestamp_llk = sm["navModel"].locationMonoTime - nav_valid = sm.valid["navModel"] # and (nanos_since_boot() - timestamp_llk < 1e9) - nav_enabled = nav_valid and params.get_bool("ExperimentalMode") - - if not nav_enabled: - nav_features[:] = 0 - nav_instructions[:] = 0 - - if nav_enabled and sm.updated["navModel"]: - nav_features = np.array(sm["navModel"].features) - - if nav_enabled and sm.updated["navInstruction"]: - nav_instructions[:] = 0 - for maneuver in sm["navInstruction"].allManeuvers: - distance_idx = 25 + int(maneuver.distance / 20) - direction_idx = 0 - if maneuver.modifier in ("left", "slight left", "sharp left"): - direction_idx = 1 - if maneuver.modifier in ("right", "slight right", "sharp right"): - direction_idx = 2 - if 0 <= distance_idx < 50: - nav_instructions[distance_idx*3 + direction_idx] = 1 - # tracked dropped frames vipc_dropped_frames = max(0, meta_main.frame_id - last_vipc_frame_id - 1) frames_dropped = frame_dropped_filter.update(min(vipc_dropped_frames, 10)) @@ -282,7 +258,8 @@ def main(demo=False): 'traffic_convention': traffic_convention, 'lateral_control_params': lateral_control_params, 'nav_features': nav_features, - 'nav_instructions': nav_instructions} + 'nav_instructions': nav_instructions, + } mt1 = time.perf_counter() model_output = model.run(buf_main, buf_extra, model_transform_main, model_transform_extra, inputs, prepare_only) @@ -293,7 +270,7 @@ def main(demo=False): modelv2_send = messaging.new_message('modelV2') posenet_send = messaging.new_message('cameraOdometry') fill_model_msg(modelv2_send, model_output, publish_state, meta_main.frame_id, meta_extra.frame_id, frame_id, frame_drop_ratio, - meta_main.timestamp_eof, timestamp_llk, model_execution_time, nav_enabled, live_calib_seen) + meta_main.timestamp_eof, model_execution_time, live_calib_seen) desire_state = modelv2_send.modelV2.meta.desireState l_lane_change_prob = desire_state[log.Desire.laneChangeLeft] diff --git a/selfdrive/modeld/models/README.md b/selfdrive/modeld/models/README.md index ff5c91fe0c..9e11ca8255 100644 --- a/selfdrive/modeld/models/README.md +++ b/selfdrive/modeld/models/README.md @@ -21,10 +21,6 @@ To view the architecture of the ONNX networks, you can use [netron](https://netr * one-hot encoded vector to tell model whether traffic is right-hand or left-hand traffic : 2 * **feature buffer** * A buffer of intermediate features that gets appended to the current feature to form a 5 seconds temporal context (at 20FPS) : 99 * 512 -* **nav features** - * 1 * 150 -* **nav instructions** - * 1 * 256 ### Supercombo output format (Full size: XXX x float32) diff --git a/selfdrive/modeld/models/navmodel.onnx b/selfdrive/modeld/models/navmodel.onnx deleted file mode 100644 index 3b687b960a..0000000000 --- a/selfdrive/modeld/models/navmodel.onnx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8254b569878b7472e3f63ed9f3527a87bde785c9037aee3ed66f972e072b5899 -size 14166696 diff --git a/selfdrive/modeld/models/navmodel_q.dlc b/selfdrive/modeld/models/navmodel_q.dlc deleted file mode 100644 index d5e43abcfb..0000000000 --- a/selfdrive/modeld/models/navmodel_q.dlc +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89fda8380efa3e421fbcdb6bb204c36a4991f137ee01d47f3d0380895aa7c036 -size 3630942 diff --git a/selfdrive/modeld/navmodeld.py b/selfdrive/modeld/navmodeld.py deleted file mode 100755 index 4672734681..0000000000 --- a/selfdrive/modeld/navmodeld.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python3 -import gc -import math -import time -import ctypes -import numpy as np -from pathlib import Path - -from cereal import messaging -from cereal.messaging import PubMaster, SubMaster -from cereal.visionipc import VisionIpcClient, VisionStreamType -from openpilot.common.swaglog import cloudlog -from openpilot.common.params import Params -from openpilot.common.realtime import set_realtime_priority -from openpilot.selfdrive.modeld.constants import ModelConstants -from openpilot.selfdrive.modeld.runners import ModelRunner, Runtime - -NAV_INPUT_SIZE = 256*256 -NAV_FEATURE_LEN = 256 -NAV_DESIRE_LEN = 32 -NAV_OUTPUT_SIZE = 2*2*ModelConstants.IDX_N + NAV_DESIRE_LEN + NAV_FEATURE_LEN -MODEL_PATHS = { - ModelRunner.SNPE: Path(__file__).parent / 'models/navmodel_q.dlc', - ModelRunner.ONNX: Path(__file__).parent / 'models/navmodel.onnx'} - -class NavModelOutputXY(ctypes.Structure): - _fields_ = [ - ("x", ctypes.c_float), - ("y", ctypes.c_float)] - -class NavModelOutputPlan(ctypes.Structure): - _fields_ = [ - ("mean", NavModelOutputXY*ModelConstants.IDX_N), - ("std", NavModelOutputXY*ModelConstants.IDX_N)] - -class NavModelResult(ctypes.Structure): - _fields_ = [ - ("plan", NavModelOutputPlan), - ("desire_pred", ctypes.c_float*NAV_DESIRE_LEN), - ("features", ctypes.c_float*NAV_FEATURE_LEN)] - -class ModelState: - inputs: dict[str, np.ndarray] - output: np.ndarray - model: ModelRunner - - def __init__(self): - assert ctypes.sizeof(NavModelResult) == NAV_OUTPUT_SIZE * ctypes.sizeof(ctypes.c_float) - self.output = np.zeros(NAV_OUTPUT_SIZE, dtype=np.float32) - self.inputs = {'input_img': np.zeros(NAV_INPUT_SIZE, dtype=np.uint8)} - self.model = ModelRunner(MODEL_PATHS, self.output, Runtime.DSP, True, None) - self.model.addInput("input_img", None) - - def run(self, buf:np.ndarray) -> tuple[np.ndarray, float]: - self.inputs['input_img'][:] = buf - - t1 = time.perf_counter() - self.model.setInputBuffer("input_img", self.inputs['input_img'].view(np.float32)) - self.model.execute() - t2 = time.perf_counter() - return self.output, t2 - t1 - -def get_navmodel_packet(model_output: np.ndarray, valid: bool, frame_id: int, location_ts: int, execution_time: float, dsp_execution_time: float): - model_result = ctypes.cast(model_output.ctypes.data, ctypes.POINTER(NavModelResult)).contents - msg = messaging.new_message('navModel') - msg.valid = valid - msg.navModel.frameId = frame_id - msg.navModel.locationMonoTime = location_ts - msg.navModel.modelExecutionTime = execution_time - msg.navModel.dspExecutionTime = dsp_execution_time - msg.navModel.features = model_result.features[:] - msg.navModel.desirePrediction = model_result.desire_pred[:] - msg.navModel.position.x = [p.x for p in model_result.plan.mean] - msg.navModel.position.y = [p.y for p in model_result.plan.mean] - msg.navModel.position.xStd = [math.exp(p.x) for p in model_result.plan.std] - msg.navModel.position.yStd = [math.exp(p.y) for p in model_result.plan.std] - return msg - - -def main(): - gc.disable() - set_realtime_priority(1) - - # there exists a race condition when two processes try to create a - # SNPE model runner at the same time, wait for dmonitoringmodeld to finish - cloudlog.warning("waiting for dmonitoringmodeld to initialize") - if not Params().get_bool("DmModelInitialized", True): - return - - model = ModelState() - cloudlog.warning("models loaded, navmodeld starting") - - vipc_client = VisionIpcClient("navd", VisionStreamType.VISION_STREAM_MAP, True) - while not vipc_client.connect(False): - time.sleep(0.1) - assert vipc_client.is_connected() - cloudlog.warning(f"connected with buffer size: {vipc_client.buffer_len}") - - sm = SubMaster(["navInstruction"]) - pm = PubMaster(["navModel"]) - - while True: - buf = vipc_client.recv() - if buf is None: - continue - - sm.update(0) - t1 = time.perf_counter() - model_output, dsp_execution_time = model.run(buf.data[:buf.uv_offset]) - t2 = time.perf_counter() - - valid = vipc_client.valid and sm.valid["navInstruction"] - pm.send("navModel", get_navmodel_packet(model_output, valid, vipc_client.frame_id, vipc_client.timestamp_sof, t2 - t1, dsp_execution_time)) - - -if __name__ == "__main__": - main() diff --git a/selfdrive/navd/README.md b/selfdrive/navd/README.md index 3047b7f8eb..81de8ae39f 100644 --- a/selfdrive/navd/README.md +++ b/selfdrive/navd/README.md @@ -8,7 +8,7 @@ This directory contains two daemons, `navd` and `mapsd`, which support navigatio ### map renderer -The map renderer listens for the `navRoute` and publishes a rendered map view over VisionIPC for the navigation model, which lives in `selfdrive/modeld/`. The rendered maps look like this: +The map renderer listens for the `navRoute` and publishes a simplified rendered map view over VisionIPC. The rendered maps look like this: ![](https://i.imgur.com/oZLfmwq.png) diff --git a/selfdrive/navd/SConscript b/selfdrive/navd/SConscript index 5a173c0351..5a049f18ba 100644 --- a/selfdrive/navd/SConscript +++ b/selfdrive/navd/SConscript @@ -17,4 +17,4 @@ if arch in ['larch64', 'aarch64', 'x86_64']: map_env["RPATH"].append(Dir('.').abspath) map_env["LIBPATH"].append(Dir('.').abspath) maplib = map_env.SharedLibrary("maprender", ["map_renderer.cc"], LIBS=libs) - map_env.Program("mapsd", ["main.cc", ], LIBS=[maplib[0].get_path(), ] + libs) + # map_env.Program("mapsd", ["main.cc", ], LIBS=[maplib[0].get_path(), ] + libs) diff --git a/selfdrive/navd/tests/test_map_renderer.py b/selfdrive/navd/tests/test_map_renderer.py index b5f186dbb0..7d5a4c297f 100755 --- a/selfdrive/navd/tests/test_map_renderer.py +++ b/selfdrive/navd/tests/test_map_renderer.py @@ -65,6 +65,7 @@ class MapBoxInternetDisabledServer(threading.Thread): MapBoxInternetDisabledRequestHandler.INTERNET_ACTIVE = True +@pytest.mark.skip(reason="not used") class TestMapRenderer(unittest.TestCase): server: MapBoxInternetDisabledServer diff --git a/selfdrive/test/process_replay/model_replay.py b/selfdrive/test/process_replay/model_replay.py index 9db05cfc82..cba2edfd58 100755 --- a/selfdrive/test/process_replay/model_replay.py +++ b/selfdrive/test/process_replay/model_replay.py @@ -1,15 +1,11 @@ #!/usr/bin/env python3 import os import sys -import time from collections import defaultdict from typing import Any -import cereal.messaging as messaging from openpilot.common.git import get_commit -from openpilot.common.params import Params from openpilot.system.hardware import PC -from openpilot.selfdrive.manager.process_config import managed_processes from openpilot.tools.lib.openpilotci import BASE_URL, get_url from openpilot.selfdrive.test.process_replay.compare_logs import compare_logs, format_diff from openpilot.selfdrive.test.process_replay.process_replay import get_process_config, replay_process @@ -20,9 +16,7 @@ from openpilot.tools.lib.helpers import save_log TEST_ROUTE = "2f4452b03ccb98f0|2022-12-03--13-45-30" SEGMENT = 6 MAX_FRAMES = 100 if PC else 600 -NAV_FRAMES = 50 -NO_NAV = "NO_NAV" in os.environ NO_MODEL = "NO_MODEL" in os.environ SEND_EXTRA_INPUTS = bool(int(os.getenv("SEND_EXTRA_INPUTS", "0"))) @@ -50,59 +44,6 @@ def trim_logs_to_max_frames(logs, max_frames, frs_types, include_all_types): return all_msgs -def nav_model_replay(lr): - sm = messaging.SubMaster(['navModel', 'navThumbnail', 'mapRenderState']) - pm = messaging.PubMaster(['liveLocationKalman', 'navRoute']) - - nav = [m for m in lr if m.which() == 'navRoute'] - llk = [m for m in lr if m.which() == 'liveLocationKalman'] - assert len(nav) > 0 and len(llk) >= NAV_FRAMES and nav[0].logMonoTime < llk[-NAV_FRAMES].logMonoTime - - log_msgs = [] - try: - assert "MAPBOX_TOKEN" in os.environ - os.environ['MAP_RENDER_TEST_MODE'] = '1' - Params().put_bool('DmModelInitialized', True) - managed_processes['mapsd'].start() - managed_processes['navmodeld'].start() - - # setup position and route - for _ in range(10): - for s in (llk[-NAV_FRAMES], nav[0]): - pm.send(s.which(), s.as_builder().to_bytes()) - sm.update(1000) - if sm.updated['navModel']: - break - time.sleep(1) - - if not sm.updated['navModel']: - raise Exception("no navmodeld outputs, failed to initialize") - - # drain - time.sleep(2) - sm.update(0) - - # run replay - for n in range(len(llk) - NAV_FRAMES, len(llk)): - pm.send(llk[n].which(), llk[n].as_builder().to_bytes()) - m = messaging.recv_one(sm.sock['navThumbnail']) - assert m is not None, f"no navThumbnail, frame={n}" - log_msgs.append(m) - - m = messaging.recv_one(sm.sock['mapRenderState']) - assert m is not None, f"no mapRenderState, frame={n}" - log_msgs.append(m) - - m = messaging.recv_one(sm.sock['navModel']) - assert m is not None, f"no navModel response, frame={n}" - log_msgs.append(m) - finally: - managed_processes['mapsd'].stop() - managed_processes['navmodeld'].stop() - - return log_msgs - - def model_replay(lr, frs): # modeld is using frame pairs modeld_logs = trim_logs_to_max_frames(lr, MAX_FRAMES, {"roadCameraState", "wideRoadCameraState"}, {"roadEncodeIdx", "wideRoadEncodeIdx", "carParams"}) @@ -169,8 +110,6 @@ if __name__ == "__main__": # run replays if not NO_MODEL: log_msgs += model_replay(lr, frs) - if not NO_NAV: - log_msgs += nav_model_replay(lr) # get diff failed = False @@ -182,28 +121,19 @@ if __name__ == "__main__": all_logs = list(LogReader(BASE_URL + log_fn)) cmp_log = [] - # logs are ordered based on type: modelV2, driverStateV2, nav messages (navThumbnail, mapRenderState, navModel) + # logs are ordered based on type: modelV2, driverStateV2 if not NO_MODEL: model_start_index = next(i for i, m in enumerate(all_logs) if m.which() in ("modelV2", "cameraOdometry")) cmp_log += all_logs[model_start_index:model_start_index + MAX_FRAMES*2] dmon_start_index = next(i for i, m in enumerate(all_logs) if m.which() == "driverStateV2") cmp_log += all_logs[dmon_start_index:dmon_start_index + MAX_FRAMES] - if not NO_NAV: - nav_start_index = next(i for i, m in enumerate(all_logs) if m.which() in ["navThumbnail", "mapRenderState", "navModel"]) - nav_logs = all_logs[nav_start_index:nav_start_index + NAV_FRAMES*3] - cmp_log += nav_logs ignore = [ 'logMonoTime', 'modelV2.frameDropPerc', 'modelV2.modelExecutionTime', 'driverStateV2.modelExecutionTime', - 'driverStateV2.dspExecutionTime', - 'navModel.dspExecutionTime', - 'navModel.modelExecutionTime', - 'navThumbnail.timestampEof', - 'mapRenderState.locationMonoTime', - 'mapRenderState.renderTime', + 'driverStateV2.dspExecutionTime' ] if PC: ignore += [ diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 250534bf86..7492ac12a6 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -34,7 +34,6 @@ PROCS = { "./encoderd": 17.0, "./camerad": 14.5, "./locationd": 11.0, - "./mapsd": (0.5, 10.0), "selfdrive.controls.plannerd": 11.0, "./ui": 18.0, "selfdrive.locationd.paramsd": 9.0, @@ -42,7 +41,6 @@ PROCS = { "selfdrive.controls.radard": 7.0, "selfdrive.modeld.modeld": 13.0, "selfdrive.modeld.dmonitoringmodeld": 8.0, - "selfdrive.modeld.navmodeld": 1.0, "selfdrive.thermald.thermald": 3.87, "selfdrive.locationd.calibrationd": 2.0, "selfdrive.locationd.torqued": 5.0, @@ -87,8 +85,6 @@ TIMINGS = { "driverCameraState": [2.5, 0.35], "modelV2": [2.5, 0.35], "driverStateV2": [2.5, 0.40], - "navModel": [2.5, 0.35], - "mapRenderState": [2.5, 0.35], "liveLocationKalman": [2.5, 0.35], "wideRoadCameraState": [1.5, 0.35], } diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc index a5644bae4f..664364e04f 100644 --- a/selfdrive/ui/qt/maps/map.cc +++ b/selfdrive/ui/qt/maps/map.cc @@ -74,7 +74,7 @@ void MapWindow::initLayers() { QVariantMap transition; transition["duration"] = 400; // ms - m_map->setPaintProperty("navLayer", "line-color", getNavPathColor(uiState()->scene.navigate_on_openpilot)); + m_map->setPaintProperty("navLayer", "line-color", QColor("#31a1ee")); m_map->setPaintProperty("navLayer", "line-color-transition", transition); m_map->setPaintProperty("navLayer", "line-width", 7.5); m_map->setLayoutProperty("navLayer", "line-cap", "round"); @@ -118,21 +118,6 @@ void MapWindow::updateState(const UIState &s) { const SubMaster &sm = *(s.sm); update(); - if (sm.updated("modelV2")) { - // set path color on change, and show map on rising edge of navigate on openpilot - bool nav_enabled = sm["modelV2"].getModelV2().getNavEnabled() && - sm["controlsState"].getControlsState().getEnabled(); - if (nav_enabled != uiState()->scene.navigate_on_openpilot) { - if (loaded_once) { - m_map->setPaintProperty("navLayer", "line-color", getNavPathColor(nav_enabled)); - } - if (nav_enabled) { - emit requestVisible(true); - } - } - uiState()->scene.navigate_on_openpilot = nav_enabled; - } - if (sm.updated("liveLocationKalman")) { auto locationd_location = sm["liveLocationKalman"].getLiveLocationKalman(); auto locationd_pos = locationd_location.getPositionGeodetic(); @@ -365,7 +350,6 @@ void MapWindow::pinchTriggered(QPinchGesture *gesture) { void MapWindow::offroadTransition(bool offroad) { if (offroad) { clearRoute(); - uiState()->scene.navigate_on_openpilot = false; routing_problem = false; } else { auto dest = coordinate_from_param("NavDestination"); diff --git a/selfdrive/ui/qt/maps/map.h b/selfdrive/ui/qt/maps/map.h index 81ba50037a..8193d55729 100644 --- a/selfdrive/ui/qt/maps/map.h +++ b/selfdrive/ui/qt/maps/map.h @@ -69,11 +69,6 @@ private: MapInstructions* map_instructions; MapETA* map_eta; - // Blue with normal nav, green when nav is input into the model - QColor getNavPathColor(bool nav_enabled) { - return nav_enabled ? QColor("#31ee73") : QColor("#31a1ee"); - } - void clearRoute(); void updateDestinationMarker(); uint64_t route_rcv_frame = 0; diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 1c4e144468..4b3005467a 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -143,21 +143,14 @@ void TogglesPanel::updateToggles() { "

%2


" "%3
" "

%4


" - "%5
" - "

%6


" - "%7") + "%5
") .arg(tr("openpilot defaults to driving in chill mode. Experimental mode enables alpha-level features that aren't ready for chill mode. Experimental features are listed below:")) .arg(tr("End-to-End Longitudinal Control")) .arg(tr("Let the driving model control the gas and brakes. openpilot will drive as it thinks a human would, including stopping for red lights and stop signs. " "Since the driving model decides the speed to drive, the set speed will only act as an upper bound. This is an alpha quality feature; " "mistakes should be expected.")) - .arg(tr("Navigate on openpilot")) - .arg(tr("When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right " - "appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around " - "exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc.")) .arg(tr("New Driving Visualization")) - .arg(tr("The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. " - "When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green.")); + .arg(tr("The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. ")); const bool is_release = params.getBool("IsReleaseBranch"); auto cp_bytes = params.get("CarParamsPersistent"); diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 5d562d6e23..b6a49162fc 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -93,9 +93,8 @@ void OnroadWindow::updateState(const UIState &s) { void OnroadWindow::mousePressEvent(QMouseEvent* e) { #ifdef ENABLE_MAPS if (map != nullptr) { - // Switch between map and sidebar when using navigate on openpilot bool sidebarVisible = geometry().x() > 0; - bool show_map = uiState()->scene.navigate_on_openpilot ? sidebarVisible : !sidebarVisible; + bool show_map = !sidebarVisible; map->setVisible(show_map && !map->isVisible()); } #endif diff --git a/selfdrive/ui/qt/window.cc b/selfdrive/ui/qt/window.cc index 74fd05ed7b..6b579fcc5d 100644 --- a/selfdrive/ui/qt/window.cc +++ b/selfdrive/ui/qt/window.cc @@ -75,10 +75,6 @@ void MainWindow::closeSettings() { if (uiState()->scene.started) { homeWindow->showSidebar(false); - // Map is always shown when using navigate on openpilot - if (uiState()->scene.navigate_on_openpilot) { - homeWindow->showMapPanel(true); - } } } diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 2aea017c78..8a32b980f2 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -1154,22 +1154,10 @@ This may take up to a minute. Let the driving model control the gas and brakes. openpilot will drive as it thinks a human would, including stopping for red lights and stop signs. Since the driving model decides the speed to drive, the set speed will only act as an upper bound. This is an alpha quality feature; mistakes should be expected. دع نظام القيادة يتحكم بالوقود والمكابح. سيقوم openpilot بالقيادة كما لو أنه كائن بشري، بما في ذلك التوقف عند الإشارة الحمراء، وإشارات التوقف. وبما أن نمط القيادة يحدد سرعة القيادة، فإن السرعة المضبوطة تشكل الحد الأقصى فقط. هذه خاصية الجودة ألفا، فيجب توقع حدوث الأخطاء. - - Navigate on openpilot - التنقل على openpilot - - - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - عندما يكون هناك وجهة للتنقل، فإن openpilot سيقوم بإدخال معلومات الخريطة في هذا النموذج. وهذا يقدم سياقاً مفيداً ويسمح لـopenpilot بالبقاء يساراً أو يميناً بالشكل المناسب عند المنعطفات/المخارج. يبقى سلوك تغيير المسار مفعلاً عند السائق،. هذه هي خاصية الجودة ألفا، ولذلك يجب توقع الأخطاء لا سيما عند المخارج والمنعطفات هذه الأخطاء قد تشمل العبور غير المقصود لخطوط المسارات، والتأخر في الخروج، والقيادة نحو الحواجز الفاصلة في المناطق المثلثة بين الطريق الرئيسي والمخارج، وغير ذلك من الأخطاء المشابهة. - New Driving Visualization تصور القيادة الديد - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - تصور القيادة سينتقل إلى الكاميرا واسعة الزاوية المواجهة للطريق في السرعات المنخفضة من أجل إظهار بعض المنعطفات بشكل أفضل. سيتم أيضاً إظهار شعار الوضع التجريبي في الزاوية العلوية اليمنى. عند تحديد وجهة التنقل، واستخدام نظام القيادة لها كوضع مدخل، سيتحول مسار القيادة على الخريطة إلى اللون الأخضر. - Experimental mode is currently unavailable on this car since the car's stock ACC is used for longitudinal control. الوضع التجريبي غير متوفر حالياً في هذه السيارة نظراً لاستخدام رصيد التحكم التكيفي بالسرعة من أجل التحكم الطولي. @@ -1190,6 +1178,10 @@ This may take up to a minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. يوصى بالمعيار. في الوضع العدواني، سيتبع الطيار المفتوح السيارات الرائدة بشكل أقرب ويكون أكثر عدوانية مع البنزين والفرامل. في الوضع المريح، سيبقى openpilot بعيدًا عن السيارات الرائدة. في السيارات المدعومة، يمكنك التنقل بين هذه الشخصيات باستخدام زر مسافة عجلة القيادة. + + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + +
Updater diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index bc2d685c4d..6f64ef3211 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -1148,18 +1148,6 @@ This may take up to a minute. End-to-End Longitudinal Control - - Navigate on openpilot - - - - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - - - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - - openpilot longitudinal control may come in a future update. @@ -1176,6 +1164,10 @@ This may take up to a minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Updater diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index 55cb1b29aa..2643da56ff 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -1154,18 +1154,6 @@ Cela peut prendre jusqu'à une minute. End-to-End Longitudinal Control Contrôle longitudinal de bout en bout - - Navigate on openpilot - Navigation avec openpilot - - - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - Lorsque la navigation dispose d'une destination, openpilot entrera les informations de la carte dans le modèle. Cela fournit un contexte utile pour le modèle et permet à openpilot de se diriger à gauche ou à droite de manière appropriée aux bifurcations/sorties. Le comportement relatif au changement de voie reste inchangé et doit toujours être activé par le conducteur. Il s'agit d'une fonctionnalité alpha ; il faut s'attendre à des erreurs, en particulier aux abords des sorties et des bifurcations. Ces erreurs peuvent inclure des franchissements involontaires de passages piétons, des prises de sortie tardives, la conduite vers des zones de séparation de type zebras, etc. - - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - La visualisation de la conduite passera sur la caméra grand angle dirigée vers la route à faible vitesse afin de mieux montrer certains virages. Le logo du mode expérimental s'affichera également dans le coin supérieur droit. Lorsqu'une destination de navigation est définie et que le modèle de conduite l'utilise comme entrée, la trajectoire de conduite sur la carte deviendra verte. - Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. Activer le contrôle longitudinal d'openpilot (en alpha) pour autoriser le mode expérimental. @@ -1174,6 +1162,10 @@ Cela peut prendre jusqu'à une minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + La visualisation de la conduite passera sur la caméra grand angle dirigée vers la route à faible vitesse afin de mieux montrer certains virages. Le logo du mode expérimental s'affichera également dans le coin supérieur droit. + Updater diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 92238d6beb..5fb4a3b1c2 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -1140,18 +1140,6 @@ This may take up to a minute. End-to-End Longitudinal Control - - Navigate on openpilot - - - - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - - - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - - openpilot longitudinal control may come in a future update. @@ -1168,6 +1156,10 @@ This may take up to a minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Updater diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 21f8f39fb1..d8006a0f58 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -1146,10 +1146,6 @@ This may take up to a minute. An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. openpilot 가감속 제어 알파 버전은 비 릴리즈 브랜치에서 실험 모드와 함께 테스트할 수 있습니다. - - Navigate on openpilot - openpilot 내비게이트 - Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. 실험 모드를 사용하려면 openpilot E2E 가감속 제어 (알파) 토글을 활성화하세요. @@ -1158,18 +1154,14 @@ This may take up to a minute. End-to-End Longitudinal Control E2E 가감속 제어 - - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - 내비게이션에 목적지가 설정되어 있으면 openpilot이 지도 정보를 주행 모델에 입력합니다. 이는 모델에 유용한 정보를 제공하고 openpilot이 진출입로 및 램프에서 적절하게 왼쪽 또는 오른쪽을 유지할 수 있도록 해 줍니다. 차선 변경 기능은 여전히 운전자의 조작에 의해 활성화됩니다. 이 기능은 알파 버전입니다. 특히 진출입로 및 분기점 주변에서 실수가 발생할 수 있으며 이러한 실수에는 의도하지 않은 차선 이탈, 늦은 진출, 도로 가장자리의 분리대 또는 경계석을 향해 운전하는 행동 등이 포함됩니다. - - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - 주행 시각화는 저속으로 주행 시 도로를 향한 광각 카메라로 자동 전환되어 일부 곡선 경로를 더 잘 보여줍니다. 실험 모드 로고는 우측 상단에 표시됩니다. 내비게이션 목적지가 설정되고 주행 모델에 입력되면 지도의 주행 경로가 녹색으로 바뀝니다. - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. 표준 모드를 권장합니다. 공격적 모드의 openpilot은 선두 차량을 더 가까이 따라가고 가감속제어를 사용하여 더욱 공격적으로 움직입니다. 편안한 모드의 openpilot은 선두 차량으로부터 더 멀리 떨어져 있습니다. 지원되는 차량에서는 스티어링 휠 거리 버튼을 사용하여 이러한 특성을 순환할 수 있습니다. + + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Updater diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index 7bc324f29c..6d66565a18 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -1150,10 +1150,6 @@ Isso pode levar até um minuto. An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. Uma versão embrionária do controle longitudinal openpilot pode ser testada em conjunto com o modo Experimental, em branches que não sejam de produção. - - Navigate on openpilot - Navegação no openpilot - Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. Habilite o controle longitudinal (embrionário) openpilot para permitir o modo Experimental. @@ -1162,18 +1158,14 @@ Isso pode levar até um minuto. End-to-End Longitudinal Control Controle Longitudinal de Ponta a Ponta - - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - Quando a navegação tem um destino, o openpilot insere as informações do mapa no modelo. Isso fornece contexto útil para o modelo e permite que o openpilot mantenha a esquerda ou a direita apropriadamente em bifurcações/saídas. O comportamento de mudança de faixa permanece inalterado e ainda é ativado somente pelo motorista. Este é um recurso de qualidade embrionária; erros devem ser esperados, principalmente em torno de saídas e bifurcações. Esses erros podem incluir travessias não intencionais na faixa de rodagem, saída tardia, condução em direção a barreiras divisórias nas áreas de marcas de canalização, etc. - - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - A visualização de condução fará a transição para a câmera grande angular voltada para a estrada em baixas velocidades para mostrar melhor algumas curvas. O logotipo do modo Experimental também será mostrado no canto superior direito. Quando um destino de navegação é definido e o modelo de condução o utiliza como entrada o caminho de condução no mapa fica verde. - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. Neutro é o recomendado. No modo disputa o openpilot seguirá o carro da frente mais de perto e será mais agressivo com a aceleração e frenagem. No modo calmo o openpilot se manterá mais longe do carro da frente. Em carros compatíveis, você pode alternar esses temperamentos com o botão de distância do volante. + + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Updater diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index 14fb40d21f..f417ee1af8 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -1150,18 +1150,6 @@ This may take up to a minute. End-to-End Longitudinal Control ควบคุมเร่ง/เบรคแบบ End-to-End - - Navigate on openpilot - การนำทางบน openpilot - - - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - เมื่อการนำทางมีจุดหมายปลายทาง openpilot จะป้อนข้อมูลแผนที่เข้าไปยังโมเดล ซึ่งจะเป็นบริบทที่มีประโยชน์สำหรับโมเดลและจะทำให้ openpilot สามารถรักษาเลนซ้ายหรือขวาได้อย่างเหมาะสมบริเวณทางแยกหรือทางออก พฤติกรรมการเปลี่ยนเลนยังคงเหมือนเดิมและยังคงต้องถูกเริ่มโดยคนขับ ความสามารถนี้ยังอยู่ในระดับ alpha ซึ่งอาจะเกิดความผิดพลาดได้โดยเฉพาะบริเวณทางแยกหรือทางออก ความผิดพลาดที่อาจเกิดขึ้นได้อาจรวมถึงการข้ามเส้นแบ่งเลนโดยไม่ตั้งใจ, การเข้าช่องทางออกช้ากว่าปกติ, การขับเข้าหาแบริเออร์ในเขตปลอดภัย, ฯลฯ - - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - การแสดงภาพการขับขี่จะเปลี่ยนไปใช้กล้องมุมกว้างที่หันหน้าไปทางถนนเมื่ออยู่ในความเร็วต่ำ เพื่อแสดงภาพการเลี้ยวที่ดีขึ้น โลโก้โหมดการทดลองจะแสดงที่มุมบนขวาด้วย เมื่อเป้าหมายการนำทางถูกเลือกและโมเดลการขับขี่กำลังใช้เป็นอินพุต เส้นทางการขับขี่บนแผนที่จะเปลี่ยนเป็นสีเขียว - Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. เปิดระบบควบคุมการเร่ง/เบรคโดย openpilot (alpha) เพื่อเปิดใช้งานโหมดทดลอง @@ -1170,6 +1158,10 @@ This may take up to a minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Updater diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index 9fce4793ca..16e4504343 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -1132,22 +1132,10 @@ This may take up to a minute. Let the driving model control the gas and brakes. openpilot will drive as it thinks a human would, including stopping for red lights and stop signs. Since the driving model decides the speed to drive, the set speed will only act as an upper bound. This is an alpha quality feature; mistakes should be expected. - - Navigate on openpilot - - - - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - - New Driving Visualization - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - - Experimental mode is currently unavailable on this car since the car's stock ACC is used for longitudinal control. @@ -1168,6 +1156,10 @@ This may take up to a minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Updater diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 6b040dac26..938915b305 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -1146,10 +1146,6 @@ This may take up to a minute. An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. 在正式(release)版本以外的分支上,可以测试 openpilot 纵向控制的 Alpha 版本以及实验模式。 - - Navigate on openpilot - Navigate on openpilot - Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. 启用 openpilot 纵向控制(alpha)开关以允许实验模式。 @@ -1159,15 +1155,11 @@ This may take up to a minute. 端到端纵向控制 - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - 当导航有目的地时,openpilot 将输入地图信息到模型中。这为模型提供了有用的背景信息,使 openpilot 能够在叉路/出口时适当地保持左侧或右侧行驶。车道变换行为保持不变,仍由驾驶员激活。这是一个 Alpha 版的功能;可能会出现错误,特别是在出口和分叉处。这些错误可能包括意外的车道越界、晚出口、朝着分隔栏驶向安全地带等。 - - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - 行驶画面将在低速时切换到道路朝向的广角摄像头,以更好地显示一些转弯。实验模式标志也将显示在右上角。当设置了导航目的地并且驾驶模型正在使用它作为输入时,地图上的驾驶路径将变为绿色。 + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index dd3f600254..98602b81d1 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -1146,10 +1146,6 @@ This may take up to a minute. An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. 在正式 (release) 版以外的分支上可以測試 openpilot 縱向控制的 Alpha 版本以及實驗模式。 - - Navigate on openpilot - Navigate on openpilot - Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. 啟用 openpilot 縱向控制(alpha)切換以允許實驗模式。 @@ -1159,15 +1155,11 @@ This may take up to a minute. 端到端縱向控制 - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - 當導航有目的地時,openpilot 將把地圖資訊輸入模型中。這為模型提供了有用的背景資訊,使 openpilot 能夠在叉路/出口時適當地保持左側或右側行駛。車道變換行為保持不變,仍由駕駛員啟用。這是一個 Alpha 版的功能;可能會出現錯誤,特別是在出口和分叉處。這些錯誤可能包括意外的車道越界、晚出口、朝著分隔欄駛向分隔帶區域等。 - - - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - 行駛畫面將在低速時切換至道路朝向的廣角鏡頭,以更好地顯示一些轉彎。實驗模式圖示也將顯示在右上角。當設定了導航目的地並且行駛模型正在將其作為輸入時,地圖上的行駛路徑將變為綠色。 + Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + - Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index d639d85eeb..0a939253b1 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -94,7 +94,6 @@ typedef struct UIScene { float driver_pose_coss[3]; vec3 face_kpts_draw[std::size(default_face_kpts_3d)]; - bool navigate_on_openpilot = false; cereal::LongitudinalPersonality personality; float light_sensor; diff --git a/system/hardware/tici/tests/test_power_draw.py b/system/hardware/tici/tests/test_power_draw.py index 180ec155e4..ba7e0a6d9d 100755 --- a/system/hardware/tici/tests/test_power_draw.py +++ b/system/hardware/tici/tests/test_power_draw.py @@ -36,7 +36,6 @@ PROCS = [ Proc(['modeld'], 1.12, atol=0.2, msgs=['modelV2']), Proc(['dmonitoringmodeld'], 0.4, msgs=['driverStateV2']), Proc(['encoderd'], 0.23, msgs=[]), - Proc(['mapsd', 'navmodeld'], 0.05, msgs=['mapRenderState', 'navModel']), ] From cad7b96c3a12e58c17f0d80936a8b9e4c39e7365 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 10 Apr 2024 01:45:48 +0800 Subject: [PATCH 224/384] loggerd/logger.cc: fix typo (#32134) --- system/loggerd/logger.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/loggerd/logger.cc b/system/loggerd/logger.cc index f1b187df7f..b44758bb04 100644 --- a/system/loggerd/logger.cc +++ b/system/loggerd/logger.cc @@ -113,11 +113,11 @@ std::string logger_get_identifier(std::string key) { return util::string_format("%08x--%s", cnt, ss.str().c_str()); } -static void log_sentinel(LoggerState *log, SentinelType type, int eixt_signal = 0) { +static void log_sentinel(LoggerState *log, SentinelType type, int exit_signal = 0) { MessageBuilder msg; auto sen = msg.initEvent().initSentinel(); sen.setType(type); - sen.setSignal(eixt_signal); + sen.setSignal(exit_signal); log->write(msg.toBytes(), true); } From 99285ef1f2da4ba3852c376f4cae0c50e5dc3c79 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 10 Apr 2024 01:46:07 +0800 Subject: [PATCH 225/384] loggerd/logger.cc: use std::stoul instead of std::stol (#32133) --- system/loggerd/logger.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/loggerd/logger.cc b/system/loggerd/logger.cc index b44758bb04..8234cd84ad 100644 --- a/system/loggerd/logger.cc +++ b/system/loggerd/logger.cc @@ -96,7 +96,7 @@ std::string logger_get_identifier(std::string key) { Params params; uint32_t cnt; try { - cnt = std::stol(params.get(key)); + cnt = std::stoul(params.get(key)); } catch (std::exception &e) { cnt = 0; } From 6c3a33a6d847c946e11f5a6414e270ae3ee5c03d Mon Sep 17 00:00:00 2001 From: YassineYousfi Date: Tue, 9 Apr 2024 11:19:43 -0700 Subject: [PATCH 226/384] WD40 model (#32141) * 2eedcd90-b7db-46cb-86be-740f48ded7ab/700 * cleanup some constants * update model replay ref --- selfdrive/modeld/constants.py | 3 --- selfdrive/modeld/modeld.py | 8 -------- selfdrive/modeld/models/supercombo.onnx | 4 ++-- selfdrive/test/process_replay/model_replay_ref_commit | 2 +- 4 files changed, 3 insertions(+), 14 deletions(-) diff --git a/selfdrive/modeld/constants.py b/selfdrive/modeld/constants.py index dda1ff5e33..ca81bffcc8 100644 --- a/selfdrive/modeld/constants.py +++ b/selfdrive/modeld/constants.py @@ -18,9 +18,6 @@ class ModelConstants: HISTORY_BUFFER_LEN = 99 DESIRE_LEN = 8 TRAFFIC_CONVENTION_LEN = 2 - NAV_FEATURE_LEN = 256 - NAV_INSTRUCTION_LEN = 150 - DRIVING_STYLE_LEN = 12 LAT_PLANNER_STATE_LEN = 4 LATERAL_CONTROL_PARAMS_LEN = 2 PREV_DESIRED_CURV_LEN = 1 diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 9083f8585e..a8a9aac8c9 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -59,8 +59,6 @@ class ModelState: 'traffic_convention': np.zeros(ModelConstants.TRAFFIC_CONVENTION_LEN, dtype=np.float32), 'lateral_control_params': np.zeros(ModelConstants.LATERAL_CONTROL_PARAMS_LEN, dtype=np.float32), 'prev_desired_curv': np.zeros(ModelConstants.PREV_DESIRED_CURV_LEN * (ModelConstants.HISTORY_BUFFER_LEN+1), dtype=np.float32), - 'nav_features': np.zeros(ModelConstants.NAV_FEATURE_LEN, dtype=np.float32), - 'nav_instructions': np.zeros(ModelConstants.NAV_INSTRUCTION_LEN, dtype=np.float32), 'features_buffer': np.zeros(ModelConstants.HISTORY_BUFFER_LEN * ModelConstants.FEATURE_LEN, dtype=np.float32), } @@ -94,8 +92,6 @@ class ModelState: self.inputs['traffic_convention'][:] = inputs['traffic_convention'] self.inputs['lateral_control_params'][:] = inputs['lateral_control_params'] - self.inputs['nav_features'][:] = inputs['nav_features'] - self.inputs['nav_instructions'][:] = inputs['nav_instructions'] # if getCLBuffer is not None, frame will be None self.model.setInputBuffer("input_imgs", self.frame.prepare(buf, transform.flatten(), self.model.getCLBuffer("input_imgs"))) @@ -168,8 +164,6 @@ def main(demo=False): model_transform_main = np.zeros((3, 3), dtype=np.float32) model_transform_extra = np.zeros((3, 3), dtype=np.float32) live_calib_seen = False - nav_features = np.zeros(ModelConstants.NAV_FEATURE_LEN, dtype=np.float32) - nav_instructions = np.zeros(ModelConstants.NAV_INSTRUCTION_LEN, dtype=np.float32) buf_main, buf_extra = None, None meta_main = FrameMeta() meta_extra = FrameMeta() @@ -257,8 +251,6 @@ def main(demo=False): 'desire': vec_desire, 'traffic_convention': traffic_convention, 'lateral_control_params': lateral_control_params, - 'nav_features': nav_features, - 'nav_instructions': nav_instructions, } mt1 = time.perf_counter() diff --git a/selfdrive/modeld/models/supercombo.onnx b/selfdrive/modeld/models/supercombo.onnx index 7991fef662..ed539ca37d 100644 --- a/selfdrive/modeld/models/supercombo.onnx +++ b/selfdrive/modeld/models/supercombo.onnx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4fb2cec9ef759cb1164ee2d27b338338a5a9302f427ad95f9b021361b02e1a2 -size 52263406 +oid sha256:a7a267b5026a0fab61095092d9af20c1dcd70311817c80749adcf6c0a0879061 +size 50660999 diff --git a/selfdrive/test/process_replay/model_replay_ref_commit b/selfdrive/test/process_replay/model_replay_ref_commit index 85ba5fb840..3f1e91c369 100644 --- a/selfdrive/test/process_replay/model_replay_ref_commit +++ b/selfdrive/test/process_replay/model_replay_ref_commit @@ -1 +1 @@ -60b00d102b3aedcc74a91722d1210cc6905b0c8f +512c45131ff7eb48bf101f9eae50a389efba6930 From 8364cd2f2cc4f4b753fc417333df4c707c11eb86 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 9 Apr 2024 11:38:18 -0700 Subject: [PATCH 227/384] jenkins: publish casync releases from device (#32142) * publish in ci * overwrite * publish in ci * fix * test it * Revert "test it" This reverts commit b3de51dc693df79b980d7dffc18bcc3c88d83375. * use right token * cleanup after uploading --------- Co-authored-by: Comma Device --- Jenkinsfile | 2 +- release/upload_casync_release.py | 24 ++++++++++++++++++++++++ release/upload_casync_release.sh | 9 --------- tools/lib/azure_container.py | 10 +++++----- 4 files changed, 30 insertions(+), 15 deletions(-) create mode 100755 release/upload_casync_release.py delete mode 100755 release/upload_casync_release.sh diff --git a/Jenkinsfile b/Jenkinsfile index 8fe0e76ec0..340145eac1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -153,7 +153,7 @@ def build_release(String channel_name) { deviceStage("build casync", "tici-needs-can", [], [ ["build ${channel_name}", "RELEASE=1 OPENPILOT_CHANNEL=${channel_name} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync $SOURCE_DIR/release/create_casync_build.sh"], ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/manifest.json && cat /data/manifest.json"], - //["upload ${channel_name}", "OPENPILOT_CHANNEL=${channel_name} $SOURCE_DIR/release/upload_casync_release.sh"], + ["upload and cleanup ${channel_name}", "$SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], ]) } ) diff --git a/release/upload_casync_release.py b/release/upload_casync_release.py new file mode 100755 index 0000000000..0119ebfa0e --- /dev/null +++ b/release/upload_casync_release.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +import argparse +import os +import pathlib +from openpilot.tools.lib.azure_container import AzureContainer + + +if __name__ == "__main__": + del os.environ["AZURE_TOKEN"] # regerenate token for this bucket + + OPENPILOT_RELEASES_CONTAINER = AzureContainer("commadist", "openpilot-releases") + + parser = argparse.ArgumentParser(description='upload casync folder to azure') + parser.add_argument("casync_dir", type=str, help="casync directory") + args = parser.parse_args() + + casync_dir = pathlib.Path(args.casync_dir) + + for f in casync_dir.rglob("*"): + if f.is_file(): + blob_name = f.relative_to(casync_dir) + print(f"uploading {f} to {blob_name}") + OPENPILOT_RELEASES_CONTAINER.upload_file(str(f), str(blob_name), overwrite=True) diff --git a/release/upload_casync_release.sh b/release/upload_casync_release.sh deleted file mode 100755 index 02ced8338e..0000000000 --- a/release/upload_casync_release.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -CASYNC_DIR="${CASYNC_DIR:=/tmp/casync}" - -OPENPILOT_RELEASES="https://commadist.blob.core.windows.net/openpilot-releases/" - -SAS="$(python -c 'from tools.lib.azure_container import get_container_sas;print(get_container_sas("commadist","openpilot-releases"))')" - -azcopy cp "$CASYNC_DIR*" "$OPENPILOT_RELEASES?$SAS" --recursive diff --git a/tools/lib/azure_container.py b/tools/lib/azure_container.py index 52b2f37dbf..f5a3a8bfb1 100644 --- a/tools/lib/azure_container.py +++ b/tools/lib/azure_container.py @@ -57,18 +57,18 @@ class AzureContainer: ext = "hevc" if log_type.endswith('camera') else "bz2" return self.BASE_URL + f"{route_name.replace('|', '/')}/{segment_num}/{log_type}.{ext}" - def upload_bytes(self, data: bytes | IO, blob_name: str) -> str: + def upload_bytes(self, data: bytes | IO, blob_name: str, overwrite=False) -> str: from azure.storage.blob import BlobClient blob = BlobClient( account_url=self.ACCOUNT_URL, container_name=self.CONTAINER, blob_name=blob_name, credential=get_azure_credential(), - overwrite=False, + overwrite=overwrite, ) - blob.upload_blob(data) + blob.upload_blob(data, overwrite=overwrite) return self.BASE_URL + blob_name - def upload_file(self, path: str | os.PathLike, blob_name: str) -> str: + def upload_file(self, path: str | os.PathLike, blob_name: str, overwrite=False) -> str: with open(path, "rb") as f: - return self.upload_bytes(f, blob_name) + return self.upload_bytes(f, blob_name, overwrite) From da403a440704da2c2a98bb778919554443403295 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 9 Apr 2024 12:32:29 -0700 Subject: [PATCH 228/384] fix casync uploading (#32144) fix --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 340145eac1..c01a702fff 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -152,8 +152,8 @@ def build_release(String channel_name) { "${channel_name} (casync)": { deviceStage("build casync", "tici-needs-can", [], [ ["build ${channel_name}", "RELEASE=1 OPENPILOT_CHANNEL=${channel_name} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync $SOURCE_DIR/release/create_casync_build.sh"], - ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/manifest.json && cat /data/manifest.json"], - ["upload and cleanup ${channel_name}", "$SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], + ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/openpilot /data/manifest.json && cat /data/manifest.json"], + ["upload and cleanup ${channel_name}", "PYTHONWARNINGS=ignore $SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], ]) } ) From 34912b29c1aef1d2561592010978067bcb150459 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 9 Apr 2024 13:45:45 -0700 Subject: [PATCH 229/384] modeld: less spammy with no cams --- selfdrive/modeld/modeld.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index a8a9aac8c9..35e2a29aa1 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -190,7 +190,7 @@ def main(demo=False): break if buf_main is None: - cloudlog.error("vipc_client_main no frame") + cloudlog.debug("vipc_client_main no frame") continue if use_extra_client: @@ -202,7 +202,7 @@ def main(demo=False): break if buf_extra is None: - cloudlog.error("vipc_client_extra no frame") + cloudlog.debug("vipc_client_extra no frame") continue if abs(meta_main.timestamp_sof - meta_extra.timestamp_sof) > 10000000: From 91713bed2627bef431af0fbcca485e054112d875 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 9 Apr 2024 15:42:30 -0700 Subject: [PATCH 230/384] jenkins: use token for pushing to openpilot-releases (#32146) use token Co-authored-by: tester --- Jenkinsfile | 3 +++ release/upload_casync_release.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index c01a702fff..45a18879f5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -26,6 +26,7 @@ export SOURCE_DIR=${env.SOURCE_DIR} export GIT_BRANCH=${env.GIT_BRANCH} export GIT_COMMIT=${env.GIT_COMMIT} export AZURE_TOKEN='${env.AZURE_TOKEN}' +export AZURE_TOKEN_OPENPILOT_RELEASES='${env.AZURE_TOKEN_OPENPILOT_RELEASES}' export MAPBOX_TOKEN='${env.MAPBOX_TOKEN}' # only use 1 thread for tici tests since most require HIL export PYTEST_ADDOPTS="-n 0" @@ -134,9 +135,11 @@ def pcStage(String stageName, Closure body) { def setupCredentials() { withCredentials([ string(credentialsId: 'azure_token', variable: 'AZURE_TOKEN'), + string(credentialsId: 'azure_token_openpilot_releases', variable: 'AZURE_TOKEN_OPENPILOT_RELEASES'), string(credentialsId: 'mapbox_token', variable: 'MAPBOX_TOKEN') ]) { env.AZURE_TOKEN = "${AZURE_TOKEN}" + env.AZURE_TOKEN_OPENPILOT_RELEASES = "${AZURE_TOKEN_OPENPILOT_RELEASES}" env.MAPBOX_TOKEN = "${MAPBOX_TOKEN}" } } diff --git a/release/upload_casync_release.py b/release/upload_casync_release.py index 0119ebfa0e..4261e298a8 100755 --- a/release/upload_casync_release.py +++ b/release/upload_casync_release.py @@ -7,7 +7,8 @@ from openpilot.tools.lib.azure_container import AzureContainer if __name__ == "__main__": - del os.environ["AZURE_TOKEN"] # regerenate token for this bucket + if "AZURE_TOKEN_OPENPILOT_RELEASES" in os.environ: + os.environ["AZURE_TOKEN"] = os.environ["AZURE_TOKEN_OPENPILOT_RELEASES"] OPENPILOT_RELEASES_CONTAINER = AzureContainer("commadist", "openpilot-releases") From a6235521279bff11a0ebfcfb14d303986e927b74 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 9 Apr 2024 19:28:02 -0700 Subject: [PATCH 231/384] Format volkswagen/values.py --- selfdrive/car/volkswagen/values.py | 62 +++++++++++++++--------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index a88487f7c4..386cbf43f2 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -8,7 +8,7 @@ from opendbc.can.can_define import CANDefine from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car import dbc_dict, CarSpecs, DbcDict, PlatformConfig, Platforms from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, \ - Device + Device from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 Ecu = car.CarParams.Ecu @@ -177,7 +177,7 @@ class VWCarDocs(CarDocs): # Exception: SEAT Leon and SEAT Ateca share a chassis code class CAR(Platforms): - VOLKSWAGEN_ARTEON_MK1 = VolkswagenMQBPlatformConfig( # Chassis AN + VOLKSWAGEN_ARTEON_MK1 = VolkswagenMQBPlatformConfig( # Chassis AN [ VWCarDocs("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"), VWCarDocs("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), @@ -186,7 +186,7 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1733, wheelbase=2.84), ) - VOLKSWAGEN_ATLAS_MK1 = VolkswagenMQBPlatformConfig( # Chassis CA + VOLKSWAGEN_ATLAS_MK1 = VolkswagenMQBPlatformConfig( # Chassis CA [ VWCarDocs("Volkswagen Atlas 2018-23"), VWCarDocs("Volkswagen Atlas Cross Sport 2020-22"), @@ -196,14 +196,14 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=2011, wheelbase=2.98), ) - VOLKSWAGEN_CADDY_MK3 = VolkswagenPQPlatformConfig( # Chassis 2K + VOLKSWAGEN_CADDY_MK3 = VolkswagenPQPlatformConfig( # Chassis 2K [ VWCarDocs("Volkswagen Caddy 2019"), VWCarDocs("Volkswagen Caddy Maxi 2019"), ], VolkswagenCarSpecs(mass=1613, wheelbase=2.6, minSteerSpeed=21 * CV.KPH_TO_MS), ) - VOLKSWAGEN_CRAFTER_MK2 = VolkswagenMQBPlatformConfig( # Chassis SY/SZ + VOLKSWAGEN_CRAFTER_MK2 = VolkswagenMQBPlatformConfig( # Chassis SY/SZ [ VWCarDocs("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"), VWCarDocs("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"), @@ -213,7 +213,7 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS), ) - VOLKSWAGEN_GOLF_MK7 = VolkswagenMQBPlatformConfig( # Chassis 5G/AU/BA/BE + VOLKSWAGEN_GOLF_MK7 = VolkswagenMQBPlatformConfig( # Chassis 5G/AU/BA/BE [ VWCarDocs("Volkswagen e-Golf 2014-20"), VWCarDocs("Volkswagen Golf 2015-20", auto_resume=False), @@ -226,14 +226,14 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1397, wheelbase=2.62), ) - VOLKSWAGEN_JETTA_MK7 = VolkswagenMQBPlatformConfig( # Chassis BU + VOLKSWAGEN_JETTA_MK7 = VolkswagenMQBPlatformConfig( # Chassis BU [ VWCarDocs("Volkswagen Jetta 2018-24"), VWCarDocs("Volkswagen Jetta GLI 2021-24"), ], VolkswagenCarSpecs(mass=1328, wheelbase=2.71), ) - VOLKSWAGEN_PASSAT_MK8 = VolkswagenMQBPlatformConfig( # Chassis 3G + VOLKSWAGEN_PASSAT_MK8 = VolkswagenMQBPlatformConfig( # Chassis 3G [ VWCarDocs("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), VWCarDocs("Volkswagen Passat Alltrack 2015-22"), @@ -241,55 +241,55 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1551, wheelbase=2.79), ) - VOLKSWAGEN_PASSAT_NMS = VolkswagenPQPlatformConfig( # Chassis A3 + VOLKSWAGEN_PASSAT_NMS = VolkswagenPQPlatformConfig( # Chassis A3 [VWCarDocs("Volkswagen Passat NMS 2017-22")], - VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50*CV.KPH_TO_MS, minEnableSpeed=20*CV.KPH_TO_MS), + VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50 * CV.KPH_TO_MS, minEnableSpeed=20 * CV.KPH_TO_MS), ) - VOLKSWAGEN_POLO_MK6 = VolkswagenMQBPlatformConfig( # Chassis AW + VOLKSWAGEN_POLO_MK6 = VolkswagenMQBPlatformConfig( # Chassis AW [ VWCarDocs("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), VWCarDocs("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), ], VolkswagenCarSpecs(mass=1230, wheelbase=2.55), ) - VOLKSWAGEN_SHARAN_MK2 = VolkswagenPQPlatformConfig( # Chassis 7N + VOLKSWAGEN_SHARAN_MK2 = VolkswagenPQPlatformConfig( # Chassis 7N [ VWCarDocs("Volkswagen Sharan 2018-22"), VWCarDocs("SEAT Alhambra 2018-20"), ], - VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50*CV.KPH_TO_MS), + VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50 * CV.KPH_TO_MS), ) - VOLKSWAGEN_TAOS_MK1 = VolkswagenMQBPlatformConfig( # Chassis B2 + VOLKSWAGEN_TAOS_MK1 = VolkswagenMQBPlatformConfig( # Chassis B2 [VWCarDocs("Volkswagen Taos 2022-23")], VolkswagenCarSpecs(mass=1498, wheelbase=2.69), ) - VOLKSWAGEN_TCROSS_MK1 = VolkswagenMQBPlatformConfig( # Chassis C1 + VOLKSWAGEN_TCROSS_MK1 = VolkswagenMQBPlatformConfig( # Chassis C1 [VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1150, wheelbase=2.60), ) - VOLKSWAGEN_TIGUAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis AD/BW + VOLKSWAGEN_TIGUAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis AD/BW [ VWCarDocs("Volkswagen Tiguan 2018-24"), VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"), ], VolkswagenCarSpecs(mass=1715, wheelbase=2.74), ) - VOLKSWAGEN_TOURAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis 1T + VOLKSWAGEN_TOURAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis 1T [VWCarDocs("Volkswagen Touran 2016-23")], VolkswagenCarSpecs(mass=1516, wheelbase=2.79), ) - VOLKSWAGEN_TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( # Chassis 7H/7L + VOLKSWAGEN_TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( # Chassis 7H/7L [ VWCarDocs("Volkswagen Caravelle 2020"), VWCarDocs("Volkswagen California 2021-23"), ], VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0), ) - VOLKSWAGEN_TROC_MK1 = VolkswagenMQBPlatformConfig( # Chassis A1 + VOLKSWAGEN_TROC_MK1 = VolkswagenMQBPlatformConfig( # Chassis A1 [VWCarDocs("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1413, wheelbase=2.63), ) - AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( # Chassis 8V/FF + AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( # Chassis 8V/FF [ VWCarDocs("Audi A3 2014-19"), VWCarDocs("Audi A3 Sportback e-tron 2017-18"), @@ -298,39 +298,39 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1335, wheelbase=2.61), ) - AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( # Chassis GA + AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( # Chassis GA [VWCarDocs("Audi Q2 2018")], VolkswagenCarSpecs(mass=1205, wheelbase=2.61), ) - AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( # Chassis 8U/F3/FS + AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( # Chassis 8U/F3/FS [VWCarDocs("Audi Q3 2019-23")], VolkswagenCarSpecs(mass=1623, wheelbase=2.68), ) - SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( # Chassis 5F + SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( # Chassis 5F [VWCarDocs("SEAT Ateca 2018")], VolkswagenCarSpecs(mass=1900, wheelbase=2.64), ) - SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( # Chassis 5F + SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( # Chassis 5F [VWCarDocs("SEAT Leon 2014-20")], VolkswagenCarSpecs(mass=1227, wheelbase=2.64), ) - SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( # Chassis PJ + SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( # Chassis PJ [VWCarDocs("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1266, wheelbase=2.56), ) - SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NW + SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NW [VWCarDocs("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ])], VolkswagenCarSpecs(mass=1265, wheelbase=2.66), ) - SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NU + SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NU [VWCarDocs("Škoda Karoq 2019-23")], VolkswagenCarSpecs(mass=1278, wheelbase=2.66), ) - SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NS + SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NS [VWCarDocs("Škoda Kodiaq 2017-23")], VolkswagenCarSpecs(mass=1569, wheelbase=2.79), ) - SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( # Chassis NE + SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( # Chassis NE [ VWCarDocs("Škoda Octavia 2015-19"), VWCarDocs("Škoda Octavia RS 2016"), @@ -338,11 +338,11 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1388, wheelbase=2.68), ) - SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig( # Chassis NW + SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig( # Chassis NW [VWCarDocs("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1192, wheelbase=2.65), ) - SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( # Chassis 3V/NP + SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( # Chassis 3V/NP [VWCarDocs("Škoda Superb 2015-22")], VolkswagenCarSpecs(mass=1505, wheelbase=2.84), ) From bf61e92518775f251a1ec4004889cdb8cd27b47e Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 10 Apr 2024 10:39:24 +0800 Subject: [PATCH 232/384] cabana: gray out inactive messages (#32121) * improve message list remove TODO * improve sort * remove translate * fix seeking issue --- tools/cabana/mainwin.cc | 1 + tools/cabana/messageswidget.cc | 160 +++++++++++++++++++-------------- tools/cabana/messageswidget.h | 11 +-- tools/cabana/utils/util.cc | 12 ++- tools/replay/replay.cc | 38 +++++--- tools/replay/replay.h | 1 + 6 files changed, 140 insertions(+), 83 deletions(-) diff --git a/tools/cabana/mainwin.cc b/tools/cabana/mainwin.cc index bcb65e2e3e..a4b7764346 100644 --- a/tools/cabana/mainwin.cc +++ b/tools/cabana/mainwin.cc @@ -179,6 +179,7 @@ void MainWindow::createDockWindows() { void MainWindow::createDockWidgets() { messages_widget = new MessagesWidget(this); messages_dock->setWidget(messages_widget); + QObject::connect(messages_widget, &MessagesWidget::titleChanged, messages_dock, &QDockWidget::setWindowTitle); // right panel charts_widget = new ChartsWidget(this); diff --git a/tools/cabana/messageswidget.cc b/tools/cabana/messageswidget.cc index 720553dcb3..8043b99a70 100644 --- a/tools/cabana/messageswidget.cc +++ b/tools/cabana/messageswidget.cc @@ -6,16 +6,29 @@ #include #include #include +#include #include #include #include #include "tools/cabana/commands.h" +static bool isMessageActive(const MessageId &id) { + if (auto dummy_stream = dynamic_cast(can)) { + return true; + } + if (id.source == INVALID_SOURCE) { + return false; + } + // Check if the message is active based on time difference and frequency + const auto &m = can->lastMessage(id); + float delta = can->currentSec() - m.ts; + return (m.freq == 0 && delta < 1.5) || (m.freq > 0 && ((delta - 1.0 / settings.fps) < (5.0 / m.freq))); +} + MessagesWidget::MessagesWidget(QWidget *parent) : menu(new QMenu(this)), QWidget(parent) { QVBoxLayout *main_layout = new QVBoxLayout(this); main_layout->setContentsMargins(0, 0, 0, 0); - main_layout->setSpacing(0); // toolbar main_layout->addWidget(createToolBar()); // message table @@ -39,23 +52,10 @@ MessagesWidget::MessagesWidget(QWidget *parent) : menu(new QMenu(this)), QWidget header->setStretchLastSection(true); header->setContextMenuPolicy(Qt::CustomContextMenu); - // suppress - QHBoxLayout *suppress_layout = new QHBoxLayout(); - suppress_layout->addWidget(suppress_add = new QPushButton("Suppress Highlighted")); - suppress_layout->addWidget(suppress_clear = new QPushButton()); - suppress_clear->setToolTip(tr("Clear suppressed")); - suppress_layout->addStretch(1); - QCheckBox *suppress_defined_signals = new QCheckBox(tr("Suppress Signals"), this); - suppress_defined_signals->setToolTip(tr("Suppress defined signals")); - suppress_defined_signals->setChecked(settings.suppress_defined_signals); - suppress_layout->addWidget(suppress_defined_signals); - main_layout->addLayout(suppress_layout); - // signals/slots QObject::connect(menu, &QMenu::aboutToShow, this, &MessagesWidget::menuAboutToShow); QObject::connect(header, &MessageViewHeader::customContextMenuRequested, this, &MessagesWidget::headerContextMenuEvent); QObject::connect(view->horizontalScrollBar(), &QScrollBar::valueChanged, header, &MessageViewHeader::updateHeaderPositions); - QObject::connect(suppress_defined_signals, &QCheckBox::stateChanged, can, &AbstractStream::suppressDefinedSignals); QObject::connect(can, &AbstractStream::msgsReceived, model, &MessageListModel::msgsReceived); QObject::connect(dbc(), &DBCManager::DBCFileChanged, model, &MessageListModel::dbcModified); QObject::connect(UndoStack::instance(), &QUndoStack::indexChanged, model, &MessageListModel::dbcModified); @@ -75,9 +75,6 @@ MessagesWidget::MessagesWidget(QWidget *parent) : menu(new QMenu(this)), QWidget } } }); - QObject::connect(suppress_add, &QPushButton::clicked, this, &MessagesWidget::suppressHighlighted); - QObject::connect(suppress_clear, &QPushButton::clicked, this, &MessagesWidget::suppressHighlighted); - suppressHighlighted(); setWhatsThis(tr(R"( Message View
@@ -91,18 +88,30 @@ MessagesWidget::MessagesWidget(QWidget *parent) : menu(new QMenu(this)), QWidget )")); } -QToolBar *MessagesWidget::createToolBar() { - QToolBar *toolbar = new QToolBar(this); - toolbar->setIconSize({12, 12}); - toolbar->addWidget(num_msg_label = new QLabel(this)); - num_msg_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); +QWidget *MessagesWidget::createToolBar() { + QWidget *toolbar = new QWidget(this); + QHBoxLayout *layout = new QHBoxLayout(toolbar); + layout->setContentsMargins(0, 9, 0, 0); + layout->addWidget(suppress_add = new QPushButton("Suppress Highlighted")); + layout->addWidget(suppress_clear = new QPushButton()); + suppress_clear->setToolTip(tr("Clear suppressed")); + layout->addStretch(1); + QCheckBox *suppress_defined_signals = new QCheckBox(tr("Suppress Signals"), this); + suppress_defined_signals->setToolTip(tr("Suppress defined signals")); + suppress_defined_signals->setChecked(settings.suppress_defined_signals); + layout->addWidget(suppress_defined_signals); - auto views_btn = toolbar->addAction(utils::icon("three-dots"), tr("View...")); - views_btn->setMenu(menu); - auto view_button = qobject_cast(toolbar->widgetForAction(views_btn)); + auto view_button = new ToolButton("three-dots", tr("View...")); + view_button->setMenu(menu); view_button->setPopupMode(QToolButton::InstantPopup); - view_button->setToolButtonStyle(Qt::ToolButtonIconOnly); view_button->setStyleSheet("QToolButton::menu-indicator { image: none; }"); + layout->addWidget(view_button); + + QObject::connect(suppress_add, &QPushButton::clicked, this, &MessagesWidget::suppressHighlighted); + QObject::connect(suppress_clear, &QPushButton::clicked, this, &MessagesWidget::suppressHighlighted); + QObject::connect(suppress_defined_signals, &QCheckBox::stateChanged, can, &AbstractStream::suppressDefinedSignals); + + suppressHighlighted(); return toolbar; } @@ -113,7 +122,7 @@ void MessagesWidget::updateTitle() { auto m = dbc()->msg(item.id); return m ? std::make_pair(pair.first + 1, pair.second + m->sigs.size()) : pair; }); - num_msg_label->setText(tr("%1 Messages (%2 DBC Messages, %3 Signals)") + emit titleChanged(tr("%1 Messages (%2 DBC Messages, %3 Signals)") .arg(model->items_.size()).arg(stats.first).arg(stats.second)); } @@ -156,6 +165,10 @@ void MessagesWidget::menuAboutToShow() { auto action = menu->addAction(tr("Multi-Line bytes"), this, &MessagesWidget::setMultiLineBytes); action->setCheckable(true); action->setChecked(settings.multiple_lines_hex); + + action = menu->addAction(tr("Show inactive Messages"), model, &MessageListModel::showInactivemessages); + action->setCheckable(true); + action->setChecked(model->show_inactive_messages); } void MessagesWidget::setMultiLineBytes(bool multi) { @@ -186,9 +199,9 @@ QVariant MessageListModel::headerData(int section, Qt::Orientation orientation, QVariant MessageListModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() >= items_.size()) return {}; - auto getFreq = [](const CanData &d) { - if (d.freq > 0 && (can->currentSec() - d.ts - 1.0 / settings.fps) < (5.0 / d.freq)) { - return d.freq >= 0.95 ? QString::number(std::nearbyint(d.freq)) : QString::number(d.freq, 'f', 2); + auto getFreq = [](float freq) { + if (freq > 0) { + return freq >= 0.95 ? QString::number(std::nearbyint(freq)) : QString::number(freq, 'f', 2); } else { return QStringLiteral("--"); } @@ -202,7 +215,7 @@ QVariant MessageListModel::data(const QModelIndex &index, int role) const { case Column::SOURCE: return item.id.source != INVALID_SOURCE ? QString::number(item.id.source) : "N/A"; case Column::ADDRESS: return QString::number(item.id.address, 16); case Column::NODE: return item.node; - case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(data) : "N/A"; + case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(data.freq) : "N/A"; case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(data.count) : "N/A"; case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : "N/A"; } @@ -210,6 +223,8 @@ QVariant MessageListModel::data(const QModelIndex &index, int role) const { return QVariant::fromValue((void*)(&data.colors)); } else if (role == BytesRole && index.column() == Column::DATA && item.id.source != INVALID_SOURCE) { return QVariant::fromValue((void*)(&data.dat)); + } else if (role == Qt::ForegroundRole && !item.active) { + return settings.theme == DARK_THEME ? QApplication::palette().color(QPalette::Text).darker(150) : QColor(Qt::gray); } else if (role == Qt::ToolTipRole && index.column() == Column::NAME) { auto msg = dbc()->msg(item.id); auto tooltip = item.name; @@ -224,6 +239,11 @@ void MessageListModel::setFilterStrings(const QMap &filters) { filterAndSort(); } +void MessageListModel::showInactivemessages(bool show) { + show_inactive_messages = show; + filterAndSort(); +} + void MessageListModel::dbcModified() { dbc_messages_.clear(); for (const auto &[_, m] : dbc()->getMessages(-1)) { @@ -233,19 +253,22 @@ void MessageListModel::dbcModified() { } void MessageListModel::sortItems(std::vector &items) { - auto do_sort = [order = sort_order](std::vector &m, auto proj) { - std::stable_sort(m.begin(), m.end(), [order, proj = std::move(proj)](auto &l, auto &r) { - return order == Qt::AscendingOrder ? proj(l) < proj(r) : proj(l) > proj(r); - }); + auto compare = [this](const auto &l, const auto &r) { + switch (sort_column) { + case Column::NAME: return l.name < r.name; + case Column::SOURCE: return l.id.source < r.id.source; + case Column::ADDRESS: return l.id.address < r.id.address; + case Column::NODE: return l.node < r.node; + case Column::FREQ: return can->lastMessage(l.id).freq < can->lastMessage(r.id).freq; + case Column::COUNT: return can->lastMessage(l.id).count < can->lastMessage(r.id).count; + default: return false; // Default case to suppress compiler warning + } }; - switch (sort_column) { - case Column::NAME: do_sort(items, [](auto &item) { return std::tie(item.name, item.id); }); break; - case Column::SOURCE: do_sort(items, [](auto &item) { return std::tie(item.id.source, item.id); }); break; - case Column::ADDRESS: do_sort(items, [](auto &item) { return std::tie(item.id.address, item.id);}); break; - case Column::NODE: do_sort(items, [](auto &item) { return std::tie(item.node, item.id);}); break; - case Column::FREQ: do_sort(items, [](auto &item) { return std::make_pair(can->lastMessage(item.id).freq, item.id); }); break; - case Column::COUNT: do_sort(items, [](auto &item) { return std::make_pair(can->lastMessage(item.id).count, item.id); }); break; - } + + if (sort_order == Qt::DescendingOrder) + std::stable_sort(items.rbegin(), items.rend(), compare); + else + std::stable_sort(items.begin(), items.end(), compare); } static bool parseRange(const QString &filter, uint32_t value, int base = 10) { @@ -292,7 +315,6 @@ bool MessageListModel::match(const MessageListModel::Item &item) { match = item.node.contains(txt, Qt::CaseInsensitive); break; case Column::FREQ: - // TODO: Hide stale messages? match = parseRange(txt, data.freq); break; case Column::COUNT: @@ -306,7 +328,7 @@ bool MessageListModel::match(const MessageListModel::Item &item) { return match; } -void MessageListModel::filterAndSort() { +bool MessageListModel::filterAndSort() { // merge CAN and DBC messages std::vector all_messages; all_messages.reserve(can->lastMessages().size() + dbc_messages_.size()); @@ -319,13 +341,18 @@ void MessageListModel::filterAndSort() { // filter and sort std::vector items; + items.reserve(all_messages.size()); for (const auto &id : all_messages) { - auto msg = dbc()->msg(id); - Item item = {.id = id, - .name = msg ? msg->name : UNTITLED, - .node = msg ? msg->transmitter : QString()}; - if (match(item)) - items.emplace_back(item); + bool active = isMessageActive(id); + if (active || show_inactive_messages) { + auto msg = dbc()->msg(id); + Item item = {.id = id, + .active = active, + .name = msg ? msg->name : UNTITLED, + .node = msg ? msg->transmitter : QString()}; + if (match(item)) + items.emplace_back(item); + } } sortItems(items); @@ -333,16 +360,21 @@ void MessageListModel::filterAndSort() { beginResetModel(); items_ = std::move(items); endResetModel(); + return true; } + return false; } void MessageListModel::msgsReceived(const std::set *new_msgs, bool has_new_ids) { if (has_new_ids || filters_.contains(Column::FREQ) || filters_.contains(Column::COUNT) || filters_.contains(Column::DATA)) { - filterAndSort(); + if (filterAndSort()) return; } for (int i = 0; i < items_.size(); ++i) { - if (!new_msgs || new_msgs->count(items_[i].id)) { - for (int col = Column::FREQ; col < columnCount(); ++col) + auto &item = items_[i]; + bool prev_active = item.active; + item.active = isMessageActive(item.id); + if (item.active != prev_active || !new_msgs || new_msgs->count(item.id)) { + for (int col = 0; col < columnCount(); ++col) emit dataChanged(index(i, col), index(i, col), {Qt::DisplayRole}); } } @@ -360,20 +392,18 @@ void MessageListModel::sort(int column, Qt::SortOrder order) { void MessageView::drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QTreeView::drawRow(painter, option, index); - const int gridHint = style()->styleHint(QStyle::SH_Table_GridLineColor, &option, this); - const QColor gridColor = QColor::fromRgba(static_cast(gridHint)); - QPen old_pen = painter->pen(); - painter->setPen(gridColor); - painter->drawLine(option.rect.left(), option.rect.bottom(), option.rect.right(), option.rect.bottom()); - auto y = option.rect.y(); - painter->translate(visualRect(model()->index(0, 0)).x() - indentation() - .5, -.5); + QPen oldPen = painter->pen(); + const int gridHint = style()->styleHint(QStyle::SH_Table_GridLineColor, &option, this); + painter->setPen(QColor::fromRgba(static_cast(gridHint))); + // Draw bottom border for the row + painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight()); + // Draw vertical borders for each column for (int i = 0; i < header()->count(); ++i) { - painter->translate(header()->sectionSize(header()->logicalIndex(i)), 0); - painter->drawLine(0, y, 0, y + option.rect.height()); + int sectionX = header()->sectionViewportPosition(i); + painter->drawLine(sectionX, option.rect.top(), sectionX, option.rect.bottom()); } - painter->setPen(old_pen); - painter->resetTransform(); + painter->setPen(oldPen); } void MessageView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) { diff --git a/tools/cabana/messageswidget.h b/tools/cabana/messageswidget.h index e7f1f8c033..c110db2b56 100644 --- a/tools/cabana/messageswidget.h +++ b/tools/cabana/messageswidget.h @@ -7,10 +7,8 @@ #include #include -#include #include #include -#include #include #include @@ -38,19 +36,22 @@ public: int rowCount(const QModelIndex &parent = QModelIndex()) const override { return items_.size(); } void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; void setFilterStrings(const QMap &filters); + void showInactivemessages(bool show); void msgsReceived(const std::set *new_msgs, bool has_new_ids); - void filterAndSort(); + bool filterAndSort(); void dbcModified(); struct Item { MessageId id; QString name; QString node; + bool active; bool operator==(const Item &other) const { return id == other.id && name == other.name && node == other.node; } }; std::vector items_; + bool show_inactive_messages = true; private: void sortItems(std::vector &items); @@ -100,9 +101,10 @@ public: signals: void msgSelectionChanged(const MessageId &message_id); + void titleChanged(const QString &title); protected: - QToolBar *createToolBar(); + QWidget *createToolBar(); void headerContextMenuEvent(const QPoint &pos); void menuAboutToShow(); void setMultiLineBytes(bool multi); @@ -115,6 +117,5 @@ protected: MessageListModel *model; QPushButton *suppress_add; QPushButton *suppress_clear; - QLabel *num_msg_label; QMenu *menu; }; diff --git a/tools/cabana/utils/util.cc b/tools/cabana/utils/util.cc index c89e39993b..a5f6cf0f5e 100644 --- a/tools/cabana/utils/util.cc +++ b/tools/cabana/utils/util.cc @@ -88,18 +88,24 @@ void MessageBytesDelegate::paint(QPainter *painter, const QStyleOptionViewItem & const auto &bytes = *static_cast*>(data.value()); const auto &colors = *static_cast*>(index.data(ColorsRole).value()); + auto text_color = index.data(Qt::ForegroundRole).value(); + bool inactive = text_color.isValid(); + if (!inactive) { + text_color = option.palette.color(QPalette::Text); + } + for (int i = 0; i < bytes.size(); ++i) { int row = !multiple_lines ? 0 : i / 8; int column = !multiple_lines ? i : i % 8; QRect r = QRect({pt.x() + column * byte_size.width(), pt.y() + row * byte_size.height()}, byte_size); - if (i < colors.size() && colors[i].alpha() > 0) { + if (!inactive && i < colors.size() && colors[i].alpha() > 0) { if (option.state & QStyle::State_Selected) { painter->setPen(option.palette.color(QPalette::Text)); painter->fillRect(r, option.palette.color(QPalette::Window)); } painter->fillRect(r, colors[i]); - } else if (option.state & QStyle::State_Selected) { - painter->setPen(option.palette.color(QPalette::HighlightedText)); + } else { + painter->setPen(option.state & QStyle::State_Selected ? option.palette.color(QPalette::HighlightedText) : text_color); } utils::drawStaticText(painter, r, hex_text_table[bytes[i]]); } diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index 3d5d3219c6..ae148f1a5b 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -96,20 +96,26 @@ void Replay::updateEvents(const std::function &lambda) { } void Replay::seekTo(double seconds, bool relative) { - seconds = relative ? seconds + currentSeconds() : seconds; + seeking_to_seconds_ = relative ? seconds + currentSeconds() : seconds; + seeking_to_seconds_ = std::max(double(0.0), seeking_to_seconds_); + updateEvents([&]() { - seconds = std::max(double(0.0), seconds); - int seg = (int)seconds / 60; - if (segments_.find(seg) == segments_.end()) { - rWarning("can't seek to %d s segment %d is invalid", seconds, seg); + int target_segment = (int)seeking_to_seconds_ / 60; + if (segments_.count(target_segment) == 0) { + rWarning("can't seek to %d s segment %d is invalid", (int)seeking_to_seconds_, target_segment); return true; } - rInfo("seeking to %d s, segment %d", (int)seconds, seg); - current_segment_ = seg; - cur_mono_time_ = route_start_ts_ + seconds * 1e9; - emit seekedTo(seconds); - return isSegmentMerged(seg); + rInfo("seeking to %d s, segment %d", (int)seeking_to_seconds_, target_segment); + current_segment_ = target_segment; + cur_mono_time_ = route_start_ts_ + seeking_to_seconds_ * 1e9; + bool segment_merged = isSegmentMerged(target_segment); + if (segment_merged) { + emit seekedTo(seeking_to_seconds_); + // Reset seeking_to_seconds_ to indicate completion of seek + seeking_to_seconds_ = -1; + } + return segment_merged; }); queueSegment(); } @@ -277,6 +283,18 @@ void Replay::mergeSegments(const SegmentMap::iterator &begin, const SegmentMap:: if (stream_thread_) { emit segmentsMerged(); + + // Check if seeking is in progress + if (seeking_to_seconds_ >= 0) { + int target_segment = int(seeking_to_seconds_ / 60); + auto segment_found = std::find(segments_need_merge.begin(), segments_need_merge.end(), target_segment); + + // If the target segment is found, emit seekedTo signal and reset seeking_to_seconds_ + if (segment_found != segments_need_merge.end()) { + emit seekedTo(seeking_to_seconds_); + seeking_to_seconds_ = -1; // Reset seeking_to_seconds_ to indicate completion of seek + } + } } updateEvents([&]() { events_.swap(new_events_); diff --git a/tools/replay/replay.h b/tools/replay/replay.h index 3859b69380..c4140dc806 100644 --- a/tools/replay/replay.h +++ b/tools/replay/replay.h @@ -117,6 +117,7 @@ protected: std::condition_variable stream_cv_; std::atomic updating_events_ = false; std::atomic current_segment_ = 0; + double seeking_to_seconds_ = -1; SegmentMap segments_; // the following variables must be protected with stream_lock_ std::atomic exit_ = false; From 16bb4a9ccd1fe07d5a90aae719873e4bfc8e4d65 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 9 Apr 2024 21:00:56 -0700 Subject: [PATCH 233/384] Volkswagen: combine platforms with common chassis codes (#32147) * fix curb weight for Ateca to match Leon better https://www.auto-data.net/en/seat-ateca-i-1.6-tdi-115hp-start-stop-23096 https://www.seat.com/content/dam/public/seat-website/car-shopping-tools/brochure-download/brochures/ateca/cars-specs-brochure-KH7-NA-december-2018.pdf * combine leon and ateca * combine fw * migrate * great, both use same torque params * scala and kamiq * remove duplicates * fix * fix! --- selfdrive/car/fingerprints.py | 6 ++- selfdrive/car/tests/routes.py | 4 +- selfdrive/car/torque_data/substitute.toml | 2 - selfdrive/car/volkswagen/fingerprints.py | 51 ++++++----------------- selfdrive/car/volkswagen/values.py | 23 +++++----- 5 files changed, 28 insertions(+), 58 deletions(-) diff --git a/selfdrive/car/fingerprints.py b/selfdrive/car/fingerprints.py index 978d2260d6..9be6dc8de6 100644 --- a/selfdrive/car/fingerprints.py +++ b/selfdrive/car/fingerprints.py @@ -331,13 +331,15 @@ MIGRATION = { "AUDI Q2 1ST GEN": VW.AUDI_Q2_MK1, "AUDI Q3 2ND GEN": VW.AUDI_Q3_MK2, "SEAT ATECA 1ST GEN": VW.SEAT_ATECA_MK1, - "SEAT LEON 3RD GEN": VW.SEAT_LEON_MK3, + "SEAT LEON 3RD GEN": VW.SEAT_ATECA_MK1, + "SEAT_LEON_MK3": VW.SEAT_ATECA_MK1, "SKODA FABIA 4TH GEN": VW.SKODA_FABIA_MK4, "SKODA KAMIQ 1ST GEN": VW.SKODA_KAMIQ_MK1, "SKODA KAROQ 1ST GEN": VW.SKODA_KAROQ_MK1, "SKODA KODIAQ 1ST GEN": VW.SKODA_KODIAQ_MK1, "SKODA OCTAVIA 3RD GEN": VW.SKODA_OCTAVIA_MK3, - "SKODA SCALA 1ST GEN": VW.SKODA_SCALA_MK1, + "SKODA SCALA 1ST GEN": VW.SKODA_KAMIQ_MK1, + "SKODA_SCALA_MK1": VW.SKODA_KAMIQ_MK1, "SKODA SUPERB 3RD GEN": VW.SKODA_SUPERB_MK3, "mock": MOCK.MOCK, diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 036f39c1f3..ae76268d38 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -248,13 +248,13 @@ routes = [ CarTestRoute("6c6b466346192818|2021-06-06--14-17-47", VOLKSWAGEN.AUDI_Q2_MK1), CarTestRoute("0cd0b7f7e31a3853|2021-12-03--03-12-05", VOLKSWAGEN.AUDI_Q3_MK2), CarTestRoute("8f205bdd11bcbb65|2021-03-26--01-00-17", VOLKSWAGEN.SEAT_ATECA_MK1), - CarTestRoute("fc6b6c9a3471c846|2021-05-27--13-39-56", VOLKSWAGEN.SEAT_LEON_MK3), + CarTestRoute("fc6b6c9a3471c846|2021-05-27--13-39-56", VOLKSWAGEN.SEAT_ATECA_MK1), # Leon CarTestRoute("0bbe367c98fa1538|2023-03-04--17-46-11", VOLKSWAGEN.SKODA_FABIA_MK4), CarTestRoute("12d6ae3057c04b0d|2021-09-15--00-04-07", VOLKSWAGEN.SKODA_KAMIQ_MK1), CarTestRoute("12d6ae3057c04b0d|2021-09-04--21-21-21", VOLKSWAGEN.SKODA_KAROQ_MK1), CarTestRoute("90434ff5d7c8d603|2021-03-15--12-07-31", VOLKSWAGEN.SKODA_KODIAQ_MK1), CarTestRoute("66e5edc3a16459c5|2021-05-25--19-00-29", VOLKSWAGEN.SKODA_OCTAVIA_MK3), - CarTestRoute("026b6d18fba6417f|2021-03-26--09-17-04", VOLKSWAGEN.SKODA_SCALA_MK1), + CarTestRoute("026b6d18fba6417f|2021-03-26--09-17-04", VOLKSWAGEN.SKODA_KAMIQ_MK1), # Scala CarTestRoute("b2e9858e29db492b|2021-03-26--16-58-42", VOLKSWAGEN.SKODA_SUPERB_MK3), CarTestRoute("3c8f0c502e119c1c|2020-06-30--12-58-02", SUBARU.SUBARU_ASCENT), diff --git a/selfdrive/car/torque_data/substitute.toml b/selfdrive/car/torque_data/substitute.toml index 22ee134ae3..8724a08010 100644 --- a/selfdrive/car/torque_data/substitute.toml +++ b/selfdrive/car/torque_data/substitute.toml @@ -58,7 +58,6 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "SKODA_FABIA_MK4" = "VOLKSWAGEN_GOLF_MK7" "SKODA_OCTAVIA_MK3" = "SKODA_SUPERB_MK3" -"SKODA_SCALA_MK1" = "SKODA_SUPERB_MK3" "SKODA_KODIAQ_MK1" = "SKODA_SUPERB_MK3" "SKODA_KAROQ_MK1" = "SKODA_SUPERB_MK3" "SKODA_KAMIQ_MK1" = "SKODA_SUPERB_MK3" @@ -70,7 +69,6 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "AUDI_Q2_MK1" = "VOLKSWAGEN_TIGUAN_MK2" "VOLKSWAGEN_TAOS_MK1" = "VOLKSWAGEN_TIGUAN_MK2" "VOLKSWAGEN_POLO_MK6" = "VOLKSWAGEN_GOLF_MK7" -"SEAT_LEON_MK3" = "VOLKSWAGEN_GOLF_MK7" "SEAT_ATECA_MK1" = "VOLKSWAGEN_GOLF_MK7" "SUBARU_CROSSTREK_HYBRID" = "SUBARU_IMPREZA_2020" diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 39fc910ae9..707d96d739 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -874,22 +874,6 @@ FW_VERSIONS = { CAR.SEAT_ATECA_MK1: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704E906027KA\xf1\x893749', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x870D9300014S \xf1\x895202', - ], - (Ecu.srs, 0x715, None): [ - b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1212001211001305121211052900', - ], - (Ecu.eps, 0x712, None): [ - b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571N60511A1', - ], - (Ecu.fwdRadar, 0x757, None): [ - b'\xf1\x872Q0907572M \xf1\x890233', - ], - }, - CAR.SEAT_LEON_MK3: { - (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704L906021EL\xf1\x897542', b'\xf1\x8704L906026BP\xf1\x891198', b'\xf1\x8704L906026BP\xf1\x897608', @@ -903,6 +887,7 @@ FW_VERSIONS = { b'\xf1\x870CW300041D \xf1\x891004', b'\xf1\x870CW300041G \xf1\x891003', b'\xf1\x870CW300050J \xf1\x891908', + b'\xf1\x870D9300014S \xf1\x895202', b'\xf1\x870D9300042M \xf1\x895016', b'\xf1\x870GC300043A \xf1\x892304', ], @@ -910,11 +895,13 @@ FW_VERSIONS = { b'\xf1\x873Q0959655AC\xf1\x890189\xf1\x82\r11110011110011021511110200', b'\xf1\x873Q0959655AS\xf1\x890200\xf1\x82\r11110011110011021511110200', b'\xf1\x873Q0959655AS\xf1\x890200\xf1\x82\r12110012120012021612110200', + b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1212001211001305121211052900', b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1312001313001305171311052900', b'\xf1\x873Q0959655BH\xf1\x890712\xf1\x82\x0e1312001313001305171311052900', b'\xf1\x873Q0959655CM\xf1\x890720\xf1\x82\x0e1312001313001305171311052900', ], (Ecu.eps, 0x712, None): [ + b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571N60511A1', b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521N01842A1', b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521N01342A1', b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0511N01805A0', @@ -922,6 +909,7 @@ FW_VERSIONS = { b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521N05808A1', ], (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572M \xf1\x890233', b'\xf1\x875Q0907572B \xf1\x890200\xf1\x82\x0101', b'\xf1\x875Q0907572H \xf1\x890620', b'\xf1\x875Q0907572K \xf1\x890402\xf1\x82\x0101', @@ -948,15 +936,22 @@ FW_VERSIONS = { }, CAR.SKODA_KAMIQ_MK1: { (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704C906025AK\xf1\x897053', b'\xf1\x8705C906032M \xf1\x891333', + b'\xf1\x8705C906032M \xf1\x892365', b'\xf1\x8705E906013CK\xf1\x892540', ], (Ecu.transmission, 0x7e1, None): [ b'\xf1\x870CW300020 \xf1\x891906', + b'\xf1\x870CW300020 \xf1\x891907', b'\xf1\x870CW300020T \xf1\x892204', + b'\xf1\x870CW300050 \xf1\x891709', ], (Ecu.srs, 0x715, None): [ + b'\xf1\x872Q0959655AJ\xf1\x890250\xf1\x82\x1211110411110411--04040404131111112H14', + b'\xf1\x872Q0959655AM\xf1\x890351\xf1\x82\x12111104111104112104040404111111112H14', b'\xf1\x872Q0959655AM\xf1\x890351\xf1\x82\x122221042111042121040404042E2711152H14', + b'\xf1\x872Q0959655AS\xf1\x890411\xf1\x82\x1311150411110411210404040417151215391413', b'\xf1\x872Q0959655BJ\xf1\x890412\xf1\x82\x132223042111042121040404042B251215391423', ], (Ecu.eps, 0x712, None): [ @@ -965,6 +960,7 @@ FW_VERSIONS = { ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572R \xf1\x890372', b'\xf1\x872Q0907572T \xf1\x890383', ], }, @@ -1117,29 +1113,6 @@ FW_VERSIONS = { b'\xf1\x875Q0907572R \xf1\x890771', ], }, - CAR.SKODA_SCALA_MK1: { - (Ecu.engine, 0x7e0, None): [ - b'\xf1\x8704C906025AK\xf1\x897053', - b'\xf1\x8705C906032M \xf1\x892365', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x870CW300020 \xf1\x891907', - b'\xf1\x870CW300050 \xf1\x891709', - ], - (Ecu.srs, 0x715, None): [ - b'\xf1\x872Q0959655AJ\xf1\x890250\xf1\x82\x1211110411110411--04040404131111112H14', - b'\xf1\x872Q0959655AM\xf1\x890351\xf1\x82\x12111104111104112104040404111111112H14', - b'\xf1\x872Q0959655AS\xf1\x890411\xf1\x82\x1311150411110411210404040417151215391413', - ], - (Ecu.eps, 0x712, None): [ - b'\xf1\x872Q1909144AB\xf1\x896050', - b'\xf1\x872Q1909144M \xf1\x896041', - ], - (Ecu.fwdRadar, 0x757, None): [ - b'\xf1\x872Q0907572AA\xf1\x890396', - b'\xf1\x872Q0907572R \xf1\x890372', - ], - }, CAR.SKODA_SUPERB_MK3: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704E906027BS\xf1\x892887', diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 386cbf43f2..c4e037d9c5 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -174,7 +174,6 @@ class VWCarDocs(CarDocs): # Check the 7th and 8th characters of the VIN before adding a new CAR. If the # chassis code is already listed below, don't add a new CAR, just add to the # FW_VERSIONS for that existing CAR. -# Exception: SEAT Leon and SEAT Ateca share a chassis code class CAR(Platforms): VOLKSWAGEN_ARTEON_MK1 = VolkswagenMQBPlatformConfig( # Chassis AN @@ -307,20 +306,22 @@ class CAR(Platforms): VolkswagenCarSpecs(mass=1623, wheelbase=2.68), ) SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( # Chassis 5F - [VWCarDocs("SEAT Ateca 2018")], - VolkswagenCarSpecs(mass=1900, wheelbase=2.64), - ) - SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( # Chassis 5F - [VWCarDocs("SEAT Leon 2014-20")], - VolkswagenCarSpecs(mass=1227, wheelbase=2.64), + [ + VWCarDocs("SEAT Ateca 2018"), + VWCarDocs("SEAT Leon 2014-20"), + ], + VolkswagenCarSpecs(mass=1300, wheelbase=2.64), ) SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( # Chassis PJ [VWCarDocs("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1266, wheelbase=2.56), ) SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NW - [VWCarDocs("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ])], - VolkswagenCarSpecs(mass=1265, wheelbase=2.66), + [ + VWCarDocs("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ]), + VWCarDocs("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0]), + ], + VolkswagenCarSpecs(mass=1230, wheelbase=2.66), ) SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NU [VWCarDocs("Škoda Karoq 2019-23")], @@ -338,10 +339,6 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=1388, wheelbase=2.68), ) - SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig( # Chassis NW - [VWCarDocs("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0])], - VolkswagenCarSpecs(mass=1192, wheelbase=2.65), - ) SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( # Chassis 3V/NP [VWCarDocs("Škoda Superb 2015-22")], VolkswagenCarSpecs(mass=1505, wheelbase=2.84), From bc4c39404ae006206787ca1b7f5b468c7bd0b374 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 10 Apr 2024 10:24:44 -0700 Subject: [PATCH 234/384] qcomgpsd: don't send bad time assistance (#32151) --- system/qcomgpsd/qcomgpsd.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/system/qcomgpsd/qcomgpsd.py b/system/qcomgpsd/qcomgpsd.py index 859e024e68..21c7995a77 100755 --- a/system/qcomgpsd/qcomgpsd.py +++ b/system/qcomgpsd/qcomgpsd.py @@ -17,6 +17,7 @@ from cereal import log import cereal.messaging as messaging from openpilot.common.gpio import gpio_init, gpio_set from openpilot.common.retry import retry +from openpilot.common.time import system_time_valid from openpilot.system.hardware.tici.pins import GPIO from openpilot.common.swaglog import cloudlog from openpilot.system.qcomgpsd.modemdiag import ModemDiag, DIAG_LOG_F, setup_logs, send_recv @@ -171,8 +172,9 @@ def setup_quectel(diag: ModemDiag) -> bool: inject_assistance() os.remove(ASSIST_DATA_FILE) #at_cmd("AT+QGPSXTRADATA?") - time_str = datetime.datetime.utcnow().strftime("%Y/%m/%d,%H:%M:%S") - at_cmd(f"AT+QGPSXTRATIME=0,\"{time_str}\",1,1,1000") + if system_time_valid(): + time_str = datetime.datetime.utcnow().strftime("%Y/%m/%d,%H:%M:%S") + at_cmd(f"AT+QGPSXTRATIME=0,\"{time_str}\",1,1,1000") at_cmd("AT+QGPSCFG=\"outport\",\"usbnmea\"") at_cmd("AT+QGPS=1") From 7a3c03c901829e9da2170afc9968b834168a47b5 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 10 Apr 2024 10:38:56 -0700 Subject: [PATCH 235/384] [bot] Fingerprints: add missing FW versions from new users (#32149) Export fingerprints --- selfdrive/car/honda/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index cae5c44bc9..18fe69dd1f 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -43,6 +43,7 @@ FW_VERSIONS = { b'37805-6B2-AA10\x00\x00', b'37805-6B2-C520\x00\x00', b'37805-6B2-C540\x00\x00', + b'37805-6B2-C560\x00\x00', b'37805-6B2-M520\x00\x00', b'37805-6B2-Y810\x00\x00', b'37805-6M4-B730\x00\x00', From 9d1b3cc7737ed0621383d09d0a4772bfc867cc02 Mon Sep 17 00:00:00 2001 From: MarinkoMagla <159032106+MarinkoMagla@users.noreply.github.com> Date: Thu, 11 Apr 2024 00:22:36 +0200 Subject: [PATCH 236/384] Encode the actual current date in vw_mqb_config.py (#32093) --- selfdrive/debug/vw_mqb_config.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/selfdrive/debug/vw_mqb_config.py b/selfdrive/debug/vw_mqb_config.py index 75409e3f87..64bc2bc638 100755 --- a/selfdrive/debug/vw_mqb_config.py +++ b/selfdrive/debug/vw_mqb_config.py @@ -6,6 +6,7 @@ from enum import IntEnum from panda import Panda from panda.python.uds import UdsClient, MessageTimeoutError, NegativeResponseError, SESSION_TYPE,\ DATA_IDENTIFIER_TYPE, ACCESS_TYPE +from datetime import date # TODO: extend UDS library to allow custom/vendor-defined data identifiers without ignoring type checks class VOLKSWAGEN_DATA_IDENTIFIER_TYPE(IntEnum): @@ -136,8 +137,10 @@ if __name__ == "__main__": # last two bytes, but not the VZ/importer or tester serial number # Can't seem to read it back, but we can read the calibration tester, # so fib a little and say that same tester did the programming - # TODO: encode the actual current date - prog_date = b'\x22\x02\x08' + current_date = date.today() + formatted_date = current_date.strftime('%y-%m-%d') + year, month, day = [int(part) for part in formatted_date.split('-')] + prog_date = bytes([year, month, day]) uds_client.write_data_by_identifier(DATA_IDENTIFIER_TYPE.PROGRAMMING_DATE, prog_date) tester_num = uds_client.read_data_by_identifier(DATA_IDENTIFIER_TYPE.CALIBRATION_REPAIR_SHOP_CODE_OR_CALIBRATION_EQUIPMENT_SERIAL_NUMBER) uds_client.write_data_by_identifier(DATA_IDENTIFIER_TYPE.REPAIR_SHOP_CODE_OR_TESTER_SERIAL_NUMBER, tester_num) From c1edc0901e983c456d53c5dffbd72bd4aebe0419 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 11 Apr 2024 10:51:33 +0800 Subject: [PATCH 237/384] common/params.cc: unlink tmp_path only if there's an error (#32145) --- common/params.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/params.cc b/common/params.cc index 38d96a30b0..8635f30d26 100644 --- a/common/params.cc +++ b/common/params.cc @@ -273,7 +273,9 @@ int Params::put(const char* key, const char* value, size_t value_size) { } while (false); close(tmp_fd); - ::unlink(tmp_path.c_str()); + if (result != 0) { + ::unlink(tmp_path.c_str()); + } return result; } From 70b8e277d023196d79f33f9b93090efcbdac6fee Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 10 Apr 2024 23:39:45 -0700 Subject: [PATCH 238/384] Volkswagen: test FW version format (#32162) * add test * more explicit --- .../car/volkswagen/tests/test_volkswagen.py | 19 +++++++++++++++++++ selfdrive/car/volkswagen/values.py | 4 ++++ 2 files changed, 23 insertions(+) create mode 100755 selfdrive/car/volkswagen/tests/test_volkswagen.py diff --git a/selfdrive/car/volkswagen/tests/test_volkswagen.py b/selfdrive/car/volkswagen/tests/test_volkswagen.py new file mode 100755 index 0000000000..e4548ab76c --- /dev/null +++ b/selfdrive/car/volkswagen/tests/test_volkswagen.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +import unittest + +from openpilot.selfdrive.car.volkswagen.values import SPARE_PART_FW_PATTERN +from openpilot.selfdrive.car.volkswagen.fingerprints import FW_VERSIONS + + +class TestVolkswagenPlatformConfigs(unittest.TestCase): + def test_spare_part_fw_pattern(self): + # Relied on for determining if a FW is likely VW + for platform, ecus in FW_VERSIONS.items(): + with self.subTest(platform=platform): + for fws in ecus.values(): + for fw in fws: + self.assertNotEqual(SPARE_PART_FW_PATTERN.match(fw), None, f"Bad FW: {fw}") + + +if __name__ == "__main__": + unittest.main() diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index c4e037d9c5..42dc2869ca 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1,6 +1,7 @@ from collections import namedtuple from dataclasses import dataclass, field from enum import Enum, IntFlag +import re from cereal import car from panda.python import uds @@ -362,6 +363,9 @@ VOLKSWAGEN_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + VOLKSWAGEN_RX_OFFSET = 0x6a +# TODO: determine the unknown groups +SPARE_PART_FW_PATTERN = re.compile(b'\xf1\x87(?P[0-9][0-9A-Z]{2})(?P[0-9][0-9A-Z][0-9])(?P[0-9A-Z]{2}[0-9])([A-Z0-9]| )') + FW_QUERY_CONFIG = FwQueryConfig( # TODO: add back whitelists after we gather enough data requests=[request for bus, obd_multiplexing in [(1, True), (1, False), (0, False)] for request in [ From ecb648a68ab86e053faff450f5bf0d2bfc221333 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 11 Apr 2024 09:46:27 -0700 Subject: [PATCH 239/384] agnos casync script improvements (#32156) * build agnos * include path * cleanup * rm this * test it * all agnos partitions are AB * fix that * correct * build agnos first * better temp dir * revert the order * try it on pc * test it * upload and fix * build * pass in environemnt variable * not in jenkins --- release/create_casync_agnos_release.py | 10 ++++++++-- release/create_release_manifest.py | 19 ++++++++----------- system/version.py | 7 ++++++- 3 files changed, 22 insertions(+), 14 deletions(-) mode change 100644 => 100755 release/create_casync_agnos_release.py diff --git a/release/create_casync_agnos_release.py b/release/create_casync_agnos_release.py old mode 100644 new mode 100755 index 7f46f10129..60934b8c18 --- a/release/create_casync_agnos_release.py +++ b/release/create_casync_agnos_release.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import argparse import json import pathlib @@ -5,13 +6,15 @@ import tempfile from openpilot.common.basedir import BASEDIR from openpilot.system.hardware.tici.agnos import StreamingDecompressor, unsparsify, noop, AGNOS_MANIFEST_FILE from openpilot.system.updated.casync.common import create_casync_from_file +from openpilot.system.version import get_agnos_version if __name__ == "__main__": parser = argparse.ArgumentParser(description="creates a casync release") parser.add_argument("output_dir", type=str, help="output directory for the channel") - parser.add_argument("version", type=str, help="version of agnos this is") + parser.add_argument("working_dir", type=str, help="working directory") + parser.add_argument("--version", type=str, help="version of agnos this is", default=get_agnos_version()) parser.add_argument("--manifest", type=str, help="json manifest to create agnos release from", \ default=str(pathlib.Path(BASEDIR) / AGNOS_MANIFEST_FILE)) args = parser.parse_args() @@ -19,9 +22,12 @@ if __name__ == "__main__": output_dir = pathlib.Path(args.output_dir) output_dir.mkdir(parents=True, exist_ok=True) + working_dir = pathlib.Path(args.working_dir) + working_dir.mkdir(parents=True, exist_ok=True) + manifest_file = pathlib.Path(args.manifest) - with tempfile.NamedTemporaryFile() as entry_file: + with tempfile.NamedTemporaryFile(dir=str(working_dir)) as entry_file: entry_path = pathlib.Path(entry_file.name) with open(manifest_file) as f: diff --git a/release/create_release_manifest.py b/release/create_release_manifest.py index 8e39f2b31c..065cf03e9b 100755 --- a/release/create_release_manifest.py +++ b/release/create_release_manifest.py @@ -4,17 +4,16 @@ import dataclasses import json import pathlib -from openpilot.common.run import run_cmd -from openpilot.system.hardware.tici.agnos import AGNOS_MANIFEST_FILE -from openpilot.system.version import get_build_metadata +from openpilot.system.hardware.tici.agnos import AGNOS_MANIFEST_FILE, get_partition_path +from openpilot.system.version import get_build_metadata, get_agnos_version BASE_URL = "https://commadist.blob.core.windows.net" CHANNEL_DATA = pathlib.Path(__file__).parent / "channel_data" / "agnos" -OPENPILOT_RELEASES = f"{BASE_URL}/openpilot-releases" -AGNOS_RELEASES = f"{BASE_URL}/agnos-releases" +OPENPILOT_RELEASES = f"{BASE_URL}/openpilot-releases/openpilot" +AGNOS_RELEASES = f"{BASE_URL}/openpilot-releases/agnos" def create_partition_manifest(agnos_version, partition): @@ -23,10 +22,11 @@ def create_partition_manifest(agnos_version, partition): "casync": { "caibx": f"{AGNOS_RELEASES}/agnos-{agnos_version}-{partition['name']}.caibx" }, - "name": partition["name"], + "path": get_partition_path(0, partition), + "ab": True, "size": partition["size"], "full_check": partition["full_check"], - "hash_raw": partition["hash_raw"] + "hash_raw": partition["hash_raw"], } @@ -49,15 +49,12 @@ if __name__ == "__main__": with open(pathlib.Path(args.target_dir) / AGNOS_MANIFEST_FILE) as f: agnos_manifest = json.load(f) - agnos_version = run_cmd(["bash", "-c", r"unset AGNOS_VERSION && source launch_env.sh && \ - echo -n $AGNOS_VERSION"], args.target_dir).strip() - build_metadata = get_build_metadata(args.target_dir) ret = { "build_metadata": dataclasses.asdict(build_metadata), "manifest": [ - *[create_partition_manifest(agnos_version, entry) for entry in agnos_manifest], + *[create_partition_manifest(get_agnos_version(args.target_dir), entry) for entry in agnos_manifest], create_openpilot_manifest(build_metadata) ] } diff --git a/system/version.py b/system/version.py index 3aa35455e5..6c3609c45a 100755 --- a/system/version.py +++ b/system/version.py @@ -10,7 +10,7 @@ from openpilot.common.basedir import BASEDIR from openpilot.common.swaglog import cloudlog from openpilot.common.utils import cache from openpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_commit_date - +from openpilot.common.run import run_cmd RELEASE_BRANCHES = ['release3-staging', 'release3', 'nightly'] TESTED_BRANCHES = RELEASE_BRANCHES + ['devel', 'devel-staging'] @@ -157,6 +157,11 @@ def get_build_metadata(path: str = BASEDIR) -> BuildMetadata: raise Exception("invalid build metadata") +def get_agnos_version(directory: str = BASEDIR) -> str: + return run_cmd(["bash", "-c", r"unset AGNOS_VERSION && source launch_env.sh && \ + echo -n $AGNOS_VERSION"], cwd=directory).strip() + + if __name__ == "__main__": from openpilot.common.params import Params From cce17dc0c58204d38ab54dc133d537be425fe750 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 11 Apr 2024 09:52:45 -0700 Subject: [PATCH 240/384] no cross references between updaters (#32168) * no references * but keep this --- selfdrive/updated/tests/test_base.py | 9 ++++++--- selfdrive/updated/updated.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/selfdrive/updated/tests/test_base.py b/selfdrive/updated/tests/test_base.py index 1107a2d3b1..b59f03fe77 100644 --- a/selfdrive/updated/tests/test_base.py +++ b/selfdrive/updated/tests/test_base.py @@ -10,12 +10,15 @@ import unittest from unittest import mock import pytest + +from openpilot.common.params import Params from openpilot.selfdrive.manager.process import ManagerProcess +from openpilot.selfdrive.test.helpers import processes_context -from openpilot.selfdrive.test.helpers import processes_context -from openpilot.common.params import Params -from openpilot.system.updated.common import get_consistent_flag +def get_consistent_flag(path: str) -> bool: + consistent_file = pathlib.Path(os.path.join(path, ".overlay_consistent")) + return consistent_file.is_file() def run(args, **kwargs): diff --git a/selfdrive/updated/updated.py b/selfdrive/updated/updated.py index 3a710ba02f..c1af41bd92 100755 --- a/selfdrive/updated/updated.py +++ b/selfdrive/updated/updated.py @@ -16,9 +16,9 @@ from markdown_it import MarkdownIt from openpilot.common.basedir import BASEDIR from openpilot.common.params import Params from openpilot.common.time import system_time_valid -from openpilot.system.hardware import AGNOS, HARDWARE from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.controls.lib.alertmanager import set_offroad_alert +from openpilot.system.hardware import AGNOS, HARDWARE from openpilot.system.version import get_build_metadata LOCK_FILE = os.getenv("UPDATER_LOCK_FILE", "/tmp/safe_staging_overlay.lock") From ccddd48db8caee067109f85869b916b82ad2de3b Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 11 Apr 2024 10:25:38 -0700 Subject: [PATCH 241/384] move casync openpilot build to /data/casync/openpilot (#32171) move to openpilot --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 45a18879f5..660755046e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -154,7 +154,7 @@ def build_release(String channel_name) { }, "${channel_name} (casync)": { deviceStage("build casync", "tici-needs-can", [], [ - ["build ${channel_name}", "RELEASE=1 OPENPILOT_CHANNEL=${channel_name} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync $SOURCE_DIR/release/create_casync_build.sh"], + ["build ${channel_name}", "RELEASE=1 OPENPILOT_CHANNEL=${channel_name} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync/openpilot $SOURCE_DIR/release/create_casync_build.sh"], ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/openpilot /data/manifest.json && cat /data/manifest.json"], ["upload and cleanup ${channel_name}", "PYTHONWARNINGS=ignore $SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], ]) From e66ded444c643a9e0c875751a601f00a2d85b50a Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 12 Apr 2024 01:43:20 +0800 Subject: [PATCH 242/384] ui/network: fix typos (#32163) --- selfdrive/ui/qt/network/wifi_manager.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/selfdrive/ui/qt/network/wifi_manager.cc b/selfdrive/ui/qt/network/wifi_manager.cc index 111726330d..854a8920b5 100644 --- a/selfdrive/ui/qt/network/wifi_manager.cc +++ b/selfdrive/ui/qt/network/wifi_manager.cc @@ -98,10 +98,10 @@ void WifiManager::refreshFinished(QDBusPendingCallWatcher *watcher) { ipv4_address = getIp4Address(); seenNetworks.clear(); - const QDBusReply> wather_reply = *watcher; - for (const QDBusObjectPath &path : wather_reply.value()) { - QDBusReply replay = call(path.path(), NM_DBUS_INTERFACE_PROPERTIES, "GetAll", NM_DBUS_INTERFACE_ACCESS_POINT); - auto properties = replay.value(); + const QDBusReply> watcher_reply = *watcher; + for (const QDBusObjectPath &path : watcher_reply.value()) { + QDBusReply reply = call(path.path(), NM_DBUS_INTERFACE_PROPERTIES, "GetAll", NM_DBUS_INTERFACE_ACCESS_POINT); + auto properties = reply.value(); const QByteArray ssid = properties["Ssid"].toByteArray(); if (ssid.isEmpty()) continue; From cd16eba8fd486abdb95c172aadc2813b58636d87 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 11 Apr 2024 10:43:39 -0700 Subject: [PATCH 243/384] [bot] Car docs: update model years from new users (#32165) --- docs/CARS.md | 2 +- selfdrive/car/hyundai/values.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 31560fffb0..e591381ebf 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -122,7 +122,7 @@ A supported vehicle is one that just works when you install a comma device. All |Hyundai|Staria 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Tucson 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Tucson 2022[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Tucson 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Tucson 2023-24[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Tucson Diesel 2019|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Tucson Hybrid 2022-24[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Veloster 2019-20|Smart Cruise Control (SCC)|Stock|5 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 67345a9da1..aa24a1f353 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -321,7 +321,7 @@ class CAR(Platforms): HYUNDAI_TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( [ HyundaiCarDocs("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])), - HyundaiCarDocs("Hyundai Tucson 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Hyundai Tucson 2023-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Hyundai Tucson Hybrid 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), ], CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385), From a05de943dadfac18709d48b2f8031ff8e1e787c6 Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:58:41 -0700 Subject: [PATCH 244/384] Toyota: use existing "pcm_acc_status" declaration (#32173) --- selfdrive/car/toyota/carstate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 0efa065dc2..8315f24ae4 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -149,7 +149,7 @@ class CarState(CarStateBase): # ignore standstill state in certain vehicles, since pcm allows to restart with just an acceleration request ret.cruiseState.standstill = self.pcm_acc_status == 7 ret.cruiseState.enabled = bool(cp.vl["PCM_CRUISE"]["CRUISE_ACTIVE"]) - ret.cruiseState.nonAdaptive = cp.vl["PCM_CRUISE"]["CRUISE_STATE"] in (1, 2, 3, 4, 5, 6) + ret.cruiseState.nonAdaptive = self.pcm_acc_status in (1, 2, 3, 4, 5, 6) ret.genericToggle = bool(cp.vl["LIGHT_STALK"]["AUTO_HIGH_BEAM"]) ret.espDisabled = cp.vl["ESP_CONTROL"]["TC_DISABLED"] != 0 From ee9d12a038128025002fe90eea3c9f034bc19a23 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 11 Apr 2024 14:58:05 -0700 Subject: [PATCH 245/384] Tesla: remove CAN fingerprints (#32176) --- selfdrive/car/tesla/fingerprints.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/selfdrive/car/tesla/fingerprints.py b/selfdrive/car/tesla/fingerprints.py index 5a87986e45..1867df7a48 100644 --- a/selfdrive/car/tesla/fingerprints.py +++ b/selfdrive/car/tesla/fingerprints.py @@ -4,12 +4,6 @@ from openpilot.selfdrive.car.tesla.values import CAR Ecu = car.CarParams.Ecu -FINGERPRINTS = { - CAR.TESLA_AP1_MODELS: [{ - 1: 8, 3: 8, 14: 8, 21: 4, 69: 8, 109: 4, 257: 3, 264: 8, 267: 5, 277: 6, 280: 6, 283: 5, 293: 4, 296: 4, 309: 5, 325: 8, 328: 5, 336: 8, 341: 8, 360: 7, 373: 8, 389: 8, 415: 8, 513: 5, 516: 8, 520: 4, 522: 8, 524: 8, 526: 8, 532: 3, 536: 8, 537: 3, 542: 8, 551: 5, 552: 2, 556: 8, 558: 8, 568: 8, 569: 8, 574: 8, 577: 8, 582: 5, 584: 4, 585: 8, 590: 8, 606: 8, 622: 8, 627: 6, 638: 8, 641: 8, 643: 8, 660: 5, 693: 8, 696: 8, 697: 8, 712: 8, 728: 8, 744: 8, 760: 8, 772: 8, 775: 8, 776: 8, 777: 8, 778: 8, 782: 8, 788: 8, 791: 8, 792: 8, 796: 2, 797: 8, 798: 6, 799: 8, 804: 8, 805: 8, 807: 8, 808: 1, 809: 8, 812: 8, 813: 8, 814: 5, 815: 8, 820: 8, 823: 8, 824: 8, 829: 8, 830: 5, 836: 8, 840: 8, 841: 8, 845: 8, 846: 5, 852: 8, 856: 4, 857: 6, 861: 8, 862: 5, 872: 8, 873: 8, 877: 8, 878: 8, 879: 8, 880: 8, 884: 8, 888: 8, 889: 8, 893: 8, 896: 8, 901: 6, 904: 3, 905: 8, 908: 2, 909: 8, 920: 8, 921: 8, 925: 4, 936: 8, 937: 8, 941: 8, 949: 8, 952: 8, 953: 6, 957: 8, 968: 8, 973: 8, 984: 8, 987: 8, 989: 8, 990: 8, 1000: 8, 1001: 8, 1006: 8, 1016: 8, 1026: 8, 1028: 8, 1029: 8, 1030: 8, 1032: 1, 1033: 1, 1034: 8, 1048: 1, 1064: 8, 1070: 8, 1080: 8, 1160: 4, 1281: 8, 1329: 8, 1332: 8, 1335: 8, 1337: 8, 1368: 8, 1412: 8, 1436: 8, 1465: 8, 1476: 8, 1497: 8, 1524: 8, 1527: 8, 1601: 8, 1605: 8, 1611: 8, 1614: 8, 1617: 8, 1621: 8, 1627: 8, 1630: 8, 1800: 4, 1804: 8, 1812: 8, 1815: 8, 1816: 8, 1828: 8, 1831: 8, 1832: 8, 1840: 8, 1848: 8, 1864: 8, 1880: 8, 1892: 8, 1896: 8, 1912: 8, 1960: 8, 1992: 8, 2008: 3, 2043: 5, 2045: 4 - }], -} - FW_VERSIONS = { CAR.TESLA_AP2_MODELS: { (Ecu.adas, 0x649, None): [ From 1f37de1870f127cd8c1c9943b026fe952fd34b8d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 11 Apr 2024 17:51:26 -0700 Subject: [PATCH 246/384] jenkins: publish casync agnos alongside builds (#32177) * publish agnos * test it * more logging and fix * remove this for a quick test * time logging * revert that * space * Revert "test it" This reverts commit 3b80d97f7d436bc5b2cc29caf6bff1671f7f3f71. * bump timeout --- Jenkinsfile | 10 ++++++++-- release/create_casync_agnos_release.py | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 660755046e..418404071a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -105,7 +105,7 @@ def pcStage(String stageName, Closure body) { checkout scm - def dockerArgs = "--user=batman -v /tmp/comma_download_cache:/tmp/comma_download_cache -v /tmp/scons_cache:/tmp/scons_cache -e PYTHONPATH=${env.WORKSPACE} --cpus=8 --memory 16g -e PYTEST_ADDOPTS='-n8'"; + def dockerArgs = "--user=batman -v /tmp/comma_download_cache:/tmp/comma_download_cache -v /tmp/scons_cache:/tmp/scons_cache -e PYTHONPATH=${env.WORKSPACE} -e AZURE_TOKEN_OPENPILOT_RELEASES='${env.AZURE_TOKEN_OPENPILOT_RELEASES}' --cpus=8 --memory 16g -e PYTEST_ADDOPTS='-n8'"; def openpilot_base = retryWithDelay (3, 15) { return docker.build("openpilot-base:build-${env.GIT_COMMIT}", "-f Dockerfile.openpilot_base .") @@ -113,7 +113,7 @@ def pcStage(String stageName, Closure body) { lock(resource: "", label: 'pc', inversePrecedence: true, quantity: 1) { openpilot_base.inside(dockerArgs) { - timeout(time: 20, unit: 'MINUTES') { + timeout(time: 25, unit: 'MINUTES') { try { retryWithDelay (3, 15) { sh "git config --global --add safe.directory '*'" @@ -158,6 +158,12 @@ def build_release(String channel_name) { ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/openpilot /data/manifest.json && cat /data/manifest.json"], ["upload and cleanup ${channel_name}", "PYTHONWARNINGS=ignore $SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], ]) + }, + "publish agnos": { + pcStage("publish agnos") { + sh "release/create_casync_agnos_release.py /tmp/casync/agnos /tmp/casync_tmp" + sh "PYTHONWARNINGS=ignore ${env.WORKSPACE}/release/upload_casync_release.py /tmp/casync" + } } ) } diff --git a/release/create_casync_agnos_release.py b/release/create_casync_agnos_release.py index 60934b8c18..513ff02abf 100755 --- a/release/create_casync_agnos_release.py +++ b/release/create_casync_agnos_release.py @@ -3,6 +3,7 @@ import argparse import json import pathlib import tempfile +import time from openpilot.common.basedir import BASEDIR from openpilot.system.hardware.tici.agnos import StreamingDecompressor, unsparsify, noop, AGNOS_MANIFEST_FILE from openpilot.system.updated.casync.common import create_casync_from_file @@ -35,6 +36,7 @@ if __name__ == "__main__": for entry in manifest: print(f"creating casync agnos build from {entry}") + start = time.monotonic() downloader = StreamingDecompressor(entry['url']) parse_func = unsparsify if entry['sparse'] else noop @@ -48,4 +50,8 @@ if __name__ == "__main__": for chunk in parsed_chunks: f.write(chunk) + print(f"downloaded in {time.monotonic() - start}") + + start = time.monotonic() create_casync_from_file(entry_path, output_dir, f"agnos-{args.version}-{entry['name']}") + print(f"created casnc in {time.monotonic() - start}") From 1c491513b6a2dafd470a90186e7bb327ada503aa Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sat, 13 Apr 2024 01:32:11 +0800 Subject: [PATCH 247/384] ui/setup: use the mode "wb" instead of "w". (#32181) --- selfdrive/ui/qt/setup/setup.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/setup/setup.cc b/selfdrive/ui/qt/setup/setup.cc index 08f4a0f9c0..58a6392217 100644 --- a/selfdrive/ui/qt/setup/setup.cc +++ b/selfdrive/ui/qt/setup/setup.cc @@ -51,7 +51,7 @@ void Setup::download(QString url) { list = curl_slist_append(list, ("X-openpilot-serial: " + Hardware::get_serial()).c_str()); char tmpfile[] = "/tmp/installer_XXXXXX"; - FILE *fp = fdopen(mkstemp(tmpfile), "w"); + FILE *fp = fdopen(mkstemp(tmpfile), "wb"); curl_easy_setopt(curl, CURLOPT_URL, url.toStdString().c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); From eb0b1ce97599290680f8b6b817e3b262da2f2afc Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sat, 13 Apr 2024 01:32:23 +0800 Subject: [PATCH 248/384] ui/setup: Initially disable continue button (#32180) --- selfdrive/ui/qt/setup/setup.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/ui/qt/setup/setup.cc b/selfdrive/ui/qt/setup/setup.cc index 58a6392217..aff9b015b3 100644 --- a/selfdrive/ui/qt/setup/setup.cc +++ b/selfdrive/ui/qt/setup/setup.cc @@ -201,6 +201,7 @@ QWidget * Setup::network_setup() { QPushButton *cont = new QPushButton(); cont->setObjectName("navBtn"); cont->setProperty("primary", true); + cont->setEnabled(false); QObject::connect(cont, &QPushButton::clicked, this, &Setup::nextPage); blayout->addWidget(cont); From 7dd5dbcf7cc9890cbdb97253b249c7416a2a018d Mon Sep 17 00:00:00 2001 From: Iamz Date: Sat, 13 Apr 2024 00:34:24 +0700 Subject: [PATCH 249/384] Update Thai translations (#32184) --- selfdrive/ui/translations/main_th.ts | 38 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index f417ee1af8..447bad4652 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -68,23 +68,23 @@ Hidden Network - + เครือข่ายที่ซ่อนอยู่ CONNECT - เชื่อมต่อ + เชื่อมต่อ Enter SSID - ป้อนค่า SSID + ป้อนค่า SSID Enter password - ใส่รหัสผ่าน + ใส่รหัสผ่าน for "%1" - สำหรับ "%1" + สำหรับ "%1" @@ -299,11 +299,11 @@ Pair Device - + จับคู่อุปกรณ์ PAIR - + จับคู่ @@ -491,23 +491,23 @@ OnroadAlerts openpilot Unavailable - + openpilot ไม่สามารถใช้งานได้ Waiting for controls to start - + กำลังรอให้ controls เริ่มทำงาน TAKE CONTROL IMMEDIATELY - + เข้าควบคุมรถเดี๋ยวนี้ Controls Unresponsive - + Controls ไม่ตอบสนอง Reboot Device - + รีบูตอุปกรณ์ @@ -632,7 +632,7 @@ now - + ตอนนี้ @@ -673,7 +673,7 @@ This may take up to a minute. System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot. - + ระบบถูกรีเซ็ต กดยืนยันเพื่อลบข้อมูลและการตั้งค่าทั้งหมด กดยกเลิกเพื่อบูตต่อ @@ -783,15 +783,15 @@ This may take up to a minute. Choose Software to Install - + เลือกซอฟต์แวร์ที่จะติดตั้ง openpilot - openpilot + openpilot Custom Software - + ซอฟต์แวร์ที่กำหนดเอง @@ -1156,11 +1156,11 @@ This may take up to a minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. - + แนะนำให้ใช้แบบมาตรฐาน ในโหมดดุดัน openpilot จะตามรถคันหน้าใกล้ขึ้นและเร่งและเบรคแบบดุดันมากขึ้น ในโหมดผ่อนคลาย openpilot จะอยู่ห่างจากรถคันหน้ามากขึ้น ในรถรุ่นที่รองรับคุณสามารถเปลี่ยนบุคลิกไปแบบต่าง ๆ โดยใช้ปุ่มปรับระยะห่างบนพวงมาลัย The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. - + การแสดงภาพการขับขี่จะเปลี่ยนไปใช้กล้องมุมกว้างที่หันหน้าไปทางถนนเมื่ออยู่ในความเร็วต่ำ เพื่อแสดงภาพการเลี้ยวที่ดีขึ้น โลโก้โหมดการทดลองจะแสดงที่มุมบนขวาด้วย From 08097bdf0c2fb1526b43c54d51294ceca2158db0 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 12 Apr 2024 16:02:27 -0700 Subject: [PATCH 250/384] [bot] Fingerprints: add missing FW versions from new users (#32186) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 3 +++ selfdrive/car/tesla/fingerprints.py | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 6f8d6474e2..76d04d2e36 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -436,6 +436,7 @@ FW_VERSIONS = { b'68615034AA', ], (Ecu.abs, 0x747, None): [ + b'68292406AG', b'68292406AH', b'68432418AB', b'68432418AD', @@ -518,6 +519,7 @@ FW_VERSIONS = { b'68378701AI ', b'68378702AI ', b'68378710AL ', + b'68378742AI ', b'68378748AL ', b'68378758AM ', b'68448163AJ', @@ -566,6 +568,7 @@ FW_VERSIONS = { b'68360081AM', b'68360085AJ', b'68360085AL', + b'68360086AH', b'68384328AD', b'68384332AD', b'68445531AC', diff --git a/selfdrive/car/tesla/fingerprints.py b/selfdrive/car/tesla/fingerprints.py index 1867df7a48..68c50a62ed 100644 --- a/selfdrive/car/tesla/fingerprints.py +++ b/selfdrive/car/tesla/fingerprints.py @@ -1,4 +1,3 @@ -# ruff: noqa: E501 from cereal import car from openpilot.selfdrive.car.tesla.values import CAR From 661df357a9e9d1ceae03a97d0cf4d082ac120315 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 12 Apr 2024 17:10:18 -0700 Subject: [PATCH 251/384] include hash in agnos casync filenames (#32187) include the hash in agnos filename --- release/create_casync_agnos_release.py | 6 +++--- release/create_release_manifest.py | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/release/create_casync_agnos_release.py b/release/create_casync_agnos_release.py index 513ff02abf..1b55d0fcc8 100755 --- a/release/create_casync_agnos_release.py +++ b/release/create_casync_agnos_release.py @@ -1,13 +1,13 @@ #!/usr/bin/env python3 import argparse import json +import os import pathlib import tempfile import time from openpilot.common.basedir import BASEDIR from openpilot.system.hardware.tici.agnos import StreamingDecompressor, unsparsify, noop, AGNOS_MANIFEST_FILE from openpilot.system.updated.casync.common import create_casync_from_file -from openpilot.system.version import get_agnos_version @@ -15,7 +15,6 @@ if __name__ == "__main__": parser = argparse.ArgumentParser(description="creates a casync release") parser.add_argument("output_dir", type=str, help="output directory for the channel") parser.add_argument("working_dir", type=str, help="working directory") - parser.add_argument("--version", type=str, help="version of agnos this is", default=get_agnos_version()) parser.add_argument("--manifest", type=str, help="json manifest to create agnos release from", \ default=str(pathlib.Path(BASEDIR) / AGNOS_MANIFEST_FILE)) args = parser.parse_args() @@ -53,5 +52,6 @@ if __name__ == "__main__": print(f"downloaded in {time.monotonic() - start}") start = time.monotonic() - create_casync_from_file(entry_path, output_dir, f"agnos-{args.version}-{entry['name']}") + agnos_filename = os.path.basename(entry["url"]).split(".")[0] + create_casync_from_file(entry_path, output_dir, agnos_filename) print(f"created casnc in {time.monotonic() - start}") diff --git a/release/create_release_manifest.py b/release/create_release_manifest.py index 065cf03e9b..485b18c617 100755 --- a/release/create_release_manifest.py +++ b/release/create_release_manifest.py @@ -2,6 +2,7 @@ import argparse import dataclasses import json +import os import pathlib from openpilot.system.hardware.tici.agnos import AGNOS_MANIFEST_FILE, get_partition_path @@ -17,10 +18,12 @@ AGNOS_RELEASES = f"{BASE_URL}/openpilot-releases/agnos" def create_partition_manifest(agnos_version, partition): + agnos_filename = os.path.basename(partition["url"]).split(".")[0] + return { "type": "partition", "casync": { - "caibx": f"{AGNOS_RELEASES}/agnos-{agnos_version}-{partition['name']}.caibx" + "caibx": f"{AGNOS_RELEASES}/{agnos_filename}.caibx" }, "path": get_partition_path(0, partition), "ab": True, From 969be5ab9c170c0a8537371aa150572dfa0c814c Mon Sep 17 00:00:00 2001 From: Miwa / Ensan <63481257+ensan-hcl@users.noreply.github.com> Date: Sat, 13 Apr 2024 10:47:22 +0900 Subject: [PATCH 252/384] Fix panda sorting logic in pandad (#32100) * fix: returns int instead of bool in cmp function * fix: usb_serial will not be equal * refactor: stop using cmp function and instead use tuple of keys --- selfdrive/boardd/pandad.py | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/selfdrive/boardd/pandad.py b/selfdrive/boardd/pandad.py index 9158a51469..27104255a0 100755 --- a/selfdrive/boardd/pandad.py +++ b/selfdrive/boardd/pandad.py @@ -5,7 +5,6 @@ import usb1 import time import subprocess from typing import NoReturn -from functools import cmp_to_key from panda import Panda, PandaDFU, PandaProtocolMismatch, FW_PATH from openpilot.common.basedir import BASEDIR @@ -62,24 +61,6 @@ def flash_panda(panda_serial: str) -> Panda: return panda -def panda_sort_cmp(a: Panda, b: Panda): - a_type = a.get_type() - b_type = b.get_type() - - # make sure the internal one is always first - if a.is_internal() and not b.is_internal(): - return -1 - if not a.is_internal() and b.is_internal(): - return 1 - - # sort by hardware type - if a_type != b_type: - return a_type < b_type - - # last resort: sort by serial number - return a.get_usb_serial() < b.get_usb_serial() - - def main() -> NoReturn: count = 0 first_run = True @@ -136,7 +117,10 @@ def main() -> NoReturn: no_internal_panda_count = 0 # sort pandas to have deterministic order - pandas.sort(key=cmp_to_key(panda_sort_cmp)) + # * the internal one is always first + # * then sort by hardware type + # * as a last resort, sort by serial number + pandas.sort(key=lambda x: (not x.is_internal(), x.get_type(), x.get_usb_serial())) panda_serials = [p.get_usb_serial() for p in pandas] # log panda fw versions From b3397882a373043fda1f1c7dc28cf28c0fe5eb63 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 12 Apr 2024 20:51:54 -0700 Subject: [PATCH 253/384] Volkswagen: enable OBD-less fingerprinting for gateway-integrated cars (#32188) * too complex * Revert "too complex" This reverts commit 7614bfd466f26cf9b3ebf267f5a2c06d97527496. * no logging is fine * EPS is non-essential for exact matching --- selfdrive/car/volkswagen/values.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 42dc2869ca..8ae2a3c430 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -367,7 +367,6 @@ VOLKSWAGEN_RX_OFFSET = 0x6a SPARE_PART_FW_PATTERN = re.compile(b'\xf1\x87(?P[0-9][0-9A-Z]{2})(?P[0-9][0-9A-Z][0-9])(?P[0-9A-Z]{2}[0-9])([A-Z0-9]| )') FW_QUERY_CONFIG = FwQueryConfig( - # TODO: add back whitelists after we gather enough data requests=[request for bus, obd_multiplexing in [(1, True), (1, False), (0, False)] for request in [ Request( [VOLKSWAGEN_VERSION_REQUEST_MULTI], @@ -375,7 +374,6 @@ FW_QUERY_CONFIG = FwQueryConfig( whitelist_ecus=[Ecu.srs, Ecu.eps, Ecu.fwdRadar, Ecu.fwdCamera], rx_offset=VOLKSWAGEN_RX_OFFSET, bus=bus, - logging=(bus != 1 or not obd_multiplexing), obd_multiplexing=obd_multiplexing, ), Request( @@ -383,10 +381,10 @@ FW_QUERY_CONFIG = FwQueryConfig( [VOLKSWAGEN_VERSION_RESPONSE], whitelist_ecus=[Ecu.engine, Ecu.transmission], bus=bus, - logging=(bus != 1 or not obd_multiplexing), obd_multiplexing=obd_multiplexing, ), ]], + non_essential_ecus={Ecu.eps: list(CAR)}, extra_ecus=[(Ecu.fwdCamera, 0x74f, None)], ) From 8dbf7aa2ab20ccd66153aa358424aa938421ea73 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 12 Apr 2024 21:05:50 -0700 Subject: [PATCH 254/384] Volkswagen: add missing chassis codes (#32189) * add Tiguan NAR (North American Region) * cars in AUS/NZ (2019+) have first generation chassis code :/ jyoung states true first generation cars should CAN error --- selfdrive/car/volkswagen/values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 8ae2a3c430..5052ff1026 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -267,7 +267,7 @@ class CAR(Platforms): [VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1150, wheelbase=2.60), ) - VOLKSWAGEN_TIGUAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis AD/BW + VOLKSWAGEN_TIGUAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis 5N/AD/AX/BW [ VWCarDocs("Volkswagen Tiguan 2018-24"), VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"), From 02920d67b74410c273987ac7afffc37efddfddc1 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 12 Apr 2024 21:19:20 -0700 Subject: [PATCH 255/384] Volkswagen: move FW pattern to test (#32191) move --- selfdrive/car/volkswagen/tests/test_volkswagen.py | 5 ++++- selfdrive/car/volkswagen/values.py | 4 ---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/volkswagen/tests/test_volkswagen.py b/selfdrive/car/volkswagen/tests/test_volkswagen.py index e4548ab76c..85da10a0c2 100755 --- a/selfdrive/car/volkswagen/tests/test_volkswagen.py +++ b/selfdrive/car/volkswagen/tests/test_volkswagen.py @@ -1,9 +1,12 @@ #!/usr/bin/env python3 +import re import unittest -from openpilot.selfdrive.car.volkswagen.values import SPARE_PART_FW_PATTERN from openpilot.selfdrive.car.volkswagen.fingerprints import FW_VERSIONS +# TODO: determine the unknown groups +SPARE_PART_FW_PATTERN = re.compile(b'\xf1\x87(?P[0-9][0-9A-Z]{2})(?P[0-9][0-9A-Z][0-9])(?P[0-9A-Z]{2}[0-9])([A-Z0-9]| )') + class TestVolkswagenPlatformConfigs(unittest.TestCase): def test_spare_part_fw_pattern(self): diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 5052ff1026..375ca78104 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1,7 +1,6 @@ from collections import namedtuple from dataclasses import dataclass, field from enum import Enum, IntFlag -import re from cereal import car from panda.python import uds @@ -363,9 +362,6 @@ VOLKSWAGEN_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + VOLKSWAGEN_RX_OFFSET = 0x6a -# TODO: determine the unknown groups -SPARE_PART_FW_PATTERN = re.compile(b'\xf1\x87(?P[0-9][0-9A-Z]{2})(?P[0-9][0-9A-Z][0-9])(?P[0-9A-Z]{2}[0-9])([A-Z0-9]| )') - FW_QUERY_CONFIG = FwQueryConfig( requests=[request for bus, obd_multiplexing in [(1, True), (1, False), (0, False)] for request in [ Request( From 6acf763db49944de7a7685b46d50a6c8228a5777 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 12 Apr 2024 22:00:03 -0700 Subject: [PATCH 256/384] Volkswagen: fingerprint on VIN chassis code (#32148) * add function signature and behavior comment * add test * move chassis codes to platform config! * add a shared chassis code test * function * test matching * this commit isn't complete yet * Revert "this commit isn't complete yet" This reverts commit ae77d5cd54e1f43d390fb70c4da38a95ac34f8da. * need to check WMI * TODO: test WMI * test wmi * radar FW sanity check * fix test * fixes from merge fixes from merge * whoops * fix static analysis! * do match_fw_to_car match_fw_to_car takes vin * makes sense to keep it one function, and we can return exact or fuzzy! * clean up * kinda pointless * fix more tests * back to function being only fuzzy * revert test_fw_fingerprint * revert test_fw_fingerprint * simplify * clean up/fixes * rename test * less duplicatey WMI descriptions * fix * convert to enum * I am confident about these WMIs * these are also good * we support 5N AUS/NZ and NAR (North American) AX Tiguans fixes * Tiguan also Mexico * only one user for caddy * got from the test route * check that the gateway type matches the platform (each platform has 1 or 2 types) * ~gateway~ -> exact FW match * remove re * ensure WMIs are set * actually no reason to delete * move comment up to the platform config * proper wmis typing * spacing * flip --- selfdrive/car/car_helpers.py | 4 +- selfdrive/car/fw_query_definitions.py | 4 +- selfdrive/car/fw_versions.py | 12 +- selfdrive/car/hyundai/tests/test_hyundai.py | 2 +- selfdrive/car/hyundai/values.py | 2 +- selfdrive/car/tests/test_fw_fingerprint.py | 8 +- selfdrive/car/toyota/tests/test_toyota.py | 2 +- selfdrive/car/toyota/values.py | 2 +- .../car/volkswagen/tests/test_volkswagen.py | 43 +++++ selfdrive/car/volkswagen/values.py | 170 +++++++++++++++--- selfdrive/debug/test_fw_query_on_routes.py | 4 +- tools/car_porting/auto_fingerprint.py | 2 +- 12 files changed, 206 insertions(+), 49 deletions(-) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 0e2443d330..66097339b1 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -139,10 +139,10 @@ def fingerprint(logcan, sendcan, num_pandas): # VIN query only reliably works through OBDII vin_rx_addr, vin_rx_bus, vin = get_vin(logcan, sendcan, (0, 1)) ecu_rx_addrs = get_present_ecus(logcan, sendcan, num_pandas=num_pandas) - car_fw = get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs, num_pandas=num_pandas) + car_fw = get_fw_versions_ordered(logcan, sendcan, vin, ecu_rx_addrs, num_pandas=num_pandas) cached = False - exact_fw_match, fw_candidates = match_fw_to_car(car_fw) + exact_fw_match, fw_candidates = match_fw_to_car(car_fw, vin) else: vin_rx_addr, vin_rx_bus, vin = -1, -1, VIN_UNKNOWN exact_fw_match, fw_candidates, car_fw = True, set(), [] diff --git a/selfdrive/car/fw_query_definitions.py b/selfdrive/car/fw_query_definitions.py index 236ade49bb..ad4dcdc8f1 100755 --- a/selfdrive/car/fw_query_definitions.py +++ b/selfdrive/car/fw_query_definitions.py @@ -97,9 +97,9 @@ class FwQueryConfig: non_essential_ecus: dict[capnp.lib.capnp._EnumModule, list[str]] = field(default_factory=dict) # Ecus added for data collection, not to be fingerprinted on extra_ecus: list[tuple[capnp.lib.capnp._EnumModule, int, int | None]] = field(default_factory=list) - # Function a brand can implement to provide better fuzzy matching. Takes in FW versions, + # Function a brand can implement to provide better fuzzy matching. Takes in FW versions and VIN, # returns set of candidates. Only will match if one candidate is returned - match_fw_to_car_fuzzy: Callable[[LiveFwVersions, OfflineFwVersions], set[str]] | None = None + match_fw_to_car_fuzzy: Callable[[LiveFwVersions, str, OfflineFwVersions], set[str]] | None = None def __post_init__(self): for i in range(len(self.requests)): diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index d7444ebf7d..f2aff2e6f9 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -144,8 +144,8 @@ def match_fw_to_car_exact(live_fw_versions: LiveFwVersions, match_brand: str = N return set(candidates.keys()) - invalid -def match_fw_to_car(fw_versions: list[capnp.lib.capnp._DynamicStructBuilder], allow_exact: bool = True, allow_fuzzy: bool = True, - log: bool = True) -> tuple[bool, set[str]]: +def match_fw_to_car(fw_versions: list[capnp.lib.capnp._DynamicStructBuilder], vin: str, + allow_exact: bool = True, allow_fuzzy: bool = True, log: bool = True) -> tuple[bool, set[str]]: # Try exact matching first exact_matches: list[tuple[bool, MatchFwToCar]] = [] if allow_exact: @@ -163,7 +163,7 @@ def match_fw_to_car(fw_versions: list[capnp.lib.capnp._DynamicStructBuilder], al # If specified and no matches so far, fall back to brand's fuzzy fingerprinting function config = FW_QUERY_CONFIGS[brand] if not exact_match and not len(matches) and config.match_fw_to_car_fuzzy is not None: - matches |= config.match_fw_to_car_fuzzy(fw_versions_dict, VERSIONS[brand]) + matches |= config.match_fw_to_car_fuzzy(fw_versions_dict, vin, VERSIONS[brand]) if len(matches): return exact_match, matches @@ -237,7 +237,7 @@ def set_obd_multiplexing(params: Params, obd_multiplexing: bool): cloudlog.warning("OBD multiplexing set successfully") -def get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs: set[EcuAddrBusType], timeout: float = 0.1, num_pandas: int = 1, +def get_fw_versions_ordered(logcan, sendcan, vin: str, ecu_rx_addrs: set[EcuAddrBusType], timeout: float = 0.1, num_pandas: int = 1, debug: bool = False, progress: bool = False) -> list[capnp.lib.capnp._DynamicStructBuilder]: """Queries for FW versions ordering brands by likelihood, breaks when exact match is found""" @@ -253,7 +253,7 @@ def get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs: set[EcuAddrBusType], all_car_fw.extend(car_fw) # If there is a match using this brand's FW alone, finish querying early - _, matches = match_fw_to_car(car_fw, log=False) + _, matches = match_fw_to_car(car_fw, vin, log=False) if len(matches) == 1: break @@ -381,7 +381,7 @@ if __name__ == "__main__": t = time.time() fw_vers = get_fw_versions(logcan, sendcan, query_brand=args.brand, extra=extra, num_pandas=num_pandas, debug=args.debug, progress=True) - _, candidates = match_fw_to_car(fw_vers) + _, candidates = match_fw_to_car(fw_vers, vin) print() print("Found FW versions") diff --git a/selfdrive/car/hyundai/tests/test_hyundai.py b/selfdrive/car/hyundai/tests/test_hyundai.py index 2e4edcffc6..0753b372e1 100755 --- a/selfdrive/car/hyundai/tests/test_hyundai.py +++ b/selfdrive/car/hyundai/tests/test_hyundai.py @@ -209,7 +209,7 @@ class TestHyundaiFingerprint(unittest.TestCase): "subAddress": 0 if sub_addr is None else sub_addr}) CP = car.CarParams.new_message(carFw=car_fw) - matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), FW_VERSIONS) + matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, FW_VERSIONS) if len(matches) == 1: self.assertEqual(list(matches)[0], platform) else: diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index aa24a1f353..3339fd8009 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -568,7 +568,7 @@ def get_platform_codes(fw_versions: list[bytes]) -> set[tuple[bytes, bytes | Non return codes -def match_fw_to_car_fuzzy(live_fw_versions, offline_fw_versions) -> set[str]: +def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]: # Non-electric CAN FD platforms often do not have platform code specifiers needed # to distinguish between hybrid and ICE. All EVs so far are either exclusively # electric or specify electric in the platform code. diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 4a17fc34ec..96e81272e4 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -49,7 +49,7 @@ class TestFwFingerprint(unittest.TestCase): fw.append({"ecu": ecu_name, "fwVersion": random.choice(fw_versions), 'brand': brand, "address": addr, "subAddress": 0 if sub_addr is None else sub_addr}) CP.carFw = fw - _, matches = match_fw_to_car(CP.carFw, allow_fuzzy=False) + _, matches = match_fw_to_car(CP.carFw, CP.carVin, allow_fuzzy=False) if not test_non_essential: self.assertFingerprints(matches, car_model) else: @@ -72,8 +72,8 @@ class TestFwFingerprint(unittest.TestCase): fw.append({"ecu": ecu_name, "fwVersion": random.choice(fw_versions), 'brand': brand, "address": addr, "subAddress": 0 if sub_addr is None else sub_addr}) CP.carFw = fw - _, matches = match_fw_to_car(CP.carFw, allow_exact=False, log=False) - brand_matches = config.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), VERSIONS[brand]) + _, matches = match_fw_to_car(CP.carFw, CP.carVin, allow_exact=False, log=False) + brand_matches = config.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, VERSIONS[brand]) # If both have matches, they must agree if len(matches) == 1 and len(brand_matches) == 1: @@ -94,7 +94,7 @@ class TestFwFingerprint(unittest.TestCase): fw.append({"ecu": ecu_name, "fwVersion": random.choice(ecus[ecu]), 'brand': brand, "address": addr, "subAddress": 0 if sub_addr is None else sub_addr}) CP = car.CarParams.new_message(carFw=fw) - _, matches = match_fw_to_car(CP.carFw, allow_exact=False, log=False) + _, matches = match_fw_to_car(CP.carFw, CP.carVin, allow_exact=False, log=False) # Assert no match if there are not enough unique ECUs unique_ecus = {(f['address'], f['subAddress']) for f in fw} diff --git a/selfdrive/car/toyota/tests/test_toyota.py b/selfdrive/car/toyota/tests/test_toyota.py index ba131a0185..e2a9b46eb4 100755 --- a/selfdrive/car/toyota/tests/test_toyota.py +++ b/selfdrive/car/toyota/tests/test_toyota.py @@ -160,7 +160,7 @@ class TestToyotaFingerprint(unittest.TestCase): "subAddress": 0 if sub_addr is None else sub_addr}) CP = car.CarParams.new_message(carFw=car_fw) - matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), FW_VERSIONS) + matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, FW_VERSIONS) if len(matches) == 1: self.assertEqual(list(matches)[0], platform) else: diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 179e3f97e3..4f6fdef1ba 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -415,7 +415,7 @@ def get_platform_codes(fw_versions: list[bytes]) -> dict[bytes, set[bytes]]: return dict(codes) -def match_fw_to_car_fuzzy(live_fw_versions, offline_fw_versions) -> set[str]: +def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]: candidates = set() for candidate, fws in offline_fw_versions.items(): diff --git a/selfdrive/car/volkswagen/tests/test_volkswagen.py b/selfdrive/car/volkswagen/tests/test_volkswagen.py index 85da10a0c2..92569e194e 100755 --- a/selfdrive/car/volkswagen/tests/test_volkswagen.py +++ b/selfdrive/car/volkswagen/tests/test_volkswagen.py @@ -2,8 +2,13 @@ import re import unittest +from cereal import car +from openpilot.selfdrive.car.volkswagen.values import CAR, FW_QUERY_CONFIG, WMI from openpilot.selfdrive.car.volkswagen.fingerprints import FW_VERSIONS +Ecu = car.CarParams.Ecu + +CHASSIS_CODE_PATTERN = re.compile('[A-Z0-9]{2}') # TODO: determine the unknown groups SPARE_PART_FW_PATTERN = re.compile(b'\xf1\x87(?P[0-9][0-9A-Z]{2})(?P[0-9][0-9A-Z][0-9])(?P[0-9A-Z]{2}[0-9])([A-Z0-9]| )') @@ -17,6 +22,44 @@ class TestVolkswagenPlatformConfigs(unittest.TestCase): for fw in fws: self.assertNotEqual(SPARE_PART_FW_PATTERN.match(fw), None, f"Bad FW: {fw}") + def test_chassis_codes(self): + for platform in CAR: + with self.subTest(platform=platform): + self.assertTrue(len(platform.config.wmis) > 0, "WMIs not set") + self.assertTrue(len(platform.config.chassis_codes) > 0, "Chassis codes not set") + self.assertTrue(all(CHASSIS_CODE_PATTERN.match(cc) for cc in + platform.config.chassis_codes), "Bad chassis codes") + + # No two platforms should share chassis codes + for comp in CAR: + if platform == comp: + continue + self.assertEqual(set(), platform.config.chassis_codes & comp.config.chassis_codes, + f"Shared chassis codes: {comp}") + + def test_custom_fuzzy_fingerprinting(self): + for platform in CAR: + expected_radar_fw = FW_VERSIONS[platform][Ecu.fwdRadar, 0x757, None] + + with self.subTest(platform=platform): + for wmi in WMI: + for chassis_code in platform.config.chassis_codes | {"00"}: + vin = ["0"] * 17 + vin[0:3] = wmi + vin[6:8] = chassis_code + vin = "".join(vin) + + # Check a few FW cases - expected, unexpected + for radar_fw in expected_radar_fw + [b'\xf1\x877H9907572AA\xf1\x890396']: + should_match = ((wmi in platform.config.wmis and chassis_code in platform.config.chassis_codes) and + radar_fw in expected_radar_fw) + + live_fws = {(0x757, None): [radar_fw]} + matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fws, vin, FW_VERSIONS) + + expected_matches = {platform} if should_match else set() + self.assertEqual(expected_matches, matches, "Bad match") + if __name__ == "__main__": unittest.main() diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 375ca78104..5e332c98c4 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1,6 +1,6 @@ from collections import namedtuple from dataclasses import dataclass, field -from enum import Enum, IntFlag +from enum import Enum, IntFlag, StrEnum from cereal import car from panda.python import uds @@ -109,6 +109,27 @@ class CANBUS: cam = 2 +class WMI(StrEnum): + VOLKSWAGEN_USA_SUV = "1V2" + VOLKSWAGEN_USA_CAR = "1VW" + VOLKSWAGEN_MEXICO_SUV = "3VV" + VOLKSWAGEN_MEXICO_CAR = "3VW" + VOLKSWAGEN_ARGENTINA = "8AW" + VOLKSWAGEN_BRASIL = "9BW" + SAIC_VOLKSWAGEN = "LSV" + SKODA = "TMB" + SEAT = "VSS" + AUDI_EUROPE_MPV = "WA1" + AUDI_GERMANY_CAR = "WAU" + MAN = "WMA" + AUDI_SPORT = "WUA" + VOLKSWAGEN_COMMERCIAL = "WV1" + VOLKSWAGEN_COMMERCIAL_BUS_VAN = "WV2" + VOLKSWAGEN_EUROPE_SUV = "WVG" + VOLKSWAGEN_EUROPE_CAR = "WVW" + VOLKSWAGEN_GROUP_RUS = "XW8" + + class VolkswagenFlags(IntFlag): # Detected flags STOCK_HCA_PRESENT = 1 @@ -120,10 +141,14 @@ class VolkswagenFlags(IntFlag): @dataclass class VolkswagenMQBPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_mqb_2010', None)) + # Volkswagen uses the VIN WMI and chassis code to match in the absence of the comma power + # on camera-integrated cars, as we lose too many ECUs to reliably identify the vehicle + chassis_codes: set[str] = field(default_factory=set) + wmis: set[WMI] = field(default_factory=set) @dataclass -class VolkswagenPQPlatformConfig(PlatformConfig): +class VolkswagenPQPlatformConfig(VolkswagenMQBPlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_golf_mk4', None)) def init(self): @@ -176,7 +201,9 @@ class VWCarDocs(CarDocs): # FW_VERSIONS for that existing CAR. class CAR(Platforms): - VOLKSWAGEN_ARTEON_MK1 = VolkswagenMQBPlatformConfig( # Chassis AN + config: VolkswagenMQBPlatformConfig | VolkswagenPQPlatformConfig + + VOLKSWAGEN_ARTEON_MK1 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"), VWCarDocs("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), @@ -184,8 +211,10 @@ class CAR(Platforms): VWCarDocs("Volkswagen CC 2018-22", video_link="https://youtu.be/FAomFKPFlDA"), ], VolkswagenCarSpecs(mass=1733, wheelbase=2.84), + chassis_codes={"AN"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, ) - VOLKSWAGEN_ATLAS_MK1 = VolkswagenMQBPlatformConfig( # Chassis CA + VOLKSWAGEN_ATLAS_MK1 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Volkswagen Atlas 2018-23"), VWCarDocs("Volkswagen Atlas Cross Sport 2020-22"), @@ -194,15 +223,19 @@ class CAR(Platforms): VWCarDocs("Volkswagen Teramont X 2021-22"), ], VolkswagenCarSpecs(mass=2011, wheelbase=2.98), + chassis_codes={"CA"}, + wmis={WMI.VOLKSWAGEN_USA_SUV}, ) - VOLKSWAGEN_CADDY_MK3 = VolkswagenPQPlatformConfig( # Chassis 2K + VOLKSWAGEN_CADDY_MK3 = VolkswagenPQPlatformConfig( [ VWCarDocs("Volkswagen Caddy 2019"), VWCarDocs("Volkswagen Caddy Maxi 2019"), ], VolkswagenCarSpecs(mass=1613, wheelbase=2.6, minSteerSpeed=21 * CV.KPH_TO_MS), + chassis_codes={"2K"}, + wmis={WMI.VOLKSWAGEN_COMMERCIAL_BUS_VAN}, ) - VOLKSWAGEN_CRAFTER_MK2 = VolkswagenMQBPlatformConfig( # Chassis SY/SZ + VOLKSWAGEN_CRAFTER_MK2 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"), VWCarDocs("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"), @@ -211,8 +244,10 @@ class CAR(Platforms): VWCarDocs("MAN eTGE 2020-23", video_link="https://youtu.be/4100gLeabmo"), ], VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS), + chassis_codes={"SY", "SZ"}, + wmis={WMI.VOLKSWAGEN_COMMERCIAL, WMI.MAN}, ) - VOLKSWAGEN_GOLF_MK7 = VolkswagenMQBPlatformConfig( # Chassis 5G/AU/BA/BE + VOLKSWAGEN_GOLF_MK7 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Volkswagen e-Golf 2014-20"), VWCarDocs("Volkswagen Golf 2015-20", auto_resume=False), @@ -224,71 +259,95 @@ class CAR(Platforms): VWCarDocs("Volkswagen Golf SportsVan 2015-20"), ], VolkswagenCarSpecs(mass=1397, wheelbase=2.62), + chassis_codes={"5G", "AU", "BA", "BE"}, + wmis={WMI.VOLKSWAGEN_MEXICO_CAR, WMI.VOLKSWAGEN_EUROPE_CAR}, ) - VOLKSWAGEN_JETTA_MK7 = VolkswagenMQBPlatformConfig( # Chassis BU + VOLKSWAGEN_JETTA_MK7 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Volkswagen Jetta 2018-24"), VWCarDocs("Volkswagen Jetta GLI 2021-24"), ], VolkswagenCarSpecs(mass=1328, wheelbase=2.71), + chassis_codes={"BU"}, + wmis={WMI.VOLKSWAGEN_MEXICO_CAR, WMI.VOLKSWAGEN_EUROPE_CAR}, ) - VOLKSWAGEN_PASSAT_MK8 = VolkswagenMQBPlatformConfig( # Chassis 3G + VOLKSWAGEN_PASSAT_MK8 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), VWCarDocs("Volkswagen Passat Alltrack 2015-22"), VWCarDocs("Volkswagen Passat GTE 2015-22"), ], VolkswagenCarSpecs(mass=1551, wheelbase=2.79), + chassis_codes={"3G"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, ) - VOLKSWAGEN_PASSAT_NMS = VolkswagenPQPlatformConfig( # Chassis A3 + VOLKSWAGEN_PASSAT_NMS = VolkswagenPQPlatformConfig( [VWCarDocs("Volkswagen Passat NMS 2017-22")], VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50 * CV.KPH_TO_MS, minEnableSpeed=20 * CV.KPH_TO_MS), + chassis_codes={"A3"}, + wmis={WMI.VOLKSWAGEN_USA_CAR}, ) - VOLKSWAGEN_POLO_MK6 = VolkswagenMQBPlatformConfig( # Chassis AW + VOLKSWAGEN_POLO_MK6 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), VWCarDocs("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), ], VolkswagenCarSpecs(mass=1230, wheelbase=2.55), + chassis_codes={"AW"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, ) - VOLKSWAGEN_SHARAN_MK2 = VolkswagenPQPlatformConfig( # Chassis 7N + VOLKSWAGEN_SHARAN_MK2 = VolkswagenPQPlatformConfig( [ VWCarDocs("Volkswagen Sharan 2018-22"), VWCarDocs("SEAT Alhambra 2018-20"), ], VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50 * CV.KPH_TO_MS), + chassis_codes={"7N"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, ) - VOLKSWAGEN_TAOS_MK1 = VolkswagenMQBPlatformConfig( # Chassis B2 + VOLKSWAGEN_TAOS_MK1 = VolkswagenMQBPlatformConfig( [VWCarDocs("Volkswagen Taos 2022-23")], VolkswagenCarSpecs(mass=1498, wheelbase=2.69), + chassis_codes={"B2"}, + wmis={WMI.VOLKSWAGEN_MEXICO_SUV, WMI.VOLKSWAGEN_ARGENTINA}, ) - VOLKSWAGEN_TCROSS_MK1 = VolkswagenMQBPlatformConfig( # Chassis C1 + VOLKSWAGEN_TCROSS_MK1 = VolkswagenMQBPlatformConfig( [VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1150, wheelbase=2.60), + chassis_codes={"C1"}, + wmis={WMI.VOLKSWAGEN_EUROPE_SUV}, ) - VOLKSWAGEN_TIGUAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis 5N/AD/AX/BW + VOLKSWAGEN_TIGUAN_MK2 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Volkswagen Tiguan 2018-24"), VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"), ], VolkswagenCarSpecs(mass=1715, wheelbase=2.74), + chassis_codes={"5N", "AD", "AX", "BW"}, + wmis={WMI.VOLKSWAGEN_EUROPE_SUV, WMI.VOLKSWAGEN_MEXICO_SUV}, ) - VOLKSWAGEN_TOURAN_MK2 = VolkswagenMQBPlatformConfig( # Chassis 1T + VOLKSWAGEN_TOURAN_MK2 = VolkswagenMQBPlatformConfig( [VWCarDocs("Volkswagen Touran 2016-23")], VolkswagenCarSpecs(mass=1516, wheelbase=2.79), + chassis_codes={"1T"}, + wmis={WMI.VOLKSWAGEN_EUROPE_SUV}, ) - VOLKSWAGEN_TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( # Chassis 7H/7L + VOLKSWAGEN_TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Volkswagen Caravelle 2020"), VWCarDocs("Volkswagen California 2021-23"), ], VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0), + chassis_codes={"7H", "7L"}, + wmis={WMI.VOLKSWAGEN_COMMERCIAL_BUS_VAN}, ) - VOLKSWAGEN_TROC_MK1 = VolkswagenMQBPlatformConfig( # Chassis A1 + VOLKSWAGEN_TROC_MK1 = VolkswagenMQBPlatformConfig( [VWCarDocs("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1413, wheelbase=2.63), + chassis_codes={"A1"}, + wmis={WMI.VOLKSWAGEN_EUROPE_SUV}, ) - AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( # Chassis 8V/FF + AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Audi A3 2014-19"), VWCarDocs("Audi A3 Sportback e-tron 2017-18"), @@ -296,55 +355,109 @@ class CAR(Platforms): VWCarDocs("Audi S3 2015-17"), ], VolkswagenCarSpecs(mass=1335, wheelbase=2.61), + chassis_codes={"8V", "FF"}, + wmis={WMI.AUDI_GERMANY_CAR, WMI.AUDI_SPORT}, ) - AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( # Chassis GA + AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( [VWCarDocs("Audi Q2 2018")], VolkswagenCarSpecs(mass=1205, wheelbase=2.61), + chassis_codes={"GA"}, + wmis={WMI.AUDI_GERMANY_CAR}, ) - AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( # Chassis 8U/F3/FS + AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( [VWCarDocs("Audi Q3 2019-23")], VolkswagenCarSpecs(mass=1623, wheelbase=2.68), + chassis_codes={"8U", "F3", "FS"}, + wmis={WMI.AUDI_EUROPE_MPV, WMI.AUDI_GERMANY_CAR}, ) - SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( # Chassis 5F + SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( [ VWCarDocs("SEAT Ateca 2018"), VWCarDocs("SEAT Leon 2014-20"), ], VolkswagenCarSpecs(mass=1300, wheelbase=2.64), + chassis_codes={"5F"}, + wmis={WMI.SEAT}, ) - SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( # Chassis PJ + SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( [VWCarDocs("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])], VolkswagenCarSpecs(mass=1266, wheelbase=2.56), + chassis_codes={"PJ"}, + wmis={WMI.SKODA}, ) - SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NW + SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ]), VWCarDocs("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0]), ], VolkswagenCarSpecs(mass=1230, wheelbase=2.66), + chassis_codes={"NW"}, + wmis={WMI.SKODA}, ) - SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NU + SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( [VWCarDocs("Škoda Karoq 2019-23")], VolkswagenCarSpecs(mass=1278, wheelbase=2.66), + chassis_codes={"NU"}, + wmis={WMI.SKODA}, ) - SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( # Chassis NS + SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( [VWCarDocs("Škoda Kodiaq 2017-23")], VolkswagenCarSpecs(mass=1569, wheelbase=2.79), + chassis_codes={"NS"}, + wmis={WMI.SKODA, WMI.VOLKSWAGEN_GROUP_RUS}, ) - SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( # Chassis NE + SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( [ VWCarDocs("Škoda Octavia 2015-19"), VWCarDocs("Škoda Octavia RS 2016"), VWCarDocs("Škoda Octavia Scout 2017-19"), ], VolkswagenCarSpecs(mass=1388, wheelbase=2.68), + chassis_codes={"NE"}, + wmis={WMI.SKODA}, ) - SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( # Chassis 3V/NP + SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( [VWCarDocs("Škoda Superb 2015-22")], VolkswagenCarSpecs(mass=1505, wheelbase=2.84), + chassis_codes={"3V", "NP"}, + wmis={WMI.SKODA}, ) +def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]: + candidates = set() + + # Check the WMI and chassis code to determine the platform + wmi = vin[:3] + chassis_code = vin[6:8] + + for platform in CAR: + valid_ecus = set() + for ecu, expected_versions in offline_fw_versions[platform].items(): + addr = ecu[1:] + if ecu[0] not in CHECK_FUZZY_ECUS: + continue + + # Sanity check that a subset of Volkswagen FW is in the database + found_versions = live_fw_versions.get(addr, []) + if not any(found_version in expected_versions for found_version in found_versions): + break + + valid_ecus.add(ecu[0]) + + if valid_ecus != CHECK_FUZZY_ECUS: + continue + + if wmi in platform.config.wmis and chassis_code in platform.config.chassis_codes: + candidates.add(platform) + + return {str(c) for c in candidates} + + +# These ECUs are required to match to gain a VIN match +# TODO: do we want to check camera when we add its FW? +CHECK_FUZZY_ECUS = {Ecu.fwdRadar} + # All supported cars should return FW from the engine, srs, eps, and fwdRadar. Cars # with a manual trans won't return transmission firmware, but all other cars will. # @@ -382,6 +495,7 @@ FW_QUERY_CONFIG = FwQueryConfig( ]], non_essential_ecus={Ecu.eps: list(CAR)}, extra_ecus=[(Ecu.fwdCamera, 0x74f, None)], + match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, ) DBC = CAR.create_dbc_map() diff --git a/selfdrive/debug/test_fw_query_on_routes.py b/selfdrive/debug/test_fw_query_on_routes.py index 3c5733520e..e338110a7d 100755 --- a/selfdrive/debug/test_fw_query_on_routes.py +++ b/selfdrive/debug/test_fw_query_on_routes.py @@ -78,8 +78,8 @@ if __name__ == "__main__": print("not in supported cars") break - _, exact_matches = match_fw_to_car(car_fw, allow_exact=True, allow_fuzzy=False) - _, fuzzy_matches = match_fw_to_car(car_fw, allow_exact=False, allow_fuzzy=True) + _, exact_matches = match_fw_to_car(car_fw, CP.carVin, allow_exact=True, allow_fuzzy=False) + _, fuzzy_matches = match_fw_to_car(car_fw, CP.carVin, allow_exact=False, allow_fuzzy=True) if (len(exact_matches) == 1) and (list(exact_matches)[0] == live_fingerprint): good_exact += 1 diff --git a/tools/car_porting/auto_fingerprint.py b/tools/car_porting/auto_fingerprint.py index 8b0ae6762d..0a6b602a15 100755 --- a/tools/car_porting/auto_fingerprint.py +++ b/tools/car_porting/auto_fingerprint.py @@ -41,7 +41,7 @@ if __name__ == "__main__": carPlatform = CP.carFingerprint if args.platform is None: # attempt to auto-determine platform with other fuzzy fingerprints - _, possible_platforms = match_fw_to_car(carFw, log=False) + _, possible_platforms = match_fw_to_car(carFw, carVin, log=False) if len(possible_platforms) != 1: print(f"Unable to auto-determine platform, possible platforms: {possible_platforms}") From 70ee42d17f8af457fe97e374cf9e7bded66b36bd Mon Sep 17 00:00:00 2001 From: Saber <81108166+Saber422@users.noreply.github.com> Date: Sun, 14 Apr 2024 11:22:34 +0800 Subject: [PATCH 257/384] VW MQB: Add FW for 2023 TROC (#31737) * Update fingerprints.py * Update values.py TROC is MQB instead of MQB A0 * update docs * missing srs! --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 2 +- selfdrive/car/volkswagen/fingerprints.py | 3 +++ selfdrive/car/volkswagen/values.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index e591381ebf..1b356ac8ed 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -291,7 +291,7 @@ A supported vehicle is one that just works when you install a comma device. All |Volkswagen|Polo 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| |Volkswagen|Polo GTI 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| |Volkswagen|T-Cross 2021|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| -|Volkswagen|T-Roc 2018-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| +|Volkswagen|T-Roc 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Volkswagen|Taos 2022-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Volkswagen|Teramont 2018-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Volkswagen|Teramont Cross Sport 2021-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 707d96d739..80b92cee67 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -723,13 +723,16 @@ FW_VERSIONS = { b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1311110012333300314240681152119333463100', b'\xf1\x875Q0959655CF\xf1\x890421\xf1\x82\x1311110012333300314240021150119333613100', b'\xf1\x875Q0959655CG\xf1\x890421\xf1\x82\x13111100123333003142404M1152119333613100', + b'\xf1\x875Q0959655CG\xf1\x890421\xf1\x82\x13111100123333003142404M1154119333613100', ], (Ecu.eps, 0x712, None): [ b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521060403A1', b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521060405A1', b'\xf1\x875WA907144M \xf1\x891051\xf1\x82\x001T06081T7N', + b'\xf1\x875WA907144Q \xf1\x891063\xf1\x82\x001O06081OOM', ], (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', b'\xf1\x872Q0907572M \xf1\x890233', b'\xf1\x872Q0907572T \xf1\x890383', ], diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 5e332c98c4..3c5d60a16b 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -342,7 +342,7 @@ class CAR(Platforms): wmis={WMI.VOLKSWAGEN_COMMERCIAL_BUS_VAN}, ) VOLKSWAGEN_TROC_MK1 = VolkswagenMQBPlatformConfig( - [VWCarDocs("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])], + [VWCarDocs("Volkswagen T-Roc 2018-23")], VolkswagenCarSpecs(mass=1413, wheelbase=2.63), chassis_codes={"A1"}, wmis={WMI.VOLKSWAGEN_EUROPE_SUV}, From 9244f0f0d5490c1078ee3559b8edbcb39c9908d4 Mon Sep 17 00:00:00 2001 From: dkiiv Date: Sat, 13 Apr 2024 23:27:53 -0400 Subject: [PATCH 258/384] VW: update LKA HUD to be more logically accurate (#31895) * VW: update LKA HUD to be more logically accurate * consistent case --------- Co-authored-by: Shane Smiskol --- selfdrive/car/volkswagen/carcontroller.py | 2 +- selfdrive/car/volkswagen/mqbcan.py | 6 +++--- selfdrive/car/volkswagen/pqcan.py | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 37a4ed36b8..5fc47c51c6 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -92,7 +92,7 @@ class CarController(CarControllerBase): hud_alert = 0 if hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw): hud_alert = self.CCP.LDW_MESSAGES["laneAssistTakeOver"] - can_sends.append(self.CCS.create_lka_hud_control(self.packer_pt, CANBUS.pt, CS.ldw_stock_values, CC.enabled, + can_sends.append(self.CCS.create_lka_hud_control(self.packer_pt, CANBUS.pt, CS.ldw_stock_values, CC.latActive, CS.out.steeringPressed, hud_alert, hud_control)) if self.frame % self.CCP.ACC_HUD_STEP == 0 and self.CP.openpilotLongitudinalControl: diff --git a/selfdrive/car/volkswagen/mqbcan.py b/selfdrive/car/volkswagen/mqbcan.py index 6043533acf..763908b6b2 100644 --- a/selfdrive/car/volkswagen/mqbcan.py +++ b/selfdrive/car/volkswagen/mqbcan.py @@ -28,7 +28,7 @@ def create_eps_update(packer, bus, eps_stock_values, ea_simulated_torque): return packer.make_can_msg("LH_EPS_03", bus, values) -def create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pressed, hud_alert, hud_control): +def create_lka_hud_control(packer, bus, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control): values = {} if len(ldw_stock_values): values = {s: ldw_stock_values[s] for s in [ @@ -40,8 +40,8 @@ def create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pres ]} values.update({ - "LDW_Status_LED_gelb": 1 if enabled and steering_pressed else 0, - "LDW_Status_LED_gruen": 1 if enabled and not steering_pressed else 0, + "LDW_Status_LED_gelb": 1 if lat_active and steering_pressed else 0, + "LDW_Status_LED_gruen": 1 if lat_active and not steering_pressed else 0, "LDW_Lernmodus_links": 3 if hud_control.leftLaneDepart else 1 + hud_control.leftLaneVisible, "LDW_Lernmodus_rechts": 3 if hud_control.rightLaneDepart else 1 + hud_control.rightLaneVisible, "LDW_Texte": hud_alert, diff --git a/selfdrive/car/volkswagen/pqcan.py b/selfdrive/car/volkswagen/pqcan.py index 307aaaa2a7..f8d161b970 100644 --- a/selfdrive/car/volkswagen/pqcan.py +++ b/selfdrive/car/volkswagen/pqcan.py @@ -9,7 +9,7 @@ def create_steering_control(packer, bus, apply_steer, lkas_enabled): return packer.make_can_msg("HCA_1", bus, values) -def create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pressed, hud_alert, hud_control): +def create_lka_hud_control(packer, bus, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control): values = {} if len(ldw_stock_values): values = {s: ldw_stock_values[s] for s in [ @@ -21,8 +21,8 @@ def create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pres ]} values.update({ - "LDW_Lampe_gelb": 1 if enabled and steering_pressed else 0, - "LDW_Lampe_gruen": 1 if enabled and not steering_pressed else 0, + "LDW_Lampe_gelb": 1 if lat_active and steering_pressed else 0, + "LDW_Lampe_gruen": 1 if lat_active and not steering_pressed else 0, "LDW_Lernmodus_links": 3 if hud_control.leftLaneDepart else 1 + hud_control.leftLaneVisible, "LDW_Lernmodus_rechts": 3 if hud_control.rightLaneDepart else 1 + hud_control.rightLaneVisible, "LDW_Textbits": hud_alert, From 5f9a25dfe98915fa97b91c6ba5391ba7896a40ba Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 13 Apr 2024 21:03:45 -0700 Subject: [PATCH 259/384] Volkswagen: add missing Golf FW (#32196) add missing golf fingerprints --- selfdrive/car/volkswagen/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 80b92cee67..6320f0ec34 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -161,6 +161,7 @@ FW_VERSIONS = { b'\xf1\x8704L906056HE\xf1\x893758', b'\xf1\x8704L906056HN\xf1\x896590', b'\xf1\x8704L906056HT\xf1\x896591', + b'\xf1\x8704L997022N \xf1\x899459', b'\xf1\x870EA906016A \xf1\x898343', b'\xf1\x870EA906016E \xf1\x894219', b'\xf1\x870EA906016F \xf1\x894238', @@ -218,6 +219,7 @@ FW_VERSIONS = { b'\xf1\x870D9300040A \xf1\x893613', b'\xf1\x870D9300040S \xf1\x894311', b'\xf1\x870D9300041H \xf1\x895220', + b'\xf1\x870D9300041N \xf1\x894512', b'\xf1\x870D9300041P \xf1\x894507', b'\xf1\x870DD300045K \xf1\x891120', b'\xf1\x870DD300046F \xf1\x891601', @@ -251,6 +253,7 @@ FW_VERSIONS = { b'\xf1\x875Q0959655C \xf1\x890361\xf1\x82\x111413001112120004110415121610169112', b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x1314160011123300314240012250229333463100', b'\xf1\x875Q0959655D \xf1\x890388\xf1\x82\x111413001113120006110417121A101A9113', + b'\xf1\x875Q0959655J \xf1\x890825\xf1\x82\x13271112111312--071104171825102591131211', b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13271112111312--071104171825102591131211', b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13271212111312--071104171838103891131211', b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13272512111312--07110417182C102C91131211', From 585c62673f8f3d9d70a3fb648562d10ae643938e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 13 Apr 2024 21:20:15 -0700 Subject: [PATCH 260/384] [bot] Fingerprints: add missing FW versions from new users (#32195) Export fingerprints --- selfdrive/car/volkswagen/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 6320f0ec34..285eb0c7d5 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -60,6 +60,7 @@ FW_VERSIONS = { b'\xf1\x8703H906026F \xf1\x896696', b'\xf1\x8703H906026F \xf1\x899970', b'\xf1\x8703H906026J \xf1\x896026', + b'\xf1\x8703H906026J \xf1\x899970', b'\xf1\x8703H906026J \xf1\x899971', b'\xf1\x8703H906026S \xf1\x896693', b'\xf1\x8703H906026S \xf1\x899970', @@ -213,6 +214,7 @@ FW_VERSIONS = { b'\xf1\x870D9300012 \xf1\x895046', b'\xf1\x870D9300014M \xf1\x895004', b'\xf1\x870D9300014Q \xf1\x895006', + b'\xf1\x870D9300018 \xf1\x895201', b'\xf1\x870D9300020J \xf1\x894902', b'\xf1\x870D9300020Q \xf1\x895201', b'\xf1\x870D9300020S \xf1\x895201', @@ -304,6 +306,7 @@ FW_VERSIONS = { b'\xf1\x875QD909144B \xf1\x891072\xf1\x82\x0521A00507A1', b'\xf1\x875QM909144A \xf1\x891072\xf1\x82\x0521A20B03A1', b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A00442A1', + b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A00642A1', b'\xf1\x875QN909144A \xf1\x895081\xf1\x82\x0571A01A16A1', b'\xf1\x875QN909144A \xf1\x895081\xf1\x82\x0571A01A17A1', b'\xf1\x875QN909144A \xf1\x895081\xf1\x82\x0571A01A18A1', From 40b061cd51078c3ca3a0f58ccfce6a9078fb08ef Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 15 Apr 2024 08:52:20 +0800 Subject: [PATCH 261/384] ui/network: update known connections after adding tethering connection. (#32166) update known connections --- selfdrive/ui/qt/network/wifi_manager.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/network/wifi_manager.cc b/selfdrive/ui/qt/network/wifi_manager.cc index 854a8920b5..cb7cccd194 100644 --- a/selfdrive/ui/qt/network/wifi_manager.cc +++ b/selfdrive/ui/qt/network/wifi_manager.cc @@ -428,7 +428,10 @@ void WifiManager::addTetheringConnection() { connection["ipv4"]["route-metric"] = 1100; connection["ipv6"]["method"] = "ignore"; - call(NM_DBUS_PATH_SETTINGS, NM_DBUS_INTERFACE_SETTINGS, "AddConnection", QVariant::fromValue(connection)); + auto path = call(NM_DBUS_PATH_SETTINGS, NM_DBUS_INTERFACE_SETTINGS, "AddConnection", QVariant::fromValue(connection)); + if (!path.path().isEmpty()) { + knownConnections[path] = tethering_ssid; + } } void WifiManager::tetheringActivated(QDBusPendingCallWatcher *call) { From e9965c87d31af7dc5ea3b2fc28574eaf523b574e Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 15 Apr 2024 08:52:59 +0800 Subject: [PATCH 262/384] ui/network: initialize raw_adapter_state to NM_DEVICE_STATE_UNKNOWN (#32175) --- selfdrive/ui/qt/network/networkmanager.h | 1 + selfdrive/ui/qt/network/wifi_manager.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/network/networkmanager.h b/selfdrive/ui/qt/network/networkmanager.h index 2896b0fff7..8bdeaf3bbd 100644 --- a/selfdrive/ui/qt/network/networkmanager.h +++ b/selfdrive/ui/qt/network/networkmanager.h @@ -32,6 +32,7 @@ const QString NM_DBUS_INTERFACE_IP4_CONFIG = "org.freedesktop.NetworkMa const QString NM_DBUS_SERVICE = "org.freedesktop.NetworkManager"; +const int NM_DEVICE_STATE_UNKNOWN = 0; const int NM_DEVICE_STATE_ACTIVATED = 100; const int NM_DEVICE_STATE_NEED_AUTH = 60; const int NM_DEVICE_TYPE_WIFI = 2; diff --git a/selfdrive/ui/qt/network/wifi_manager.h b/selfdrive/ui/qt/network/wifi_manager.h index 933f25c9d4..2f6a1829d7 100644 --- a/selfdrive/ui/qt/network/wifi_manager.h +++ b/selfdrive/ui/qt/network/wifi_manager.h @@ -63,7 +63,7 @@ public: private: QString adapter; // Path to network manager wifi-device QTimer timer; - unsigned int raw_adapter_state; // Connection status https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NMDeviceState + unsigned int raw_adapter_state = NM_DEVICE_STATE_UNKNOWN; // Connection status https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NMDeviceState QString connecting_to_network; QString tethering_ssid; const QString defaultTetheringPassword = "swagswagcomma"; From ba98786ee317750034881710f0b4b5a7a5a60474 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 15 Apr 2024 09:00:01 +0800 Subject: [PATCH 263/384] ui: fix pair button shows on paired device (#32109) --- selfdrive/ui/qt/offroad/settings.cc | 6 +++--- selfdrive/ui/qt/widgets/prime.cc | 9 +++++---- selfdrive/ui/ui.h | 5 +++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 4b3005467a..e3f3b36ff9 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -255,8 +255,8 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { }); addItem(translateBtn); - QObject::connect(uiState(), &UIState::primeChanged, [this] (bool prime) { - pair_device->setVisible(!prime); + QObject::connect(uiState(), &UIState::primeTypeChanged, [this] (PrimeType type) { + pair_device->setVisible(type == PrimeType::UNPAIRED); }); QObject::connect(uiState(), &UIState::offroadTransition, [=](bool offroad) { for (auto btn : findChildren()) { @@ -344,7 +344,7 @@ void DevicePanel::poweroff() { } void DevicePanel::showEvent(QShowEvent *event) { - pair_device->setVisible(!uiState()->primeType()); + pair_device->setVisible(uiState()->primeType() == PrimeType::UNPAIRED); ListWidget::showEvent(event); } diff --git a/selfdrive/ui/qt/widgets/prime.cc b/selfdrive/ui/qt/widgets/prime.cc index 324d6cf6ae..2621612f67 100644 --- a/selfdrive/ui/qt/widgets/prime.cc +++ b/selfdrive/ui/qt/widgets/prime.cc @@ -235,7 +235,7 @@ SetupWidget::SetupWidget(QWidget* parent) : QFrame(parent) { mainLayout->addWidget(content); - primeUser->setVisible(uiState()->primeType()); + primeUser->setVisible(uiState()->hasPrime()); mainLayout->setCurrentIndex(1); setStyleSheet(R"( @@ -269,15 +269,16 @@ void SetupWidget::replyFinished(const QString &response, bool success) { } QJsonObject json = doc.object(); + bool is_paired = json["is_paired"].toBool(); PrimeType prime_type = static_cast(json["prime_type"].toInt()); - uiState()->setPrimeType(prime_type); + uiState()->setPrimeType(is_paired ? prime_type : PrimeType::UNPAIRED); - if (!json["is_paired"].toBool()) { + if (!is_paired) { mainLayout->setCurrentIndex(0); } else { popup->reject(); - primeUser->setVisible(prime_type); + primeUser->setVisible(uiState()->hasPrime()); mainLayout->setCurrentIndex(1); } } diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 0a939253b1..f5028a280f 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -53,7 +53,8 @@ typedef enum UIStatus { } UIStatus; enum PrimeType { - UNKNOWN = -1, + UNKNOWN = -2, + UNPAIRED = -1, NONE = 0, MAGENTA = 1, LITE = 2, @@ -114,7 +115,7 @@ public: void setPrimeType(PrimeType type); inline PrimeType primeType() const { return prime_type; } - inline bool hasPrime() const { return prime_type != PrimeType::UNKNOWN && prime_type != PrimeType::NONE; } + inline bool hasPrime() const { return prime_type > PrimeType::NONE; } int fb_w = 0, fb_h = 0; From 7bc81341e10aad9742e113006f702ead75f2fbf2 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Mon, 15 Apr 2024 02:00:34 +0100 Subject: [PATCH 264/384] Ford: add Ranger 2024 (CAN FD, dashcam only) (#31956) * Ford: add Ranger 2024 (CAN FD, dashcam only) * force fingerprint * debug * add FW (using debug_fw_fingerprinting_offline) * add test route * Revert "debug" This reverts commit 9d128cb1bbb28fb0cb8da6725c291ebe285e7467. * Revert "force fingerprint" This reverts commit 421d92172f354b4713a1371bec9dc9b1bbb6318f. * update package and finalise steer ratio "Adaptive Cruise Control with Lane Centering" is part of the Raptor Standard Equipment Group (i.e. only on the Raptor trim). However, looking at As-Built/VIN data for Raptor LARIATs show that although Ford does not advertise it they do come with Lane Centering (the configurator only says they have ACC with Stop and Go). ACC with Stop and Go can also be added to the lower XLT trim as part of the Technology Package, but it is unclear at this point whether that includes Lane Centering. The 2021 Ranger had a 17.0 steer ratio. The As-Built data suggests 17/18. PlotJuggler shows the liveParameters.steerRatio between 16.5-17.5 on two short drives. --------- Co-authored-by: Shane Smiskol --- selfdrive/car/ford/fingerprints.py | 14 ++++++++++++++ selfdrive/car/ford/values.py | 4 ++++ selfdrive/car/tests/routes.py | 1 + selfdrive/car/torque_data/override.toml | 1 + 4 files changed, 20 insertions(+) diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index deba38c205..76cbd3aee8 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -148,4 +148,18 @@ FW_VERSIONS = { b'NZ6T-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, + CAR.FORD_RANGER_MK2: { + (Ecu.eps, 0x730, None): [ + b'NL14-14D003-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'PB3C-2D053-ZD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + } } diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index d1e6686ea0..a5494c921c 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -137,6 +137,10 @@ class CAR(Platforms): [FordCarDocs("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0")], CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio ) + FORD_RANGER_MK2 = FordCANFDPlatformConfig( + [FordCarDocs("Ford Ranger 2024", "Adaptive Cruise Control with Lane Centering")], + CarSpecs(mass=2000, wheelbase=3.27, steerRatio=17.0), + ) DATA_IDENTIFIER_FORD_ASBUILT = 0xDE00 diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index ae76268d38..35a9d8a8e7 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -55,6 +55,7 @@ routes = [ CarTestRoute("bd37e43731e5964b|2023-04-30--10-42-26", FORD.FORD_MAVERICK_MK1), CarTestRoute("112e4d6e0cad05e1|2023-11-14--08-21-43", FORD.FORD_F_150_LIGHTNING_MK1), CarTestRoute("83a4e056c7072678|2023-11-13--16-51-33", FORD.FORD_MUSTANG_MACH_E_MK1), + CarTestRoute("37998aa0fade36ab/00000000--48f927c4f5", FORD.FORD_RANGER_MK2), #TestRoute("f1b4c567731f4a1b|2018-04-30--10-15-35", FORD.FUSION), CarTestRoute("7cc2a8365b4dd8a9|2018-12-02--12-10-44", GM.GMC_ACADIA), diff --git a/selfdrive/car/torque_data/override.toml b/selfdrive/car/torque_data/override.toml index 4d9646a54a..c068bf9a14 100644 --- a/selfdrive/car/torque_data/override.toml +++ b/selfdrive/car/torque_data/override.toml @@ -29,6 +29,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "FORD_MAVERICK_MK1" = [nan, 1.5, nan] "FORD_F_150_LIGHTNING_MK1" = [nan, 1.5, nan] "FORD_MUSTANG_MACH_E_MK1" = [nan, 1.5, nan] +"FORD_RANGER_MK2" = [nan, 1.5, nan] ### # No steering wheel From 038782bcba512b077752ef8901b848973b05cd48 Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Mon, 15 Apr 2024 09:11:40 -0700 Subject: [PATCH 265/384] Fix "PlaformConfig" typo (#32201) --- selfdrive/car/nissan/values.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index bdd2dec5f4..eecffb21bc 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -32,16 +32,16 @@ class NissanCarSpecs(CarSpecs): @dataclass -class NissanPlaformConfig(PlatformConfig): +class NissanPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('nissan_x_trail_2017_generated', None)) class CAR(Platforms): - NISSAN_XTRAIL = NissanPlaformConfig( + NISSAN_XTRAIL = NissanPlatformConfig( [NissanCarDocs("Nissan X-Trail 2017")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) - NISSAN_LEAF = NissanPlaformConfig( + NISSAN_LEAF = NissanPlatformConfig( [NissanCarDocs("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY")], NissanCarSpecs(mass=1610, wheelbase=2.705), dbc_dict('nissan_leaf_2018_generated', None), @@ -49,11 +49,11 @@ class CAR(Platforms): # Leaf with ADAS ECU found behind instrument cluster instead of glovebox # Currently the only known difference between them is the inverted seatbelt signal. NISSAN_LEAF_IC = NISSAN_LEAF.override(car_docs=[]) - NISSAN_ROGUE = NissanPlaformConfig( + NISSAN_ROGUE = NissanPlatformConfig( [NissanCarDocs("Nissan Rogue 2018-20")], NissanCarSpecs(mass=1610, wheelbase=2.705) ) - NISSAN_ALTIMA = NissanPlaformConfig( + NISSAN_ALTIMA = NissanPlatformConfig( [NissanCarDocs("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b]))], NissanCarSpecs(mass=1492, wheelbase=2.824) ) From 70cdcc51a99b932000e3b281b303181451a5bc33 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 15 Apr 2024 09:28:32 -0700 Subject: [PATCH 266/384] [bot] Fingerprints: add missing FW versions from CAN fingerprinting cars (#32203) Export fingerprints --- selfdrive/car/ford/fingerprints.py | 2 +- selfdrive/car/hyundai/fingerprints.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index 76cbd3aee8..4dcf2a65fd 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -161,5 +161,5 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - } + }, } diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index f3704524fc..5033738a96 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -82,12 +82,15 @@ FW_VERSIONS = { CAR.HYUNDAI_IONIQ: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 ', + b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2100 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2301 4AEHC107', + b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2501 4AEHC107', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00AEH MFC AT EUR LHD 1.00 1.00 95740-G2400 180222', + b'\xf1\x00AEH MFC AT USA LHD 1.00 1.00 95740-G2400 180222', ], }, CAR.HYUNDAI_IONIQ_PHEV_2019: { @@ -600,6 +603,7 @@ FW_VERSIONS = { CAR.HYUNDAI_KONA_EV: { (Ecu.abs, 0x7d1, None): [ b'\xf1\x00OS IEB \x01 212 \x11\x13 58520-K4000', + b'\xf1\x00OS IEB \x02 210 \x02\x14 58520-K4000', b'\xf1\x00OS IEB \x02 212 \x11\x13 58520-K4000', b'\xf1\x00OS IEB \x03 210 \x02\x14 58520-K4000', b'\xf1\x00OS IEB \x03 212 \x11\x13 58520-K4000', @@ -610,6 +614,7 @@ FW_VERSIONS = { b'\xf1\x00OSE LKAS AT EUR LHD 1.00 1.00 95740-K4100 W40', b'\xf1\x00OSE LKAS AT EUR RHD 1.00 1.00 95740-K4100 W40', b'\xf1\x00OSE LKAS AT KOR LHD 1.00 1.00 95740-K4100 W40', + b'\xf1\x00OSE LKAS AT USA LHD 1.00 1.00 95740-K4100 W40', b'\xf1\x00OSE LKAS AT USA LHD 1.00 1.00 95740-K4300 W50', ], (Ecu.eps, 0x7d4, None): [ @@ -908,14 +913,17 @@ FW_VERSIONS = { }, CAR.KIA_SORENTO: { (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00UMP LKAS AT KOR LHD 1.00 1.00 95740-C5550 S30', b'\xf1\x00UMP LKAS AT USA LHD 1.00 1.00 95740-C6550 d00', b'\xf1\x00UMP LKAS AT USA LHD 1.01 1.01 95740-C6550 d01', ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00UM ESC \x02 12 \x18\x05\x05 58910-C6300', b'\xf1\x00UM ESC \x0c 12 \x18\x05\x06 58910-C6330', + b'\xf1\x00UM ESC \x13 12 \x17\x07\x05 58910-C5320', ], (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00UM__ SCC F-CUP 1.00 1.00 96400-C5500 ', b'\xf1\x00UM__ SCC F-CUP 1.00 1.00 96400-C6500 ', ], }, From c1b059de1ef8f52d050f1902ef54d0dc5f2e1283 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 16 Apr 2024 00:33:28 +0800 Subject: [PATCH 267/384] ui/onroad: split into multiple files (#32059) --- release/files_common | 2 + selfdrive/ui/SConscript | 6 +- selfdrive/ui/qt/home.h | 2 +- selfdrive/ui/qt/onroad.h | 162 ---------- selfdrive/ui/qt/onroad/alerts.cc | 112 +++++++ selfdrive/ui/qt/onroad/alerts.h | 39 +++ .../{onroad.cc => onroad/annotated_camera.cc} | 305 +----------------- selfdrive/ui/qt/onroad/annotated_camera.h | 58 ++++ selfdrive/ui/qt/onroad/buttons.cc | 64 ++++ selfdrive/ui/qt/onroad/buttons.h | 41 +++ selfdrive/ui/qt/onroad/onroad_home.cc | 128 ++++++++ selfdrive/ui/qt/onroad/onroad_home.h | 31 ++ 12 files changed, 484 insertions(+), 466 deletions(-) delete mode 100644 selfdrive/ui/qt/onroad.h create mode 100644 selfdrive/ui/qt/onroad/alerts.cc create mode 100644 selfdrive/ui/qt/onroad/alerts.h rename selfdrive/ui/qt/{onroad.cc => onroad/annotated_camera.cc} (63%) create mode 100644 selfdrive/ui/qt/onroad/annotated_camera.h create mode 100644 selfdrive/ui/qt/onroad/buttons.cc create mode 100644 selfdrive/ui/qt/onroad/buttons.h create mode 100644 selfdrive/ui/qt/onroad/onroad_home.cc create mode 100644 selfdrive/ui/qt/onroad/onroad_home.h diff --git a/release/files_common b/release/files_common index 641e084d30..eaf54b0cd5 100644 --- a/release/files_common +++ b/release/files_common @@ -280,6 +280,8 @@ selfdrive/ui/qt/network/*.h selfdrive/ui/qt/offroad/*.cc selfdrive/ui/qt/offroad/*.h selfdrive/ui/qt/offroad/*.qml +selfdrive/ui/qt/onroad/*.cc +selfdrive/ui/qt/onroad/*.h selfdrive/ui/qt/widgets/*.cc selfdrive/ui/qt/widgets/*.h selfdrive/ui/qt/maps/*.cc diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index ea5734fe6e..13b6998de2 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -36,10 +36,12 @@ widgets = qt_env.Library("qt_widgets", widgets_src, LIBS=base_libs) Export('widgets') qt_libs = [widgets, qt_util] + base_libs -qt_src = ["main.cc", "qt/sidebar.cc", "qt/onroad.cc", "qt/body.cc", +qt_src = ["main.cc", "qt/sidebar.cc", "qt/body.cc", "qt/window.cc", "qt/home.cc", "qt/offroad/settings.cc", "qt/offroad/software_settings.cc", "qt/offroad/onboarding.cc", - "qt/offroad/driverview.cc", "qt/offroad/experimental_mode.cc"] + "qt/offroad/driverview.cc", "qt/offroad/experimental_mode.cc", + "qt/onroad/onroad_home.cc", "qt/onroad/annotated_camera.cc", + "qt/onroad/buttons.cc", "qt/onroad/alerts.cc"] # build translation files with open(File("translations/languages.json").abspath) as f: diff --git a/selfdrive/ui/qt/home.h b/selfdrive/ui/qt/home.h index c6032852a1..f60b80b21a 100644 --- a/selfdrive/ui/qt/home.h +++ b/selfdrive/ui/qt/home.h @@ -10,7 +10,7 @@ #include "common/params.h" #include "selfdrive/ui/qt/offroad/driverview.h" #include "selfdrive/ui/qt/body.h" -#include "selfdrive/ui/qt/onroad.h" +#include "selfdrive/ui/qt/onroad/onroad_home.h" #include "selfdrive/ui/qt/sidebar.h" #include "selfdrive/ui/qt/widgets/controls.h" #include "selfdrive/ui/qt/widgets/offroad_alerts.h" diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h deleted file mode 100644 index c2c2c326db..0000000000 --- a/selfdrive/ui/qt/onroad.h +++ /dev/null @@ -1,162 +0,0 @@ -#pragma once - -#include - -#include -#include -#include - -#include "common/util.h" -#include "selfdrive/ui/ui.h" -#include "selfdrive/ui/qt/widgets/cameraview.h" - - -const int btn_size = 192; -const int img_size = (btn_size / 4) * 3; - - -// ***** onroad widgets ***** -class OnroadAlerts : public QWidget { - Q_OBJECT - -public: - OnroadAlerts(QWidget *parent = 0) : QWidget(parent) {} - void updateState(const UIState &s); - void clear(); - -protected: - struct Alert { - QString text1; - QString text2; - QString type; - cereal::ControlsState::AlertSize size; - cereal::ControlsState::AlertStatus status; - - bool equal(const Alert &other) const { - return text1 == other.text1 && other.text2 == other.text2 && type == other.type; - } - }; - - const QMap alert_colors = { - {cereal::ControlsState::AlertStatus::NORMAL, QColor(0x15, 0x15, 0x15, 0xf1)}, - {cereal::ControlsState::AlertStatus::USER_PROMPT, QColor(0xDA, 0x6F, 0x25, 0xf1)}, - {cereal::ControlsState::AlertStatus::CRITICAL, QColor(0xC9, 0x22, 0x31, 0xf1)}, - }; - - void paintEvent(QPaintEvent*) override; - OnroadAlerts::Alert getAlert(const SubMaster &sm, uint64_t started_frame); - - QColor bg; - Alert alert = {}; -}; - -class ExperimentalButton : public QPushButton { - Q_OBJECT - -public: - explicit ExperimentalButton(QWidget *parent = 0); - void updateState(const UIState &s); - -private: - void paintEvent(QPaintEvent *event) override; - void changeMode(); - - Params params; - QPixmap engage_img; - QPixmap experimental_img; - bool experimental_mode; - bool engageable; -}; - - -class MapSettingsButton : public QPushButton { - Q_OBJECT - -public: - explicit MapSettingsButton(QWidget *parent = 0); - -private: - void paintEvent(QPaintEvent *event) override; - - QPixmap settings_img; -}; - -// container window for the NVG UI -class AnnotatedCameraWidget : public CameraWidget { - Q_OBJECT - -public: - explicit AnnotatedCameraWidget(VisionStreamType type, QWidget* parent = 0); - void updateState(const UIState &s); - - MapSettingsButton *map_settings_btn; - -private: - void drawText(QPainter &p, int x, int y, const QString &text, int alpha = 255); - - QVBoxLayout *main_layout; - ExperimentalButton *experimental_btn; - QPixmap dm_img; - float speed; - QString speedUnit; - float setSpeed; - float speedLimit; - bool is_cruise_set = false; - bool is_metric = false; - bool dmActive = false; - bool hideBottomIcons = false; - bool rightHandDM = false; - float dm_fade_state = 1.0; - bool has_us_speed_limit = false; - bool has_eu_speed_limit = false; - bool v_ego_cluster_seen = false; - int status = STATUS_DISENGAGED; - std::unique_ptr pm; - - int skip_frame_count = 0; - bool wide_cam_requested = false; - -protected: - void paintGL() override; - void initializeGL() override; - void showEvent(QShowEvent *event) override; - void updateFrameMat() override; - void drawLaneLines(QPainter &painter, const UIState *s); - void drawLead(QPainter &painter, const cereal::RadarState::LeadData::Reader &lead_data, const QPointF &vd); - void drawHud(QPainter &p); - void drawDriverState(QPainter &painter, const UIState *s); - inline QColor redColor(int alpha = 255) { return QColor(201, 34, 49, alpha); } - inline QColor whiteColor(int alpha = 255) { return QColor(255, 255, 255, alpha); } - inline QColor blackColor(int alpha = 255) { return QColor(0, 0, 0, alpha); } - - double prev_draw_t = 0; - FirstOrderFilter fps_filter; -}; - -// container for all onroad widgets -class OnroadWindow : public QWidget { - Q_OBJECT - -public: - OnroadWindow(QWidget* parent = 0); - bool isMapVisible() const { return map && map->isVisible(); } - void showMapPanel(bool show) { if (map) map->setVisible(show); } - -signals: - void mapPanelRequested(); - -private: - void createMapWidget(); - void paintEvent(QPaintEvent *event); - void mousePressEvent(QMouseEvent* e) override; - OnroadAlerts *alerts; - AnnotatedCameraWidget *nvg; - QColor bg = bg_colors[STATUS_DISENGAGED]; - QWidget *map = nullptr; - QHBoxLayout* split; - -private slots: - void offroadTransition(bool offroad); - void primeChanged(bool prime); - void updateState(const UIState &s); -}; diff --git a/selfdrive/ui/qt/onroad/alerts.cc b/selfdrive/ui/qt/onroad/alerts.cc new file mode 100644 index 0000000000..0235c5ff42 --- /dev/null +++ b/selfdrive/ui/qt/onroad/alerts.cc @@ -0,0 +1,112 @@ +#include "selfdrive/ui/qt/onroad/alerts.h" + +#include +#include + +#include "selfdrive/ui/qt/util.h" + +void OnroadAlerts::updateState(const UIState &s) { + Alert a = getAlert(*(s.sm), s.scene.started_frame); + if (!alert.equal(a)) { + alert = a; + update(); + } +} + +void OnroadAlerts::clear() { + alert = {}; + update(); +} + +OnroadAlerts::Alert OnroadAlerts::getAlert(const SubMaster &sm, uint64_t started_frame) { + const cereal::ControlsState::Reader &cs = sm["controlsState"].getControlsState(); + const uint64_t controls_frame = sm.rcv_frame("controlsState"); + + Alert a = {}; + if (controls_frame >= started_frame) { // Don't get old alert. + a = {cs.getAlertText1().cStr(), cs.getAlertText2().cStr(), + cs.getAlertType().cStr(), cs.getAlertSize(), cs.getAlertStatus()}; + } + + if (!sm.updated("controlsState") && (sm.frame - started_frame) > 5 * UI_FREQ) { + const int CONTROLS_TIMEOUT = 5; + const int controls_missing = (nanos_since_boot() - sm.rcv_time("controlsState")) / 1e9; + + // Handle controls timeout + if (controls_frame < started_frame) { + // car is started, but controlsState hasn't been seen at all + a = {tr("openpilot Unavailable"), tr("Waiting for controls to start"), + "controlsWaiting", cereal::ControlsState::AlertSize::MID, + cereal::ControlsState::AlertStatus::NORMAL}; + } else if (controls_missing > CONTROLS_TIMEOUT && !Hardware::PC()) { + // car is started, but controls is lagging or died + if (cs.getEnabled() && (controls_missing - CONTROLS_TIMEOUT) < 10) { + a = {tr("TAKE CONTROL IMMEDIATELY"), tr("Controls Unresponsive"), + "controlsUnresponsive", cereal::ControlsState::AlertSize::FULL, + cereal::ControlsState::AlertStatus::CRITICAL}; + } else { + a = {tr("Controls Unresponsive"), tr("Reboot Device"), + "controlsUnresponsivePermanent", cereal::ControlsState::AlertSize::MID, + cereal::ControlsState::AlertStatus::NORMAL}; + } + } + } + return a; +} + +void OnroadAlerts::paintEvent(QPaintEvent *event) { + if (alert.size == cereal::ControlsState::AlertSize::NONE) { + return; + } + static std::map alert_heights = { + {cereal::ControlsState::AlertSize::SMALL, 271}, + {cereal::ControlsState::AlertSize::MID, 420}, + {cereal::ControlsState::AlertSize::FULL, height()}, + }; + int h = alert_heights[alert.size]; + + int margin = 40; + int radius = 30; + if (alert.size == cereal::ControlsState::AlertSize::FULL) { + margin = 0; + radius = 0; + } + QRect r = QRect(0 + margin, height() - h + margin, width() - margin*2, h - margin*2); + + QPainter p(this); + + // draw background + gradient + p.setPen(Qt::NoPen); + p.setCompositionMode(QPainter::CompositionMode_SourceOver); + p.setBrush(QBrush(alert_colors[alert.status])); + p.drawRoundedRect(r, radius, radius); + + QLinearGradient g(0, r.y(), 0, r.bottom()); + g.setColorAt(0, QColor::fromRgbF(0, 0, 0, 0.05)); + g.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0.35)); + + p.setCompositionMode(QPainter::CompositionMode_DestinationOver); + p.setBrush(QBrush(g)); + p.drawRoundedRect(r, radius, radius); + p.setCompositionMode(QPainter::CompositionMode_SourceOver); + + // text + const QPoint c = r.center(); + p.setPen(QColor(0xff, 0xff, 0xff)); + p.setRenderHint(QPainter::TextAntialiasing); + if (alert.size == cereal::ControlsState::AlertSize::SMALL) { + p.setFont(InterFont(74, QFont::DemiBold)); + p.drawText(r, Qt::AlignCenter, alert.text1); + } else if (alert.size == cereal::ControlsState::AlertSize::MID) { + p.setFont(InterFont(88, QFont::Bold)); + p.drawText(QRect(0, c.y() - 125, width(), 150), Qt::AlignHCenter | Qt::AlignTop, alert.text1); + p.setFont(InterFont(66)); + p.drawText(QRect(0, c.y() + 21, width(), 90), Qt::AlignHCenter, alert.text2); + } else if (alert.size == cereal::ControlsState::AlertSize::FULL) { + bool l = alert.text1.length() > 15; + p.setFont(InterFont(l ? 132 : 177, QFont::Bold)); + p.drawText(QRect(0, r.y() + (l ? 240 : 270), width(), 600), Qt::AlignHCenter | Qt::TextWordWrap, alert.text1); + p.setFont(InterFont(88)); + p.drawText(QRect(0, r.height() - (l ? 361 : 420), width(), 300), Qt::AlignHCenter | Qt::TextWordWrap, alert.text2); + } +} diff --git a/selfdrive/ui/qt/onroad/alerts.h b/selfdrive/ui/qt/onroad/alerts.h new file mode 100644 index 0000000000..ae6d4af9ee --- /dev/null +++ b/selfdrive/ui/qt/onroad/alerts.h @@ -0,0 +1,39 @@ +#pragma once + +#include + +#include "selfdrive/ui/ui.h" + +class OnroadAlerts : public QWidget { + Q_OBJECT + +public: + OnroadAlerts(QWidget *parent = 0) : QWidget(parent) {} + void updateState(const UIState &s); + void clear(); + +protected: + struct Alert { + QString text1; + QString text2; + QString type; + cereal::ControlsState::AlertSize size; + cereal::ControlsState::AlertStatus status; + + bool equal(const Alert &other) const { + return text1 == other.text1 && other.text2 == other.text2 && type == other.type; + } + }; + + const QMap alert_colors = { + {cereal::ControlsState::AlertStatus::NORMAL, QColor(0x15, 0x15, 0x15, 0xf1)}, + {cereal::ControlsState::AlertStatus::USER_PROMPT, QColor(0xDA, 0x6F, 0x25, 0xf1)}, + {cereal::ControlsState::AlertStatus::CRITICAL, QColor(0xC9, 0x22, 0x31, 0xf1)}, + }; + + void paintEvent(QPaintEvent*) override; + OnroadAlerts::Alert getAlert(const SubMaster &sm, uint64_t started_frame); + + QColor bg; + Alert alert = {}; +}; diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad/annotated_camera.cc similarity index 63% rename from selfdrive/ui/qt/onroad.cc rename to selfdrive/ui/qt/onroad/annotated_camera.cc index b6a49162fc..f7fb6b480f 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad/annotated_camera.cc @@ -1,310 +1,13 @@ -#include "selfdrive/ui/qt/onroad.h" +#include "selfdrive/ui/qt/onroad/annotated_camera.h" + +#include #include #include -#include -#include -#include - -#include -#include #include "common/swaglog.h" -#include "common/timing.h" +#include "selfdrive/ui/qt/onroad/buttons.h" #include "selfdrive/ui/qt/util.h" -#ifdef ENABLE_MAPS -#include "selfdrive/ui/qt/maps/map_helpers.h" -#include "selfdrive/ui/qt/maps/map_panel.h" -#endif - -static void drawIcon(QPainter &p, const QPoint ¢er, const QPixmap &img, const QBrush &bg, float opacity) { - p.setRenderHint(QPainter::Antialiasing); - p.setOpacity(1.0); // bg dictates opacity of ellipse - p.setPen(Qt::NoPen); - p.setBrush(bg); - p.drawEllipse(center, btn_size / 2, btn_size / 2); - p.setOpacity(opacity); - p.drawPixmap(center - QPoint(img.width() / 2, img.height() / 2), img); - p.setOpacity(1.0); -} - -OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) { - QVBoxLayout *main_layout = new QVBoxLayout(this); - main_layout->setMargin(UI_BORDER_SIZE); - QStackedLayout *stacked_layout = new QStackedLayout; - stacked_layout->setStackingMode(QStackedLayout::StackAll); - main_layout->addLayout(stacked_layout); - - nvg = new AnnotatedCameraWidget(VISION_STREAM_ROAD, this); - - QWidget * split_wrapper = new QWidget; - split = new QHBoxLayout(split_wrapper); - split->setContentsMargins(0, 0, 0, 0); - split->setSpacing(0); - split->addWidget(nvg); - - if (getenv("DUAL_CAMERA_VIEW")) { - CameraWidget *arCam = new CameraWidget("camerad", VISION_STREAM_ROAD, true, this); - split->insertWidget(0, arCam); - } - - if (getenv("MAP_RENDER_VIEW")) { - CameraWidget *map_render = new CameraWidget("navd", VISION_STREAM_MAP, false, this); - split->insertWidget(0, map_render); - } - - stacked_layout->addWidget(split_wrapper); - - alerts = new OnroadAlerts(this); - alerts->setAttribute(Qt::WA_TransparentForMouseEvents, true); - stacked_layout->addWidget(alerts); - - // setup stacking order - alerts->raise(); - - setAttribute(Qt::WA_OpaquePaintEvent); - QObject::connect(uiState(), &UIState::uiUpdate, this, &OnroadWindow::updateState); - QObject::connect(uiState(), &UIState::offroadTransition, this, &OnroadWindow::offroadTransition); - QObject::connect(uiState(), &UIState::primeChanged, this, &OnroadWindow::primeChanged); -} - -void OnroadWindow::updateState(const UIState &s) { - if (!s.scene.started) { - return; - } - - if (s.scene.map_on_left) { - split->setDirection(QBoxLayout::LeftToRight); - } else { - split->setDirection(QBoxLayout::RightToLeft); - } - - alerts->updateState(s); - nvg->updateState(s); - - QColor bgColor = bg_colors[s.status]; - if (bg != bgColor) { - // repaint border - bg = bgColor; - update(); - } -} - -void OnroadWindow::mousePressEvent(QMouseEvent* e) { -#ifdef ENABLE_MAPS - if (map != nullptr) { - bool sidebarVisible = geometry().x() > 0; - bool show_map = !sidebarVisible; - map->setVisible(show_map && !map->isVisible()); - } -#endif - // propagation event to parent(HomeWindow) - QWidget::mousePressEvent(e); -} - -void OnroadWindow::createMapWidget() { -#ifdef ENABLE_MAPS - auto m = new MapPanel(get_mapbox_settings()); - map = m; - QObject::connect(m, &MapPanel::mapPanelRequested, this, &OnroadWindow::mapPanelRequested); - QObject::connect(nvg->map_settings_btn, &MapSettingsButton::clicked, m, &MapPanel::toggleMapSettings); - nvg->map_settings_btn->setEnabled(true); - - m->setFixedWidth(topWidget(this)->width() / 2 - UI_BORDER_SIZE); - split->insertWidget(0, m); - // hidden by default, made visible when navRoute is published - m->setVisible(false); -#endif -} - -void OnroadWindow::offroadTransition(bool offroad) { -#ifdef ENABLE_MAPS - if (!offroad) { - if (map == nullptr && (uiState()->hasPrime() || !MAPBOX_TOKEN.isEmpty())) { - createMapWidget(); - } - } -#endif - alerts->clear(); -} - -void OnroadWindow::primeChanged(bool prime) { -#ifdef ENABLE_MAPS - if (map && (!prime && MAPBOX_TOKEN.isEmpty())) { - nvg->map_settings_btn->setEnabled(false); - nvg->map_settings_btn->setVisible(false); - map->deleteLater(); - map = nullptr; - } else if (!map && (prime || !MAPBOX_TOKEN.isEmpty())) { - createMapWidget(); - } -#endif -} - -void OnroadWindow::paintEvent(QPaintEvent *event) { - QPainter p(this); - p.fillRect(rect(), QColor(bg.red(), bg.green(), bg.blue(), 255)); -} - -// ***** onroad widgets ***** - -// OnroadAlerts - -void OnroadAlerts::updateState(const UIState &s) { - Alert a = getAlert(*(s.sm), s.scene.started_frame); - if (!alert.equal(a)) { - alert = a; - update(); - } -} - -void OnroadAlerts::clear() { - alert = {}; - update(); -} - -OnroadAlerts::Alert OnroadAlerts::getAlert(const SubMaster &sm, uint64_t started_frame) { - const cereal::ControlsState::Reader &cs = sm["controlsState"].getControlsState(); - const uint64_t controls_frame = sm.rcv_frame("controlsState"); - - Alert a = {}; - if (controls_frame >= started_frame) { // Don't get old alert. - a = {cs.getAlertText1().cStr(), cs.getAlertText2().cStr(), - cs.getAlertType().cStr(), cs.getAlertSize(), cs.getAlertStatus()}; - } - - if (!sm.updated("controlsState") && (sm.frame - started_frame) > 5 * UI_FREQ) { - const int CONTROLS_TIMEOUT = 5; - const int controls_missing = (nanos_since_boot() - sm.rcv_time("controlsState")) / 1e9; - - // Handle controls timeout - if (controls_frame < started_frame) { - // car is started, but controlsState hasn't been seen at all - a = {tr("openpilot Unavailable"), tr("Waiting for controls to start"), - "controlsWaiting", cereal::ControlsState::AlertSize::MID, - cereal::ControlsState::AlertStatus::NORMAL}; - } else if (controls_missing > CONTROLS_TIMEOUT && !Hardware::PC()) { - // car is started, but controls is lagging or died - if (cs.getEnabled() && (controls_missing - CONTROLS_TIMEOUT) < 10) { - a = {tr("TAKE CONTROL IMMEDIATELY"), tr("Controls Unresponsive"), - "controlsUnresponsive", cereal::ControlsState::AlertSize::FULL, - cereal::ControlsState::AlertStatus::CRITICAL}; - } else { - a = {tr("Controls Unresponsive"), tr("Reboot Device"), - "controlsUnresponsivePermanent", cereal::ControlsState::AlertSize::MID, - cereal::ControlsState::AlertStatus::NORMAL}; - } - } - } - return a; -} - -void OnroadAlerts::paintEvent(QPaintEvent *event) { - if (alert.size == cereal::ControlsState::AlertSize::NONE) { - return; - } - static std::map alert_heights = { - {cereal::ControlsState::AlertSize::SMALL, 271}, - {cereal::ControlsState::AlertSize::MID, 420}, - {cereal::ControlsState::AlertSize::FULL, height()}, - }; - int h = alert_heights[alert.size]; - - int margin = 40; - int radius = 30; - if (alert.size == cereal::ControlsState::AlertSize::FULL) { - margin = 0; - radius = 0; - } - QRect r = QRect(0 + margin, height() - h + margin, width() - margin*2, h - margin*2); - - QPainter p(this); - - // draw background + gradient - p.setPen(Qt::NoPen); - p.setCompositionMode(QPainter::CompositionMode_SourceOver); - p.setBrush(QBrush(alert_colors[alert.status])); - p.drawRoundedRect(r, radius, radius); - - QLinearGradient g(0, r.y(), 0, r.bottom()); - g.setColorAt(0, QColor::fromRgbF(0, 0, 0, 0.05)); - g.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0.35)); - - p.setCompositionMode(QPainter::CompositionMode_DestinationOver); - p.setBrush(QBrush(g)); - p.drawRoundedRect(r, radius, radius); - p.setCompositionMode(QPainter::CompositionMode_SourceOver); - - // text - const QPoint c = r.center(); - p.setPen(QColor(0xff, 0xff, 0xff)); - p.setRenderHint(QPainter::TextAntialiasing); - if (alert.size == cereal::ControlsState::AlertSize::SMALL) { - p.setFont(InterFont(74, QFont::DemiBold)); - p.drawText(r, Qt::AlignCenter, alert.text1); - } else if (alert.size == cereal::ControlsState::AlertSize::MID) { - p.setFont(InterFont(88, QFont::Bold)); - p.drawText(QRect(0, c.y() - 125, width(), 150), Qt::AlignHCenter | Qt::AlignTop, alert.text1); - p.setFont(InterFont(66)); - p.drawText(QRect(0, c.y() + 21, width(), 90), Qt::AlignHCenter, alert.text2); - } else if (alert.size == cereal::ControlsState::AlertSize::FULL) { - bool l = alert.text1.length() > 15; - p.setFont(InterFont(l ? 132 : 177, QFont::Bold)); - p.drawText(QRect(0, r.y() + (l ? 240 : 270), width(), 600), Qt::AlignHCenter | Qt::TextWordWrap, alert.text1); - p.setFont(InterFont(88)); - p.drawText(QRect(0, r.height() - (l ? 361 : 420), width(), 300), Qt::AlignHCenter | Qt::TextWordWrap, alert.text2); - } -} - -// ExperimentalButton -ExperimentalButton::ExperimentalButton(QWidget *parent) : experimental_mode(false), engageable(false), QPushButton(parent) { - setFixedSize(btn_size, btn_size); - - engage_img = loadPixmap("../assets/img_chffr_wheel.png", {img_size, img_size}); - experimental_img = loadPixmap("../assets/img_experimental.svg", {img_size, img_size}); - QObject::connect(this, &QPushButton::clicked, this, &ExperimentalButton::changeMode); -} - -void ExperimentalButton::changeMode() { - const auto cp = (*uiState()->sm)["carParams"].getCarParams(); - bool can_change = hasLongitudinalControl(cp) && params.getBool("ExperimentalModeConfirmed"); - if (can_change) { - params.putBool("ExperimentalMode", !experimental_mode); - } -} - -void ExperimentalButton::updateState(const UIState &s) { - const auto cs = (*s.sm)["controlsState"].getControlsState(); - bool eng = cs.getEngageable() || cs.getEnabled(); - if ((cs.getExperimentalMode() != experimental_mode) || (eng != engageable)) { - engageable = eng; - experimental_mode = cs.getExperimentalMode(); - update(); - } -} - -void ExperimentalButton::paintEvent(QPaintEvent *event) { - QPainter p(this); - QPixmap img = experimental_mode ? experimental_img : engage_img; - drawIcon(p, QPoint(btn_size / 2, btn_size / 2), img, QColor(0, 0, 0, 166), (isDown() || !engageable) ? 0.6 : 1.0); -} - - -// MapSettingsButton -MapSettingsButton::MapSettingsButton(QWidget *parent) : QPushButton(parent) { - setFixedSize(btn_size, btn_size); - settings_img = loadPixmap("../assets/navigation/icon_directions_outlined.svg", {img_size, img_size}); - - // hidden by default, made visible if map is created (has prime or mapbox token) - setVisible(false); - setEnabled(false); -} - -void MapSettingsButton::paintEvent(QPaintEvent *event) { - QPainter p(this); - drawIcon(p, QPoint(btn_size / 2, btn_size / 2), settings_img, QColor(0, 0, 0, 166), isDown() ? 0.6 : 1.0); -} - // Window that shows camera view and variety of info drawn on top AnnotatedCameraWidget::AnnotatedCameraWidget(VisionStreamType type, QWidget* parent) : fps_filter(UI_FREQ, 3, 1. / UI_FREQ), CameraWidget("camerad", type, true, parent) { diff --git a/selfdrive/ui/qt/onroad/annotated_camera.h b/selfdrive/ui/qt/onroad/annotated_camera.h new file mode 100644 index 0000000000..0be4adfffa --- /dev/null +++ b/selfdrive/ui/qt/onroad/annotated_camera.h @@ -0,0 +1,58 @@ +#pragma once + +#include +#include + +#include "selfdrive/ui/qt/onroad/buttons.h" +#include "selfdrive/ui/qt/widgets/cameraview.h" + +class AnnotatedCameraWidget : public CameraWidget { + Q_OBJECT + +public: + explicit AnnotatedCameraWidget(VisionStreamType type, QWidget* parent = 0); + void updateState(const UIState &s); + + MapSettingsButton *map_settings_btn; + +private: + void drawText(QPainter &p, int x, int y, const QString &text, int alpha = 255); + + QVBoxLayout *main_layout; + ExperimentalButton *experimental_btn; + QPixmap dm_img; + float speed; + QString speedUnit; + float setSpeed; + float speedLimit; + bool is_cruise_set = false; + bool is_metric = false; + bool dmActive = false; + bool hideBottomIcons = false; + bool rightHandDM = false; + float dm_fade_state = 1.0; + bool has_us_speed_limit = false; + bool has_eu_speed_limit = false; + bool v_ego_cluster_seen = false; + int status = STATUS_DISENGAGED; + std::unique_ptr pm; + + int skip_frame_count = 0; + bool wide_cam_requested = false; + +protected: + void paintGL() override; + void initializeGL() override; + void showEvent(QShowEvent *event) override; + void updateFrameMat() override; + void drawLaneLines(QPainter &painter, const UIState *s); + void drawLead(QPainter &painter, const cereal::RadarState::LeadData::Reader &lead_data, const QPointF &vd); + void drawHud(QPainter &p); + void drawDriverState(QPainter &painter, const UIState *s); + inline QColor redColor(int alpha = 255) { return QColor(201, 34, 49, alpha); } + inline QColor whiteColor(int alpha = 255) { return QColor(255, 255, 255, alpha); } + inline QColor blackColor(int alpha = 255) { return QColor(0, 0, 0, alpha); } + + double prev_draw_t = 0; + FirstOrderFilter fps_filter; +}; diff --git a/selfdrive/ui/qt/onroad/buttons.cc b/selfdrive/ui/qt/onroad/buttons.cc new file mode 100644 index 0000000000..75ec316174 --- /dev/null +++ b/selfdrive/ui/qt/onroad/buttons.cc @@ -0,0 +1,64 @@ +#include "selfdrive/ui/qt/onroad/buttons.h" + +#include + +#include "selfdrive/ui/qt/util.h" + +void drawIcon(QPainter &p, const QPoint ¢er, const QPixmap &img, const QBrush &bg, float opacity) { + p.setRenderHint(QPainter::Antialiasing); + p.setOpacity(1.0); // bg dictates opacity of ellipse + p.setPen(Qt::NoPen); + p.setBrush(bg); + p.drawEllipse(center, btn_size / 2, btn_size / 2); + p.setOpacity(opacity); + p.drawPixmap(center - QPoint(img.width() / 2, img.height() / 2), img); + p.setOpacity(1.0); +} + +// ExperimentalButton +ExperimentalButton::ExperimentalButton(QWidget *parent) : experimental_mode(false), engageable(false), QPushButton(parent) { + setFixedSize(btn_size, btn_size); + + engage_img = loadPixmap("../assets/img_chffr_wheel.png", {img_size, img_size}); + experimental_img = loadPixmap("../assets/img_experimental.svg", {img_size, img_size}); + QObject::connect(this, &QPushButton::clicked, this, &ExperimentalButton::changeMode); +} + +void ExperimentalButton::changeMode() { + const auto cp = (*uiState()->sm)["carParams"].getCarParams(); + bool can_change = hasLongitudinalControl(cp) && params.getBool("ExperimentalModeConfirmed"); + if (can_change) { + params.putBool("ExperimentalMode", !experimental_mode); + } +} + +void ExperimentalButton::updateState(const UIState &s) { + const auto cs = (*s.sm)["controlsState"].getControlsState(); + bool eng = cs.getEngageable() || cs.getEnabled(); + if ((cs.getExperimentalMode() != experimental_mode) || (eng != engageable)) { + engageable = eng; + experimental_mode = cs.getExperimentalMode(); + update(); + } +} + +void ExperimentalButton::paintEvent(QPaintEvent *event) { + QPainter p(this); + QPixmap img = experimental_mode ? experimental_img : engage_img; + drawIcon(p, QPoint(btn_size / 2, btn_size / 2), img, QColor(0, 0, 0, 166), (isDown() || !engageable) ? 0.6 : 1.0); +} + +// MapSettingsButton +MapSettingsButton::MapSettingsButton(QWidget *parent) : QPushButton(parent) { + setFixedSize(btn_size, btn_size); + settings_img = loadPixmap("../assets/navigation/icon_directions_outlined.svg", {img_size, img_size}); + + // hidden by default, made visible if map is created (has prime or mapbox token) + setVisible(false); + setEnabled(false); +} + +void MapSettingsButton::paintEvent(QPaintEvent *event) { + QPainter p(this); + drawIcon(p, QPoint(btn_size / 2, btn_size / 2), settings_img, QColor(0, 0, 0, 166), isDown() ? 0.6 : 1.0); +} diff --git a/selfdrive/ui/qt/onroad/buttons.h b/selfdrive/ui/qt/onroad/buttons.h new file mode 100644 index 0000000000..b0757795fb --- /dev/null +++ b/selfdrive/ui/qt/onroad/buttons.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +#include "selfdrive/ui/ui.h" + +const int btn_size = 192; +const int img_size = (btn_size / 4) * 3; + +class ExperimentalButton : public QPushButton { + Q_OBJECT + +public: + explicit ExperimentalButton(QWidget *parent = 0); + void updateState(const UIState &s); + +private: + void paintEvent(QPaintEvent *event) override; + void changeMode(); + + Params params; + QPixmap engage_img; + QPixmap experimental_img; + bool experimental_mode; + bool engageable; +}; + + +class MapSettingsButton : public QPushButton { + Q_OBJECT + +public: + explicit MapSettingsButton(QWidget *parent = 0); + +private: + void paintEvent(QPaintEvent *event) override; + + QPixmap settings_img; +}; + +void drawIcon(QPainter &p, const QPoint ¢er, const QPixmap &img, const QBrush &bg, float opacity); diff --git a/selfdrive/ui/qt/onroad/onroad_home.cc b/selfdrive/ui/qt/onroad/onroad_home.cc new file mode 100644 index 0000000000..1c12a2c3a2 --- /dev/null +++ b/selfdrive/ui/qt/onroad/onroad_home.cc @@ -0,0 +1,128 @@ +#include "selfdrive/ui/qt/onroad/onroad_home.h" + +#include + +#ifdef ENABLE_MAPS +#include "selfdrive/ui/qt/maps/map_helpers.h" +#include "selfdrive/ui/qt/maps/map_panel.h" +#endif + +#include "selfdrive/ui/qt/util.h" + +OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) { + QVBoxLayout *main_layout = new QVBoxLayout(this); + main_layout->setMargin(UI_BORDER_SIZE); + QStackedLayout *stacked_layout = new QStackedLayout; + stacked_layout->setStackingMode(QStackedLayout::StackAll); + main_layout->addLayout(stacked_layout); + + nvg = new AnnotatedCameraWidget(VISION_STREAM_ROAD, this); + + QWidget * split_wrapper = new QWidget; + split = new QHBoxLayout(split_wrapper); + split->setContentsMargins(0, 0, 0, 0); + split->setSpacing(0); + split->addWidget(nvg); + + if (getenv("DUAL_CAMERA_VIEW")) { + CameraWidget *arCam = new CameraWidget("camerad", VISION_STREAM_ROAD, true, this); + split->insertWidget(0, arCam); + } + + if (getenv("MAP_RENDER_VIEW")) { + CameraWidget *map_render = new CameraWidget("navd", VISION_STREAM_MAP, false, this); + split->insertWidget(0, map_render); + } + + stacked_layout->addWidget(split_wrapper); + + alerts = new OnroadAlerts(this); + alerts->setAttribute(Qt::WA_TransparentForMouseEvents, true); + stacked_layout->addWidget(alerts); + + // setup stacking order + alerts->raise(); + + setAttribute(Qt::WA_OpaquePaintEvent); + QObject::connect(uiState(), &UIState::uiUpdate, this, &OnroadWindow::updateState); + QObject::connect(uiState(), &UIState::offroadTransition, this, &OnroadWindow::offroadTransition); + QObject::connect(uiState(), &UIState::primeChanged, this, &OnroadWindow::primeChanged); +} + +void OnroadWindow::updateState(const UIState &s) { + if (!s.scene.started) { + return; + } + + if (s.scene.map_on_left) { + split->setDirection(QBoxLayout::LeftToRight); + } else { + split->setDirection(QBoxLayout::RightToLeft); + } + + alerts->updateState(s); + nvg->updateState(s); + + QColor bgColor = bg_colors[s.status]; + if (bg != bgColor) { + // repaint border + bg = bgColor; + update(); + } +} + +void OnroadWindow::mousePressEvent(QMouseEvent* e) { +#ifdef ENABLE_MAPS + if (map != nullptr) { + bool sidebarVisible = geometry().x() > 0; + bool show_map = !sidebarVisible; + map->setVisible(show_map && !map->isVisible()); + } +#endif + // propagation event to parent(HomeWindow) + QWidget::mousePressEvent(e); +} + +void OnroadWindow::createMapWidget() { +#ifdef ENABLE_MAPS + auto m = new MapPanel(get_mapbox_settings()); + map = m; + QObject::connect(m, &MapPanel::mapPanelRequested, this, &OnroadWindow::mapPanelRequested); + QObject::connect(nvg->map_settings_btn, &MapSettingsButton::clicked, m, &MapPanel::toggleMapSettings); + nvg->map_settings_btn->setEnabled(true); + + m->setFixedWidth(topWidget(this)->width() / 2 - UI_BORDER_SIZE); + split->insertWidget(0, m); + // hidden by default, made visible when navRoute is published + m->setVisible(false); +#endif +} + +void OnroadWindow::offroadTransition(bool offroad) { +#ifdef ENABLE_MAPS + if (!offroad) { + if (map == nullptr && (uiState()->hasPrime() || !MAPBOX_TOKEN.isEmpty())) { + createMapWidget(); + } + } +#endif + alerts->clear(); +} + +void OnroadWindow::primeChanged(bool prime) { +#ifdef ENABLE_MAPS + if (map && (!prime && MAPBOX_TOKEN.isEmpty())) { + nvg->map_settings_btn->setEnabled(false); + nvg->map_settings_btn->setVisible(false); + map->deleteLater(); + map = nullptr; + } else if (!map && (prime || !MAPBOX_TOKEN.isEmpty())) { + createMapWidget(); + } +#endif +} + +void OnroadWindow::paintEvent(QPaintEvent *event) { + QPainter p(this); + p.fillRect(rect(), QColor(bg.red(), bg.green(), bg.blue(), 255)); +} diff --git a/selfdrive/ui/qt/onroad/onroad_home.h b/selfdrive/ui/qt/onroad/onroad_home.h new file mode 100644 index 0000000000..4976f56a67 --- /dev/null +++ b/selfdrive/ui/qt/onroad/onroad_home.h @@ -0,0 +1,31 @@ +#pragma once + +#include "selfdrive/ui/qt/onroad/alerts.h" +#include "selfdrive/ui/qt/onroad/annotated_camera.h" + +class OnroadWindow : public QWidget { + Q_OBJECT + +public: + OnroadWindow(QWidget* parent = 0); + bool isMapVisible() const { return map && map->isVisible(); } + void showMapPanel(bool show) { if (map) map->setVisible(show); } + +signals: + void mapPanelRequested(); + +private: + void createMapWidget(); + void paintEvent(QPaintEvent *event); + void mousePressEvent(QMouseEvent* e) override; + OnroadAlerts *alerts; + AnnotatedCameraWidget *nvg; + QColor bg = bg_colors[STATUS_DISENGAGED]; + QWidget *map = nullptr; + QHBoxLayout* split; + +private slots: + void offroadTransition(bool offroad); + void primeChanged(bool prime); + void updateState(const UIState &s); +}; From ed1d12974fdf37f8acc295b25ec21da308296160 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 15 Apr 2024 14:41:03 -0700 Subject: [PATCH 268/384] Hyundai CAN: check traction control enabled (#32208) * add esp * add tcs11 --- selfdrive/car/hyundai/carstate.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index eac91d5293..92c489cf34 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -118,6 +118,7 @@ class CarState(CarStateBase): ret.brakePressed = cp.vl["TCS13"]["DriverOverride"] == 2 # 2 includes regen braking by user on HEV/EV ret.brakeHoldActive = cp.vl["TCS15"]["AVH_LAMP"] == 2 # 0 OFF, 1 ERROR, 2 ACTIVE, 3 READY ret.parkingBrake = cp.vl["TCS13"]["PBRAKE_ACT"] == 1 + ret.espDisabled = cp.vl["TCS11"]["TCS_PAS"] == 1 ret.accFaulted = cp.vl["TCS13"]["ACCEnable"] != 0 # 0 ACC CONTROL ENABLED, 1-3 ACC CONTROL DISABLED if self.CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV): @@ -255,6 +256,7 @@ class CarState(CarStateBase): messages = [ # address, frequency ("MDPS12", 50), + ("TCS11", 100), ("TCS13", 50), ("TCS15", 10), ("CLU11", 50), From fd401c317d29ac06c06c3cc505fb39e64cfb4819 Mon Sep 17 00:00:00 2001 From: kangtae1 Date: Tue, 16 Apr 2024 06:58:34 +0900 Subject: [PATCH 269/384] Fingerprint: KIA Niro HEV 2021 - South Korea model (#31499) * Fingerprints: KIA Niro HEV South Korea model * Update selfdrive/car/hyundai/fingerprints.py --------- Co-authored-by: Shane Smiskol --- selfdrive/car/hyundai/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 5033738a96..42a442a190 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -737,9 +737,11 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00DEH MFC AT USA LHD 1.00 1.00 99211-G5500 210428', b'\xf1\x00DEH MFC AT USA LHD 1.00 1.07 99211-G5000 201221', + b'\xf1\x00DEH MFC AT KOR LHD 1.00 1.04 99211-G5000 190516', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00DEhe SCC FHCUP 1.00 1.00 99110-G5600 ', + b'\xf1\x00DEhe SCC FHCUP 1.00 1.01 99110-G5000 ', ], }, CAR.KIA_SELTOS: { From d14407dafa173383b93cce29a55f0b30c10e8648 Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:03:22 -0400 Subject: [PATCH 270/384] Subaru: Add FW for 2020 Subaru Forester (#31748) --- selfdrive/car/subaru/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/subaru/fingerprints.py b/selfdrive/car/subaru/fingerprints.py index c9b0b859f4..41727d7623 100644 --- a/selfdrive/car/subaru/fingerprints.py +++ b/selfdrive/car/subaru/fingerprints.py @@ -236,6 +236,7 @@ FW_VERSIONS = { b'\xa3 \x18&\x00', b'\xa3 \x19\x14\x00', b'\xa3 \x19&\x00', + b'\xa3 \x19h\x00', b'\xa3 \x14\x00', b'\xa3 \x14\x01', ], @@ -248,6 +249,7 @@ FW_VERSIONS = { b'\x00\x00e!\x1f@ \x11', b'\x00\x00e^\x00\x00\x00\x00', b'\x00\x00e^\x1f@ !', + b'\x00\x00e`\x00\x00\x00\x00', b'\x00\x00e`\x1f@ ', b'\x00\x00e\x97\x00\x00\x00\x00', b'\x00\x00e\x97\x1f@ 0', @@ -268,6 +270,7 @@ FW_VERSIONS = { b'\x1a\xf6F`\x00', b'\x1a\xf6b0\x00', b'\x1a\xf6b`\x00', + b'\x1a\xf6f`\x00', ], }, CAR.SUBARU_FORESTER_HYBRID: { From f7f7dba5ed0580c3022ea6d07148b76e398b768e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 15 Apr 2024 15:17:21 -0700 Subject: [PATCH 271/384] [bot] Fingerprints: add missing FW versions from new users (#31840) Export fingerprints --- selfdrive/car/hyundai/fingerprints.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 42a442a190..eb2871684b 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -287,6 +287,7 @@ FW_VERSIONS = { b'\xf1\x00TM ESC \x02 101 \x08\x04 58910-S2GA0', b'\xf1\x00TM ESC \x02 103"\x07\x08 58910-S2GA0', b'\xf1\x00TM ESC \x03 101 \x08\x02 58910-S2DA0', + b'\xf1\x00TM ESC \x03 102!\x04\x03 58910-S2DA0', b'\xf1\x00TM ESC \x04 101 \x08\x04 58910-S2GA0', b'\xf1\x00TM ESC \x04 102!\x04\x05 58910-S2GA0', b'\xf1\x00TM ESC \x1e 102 \x08\x08 58910-S1DA0', @@ -410,6 +411,7 @@ FW_VERSIONS = { b'\xf1\x00LX2_ SCC FHCUP 1.00 1.05 99110-S8100 ', b'\xf1\x00ON__ FCA FHCUP 1.00 1.01 99110-S9110 ', b'\xf1\x00ON__ FCA FHCUP 1.00 1.02 99110-S9100 ', + b'\xf1\x00ON__ FCA FHCUP 1.00 1.03 99110-S9100 ', ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00LX ESC \x01 103\x19\t\x10 58910-S8360', @@ -499,6 +501,7 @@ FW_VERSIONS = { b'\xf1\x00DH__ SCC FHCUP 1.00 1.01 96400-B1110 ', ], (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DH LKAS AT KOR LHD 1.01 1.01 95895-B1500 161014', b'\xf1\x00DH LKAS AT KOR LHD 1.01 1.02 95895-B1500 170810', b'\xf1\x00DH LKAS AT USA LHD 1.01 1.01 95895-B1500 161014', b'\xf1\x00DH LKAS AT USA LHD 1.01 1.02 95895-B1500 170810', @@ -585,6 +588,7 @@ FW_VERSIONS = { b'\xf1\x00DL ESC \x06 103"\x08\x06 58910-L3200', b'\xf1\x00DL ESC \t 100 \x06\x02 58910-L3800', b'\xf1\x00DL ESC \t 101 \x07\x02 58910-L3800', + b'\xf1\x00DL ESC \t 102"\x08\x10 58910-L3800', ], }, CAR.KIA_K5_HEV_2020: { @@ -735,9 +739,9 @@ FW_VERSIONS = { b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101', ], (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DEH MFC AT KOR LHD 1.00 1.04 99211-G5000 190516', b'\xf1\x00DEH MFC AT USA LHD 1.00 1.00 99211-G5500 210428', b'\xf1\x00DEH MFC AT USA LHD 1.00 1.07 99211-G5000 201221', - b'\xf1\x00DEH MFC AT KOR LHD 1.00 1.04 99211-G5000 190516', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00DEhe SCC FHCUP 1.00 1.00 99110-G5600 ', From c309333b79e499c19ac2229dae0d767288223110 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 15 Apr 2024 15:34:10 -0700 Subject: [PATCH 272/384] [bot] Fingerprints: add missing FW versions from new users (#32209) Export fingerprints --- selfdrive/car/hyundai/fingerprints.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index eb2871684b..574f79906b 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -407,6 +407,7 @@ FW_VERSIONS = { b'\xf1\x00LX2_ SCC F-CUP 1.00 1.05 99110-S8100 ', b'\xf1\x00LX2_ SCC FHCU- 1.00 1.05 99110-S8100 ', b'\xf1\x00LX2_ SCC FHCUP 1.00 1.00 99110-S8110 ', + b'\xf1\x00LX2_ SCC FHCUP 1.00 1.03 99110-S8100 ', b'\xf1\x00LX2_ SCC FHCUP 1.00 1.04 99110-S8100 ', b'\xf1\x00LX2_ SCC FHCUP 1.00 1.05 99110-S8100 ', b'\xf1\x00ON__ FCA FHCUP 1.00 1.01 99110-S9110 ', @@ -418,6 +419,7 @@ FW_VERSIONS = { b'\xf1\x00LX ESC \x01 1031\t\x10 58910-S8360', b'\xf1\x00LX ESC \x01 104 \x10\x16 58910-S8360', b'\xf1\x00LX ESC \x0b 101\x19\x03\x17 58910-S8330', + b'\xf1\x00LX ESC \x0b 101\x19\x03 58910-S8360', b'\xf1\x00LX ESC \x0b 102\x19\x05\x07 58910-S8330', b'\xf1\x00LX ESC \x0b 103\x19\t\x07 58910-S8330', b'\xf1\x00LX ESC \x0b 103\x19\t\t 58910-S8350', @@ -432,6 +434,7 @@ FW_VERSIONS = { b'\xf1\x00LX2 MDPS C 1,00 1,03 56310-S8020 4LXDC103', b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-S8000 4LXDC103', b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-S8020 4LXDC103', + b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-XX000 4LXDC103', b'\xf1\x00LX2 MDPS C 1.00 1.04 56310-S8020 4LXDC104', b'\xf1\x00LX2 MDPS R 1.00 1.02 56370-S8300 9318', b'\xf1\x00ON MDPS C 1.00 1.00 56340-S9000 8B13', @@ -584,6 +587,7 @@ FW_VERSIONS = { ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00DL ESC \x01 104 \x07\x12 58910-L2200', + b'\xf1\x00DL ESC \x03 100 \x08\x02 58910-L3600', b'\xf1\x00DL ESC \x06 101 \x04\x02 58910-L3200', b'\xf1\x00DL ESC \x06 103"\x08\x06 58910-L3200', b'\xf1\x00DL ESC \t 100 \x06\x02 58910-L3800', @@ -850,6 +854,7 @@ FW_VERSIONS = { (Ecu.eps, 0x7d4, None): [ b'\xf1\x00CN7 MDPS C 1.00 1.06 56310/AA070 4CNDC106', b'\xf1\x00CN7 MDPS C 1.00 1.06 56310AA050\x00 4CNDC106', + b'\xf1\x00CN7 MDPS C 1.00 1.07 56310AA050\x00 4CNDC107', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.00 99210-AB000 200819', @@ -857,6 +862,7 @@ FW_VERSIONS = { b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.03 99210-AA000 200819', b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.03 99210-AB000 220426', b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.06 99210-AA000 220111', + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.08 99210-AA000 220728', ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00CN ESC \t 101 \x10\x03 58910-AB800', From cedf98de5a2a948bd7d19b23ac964cf845a4769d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 15 Apr 2024 16:44:43 -0700 Subject: [PATCH 273/384] casync build: remove channel from build metadata json (#32212) * remove channel * fix * reset * remove this * no channel --- release/README.md | 1 - release/create_casync_build.sh | 2 +- release/create_casync_release.py | 3 +-- release/create_release_manifest.py | 8 +++----- system/updated/casync/common.py | 4 ++-- system/version.py | 6 ------ 6 files changed, 7 insertions(+), 17 deletions(-) diff --git a/release/README.md b/release/README.md index 7a4b2cde3e..eaf2d2b535 100644 --- a/release/README.md +++ b/release/README.md @@ -32,7 +32,6 @@ # of a tarball containing the full prebuilt openpilot release BUILD_DIR=/data/openpilot_build \ CASYNC_DIR=/data/casync \ -OPENPILOT_CHANNEL=nightly \ release/create_casync_build.sh ``` diff --git a/release/create_casync_build.sh b/release/create_casync_build.sh index 8448801189..256bad4b4c 100755 --- a/release/create_casync_build.sh +++ b/release/create_casync_build.sh @@ -20,4 +20,4 @@ release/copy_build_files.sh $SOURCE_DIR $BUILD_DIR release/create_prebuilt.sh $BUILD_DIR cd $SOURCE_DIR -release/create_casync_release.py $BUILD_DIR $CASYNC_DIR $OPENPILOT_CHANNEL +release/create_casync_release.py $BUILD_DIR $CASYNC_DIR diff --git a/release/create_casync_release.py b/release/create_casync_release.py index 4c90c31909..11629f3ab5 100755 --- a/release/create_casync_release.py +++ b/release/create_casync_release.py @@ -12,7 +12,6 @@ if __name__ == "__main__": parser = argparse.ArgumentParser(description="creates a casync release") parser.add_argument("target_dir", type=str, help="target directory to build channel from") parser.add_argument("output_dir", type=str, help="output directory for the channel") - parser.add_argument("channel", type=str, help="what channel this build is") args = parser.parse_args() target_dir = pathlib.Path(args.target_dir) @@ -21,7 +20,7 @@ if __name__ == "__main__": build_metadata = get_build_metadata() build_metadata.openpilot.build_style = "release" if os.environ.get("RELEASE", None) is not None else "debug" - create_build_metadata_file(target_dir, build_metadata, args.channel) + create_build_metadata_file(target_dir, build_metadata) digest, caibx = create_casync_release(target_dir, output_dir, build_metadata.canonical) diff --git a/release/create_release_manifest.py b/release/create_release_manifest.py index 485b18c617..1d235f10fa 100755 --- a/release/create_release_manifest.py +++ b/release/create_release_manifest.py @@ -6,18 +6,16 @@ import os import pathlib from openpilot.system.hardware.tici.agnos import AGNOS_MANIFEST_FILE, get_partition_path -from openpilot.system.version import get_build_metadata, get_agnos_version +from openpilot.system.version import get_build_metadata BASE_URL = "https://commadist.blob.core.windows.net" -CHANNEL_DATA = pathlib.Path(__file__).parent / "channel_data" / "agnos" - OPENPILOT_RELEASES = f"{BASE_URL}/openpilot-releases/openpilot" AGNOS_RELEASES = f"{BASE_URL}/openpilot-releases/agnos" -def create_partition_manifest(agnos_version, partition): +def create_partition_manifest(partition): agnos_filename = os.path.basename(partition["url"]).split(".")[0] return { @@ -57,7 +55,7 @@ if __name__ == "__main__": ret = { "build_metadata": dataclasses.asdict(build_metadata), "manifest": [ - *[create_partition_manifest(get_agnos_version(args.target_dir), entry) for entry in agnos_manifest], + *[create_partition_manifest(entry) for entry in agnos_manifest], create_openpilot_manifest(build_metadata) ] } diff --git a/system/updated/casync/common.py b/system/updated/casync/common.py index d1c795657d..6979f5cb06 100644 --- a/system/updated/casync/common.py +++ b/system/updated/casync/common.py @@ -29,11 +29,11 @@ def get_exclude_set(path) -> set[str]: return exclude_set -def create_build_metadata_file(path: pathlib.Path, build_metadata: BuildMetadata, channel: str): +def create_build_metadata_file(path: pathlib.Path, build_metadata: BuildMetadata): with open(path / BUILD_METADATA_FILENAME, "w") as f: build_metadata_dict = dataclasses.asdict(build_metadata) - build_metadata_dict["channel"] = channel build_metadata_dict["openpilot"].pop("is_dirty") # this is determined at runtime + build_metadata_dict.pop("channel") # channel is unrelated to the build itself f.write(json.dumps(build_metadata_dict)) diff --git a/system/version.py b/system/version.py index 6c3609c45a..f5b8cd49e8 100755 --- a/system/version.py +++ b/system/version.py @@ -10,7 +10,6 @@ from openpilot.common.basedir import BASEDIR from openpilot.common.swaglog import cloudlog from openpilot.common.utils import cache from openpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_commit_date -from openpilot.common.run import run_cmd RELEASE_BRANCHES = ['release3-staging', 'release3', 'nightly'] TESTED_BRANCHES = RELEASE_BRANCHES + ['devel', 'devel-staging'] @@ -157,11 +156,6 @@ def get_build_metadata(path: str = BASEDIR) -> BuildMetadata: raise Exception("invalid build metadata") -def get_agnos_version(directory: str = BASEDIR) -> str: - return run_cmd(["bash", "-c", r"unset AGNOS_VERSION && source launch_env.sh && \ - echo -n $AGNOS_VERSION"], cwd=directory).strip() - - if __name__ == "__main__": from openpilot.common.params import Params From 4356ad9bf563e9588edec6bf96f1590cff411a95 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 15 Apr 2024 17:43:40 -0700 Subject: [PATCH 274/384] also remove channel from jenkinsfile (#32213) --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 418404071a..909fbf63dd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -154,9 +154,9 @@ def build_release(String channel_name) { }, "${channel_name} (casync)": { deviceStage("build casync", "tici-needs-can", [], [ - ["build ${channel_name}", "RELEASE=1 OPENPILOT_CHANNEL=${channel_name} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync/openpilot $SOURCE_DIR/release/create_casync_build.sh"], + ["build", "RELEASE=1 BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync/openpilot $SOURCE_DIR/release/create_casync_build.sh"], ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/openpilot /data/manifest.json && cat /data/manifest.json"], - ["upload and cleanup ${channel_name}", "PYTHONWARNINGS=ignore $SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], + ["upload and cleanup", "PYTHONWARNINGS=ignore $SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], ]) }, "publish agnos": { From 0b8de57c567fe3ef9fca9928f6d21bc76ac61024 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 16 Apr 2024 10:33:58 -0700 Subject: [PATCH 275/384] [bot] Fingerprints: add missing FW versions from new users (#32211) Export fingerprints --- selfdrive/car/toyota/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index d91124e257..8ca0ca8851 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1334,6 +1334,7 @@ FW_VERSIONS = { b'\x01896637854000\x00\x00\x00\x00', b'\x01896637873000\x00\x00\x00\x00', b'\x01896637878000\x00\x00\x00\x00', + b'\x01896637878100\x00\x00\x00\x00', ], (Ecu.engine, 0x7e0, None): [ b'\x0237841000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', From 7e494eb06f5a36a4fc0b39d637d624605de8a1dc Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Tue, 16 Apr 2024 14:35:02 -0300 Subject: [PATCH 276/384] Multilang: update pt-BR translation (#32216) remove navFeatures description from experimental toggle --- selfdrive/ui/translations/main_pt-BR.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index 6d66565a18..cd0e2eefa8 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -1164,7 +1164,7 @@ Isso pode levar até um minuto. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. - + A visualização de condução fará a transição para a câmera grande angular voltada para a estrada em baixas velocidades para mostrar melhor algumas curvas. O logotipo do modo Experimental também será mostrado no canto superior direito.
From 7c378814f1dceca0498a8e4e827a1b7f87286736 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 16 Apr 2024 12:00:18 -0700 Subject: [PATCH 277/384] jenkins: nightly casync build off of master (#32218) release node --- Jenkinsfile | 213 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 133 insertions(+), 80 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 909fbf63dd..f68ed86b66 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -9,6 +9,28 @@ def retryWithDelay(int maxRetries, int delay, Closure body) { throw Exception("Failed after ${maxRetries} retries") } +// check if started by timer: https://stackoverflow.com/questions/43516025/how-to-handle-nightly-build-in-jenkins-declarative-pipeline +@NonCPS +def isJobStartedByTimer() { + def startedByTimer = false + try { + def buildCauses = currentBuild.rawBuild.getCauses() + for ( buildCause in buildCauses ) { + if (buildCause != null) { + def causeDescription = buildCause.getShortDescription() + echo "shortDescription: ${causeDescription}" + if (causeDescription.contains("Started by timer")) { + startedByTimer = true + } + } + } + } catch(theError) { + echo "Error getting build cause" + } + + return startedByTimer +} + def device(String ip, String step_label, String cmd) { withCredentials([file(credentialsId: 'id_rsa', variable: 'key_file')]) { def ssh_cmd = """ @@ -151,15 +173,31 @@ def build_release(String channel_name) { deviceStage("build git", "tici-needs-can", [], [ ["build ${channel_name}", "RELEASE_BRANCH=${channel_name} $SOURCE_DIR/release/build_release.sh"], ]) + } + ) +} + + +def build_casync_release(String channel_name, def release) { + def extra_env = release ? "RELEASE=1" : "" + + return deviceStage("build casync", "tici-needs-can", [], [ + ["build", "${extra_env} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync/openpilot $SOURCE_DIR/release/create_casync_build.sh"], + ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/openpilot /data/manifest.json && cat /data/manifest.json"], + ["upload and cleanup", "PYTHONWARNINGS=ignore $SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], + ]) +} + + +def build_stage() { + return parallel ( + 'nightly': { + build_release("nightly", true); }, - "${channel_name} (casync)": { - deviceStage("build casync", "tici-needs-can", [], [ - ["build", "RELEASE=1 BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync/openpilot $SOURCE_DIR/release/create_casync_build.sh"], - ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/openpilot /data/manifest.json && cat /data/manifest.json"], - ["upload and cleanup", "PYTHONWARNINGS=ignore $SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], - ]) + 'master': { + build_release("master", false); }, - "publish agnos": { + 'publish agnos': { pcStage("publish agnos") { sh "release/create_casync_agnos_release.py /tmp/casync/agnos /tmp/casync_tmp" sh "PYTHONWARNINGS=ignore ${env.WORKSPACE}/release/upload_casync_release.py /tmp/casync" @@ -168,7 +206,6 @@ def build_release(String channel_name) { ) } - node { env.CI = "1" env.PYTHONWARNINGS = "error" @@ -183,12 +220,23 @@ node { 'testing-closet*', 'hotfix-*'] def excludeRegex = excludeBranches.join('|').replaceAll('\\*', '.*') - if (env.BRANCH_NAME != 'master') { - properties([ - disableConcurrentBuilds(abortPrevious: true) - ]) + def nightlyBranch = "master" + + def props = []; + + if (env.BRANCH_NAME == nightlyBranch) { + props.add(pipelineTriggers([ + pollSCM('* * * * *'), // every commit + cron('0 2 * * *') // and at 2am every night + ])) + } + + if (env.branch != "master") { + props.add(disableConcurrentBuilds(abortPrevious: true)) } + properties(props); + try { if (env.BRANCH_NAME == 'devel-staging') { build_release("release3-staging") @@ -199,74 +247,79 @@ node { } if (!env.BRANCH_NAME.matches(excludeRegex)) { - parallel ( - // tici tests - 'onroad tests': { - deviceStage("onroad", "tici-needs-can", [], [ - // TODO: ideally, this test runs in master-ci, but it takes 5+m to build it - //["build master-ci", "cd $SOURCE_DIR/release && TARGET_DIR=$TEST_DIR $SOURCE_DIR/scripts/retry.sh ./build_devel.sh"], - ["build openpilot", "cd selfdrive/manager && ./build.py"], - ["check dirty", "release/check-dirty.sh"], - ["onroad tests", "pytest selfdrive/test/test_onroad.py -s"], - ["time to onroad", "pytest selfdrive/test/test_time_to_onroad.py"], - ]) - }, - 'HW + Unit Tests': { - deviceStage("tici-hardware", "tici-common", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], - ["test power draw", "pytest -s system/hardware/tici/tests/test_power_draw.py"], - ["test encoder", "LD_LIBRARY_PATH=/usr/local/lib pytest system/loggerd/tests/test_encoder.py"], - ["test pigeond", "pytest system/ubloxd/tests/test_pigeond.py"], - ["test manager", "pytest selfdrive/manager/test/test_manager.py"], - ]) - }, - 'loopback': { - deviceStage("loopback", "tici-loopback", ["UNSAFE=1"], [ - ["build openpilot", "cd selfdrive/manager && ./build.py"], - ["test boardd loopback", "pytest selfdrive/boardd/tests/test_boardd_loopback.py"], - ]) - }, - 'camerad': { - deviceStage("AR0231", "tici-ar0231", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test camerad", "pytest system/camerad/test/test_camerad.py"], - ["test exposure", "pytest system/camerad/test/test_exposure.py"], - ]) - deviceStage("OX03C10", "tici-ox03c10", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test camerad", "pytest system/camerad/test/test_camerad.py"], - ["test exposure", "pytest system/camerad/test/test_exposure.py"], - ]) - }, - 'sensord': { - deviceStage("LSM + MMC", "tici-lsmc", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test sensord", "pytest system/sensord/tests/test_sensord.py"], - ]) - deviceStage("BMX + LSM", "tici-bmx-lsm", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test sensord", "pytest system/sensord/tests/test_sensord.py"], - ]) - }, - 'replay': { - deviceStage("model-replay", "tici-replay", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["model replay", "selfdrive/test/process_replay/model_replay.py"], - ]) - }, - 'tizi': { - deviceStage("tizi", "tizi", ["UNSAFE=1"], [ - ["build openpilot", "cd selfdrive/manager && ./build.py"], - ["test boardd loopback", "SINGLE_PANDA=1 pytest selfdrive/boardd/tests/test_boardd_loopback.py"], - ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], - ["test amp", "pytest system/hardware/tici/tests/test_amplifier.py"], - ["test hw", "pytest system/hardware/tici/tests/test_hardware.py"], - ["test qcomgpsd", "pytest system/qcomgpsd/tests/test_qcomgpsd.py"], - ]) - }, - - ) + parallel ( + // tici tests + 'onroad tests': { + deviceStage("onroad", "tici-needs-can", [], [ + // TODO: ideally, this test runs in master-ci, but it takes 5+m to build it + //["build master-ci", "cd $SOURCE_DIR/release && TARGET_DIR=$TEST_DIR $SOURCE_DIR/scripts/retry.sh ./build_devel.sh"], + ["build openpilot", "cd selfdrive/manager && ./build.py"], + ["check dirty", "release/check-dirty.sh"], + ["onroad tests", "pytest selfdrive/test/test_onroad.py -s"], + ["time to onroad", "pytest selfdrive/test/test_time_to_onroad.py"], + ]) + }, + 'HW + Unit Tests': { + deviceStage("tici-hardware", "tici-common", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], + ["test power draw", "pytest -s system/hardware/tici/tests/test_power_draw.py"], + ["test encoder", "LD_LIBRARY_PATH=/usr/local/lib pytest system/loggerd/tests/test_encoder.py"], + ["test pigeond", "pytest system/ubloxd/tests/test_pigeond.py"], + ["test manager", "pytest selfdrive/manager/test/test_manager.py"], + ]) + }, + 'loopback': { + deviceStage("loopback", "tici-loopback", ["UNSAFE=1"], [ + ["build openpilot", "cd selfdrive/manager && ./build.py"], + ["test boardd loopback", "pytest selfdrive/boardd/tests/test_boardd_loopback.py"], + ]) + }, + 'camerad': { + deviceStage("AR0231", "tici-ar0231", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test camerad", "pytest system/camerad/test/test_camerad.py"], + ["test exposure", "pytest system/camerad/test/test_exposure.py"], + ]) + deviceStage("OX03C10", "tici-ox03c10", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test camerad", "pytest system/camerad/test/test_camerad.py"], + ["test exposure", "pytest system/camerad/test/test_exposure.py"], + ]) + }, + 'sensord': { + deviceStage("LSM + MMC", "tici-lsmc", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test sensord", "pytest system/sensord/tests/test_sensord.py"], + ]) + deviceStage("BMX + LSM", "tici-bmx-lsm", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test sensord", "pytest system/sensord/tests/test_sensord.py"], + ]) + }, + 'replay': { + deviceStage("model-replay", "tici-replay", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["model replay", "selfdrive/test/process_replay/model_replay.py"], + ]) + }, + 'tizi': { + deviceStage("tizi", "tizi", ["UNSAFE=1"], [ + ["build openpilot", "cd selfdrive/manager && ./build.py"], + ["test boardd loopback", "SINGLE_PANDA=1 pytest selfdrive/boardd/tests/test_boardd_loopback.py"], + ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], + ["test amp", "pytest system/hardware/tici/tests/test_amplifier.py"], + ["test hw", "pytest system/hardware/tici/tests/test_hardware.py"], + ["test qcomgpsd", "pytest system/qcomgpsd/tests/test_qcomgpsd.py"], + ]) + }, + ) + } + + if (env.BRANCH_NAME == nightlyBranch && isJobStartedByTimer()) { + stage('build release') { + build_stage() + } } } catch (Exception e) { currentBuild.result = 'FAILED' From e4f4fd1d5a8000859ad37f1c7fb7b95d482099ad Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 16 Apr 2024 12:06:48 -0700 Subject: [PATCH 278/384] rename build_release to build_git_release (#32219) fix names --- Jenkinsfile | 16 ++++++++-------- .../{build_release.sh => build_git_release.sh} | 0 2 files changed, 8 insertions(+), 8 deletions(-) rename release/{build_release.sh => build_git_release.sh} (100%) diff --git a/Jenkinsfile b/Jenkinsfile index f68ed86b66..bbd51b8bfd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -167,19 +167,19 @@ def setupCredentials() { } -def build_release(String channel_name) { +def build_git_release(String channel_name) { return parallel ( "${channel_name} (git)": { deviceStage("build git", "tici-needs-can", [], [ - ["build ${channel_name}", "RELEASE_BRANCH=${channel_name} $SOURCE_DIR/release/build_release.sh"], + ["build ${channel_name}", "RELEASE_BRANCH=${channel_name} $SOURCE_DIR/release/build_git_release.sh"], ]) } ) } -def build_casync_release(String channel_name, def release) { - def extra_env = release ? "RELEASE=1" : "" +def build_casync_release(String channel_name, def is_release) { + def extra_env = is_release ? "RELEASE=1" : "" return deviceStage("build casync", "tici-needs-can", [], [ ["build", "${extra_env} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync/openpilot $SOURCE_DIR/release/create_casync_build.sh"], @@ -192,10 +192,10 @@ def build_casync_release(String channel_name, def release) { def build_stage() { return parallel ( 'nightly': { - build_release("nightly", true); + build_casync_release("nightly", true); }, 'master': { - build_release("master", false); + build_casync_release("master", false); }, 'publish agnos': { pcStage("publish agnos") { @@ -239,11 +239,11 @@ node { try { if (env.BRANCH_NAME == 'devel-staging') { - build_release("release3-staging") + build_git_release("release3-staging") } if (env.BRANCH_NAME == 'master-ci') { - build_release("nightly") + build_git_release("nightly") } if (!env.BRANCH_NAME.matches(excludeRegex)) { diff --git a/release/build_release.sh b/release/build_git_release.sh similarity index 100% rename from release/build_release.sh rename to release/build_git_release.sh From 7e20812924d77dfd3d6e3602eac0b08e9138f4a3 Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:51:23 -0300 Subject: [PATCH 279/384] ui: cleanup white space after string (#32217) * cleanup white space after string * update --------- Co-authored-by: Shane Smiskol --- selfdrive/ui/qt/offroad/settings.cc | 2 +- selfdrive/ui/translations/main_ar.ts | 2 +- selfdrive/ui/translations/main_de.ts | 2 +- selfdrive/ui/translations/main_fr.ts | 2 +- selfdrive/ui/translations/main_ja.ts | 2 +- selfdrive/ui/translations/main_ko.ts | 2 +- selfdrive/ui/translations/main_pt-BR.ts | 2 +- selfdrive/ui/translations/main_th.ts | 2 +- selfdrive/ui/translations/main_tr.ts | 2 +- selfdrive/ui/translations/main_zh-CHS.ts | 2 +- selfdrive/ui/translations/main_zh-CHT.ts | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index e3f3b36ff9..5aa33974ac 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -150,7 +150,7 @@ void TogglesPanel::updateToggles() { "Since the driving model decides the speed to drive, the set speed will only act as an upper bound. This is an alpha quality feature; " "mistakes should be expected.")) .arg(tr("New Driving Visualization")) - .arg(tr("The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. ")); + .arg(tr("The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner.")); const bool is_release = params.getBool("IsReleaseBranch"); auto cp_bytes = params.get("CarParamsPersistent"); diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 8a32b980f2..85b1fd040a 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -1179,7 +1179,7 @@ This may take up to a minute. يوصى بالمعيار. في الوضع العدواني، سيتبع الطيار المفتوح السيارات الرائدة بشكل أقرب ويكون أكثر عدوانية مع البنزين والفرامل. في الوضع المريح، سيبقى openpilot بعيدًا عن السيارات الرائدة. في السيارات المدعومة، يمكنك التنقل بين هذه الشخصيات باستخدام زر مسافة عجلة القيادة. - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index 6f64ef3211..4154c47abb 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -1165,7 +1165,7 @@ This may take up to a minute. - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index 2643da56ff..0736e161a8 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -1163,7 +1163,7 @@ Cela peut prendre jusqu'à une minute. - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. La visualisation de la conduite passera sur la caméra grand angle dirigée vers la route à faible vitesse afin de mieux montrer certains virages. Le logo du mode expérimental s'affichera également dans le coin supérieur droit. diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 5fb4a3b1c2..0bfca5e826 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -1157,7 +1157,7 @@ This may take up to a minute. - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index d8006a0f58..639371d135 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -1159,7 +1159,7 @@ This may take up to a minute. 표준 모드를 권장합니다. 공격적 모드의 openpilot은 선두 차량을 더 가까이 따라가고 가감속제어를 사용하여 더욱 공격적으로 움직입니다. 편안한 모드의 openpilot은 선두 차량으로부터 더 멀리 떨어져 있습니다. 지원되는 차량에서는 스티어링 휠 거리 버튼을 사용하여 이러한 특성을 순환할 수 있습니다. - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index cd0e2eefa8..2706166b47 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -1163,7 +1163,7 @@ Isso pode levar até um minuto. Neutro é o recomendado. No modo disputa o openpilot seguirá o carro da frente mais de perto e será mais agressivo com a aceleração e frenagem. No modo calmo o openpilot se manterá mais longe do carro da frente. Em carros compatíveis, você pode alternar esses temperamentos com o botão de distância do volante. - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. A visualização de condução fará a transição para a câmera grande angular voltada para a estrada em baixas velocidades para mostrar melhor algumas curvas. O logotipo do modo Experimental também será mostrado no canto superior direito. diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index 447bad4652..b196e0459a 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -1159,7 +1159,7 @@ This may take up to a minute. แนะนำให้ใช้แบบมาตรฐาน ในโหมดดุดัน openpilot จะตามรถคันหน้าใกล้ขึ้นและเร่งและเบรคแบบดุดันมากขึ้น ในโหมดผ่อนคลาย openpilot จะอยู่ห่างจากรถคันหน้ามากขึ้น ในรถรุ่นที่รองรับคุณสามารถเปลี่ยนบุคลิกไปแบบต่าง ๆ โดยใช้ปุ่มปรับระยะห่างบนพวงมาลัย - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. การแสดงภาพการขับขี่จะเปลี่ยนไปใช้กล้องมุมกว้างที่หันหน้าไปทางถนนเมื่ออยู่ในความเร็วต่ำ เพื่อแสดงภาพการเลี้ยวที่ดีขึ้น โลโก้โหมดการทดลองจะแสดงที่มุมบนขวาด้วย diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index 16e4504343..4b51ce9b42 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -1157,7 +1157,7 @@ This may take up to a minute. - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 938915b305..3e2a041758 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -1159,7 +1159,7 @@ This may take up to a minute. - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 98602b81d1..c12b2c5fdd 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -1159,7 +1159,7 @@ This may take up to a minute. - The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. From f12c4d825187769d60de2c342dd8e4780b690393 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 16 Apr 2024 12:51:44 -0700 Subject: [PATCH 280/384] jenkins: remove pollSCM (#32220) * try * master --- Jenkinsfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index bbd51b8bfd..6cffc95c09 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -226,8 +226,7 @@ node { if (env.BRANCH_NAME == nightlyBranch) { props.add(pipelineTriggers([ - pollSCM('* * * * *'), // every commit - cron('0 2 * * *') // and at 2am every night + cron('0 2 * * *') // at 2am every night ])) } From 713b7e90c269a0262e19ad14f848e83ed59444cf Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 16 Apr 2024 15:54:58 -0700 Subject: [PATCH 281/384] pandad: reconnect after reset (#32223) --- selfdrive/boardd/pandad.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/boardd/pandad.py b/selfdrive/boardd/pandad.py index 27104255a0..b4ac2d9548 100755 --- a/selfdrive/boardd/pandad.py +++ b/selfdrive/boardd/pandad.py @@ -139,7 +139,7 @@ def main() -> NoReturn: if first_run: # reset panda to ensure we're in a good state cloudlog.info(f"Resetting panda {panda.get_usb_serial()}") - panda.reset(reconnect=False) + panda.reset(reconnect=True) for p in pandas: p.close() From f072b7b8a0ca7220b4a6a99edd6e472cb6282b78 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 16 Apr 2024 16:10:03 -0700 Subject: [PATCH 282/384] fix concurrent build cancellation (#32224) fix concurrent builds --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6cffc95c09..043a2fbce3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -230,7 +230,7 @@ node { ])) } - if (env.branch != "master") { + if (env.BRANCH_NAME != "master") { props.add(disableConcurrentBuilds(abortPrevious: true)) } From 843e9de6cf35764dfae917c5014ceaf96bc97e0f Mon Sep 17 00:00:00 2001 From: commaci-public <60409688+commaci-public@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:28:05 -0700 Subject: [PATCH 283/384] [bot] Bump submodules (#32226) bump submodules Co-authored-by: adeebshihadeh --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 18f0bdff4b..2eb8578196 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 18f0bdff4bfb178c5cb5613fe91f0bb424791a93 +Subproject commit 2eb85781960ec4e69019222d8eea658f9e63d4c1 From c8f729761eab9a306788094611467248fcb8c822 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 16 Apr 2024 17:40:53 -0700 Subject: [PATCH 284/384] devcontainer: passthrough .azure (#32228) azure --- .devcontainer/devcontainer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0f1c4baf99..7174ee2800 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -17,6 +17,7 @@ "--volume=/tmp/.X11-unix:/tmp/.X11-unix", "--volume=${localWorkspaceFolder}/.devcontainer/.host/.Xauthority:/home/batman/.Xauthority", "--volume=${localEnv:HOME}/.comma:/home/batman/.comma", + "--volume=${localEnv:HOME}/.azure:/home/batman/.azure", "--volume=/tmp/comma_download_cache:/tmp/comma_download_cache", "--shm-size=1G", "--add-host=host.docker.internal:host-gateway", // required to use host.docker.internal on linux From 4a9f3a4f2738ab82eec246903f7f766a68b06d59 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 16 Apr 2024 19:12:30 -0700 Subject: [PATCH 285/384] [bot] Fingerprints: add missing FW versions from new users (#32221) Export fingerprints --- selfdrive/car/hyundai/fingerprints.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 574f79906b..72c435e550 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -192,6 +192,7 @@ FW_VERSIONS = { b'\xf1\x00DN ESC \x06 104\x19\x08\x01 58910-L0100', b'\xf1\x00DN ESC \x06 106 \x07\x01 58910-L0100', b'\xf1\x00DN ESC \x06 107 \x07\x03 58910-L1300', + b'\xf1\x00DN ESC \x06 107"\x08\x07 58910-L0100', b'\xf1\x00DN ESC \x07 104\x19\x08\x01 58910-L0100', b'\xf1\x00DN ESC \x07 106 \x07\x01 58910-L0100', b'\xf1\x00DN ESC \x07 107"\x08\x07 58910-L0100', @@ -280,10 +281,12 @@ FW_VERSIONS = { CAR.HYUNDAI_SANTA_FE_2022: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00TM__ SCC F-CUP 1.00 1.00 99110-S1500 ', + b'\xf1\x00TM__ SCC F-CUP 1.00 1.01 99110-S1500 ', b'\xf1\x00TM__ SCC FHCUP 1.00 1.00 99110-S1500 ', ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00TM ESC \x01 102!\x04\x03 58910-S2DA0', + b'\xf1\x00TM ESC \x01 104"\x10\x07 58910-S2DA0', b'\xf1\x00TM ESC \x02 101 \x08\x04 58910-S2GA0', b'\xf1\x00TM ESC \x02 103"\x07\x08 58910-S2GA0', b'\xf1\x00TM ESC \x03 101 \x08\x02 58910-S2DA0', @@ -341,6 +344,7 @@ FW_VERSIONS = { ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00TMP MFC AT USA LHD 1.00 1.03 99211-S1500 210224', + b'\xf1\x00TMP MFC AT USA LHD 1.00 1.05 99211-S1500 220126', b'\xf1\x00TMP MFC AT USA LHD 1.00 1.06 99211-S1500 220727', ], }, @@ -436,6 +440,7 @@ FW_VERSIONS = { b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-S8020 4LXDC103', b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-XX000 4LXDC103', b'\xf1\x00LX2 MDPS C 1.00 1.04 56310-S8020 4LXDC104', + b'\xf1\x00LX2 MDPS C 1.00 1.04 56310-S8420 4LXDC104', b'\xf1\x00LX2 MDPS R 1.00 1.02 56370-S8300 9318', b'\xf1\x00ON MDPS C 1.00 1.00 56340-S9000 8B13', b'\xf1\x00ON MDPS C 1.00 1.01 56340-S9000 9201', @@ -884,6 +889,7 @@ FW_VERSIONS = { (Ecu.eps, 0x7d4, None): [ b'\xf1\x00CN7 MDPS C 1.00 1.02 56310/BY050 4CNHC102', b'\xf1\x00CN7 MDPS C 1.00 1.03 56310/BY050 4CNHC103', + b'\xf1\x00CN7 MDPS C 1.00 1.03 56310BY050\x00 4CNHC103', b'\xf1\x00CN7 MDPS C 1.00 1.03 56310BY0500 4CNHC103', b'\xf1\x00CN7 MDPS C 1.00 1.04 56310BY050\x00 4CNHC104', ], From 119e2847581fd5b1ec0a15109f592d884745cb4c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 16 Apr 2024 21:19:57 -0700 Subject: [PATCH 286/384] Honda HR-V 3G: add missing camera ECU (#32230) * add from 320098ff6c5e4730/2023-04-13--17-47-46 * from a3af9bb0ea9298f4/2024-04-07--10-35-20 * Revert "from a3af9bb0ea9298f4/2024-04-07--10-35-20" This reverts commit 1bbfa8805891d072986e741296ff2248ab249f23. * add from 5d8793699017d179/2024-04-16--16-21-14 Honda HR-V 2023 EX-L Mexico plant, US market * this is that unknown response * and this is the unknown addr from the og user * clean up * consistent order * update pattern --- selfdrive/car/honda/fingerprints.py | 4 ++++ selfdrive/car/honda/tests/test_honda.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 18fe69dd1f..e7d325ca18 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -1021,6 +1021,10 @@ FW_VERSIONS = { (Ecu.srs, 0x18da53f1, None): [ b'77959-3V0-A820\x00\x00', ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S102-3W0-A060\x00\x00', + b'8S102-3W0-AB10\x00\x00', + ], (Ecu.vsa, 0x18da28f1, None): [ b'57114-3W0-A040\x00\x00', ], diff --git a/selfdrive/car/honda/tests/test_honda.py b/selfdrive/car/honda/tests/test_honda.py index 4e3f9182ea..60d91b84a8 100755 --- a/selfdrive/car/honda/tests/test_honda.py +++ b/selfdrive/car/honda/tests/test_honda.py @@ -4,7 +4,7 @@ import unittest from openpilot.selfdrive.car.honda.fingerprints import FW_VERSIONS -HONDA_FW_VERSION_RE = br"\d{5}-[A-Z0-9]{3}(-|,)[A-Z0-9]{4}(\x00){2}$" +HONDA_FW_VERSION_RE = br"[A-Z0-9]{5}-[A-Z0-9]{3}(-|,)[A-Z0-9]{4}(\x00){2}$" class TestHondaFingerprint(unittest.TestCase): From a076c1e78f54ed78666ed2fea6f8443f51b45a95 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 16 Apr 2024 21:49:30 -0700 Subject: [PATCH 287/384] FwQueryConfig: test non-essential ecus aren't needless (#32232) * good test * remove :D * typo --- selfdrive/car/honda/values.py | 12 ------------ selfdrive/car/tests/test_fw_fingerprint.py | 10 +++++++++- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 79a76ee2ac..3db8b6435f 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -300,21 +300,9 @@ FW_QUERY_CONFIG = FwQueryConfig( # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present non_essential_ecus={ - Ecu.programmedFuelInjection: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, - CAR.HONDA_PILOT], - Ecu.transmission: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, CAR.HONDA_PILOT], - Ecu.srs: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E], Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E], Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT], - Ecu.gateway: [CAR.ACURA_ILX, CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_FIT, - CAR.HONDA_FREED, CAR.HONDA_HRV, CAR.HONDA_RIDGELINE, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, - CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_PILOT], - Ecu.electricBrakeBooster: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G], - # existence correlates with transmission type for Accord ICE - Ecu.shiftByWire: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_PILOT], - # existence correlates with trim level - Ecu.hud: [CAR.HONDA_ACCORD], }, extra_ecus=[ (Ecu.combinationMeter, 0x18da60f1, None), diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 96e81272e4..18868c3e41 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -9,7 +9,7 @@ from unittest import mock from cereal import car from openpilot.selfdrive.car.car_helpers import interfaces from openpilot.selfdrive.car.fingerprints import FW_VERSIONS -from openpilot.selfdrive.car.fw_versions import FW_QUERY_CONFIGS, FUZZY_EXCLUDE_ECUS, VERSIONS, build_fw_dict, \ +from openpilot.selfdrive.car.fw_versions import ESSENTIAL_ECUS, FW_QUERY_CONFIGS, FUZZY_EXCLUDE_ECUS, VERSIONS, build_fw_dict, \ match_fw_to_car, get_brand_ecu_matches, get_fw_versions, get_present_ecus from openpilot.selfdrive.car.vin import get_vin @@ -146,6 +146,14 @@ class TestFwFingerprint(unittest.TestCase): for ecu in ecus.keys(): self.assertNotEqual(ecu[0], Ecu.transmission, f"{car_model}: Blacklisted ecu: (Ecu.{ECU_NAME[ecu[0]]}, {hex(ecu[1])})") + def test_non_essential_ecus(self): + for brand, config in FW_QUERY_CONFIGS.items(): + with self.subTest(brand): + # These ECUs are already not in ESSENTIAL_ECUS which the fingerprint functions give a pass if missing + unnecessary_non_essential_ecus = set(config.non_essential_ecus) - set(ESSENTIAL_ECUS) + self.assertEqual(unnecessary_non_essential_ecus, set(), "Declaring non-essential ECUs non-essential is not required: " + + f"{', '.join([f'Ecu.{ECU_NAME[ecu]}' for ecu in unnecessary_non_essential_ecus])}") + def test_missing_versions_and_configs(self): brand_versions = set(VERSIONS.keys()) brand_configs = set(FW_QUERY_CONFIGS.keys()) From 3d44edb3480f24067e93941a14450de53bcc041f Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 16 Apr 2024 21:52:14 -0700 Subject: [PATCH 288/384] Honda HR-V 3G: allow fingerprinting without the comma power (#32231) * from 147613502316e718/00000001--ce406cf8a7 * honda hrv 3g obd-less * rm * good test * add back --- selfdrive/car/honda/values.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 3db8b6435f..ecb00d0a3c 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -300,9 +300,9 @@ FW_QUERY_CONFIG = FwQueryConfig( # We lose these ECUs without the comma power on these cars. # Note that we still attempt to match with them when they are present non_essential_ecus={ - Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E], + Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E, CAR.HONDA_HRV_3G], Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, - CAR.HONDA_E, CAR.HONDA_INSIGHT], + CAR.HONDA_E, CAR.HONDA_HRV_3G, CAR.HONDA_INSIGHT], }, extra_ecus=[ (Ecu.combinationMeter, 0x18da60f1, None), From db5eb58d914aed9ad35bbef21f76bea0a636c37c Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Wed, 17 Apr 2024 02:08:28 -0300 Subject: [PATCH 289/384] Honda: Brazilian HR-V 2023 fingerprint (#31503) * add braziliam honda HR-V fingerprint * cleanup white spaces * cleanup more white spaces * remove radar * add fwdRadar (camera) * format --------- Co-authored-by: Shane Smiskol --- selfdrive/car/honda/fingerprints.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index e7d325ca18..09caf71931 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -1013,26 +1013,33 @@ FW_VERSIONS = { }, CAR.HONDA_HRV_3G: { (Ecu.eps, 0x18da30f1, None): [ + b'39990-3M0-G110\x00\x00', b'39990-3W0-A030\x00\x00', ], (Ecu.gateway, 0x18daeff1, None): [ + b'38897-3M0-M110\x00\x00', b'38897-3W1-A010\x00\x00', ], (Ecu.srs, 0x18da53f1, None): [ + b'77959-3M0-K840\x00\x00', b'77959-3V0-A820\x00\x00', ], (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S102-3M6-P030\x00\x00', b'8S102-3W0-A060\x00\x00', b'8S102-3W0-AB10\x00\x00', ], (Ecu.vsa, 0x18da28f1, None): [ + b'57114-3M6-M010\x00\x00', b'57114-3W0-A040\x00\x00', ], (Ecu.transmission, 0x18da1ef1, None): [ b'28101-6EH-A010\x00\x00', + b'28101-6JC-M310\x00\x00', ], (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-6CT-A710\x00\x00', + b'37805-6HZ-M630\x00\x00', ], (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ b'46114-3W0-A020\x00\x00', From 2bee28938ac2f50ec0d0e9f74f9f276a98c62f0d Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 17 Apr 2024 13:23:54 +0800 Subject: [PATCH 290/384] ui/map_eta: avoid divide by zero (#31962) --- selfdrive/ui/qt/maps/map_eta.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/selfdrive/ui/qt/maps/map_eta.cc b/selfdrive/ui/qt/maps/map_eta.cc index 161844c618..0eb77e36ce 100644 --- a/selfdrive/ui/qt/maps/map_eta.cc +++ b/selfdrive/ui/qt/maps/map_eta.cc @@ -38,10 +38,13 @@ void MapETA::updateETA(float s, float s_typical, float d) { auto remaining = s < 3600 ? std::pair{QString::number(int(s / 60)), tr("min")} : std::pair{QString("%1:%2").arg((int)s / 3600).arg(((int)s % 3600) / 60, 2, 10, QLatin1Char('0')), tr("hr")}; QString color = "#25DA6E"; - if (s / s_typical > 1.5) - color = "#DA3025"; - else if (s / s_typical > 1.2) - color = "#DAA725"; + if (std::abs(s_typical) > 1e-5) { + if (s / s_typical > 1.5) { + color = "#DA3025"; + } else if (s / s_typical > 1.2) { + color = "#DAA725"; + } + } // Distance auto distance = map_format_distance(d, uiState()->scene.is_metric); From 6de5e0d71a60d307513b3eb3cfdadcb8f8ae145c Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 17 Apr 2024 13:25:17 +0800 Subject: [PATCH 291/384] ui/network: simplify getActiveConnections (#32174) --- selfdrive/ui/qt/network/wifi_manager.cc | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/selfdrive/ui/qt/network/wifi_manager.cc b/selfdrive/ui/qt/network/wifi_manager.cc index cb7cccd194..0c50d02f4f 100644 --- a/selfdrive/ui/qt/network/wifi_manager.cc +++ b/selfdrive/ui/qt/network/wifi_manager.cc @@ -210,16 +210,8 @@ void WifiManager::deactivateConnection(const QDBusObjectPath &path) { } QVector WifiManager::getActiveConnections() { - QVector conns; - QDBusObjectPath path; - const QDBusArgument &arr = call(NM_DBUS_PATH, NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE, "ActiveConnections"); - arr.beginArray(); - while (!arr.atEnd()) { - arr >> path; - conns.push_back(path); - } - arr.endArray(); - return conns; + auto result = call(NM_DBUS_PATH, NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE, "ActiveConnections"); + return qdbus_cast>(result); } bool WifiManager::isKnownConnection(const QString &ssid) { From 3d0f9fb18f52ce092a2eb00cb92f7c285bc56e89 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 16 Apr 2024 23:37:46 -0700 Subject: [PATCH 292/384] Platforms: less redundant string repr (#32233) smol --- selfdrive/car/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 3898d46534..bbdae4f3d4 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -266,6 +266,9 @@ class Platforms(str, ReprEnum, metaclass=PlatformsType): member._value_ = platform_config.platform_str return member + def __repr__(self): + return f"<{self.__class__.__name__}.{self.name}>" + @classmethod def create_dbc_map(cls) -> dict[str, DbcDict]: return {p: p.config.dbc_dict for p in cls} From 5d0dc2ded27886b2edfd57391a54fc5f2ce0ff20 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 17 Apr 2024 00:09:20 -0700 Subject: [PATCH 293/384] Toyota: remove unecessary ECUs for fingerprinting (#32235) * remove some ecus * missing doc * fix * fix * clean up * update refs * rm --- selfdrive/car/tests/test_fw_fingerprint.py | 6 ++--- selfdrive/car/toyota/values.py | 28 +++++++++------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 18868c3e41..ed5edbef31 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -245,7 +245,7 @@ class TestFwFingerprintTiming(unittest.TestCase): def test_startup_timing(self): # Tests worse-case VIN query time and typical present ECU query time vin_ref_times = {'worst': 1.4, 'best': 0.7} # best assumes we go through all queries to get a match - present_ecu_ref_time = 0.75 + present_ecu_ref_time = 0.45 def fake_get_ecu_addrs(*_, timeout): self.total_time += timeout @@ -271,7 +271,7 @@ class TestFwFingerprintTiming(unittest.TestCase): print(f'get_vin {name} case, query time={self.total_time / self.N} seconds') def test_fw_query_timing(self): - total_ref_time = {1: 8.1, 2: 8.7} + total_ref_time = {1: 7.2, 2: 7.8} brand_ref_times = { 1: { 'gm': 1.0, @@ -284,7 +284,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'nissan': 0.8, 'subaru': 0.65, 'tesla': 0.3, - 'toyota': 1.6, + 'toyota': 0.7, 'volkswagen': 0.65, }, 2: { diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 4f6fdef1ba..dbab2e9255 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -494,22 +494,20 @@ FW_QUERY_CONFIG = FwQueryConfig( Request( [StdQueries.SHORT_TESTER_PRESENT_REQUEST, TOYOTA_VERSION_REQUEST_KWP], [StdQueries.SHORT_TESTER_PRESENT_RESPONSE, TOYOTA_VERSION_RESPONSE_KWP], - whitelist_ecus=[Ecu.fwdCamera, Ecu.fwdRadar, Ecu.dsu, Ecu.abs, Ecu.eps, Ecu.epb, Ecu.telematics, - Ecu.srs, Ecu.combinationMeter, Ecu.transmission, Ecu.gateway, Ecu.hvac], + whitelist_ecus=[Ecu.fwdCamera, Ecu.fwdRadar, Ecu.dsu, Ecu.abs, Ecu.eps, Ecu.srs, Ecu.transmission, Ecu.hvac], bus=0, ), Request( [StdQueries.SHORT_TESTER_PRESENT_REQUEST, StdQueries.OBD_VERSION_REQUEST], [StdQueries.SHORT_TESTER_PRESENT_RESPONSE, StdQueries.OBD_VERSION_RESPONSE], - whitelist_ecus=[Ecu.engine, Ecu.epb, Ecu.telematics, Ecu.hybrid, Ecu.srs, Ecu.combinationMeter, Ecu.transmission, - Ecu.gateway, Ecu.hvac], + whitelist_ecus=[Ecu.engine, Ecu.hybrid, Ecu.srs, Ecu.transmission, Ecu.hvac], bus=0, ), Request( [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.DEFAULT_DIAGNOSTIC_REQUEST, StdQueries.EXTENDED_DIAGNOSTIC_REQUEST, StdQueries.UDS_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.DEFAULT_DIAGNOSTIC_RESPONSE, StdQueries.EXTENDED_DIAGNOSTIC_RESPONSE, StdQueries.UDS_VERSION_RESPONSE], - whitelist_ecus=[Ecu.engine, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.abs, Ecu.eps, Ecu.epb, Ecu.telematics, - Ecu.hybrid, Ecu.srs, Ecu.combinationMeter, Ecu.transmission, Ecu.gateway, Ecu.hvac], + whitelist_ecus=[Ecu.engine, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.abs, Ecu.eps, + Ecu.hybrid, Ecu.srs, Ecu.transmission, Ecu.hvac], bus=0, ), ], @@ -523,33 +521,29 @@ FW_QUERY_CONFIG = FwQueryConfig( extra_ecus=[ # All known ECUs on a late-model Toyota vehicle not queried here: # Responds to UDS: + # - Combination Meter (0x7c0) # - HV Battery (0x713, 0x747) # - Motor Generator (0x716, 0x724) # - 2nd ABS "Brake/EPB" (0x730) + # - Electronic Parking Brake ((0x750, 0x2c)) + # - Telematics ((0x750, 0xc7)) # Responds to KWP (0x1a8801): # - Steering Angle Sensor (0x7b3) # - EPS/EMPS (0x7a0, 0x7a1) + # - 2nd SRS Airbag (0x784) + # - Central Gateway ((0x750, 0x5f)) + # - Telematics ((0x750, 0xc7)) # Responds to KWP (0x1a8881): # - Body Control Module ((0x750, 0x40)) + # - Telematics ((0x750, 0xc7)) # Hybrid control computer can be on 0x7e2 (KWP) or 0x7d2 (UDS) depending on platform (Ecu.hybrid, 0x7e2, None), # Hybrid Control Assembly & Computer - # TODO: if these duplicate ECUs always exist together, remove one (Ecu.srs, 0x780, None), # SRS Airbag - (Ecu.srs, 0x784, None), # SRS Airbag 2 - # Likely only exists on cars where EPB isn't standard (e.g. Camry, Avalon (/Hybrid)) - # On some cars, EPB is controlled by the ABS module - (Ecu.epb, 0x750, 0x2c), # Electronic Parking Brake - # This isn't accessible on all cars - (Ecu.gateway, 0x750, 0x5f), - # On some cars, this only responds to b'\x1a\x88\x81', which is reflected by the b'\x1a\x88\x00' query - (Ecu.telematics, 0x750, 0xc7), # Transmission is combined with engine on some platforms, such as TSS-P RAV4 (Ecu.transmission, 0x701, None), # A few platforms have a tester present response on this address, add to log (Ecu.transmission, 0x7e1, None), - # On some cars, this only responds to b'\x1a\x88\x80' - (Ecu.combinationMeter, 0x7c0, None), (Ecu.hvac, 0x7c4, None), ], match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, From 8124ba5f63ff8275424a2b7aafe09768c5ed26a2 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 18 Apr 2024 01:05:32 +0800 Subject: [PATCH 294/384] replay/framereader: no longer cache all AVPacket instances in memory (#32236) --- tools/replay/framereader.cc | 139 +++++++++++------------------------- tools/replay/framereader.h | 15 ++-- 2 files changed, 50 insertions(+), 104 deletions(-) diff --git a/tools/replay/framereader.cc b/tools/replay/framereader.cc index 303f0c60ca..fb70a82c40 100644 --- a/tools/replay/framereader.cc +++ b/tools/replay/framereader.cc @@ -1,9 +1,8 @@ #include "tools/replay/framereader.h" -#include "tools/replay/util.h" -#include -#include +#include "common/util.h" #include "third_party/libyuv/include/libyuv.h" +#include "tools/replay/util.h" #ifdef __APPLE__ #define HW_DEVICE_TYPE AV_HWDEVICE_TYPE_VIDEOTOOLBOX @@ -13,24 +12,8 @@ #define HW_PIX_FMT AV_PIX_FMT_CUDA #endif -namespace { -struct buffer_data { - const uint8_t *data; - int64_t offset; - size_t size; -}; - -int readPacket(void *opaque, uint8_t *buf, int buf_size) { - struct buffer_data *bd = (struct buffer_data *)opaque; - assert(bd->offset <= bd->size); - buf_size = std::min((size_t)buf_size, (size_t)(bd->size - bd->offset)); - if (!buf_size) return AVERROR_EOF; - - memcpy(buf, bd->data + bd->offset, buf_size); - bd->offset += buf_size; - return buf_size; -} +namespace { enum AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts) { enum AVPixelFormat *hw_pix_fmt = reinterpret_cast(ctx->opaque); @@ -50,101 +33,61 @@ FrameReader::FrameReader() { } FrameReader::~FrameReader() { - for (AVPacket *pkt : packets) { - av_packet_free(&pkt); - } - if (decoder_ctx) avcodec_free_context(&decoder_ctx); if (input_ctx) avformat_close_input(&input_ctx); if (hw_device_ctx) av_buffer_unref(&hw_device_ctx); - - if (avio_ctx_) { - av_freep(&avio_ctx_->buffer); - avio_context_free(&avio_ctx_); - } } bool FrameReader::load(const std::string &url, bool no_hw_decoder, std::atomic *abort, bool local_cache, int chunk_size, int retries) { - FileReader f(local_cache, chunk_size, retries); - std::string data = f.read(url, abort); - if (data.empty()) { - rWarning("URL %s returned no data", url.c_str()); - return false; + auto local_file_path = url.find("https://") == 0 ? cacheFilePath(url) : url; + if (!util::file_exists(local_file_path)) { + FileReader f(local_cache, chunk_size, retries); + if (f.read(url, abort).empty()) { + return false; + } } - - return load((std::byte *)data.data(), data.size(), no_hw_decoder, abort); + return loadFromFile(local_file_path, no_hw_decoder, abort); } -bool FrameReader::load(const std::byte *data, size_t size, bool no_hw_decoder, std::atomic *abort) { - input_ctx = avformat_alloc_context(); - if (!input_ctx) { - rError("Error calling avformat_alloc_context"); +bool FrameReader::loadFromFile(const std::string &file, bool no_hw_decoder, std::atomic *abort) { + if (avformat_open_input(&input_ctx, file.c_str(), nullptr, nullptr) != 0 || + avformat_find_stream_info(input_ctx, nullptr) < 0) { + rError("Failed to open input file or find video stream"); return false; } - - struct buffer_data bd = { - .data = (const uint8_t*)data, - .offset = 0, - .size = size, - }; - const int avio_ctx_buffer_size = 64 * 1024; - unsigned char *avio_ctx_buffer = (unsigned char *)av_malloc(avio_ctx_buffer_size); - avio_ctx_ = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size, 0, &bd, readPacket, nullptr, nullptr); - input_ctx->pb = avio_ctx_; - input_ctx->probesize = 10 * 1024 * 1024; // 10MB - int ret = avformat_open_input(&input_ctx, nullptr, nullptr, nullptr); - if (ret != 0) { - char err_str[1024] = {0}; - av_strerror(ret, err_str, std::size(err_str)); - rError("Error loading video - %s", err_str); - return false; - } - - ret = avformat_find_stream_info(input_ctx, nullptr); - if (ret < 0) { - rError("cannot find a video stream in the input file"); - return false; - } AVStream *video = input_ctx->streams[0]; const AVCodec *decoder = avcodec_find_decoder(video->codecpar->codec_id); if (!decoder) return false; decoder_ctx = avcodec_alloc_context3(decoder); - ret = avcodec_parameters_to_context(decoder_ctx, video->codecpar); - if (ret != 0) return false; + if (!decoder_ctx || avcodec_parameters_to_context(decoder_ctx, video->codecpar) != 0) { + rError("Failed to allocate or initialize codec context"); + return false; + } width = (decoder_ctx->width + 3) & ~3; height = decoder_ctx->height; - if (has_hw_decoder && !no_hw_decoder) { - if (!initHardwareDecoder(HW_DEVICE_TYPE)) { - rWarning("No device with hardware decoder found. fallback to CPU decoding."); - } + if (has_hw_decoder && !no_hw_decoder && !initHardwareDecoder(HW_DEVICE_TYPE)) { + rWarning("No device with hardware decoder found. fallback to CPU decoding."); } - ret = avcodec_open2(decoder_ctx, decoder, nullptr); - if (ret < 0) { - rError("avcodec_open2 failed %d", ret); + if (avcodec_open2(decoder_ctx, decoder, nullptr) < 0) { + rError("Failed to open codec"); return false; } - packets.reserve(60 * 20); // 20fps, one minute - while (!(abort && *abort)) { - AVPacket *pkt = av_packet_alloc(); - ret = av_read_frame(input_ctx, pkt); - if (ret < 0) { - av_packet_free(&pkt); - valid_ = (ret == AVERROR_EOF); - break; - } - packets.push_back(pkt); - // some stream seems to contain no keyframes - key_frames_count_ += pkt->flags & AV_PKT_FLAG_KEY; + AVPacket pkt; + packets_info.reserve(60 * 20); // 20fps, one minute + while (!(abort && *abort) && av_read_frame(input_ctx, &pkt) == 0) { + packets_info.emplace_back(PacketInfo{.flags = pkt.flags, .pos = pkt.pos}); + av_packet_unref(&pkt); } - valid_ = valid_ && !packets.empty(); - return valid_; + + avio_seek(input_ctx->pb, 0, SEEK_SET); + return !packets_info.empty(); } bool FrameReader::initHardwareDecoder(AVHWDeviceType hw_device_type) { @@ -176,8 +119,7 @@ bool FrameReader::initHardwareDecoder(AVHWDeviceType hw_device_type) { } bool FrameReader::get(int idx, VisionBuf *buf) { - assert(buf != nullptr); - if (!valid_ || idx < 0 || idx >= packets.size()) { + if (!buf || idx < 0 || idx >= packets_info.size()) { return false; } return decode(idx, buf); @@ -185,24 +127,30 @@ bool FrameReader::get(int idx, VisionBuf *buf) { bool FrameReader::decode(int idx, VisionBuf *buf) { int from_idx = idx; - if (idx != prev_idx + 1 && key_frames_count_ > 1) { + if (idx != prev_idx + 1) { // seeking to the nearest key frame for (int i = idx; i >= 0; --i) { - if (packets[i]->flags & AV_PKT_FLAG_KEY) { + if (packets_info[i].flags & AV_PKT_FLAG_KEY) { from_idx = i; break; } } + avio_seek(input_ctx->pb, packets_info[from_idx].pos, SEEK_SET); } prev_idx = idx; + bool result = false; + AVPacket pkt; for (int i = from_idx; i <= idx; ++i) { - AVFrame *f = decodeFrame(packets[i]); - if (f && i == idx) { - return copyBuffers(f, buf); + if (av_read_frame(input_ctx, &pkt) == 0) { + AVFrame *f = decodeFrame(&pkt); + if (f && i == idx) { + result = copyBuffers(f, buf); + } + av_packet_unref(&pkt); } } - return false; + return result; } AVFrame *FrameReader::decodeFrame(AVPacket *pkt) { @@ -232,7 +180,6 @@ AVFrame *FrameReader::decodeFrame(AVPacket *pkt) { } bool FrameReader::copyBuffers(AVFrame *f, VisionBuf *buf) { - assert(f != nullptr && buf != nullptr); if (hw_pix_fmt == HW_PIX_FMT) { for (int i = 0; i < height/2; i++) { memcpy(buf->y + (i*2 + 0)*buf->stride, f->data[0] + (i*2 + 0)*f->linesize[0], width); diff --git a/tools/replay/framereader.h b/tools/replay/framereader.h index bb72ac8f8d..a25b508cc7 100644 --- a/tools/replay/framereader.h +++ b/tools/replay/framereader.h @@ -22,11 +22,9 @@ public: ~FrameReader(); bool load(const std::string &url, bool no_hw_decoder = false, std::atomic *abort = nullptr, bool local_cache = false, int chunk_size = -1, int retries = 0); - bool load(const std::byte *data, size_t size, bool no_hw_decoder = false, std::atomic *abort = nullptr); + bool loadFromFile(const std::string &file, bool no_hw_decoder = false, std::atomic *abort = nullptr); bool get(int idx, VisionBuf *buf); - int getYUVSize() const { return width * height * 3 / 2; } - size_t getFrameCount() const { return packets.size(); } - bool valid() const { return valid_; } + size_t getFrameCount() const { return packets_info.size(); } int width = 0, height = 0; @@ -36,16 +34,17 @@ private: AVFrame * decodeFrame(AVPacket *pkt); bool copyBuffers(AVFrame *f, VisionBuf *buf); - std::vector packets; std::unique_ptrav_frame_, hw_frame; AVFormatContext *input_ctx = nullptr; AVCodecContext *decoder_ctx = nullptr; - int key_frames_count_ = 0; - bool valid_ = false; - AVIOContext *avio_ctx_ = nullptr; AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE; AVBufferRef *hw_device_ctx = nullptr; int prev_idx = -1; + struct PacketInfo { + int flags; + int64_t pos; + }; + std::vector packets_info; inline static std::atomic has_hw_decoder = true; }; From 046066032a548ea641101f3a2f79a0c60f36f6f1 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 17 Apr 2024 10:13:56 -0700 Subject: [PATCH 295/384] jenkins: nightly build in correct timezone (#32237) correct timezone --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 043a2fbce3..83bd9b5d8c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -226,7 +226,7 @@ node { if (env.BRANCH_NAME == nightlyBranch) { props.add(pipelineTriggers([ - cron('0 2 * * *') // at 2am every night + cron('0 9 * * *') // at 2am PST (9am UTC) every night ])) } From 1d05704d27dbe4f73c0eba7e8dad2ae84d4e205e Mon Sep 17 00:00:00 2001 From: ZwX1616 Date: Wed, 17 Apr 2024 12:56:37 -0700 Subject: [PATCH 296/384] Toggle to always enable DM (#32205) * permanent * param * correct behavior * toggle * need trans * ref_commit * translate for chs/t * disable on P and R * read --- common/params.cc | 1 + selfdrive/controls/lib/events.py | 12 ++++++------ selfdrive/monitoring/dmonitoringd.py | 8 ++++++-- selfdrive/monitoring/driver_monitor.py | 15 +++++++++++---- selfdrive/monitoring/test_monitoring.py | 2 +- selfdrive/test/process_replay/ref_commit | 2 +- selfdrive/ui/qt/offroad/settings.cc | 6 ++++++ selfdrive/ui/translations/main_ar.ts | 8 ++++++++ selfdrive/ui/translations/main_de.ts | 8 ++++++++ selfdrive/ui/translations/main_fr.ts | 8 ++++++++ selfdrive/ui/translations/main_ja.ts | 8 ++++++++ selfdrive/ui/translations/main_ko.ts | 8 ++++++++ selfdrive/ui/translations/main_pt-BR.ts | 8 ++++++++ selfdrive/ui/translations/main_th.ts | 8 ++++++++ selfdrive/ui/translations/main_tr.ts | 8 ++++++++ selfdrive/ui/translations/main_zh-CHS.ts | 8 ++++++++ selfdrive/ui/translations/main_zh-CHT.ts | 8 ++++++++ 17 files changed, 112 insertions(+), 14 deletions(-) diff --git a/common/params.cc b/common/params.cc index 8635f30d26..a00401d20a 100644 --- a/common/params.cc +++ b/common/params.cc @@ -89,6 +89,7 @@ private: std::unordered_map keys = { {"AccessToken", CLEAR_ON_MANAGER_START | DONT_LOG}, + {"AlwaysOnDM", PERSISTENT}, {"ApiCache_Device", PERSISTENT}, {"ApiCache_NavDestinations", PERSISTENT}, {"AssistNowToken", PERSISTENT}, diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index c6e9504f35..2de4d61d88 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -433,7 +433,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.preDriverDistracted: { - ET.WARNING: Alert( + ET.PERMANENT: Alert( "Pay Attention", "", AlertStatus.normal, AlertSize.small, @@ -441,7 +441,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.promptDriverDistracted: { - ET.WARNING: Alert( + ET.PERMANENT: Alert( "Pay Attention", "Driver Distracted", AlertStatus.userPrompt, AlertSize.mid, @@ -449,7 +449,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.driverDistracted: { - ET.WARNING: Alert( + ET.PERMANENT: Alert( "DISENGAGE IMMEDIATELY", "Driver Distracted", AlertStatus.critical, AlertSize.full, @@ -457,7 +457,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.preDriverUnresponsive: { - ET.WARNING: Alert( + ET.PERMANENT: Alert( "Touch Steering Wheel: No Face Detected", "", AlertStatus.normal, AlertSize.small, @@ -465,7 +465,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.promptDriverUnresponsive: { - ET.WARNING: Alert( + ET.PERMANENT: Alert( "Touch Steering Wheel", "Driver Unresponsive", AlertStatus.userPrompt, AlertSize.mid, @@ -473,7 +473,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.driverUnresponsive: { - ET.WARNING: Alert( + ET.PERMANENT: Alert( "DISENGAGE IMMEDIATELY", "Driver Unresponsive", AlertStatus.critical, AlertSize.full, diff --git a/selfdrive/monitoring/dmonitoringd.py b/selfdrive/monitoring/dmonitoringd.py index 579e79093f..84a147bd47 100755 --- a/selfdrive/monitoring/dmonitoringd.py +++ b/selfdrive/monitoring/dmonitoringd.py @@ -17,7 +17,7 @@ def dmonitoringd_thread(): pm = messaging.PubMaster(['driverMonitoringState']) sm = messaging.SubMaster(['driverStateV2', 'liveCalibration', 'carState', 'controlsState', 'modelV2'], poll='driverStateV2') - driver_status = DriverStatus(rhd_saved=params.get_bool("IsRhdDetected")) + driver_status = DriverStatus(rhd_saved=params.get_bool("IsRhdDetected"), always_on=params.get_bool("AlwaysOnDM")) v_cruise_last = 0 driver_engaged = False @@ -52,7 +52,8 @@ def dmonitoringd_thread(): events.add(car.CarEvent.EventName.tooDistracted) # Update events from driver state - driver_status.update_events(events, driver_engaged, sm['controlsState'].enabled, sm['carState'].standstill) + driver_status.update_events(events, driver_engaged, sm['controlsState'].enabled, + sm['carState'].standstill, sm['carState'].gearShifter in [car.CarState.GearShifter.reverse, car.CarState.GearShifter.park]) # build driverMonitoringState packet dat = messaging.new_message('driverMonitoringState', valid=sm.all_checks()) @@ -76,6 +77,9 @@ def dmonitoringd_thread(): } pm.send('driverMonitoringState', dat) + if sm['driverStateV2'].frameId % 40 == 1: + driver_status.always_on = params.get_bool("AlwaysOnDM") + # save rhd virtual toggle every 5 mins if (sm['driverStateV2'].frameId % 6000 == 0 and driver_status.wheelpos_learner.filtered_stat.n > driver_status.settings._WHEELPOS_FILTER_MIN_COUNT and diff --git a/selfdrive/monitoring/driver_monitor.py b/selfdrive/monitoring/driver_monitor.py index 7c1c297fff..749931af77 100644 --- a/selfdrive/monitoring/driver_monitor.py +++ b/selfdrive/monitoring/driver_monitor.py @@ -121,7 +121,7 @@ class DriverBlink(): self.right_blink = 0. class DriverStatus(): - def __init__(self, rhd_saved=False, settings=None): + def __init__(self, rhd_saved=False, settings=None, always_on=False): if settings is None: settings = DRIVER_MONITOR_SETTINGS() # init policy settings @@ -139,6 +139,7 @@ class DriverStatus(): self.ee1_calibrated = False self.ee2_calibrated = False + self.always_on = always_on self.awareness = 1. self.awareness_active = 1. self.awareness_passive = 1. @@ -301,8 +302,12 @@ class DriverStatus(): elif self.face_detected and self.pose.low_std: self.hi_stds = 0 - def update_events(self, events, driver_engaged, ctrl_active, standstill): - if (driver_engaged and self.awareness > 0 and not self.active_monitoring_mode) or not ctrl_active: # reset only when on disengagement if red reached + def update_events(self, events, driver_engaged, ctrl_active, standstill, wrong_gear): + always_on_valid = self.always_on and not wrong_gear + if (driver_engaged and self.awareness > 0 and not self.active_monitoring_mode) or \ + (not always_on_valid and not ctrl_active) or \ + (always_on_valid and not ctrl_active and self.awareness <= 0): + # always reset on disengage with normal mode; disengage resets only on red if always on self._reset_awareness() return @@ -323,11 +328,13 @@ class DriverStatus(): return standstill_exemption = standstill and self.awareness - self.step_change <= self.threshold_prompt + always_on_red_exemption = always_on_valid and not ctrl_active and self.awareness - self.step_change <= 0 certainly_distracted = self.driver_distraction_filter.x > 0.63 and self.driver_distracted and self.face_detected maybe_distracted = self.hi_stds > self.settings._HI_STD_FALLBACK_TIME or not self.face_detected if certainly_distracted or maybe_distracted: # should always be counting if distracted unless at standstill and reaching orange - if not standstill_exemption: + # also will not be reaching 0 if DM is active when not engaged + if not standstill_exemption and not always_on_red_exemption: self.awareness = max(self.awareness - self.step_change, -0.1) alert = None diff --git a/selfdrive/monitoring/test_monitoring.py b/selfdrive/monitoring/test_monitoring.py index c02d44849f..39fef75479 100755 --- a/selfdrive/monitoring/test_monitoring.py +++ b/selfdrive/monitoring/test_monitoring.py @@ -63,7 +63,7 @@ class TestMonitoring(unittest.TestCase): # cal_rpy and car_speed don't matter here # evaluate events at 10Hz for tests - DS.update_events(e, interaction[idx], engaged[idx], standstill[idx]) + DS.update_events(e, interaction[idx], engaged[idx], standstill[idx], 0) events.append(e) assert len(events) == len(msgs), f"got {len(events)} for {len(msgs)} driverState input msgs" return events, DS diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 1156aefeb2..a253da0258 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -28001018eae89eb4906717bebf892345ad590b5a +f759be555103697918d5d6c22292ef10536e68bd \ No newline at end of file diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 5aa33974ac..96fe6585cc 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -51,6 +51,12 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { tr("Receive alerts to steer back into the lane when your vehicle drifts over a detected lane line without a turn signal activated while driving over 31 mph (50 km/h)."), "../assets/offroad/icon_warning.png", }, + { + "AlwaysOnDM", + tr("Always-On Driver Monitoring"), + tr("Enable driver monitoring even when openpilot is not engaged."), + "../assets/offroad/icon_monitoring.png", + }, { "RecordFront", tr("Record and Upload Driver Camera"), diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 85b1fd040a..f00905b75b 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -1182,6 +1182,14 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Always-On Driver Monitoring + + + + Enable driver monitoring even when openpilot is not engaged. + + Updater diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index 4154c47abb..71d95244cb 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -1168,6 +1168,14 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Always-On Driver Monitoring + + + + Enable driver monitoring even when openpilot is not engaged. + + Updater diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index 0736e161a8..5da51d8b47 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -1166,6 +1166,14 @@ Cela peut prendre jusqu'à une minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. La visualisation de la conduite passera sur la caméra grand angle dirigée vers la route à faible vitesse afin de mieux montrer certains virages. Le logo du mode expérimental s'affichera également dans le coin supérieur droit. + + Always-On Driver Monitoring + + + + Enable driver monitoring even when openpilot is not engaged. + + Updater diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 0bfca5e826..7a27f46ea3 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -1160,6 +1160,14 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Always-On Driver Monitoring + + + + Enable driver monitoring even when openpilot is not engaged. + + Updater diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 639371d135..518bb4b58f 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -1162,6 +1162,14 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Always-On Driver Monitoring + + + + Enable driver monitoring even when openpilot is not engaged. + + Updater diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index 2706166b47..71f6a5caa6 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -1166,6 +1166,14 @@ Isso pode levar até um minuto. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. A visualização de condução fará a transição para a câmera grande angular voltada para a estrada em baixas velocidades para mostrar melhor algumas curvas. O logotipo do modo Experimental também será mostrado no canto superior direito. + + Always-On Driver Monitoring + + + + Enable driver monitoring even when openpilot is not engaged. + + Updater diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index b196e0459a..c8bf0d3ade 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -1162,6 +1162,14 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. การแสดงภาพการขับขี่จะเปลี่ยนไปใช้กล้องมุมกว้างที่หันหน้าไปทางถนนเมื่ออยู่ในความเร็วต่ำ เพื่อแสดงภาพการเลี้ยวที่ดีขึ้น โลโก้โหมดการทดลองจะแสดงที่มุมบนขวาด้วย + + Always-On Driver Monitoring + + + + Enable driver monitoring even when openpilot is not engaged. + + Updater diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index 4b51ce9b42..000fc1a2ec 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -1160,6 +1160,14 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Always-On Driver Monitoring + + + + Enable driver monitoring even when openpilot is not engaged. + + Updater diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 3e2a041758..3d9cf1c001 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -1162,6 +1162,14 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Always-On Driver Monitoring + 驾驶员监控常开 + + + Enable driver monitoring even when openpilot is not engaged. + 即使在openpilot未激活时也启用驾驶员监控。 + Updater diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index c12b2c5fdd..d9030b82ff 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -1162,6 +1162,14 @@ This may take up to a minute. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. + + Always-On Driver Monitoring + 駕駛監控常開 + + + Enable driver monitoring even when openpilot is not engaged. + 即使在openpilot未激活時也啟用駕駛監控。 + Updater From 3c69fcddc80327919b097c26a25017f8e11f28b0 Mon Sep 17 00:00:00 2001 From: ksfi Date: Wed, 17 Apr 2024 22:00:47 +0200 Subject: [PATCH 297/384] [$100 bounty] mapsd: switch to static render mode (#32118) * staticrender * modify static_render_sig_rec name + use back setStyleJson * better name --------- Co-authored-by: ksfi Co-authored-by: Adeeb Shihadeh --- selfdrive/navd/map_renderer.cc | 42 +++++++++++++---------- selfdrive/navd/map_renderer.h | 2 ++ selfdrive/navd/tests/test_map_renderer.py | 2 +- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/selfdrive/navd/map_renderer.cc b/selfdrive/navd/map_renderer.cc index d52ee162bd..1e57ad3e7c 100644 --- a/selfdrive/navd/map_renderer.cc +++ b/selfdrive/navd/map_renderer.cc @@ -41,6 +41,8 @@ MapRenderer::MapRenderer(const QMapLibre::Settings &settings, bool online) : m_s QSurfaceFormat fmt; fmt.setRenderableType(QSurfaceFormat::OpenGLES); + m_settings.setMapMode(QMapLibre::Settings::MapMode::Static); + ctx = std::make_unique(); ctx->setFormat(fmt); ctx->create(); @@ -87,6 +89,18 @@ MapRenderer::MapRenderer(const QMapLibre::Settings &settings, bool online) : m_s LOGE("Map loading failed with %d: '%s'\n", err_code, reason.toStdString().c_str()); }); + QObject::connect(m_map.data(), &QMapLibre::Map::staticRenderFinished, [=](const QString &error) { + rendering = false; + + if (!error.isEmpty()) { + LOGE("Static map rendering failed with error: '%s'\n", error.toStdString().c_str()); + } else if (vipc_server != nullptr) { + double end_render_t = millis_since_boot(); + publish((end_render_t - start_render_t) / 1000.0, true); + last_llk_rendered = (*sm)["liveLocationKalman"].getLogMonoTime(); + } + }); + if (online) { vipc_server.reset(new VisionIpcServer("navd")); vipc_server->create_buffers(VisionStreamType::VISION_STREAM_MAP, NUM_VIPC_BUFFERS, false, WIDTH, HEIGHT); @@ -114,22 +128,16 @@ void MapRenderer::msgUpdate() { float bearing = RAD2DEG(orientation.getValue()[2]); updatePosition(get_point_along_line(pos.getValue()[0], pos.getValue()[1], bearing, MAP_OFFSET), bearing); - // TODO: use the static rendering mode instead - // retry render a few times - for (int i = 0; i < 5 && !rendered(); i++) { - QApplication::processEvents(QEventLoop::AllEvents, 100); + if (!rendering) { update(); - if (rendered()) { - LOGW("rendered after %d retries", i+1); - break; - } } - // fallback to sending a blank frame if (!rendered()) { publish(0, false); } } + + } if (sm->updated("navRoute")) { @@ -157,7 +165,9 @@ void MapRenderer::updatePosition(QMapLibre::Coordinate position, float bearing) m_map->setCoordinate(position); m_map->setBearing(bearing); m_map->setZoom(zoom); - update(); + if (!rendering) { + update(); + } } bool MapRenderer::loaded() { @@ -165,16 +175,10 @@ bool MapRenderer::loaded() { } void MapRenderer::update() { - double start_t = millis_since_boot(); + rendering = true; gl_functions->glClear(GL_COLOR_BUFFER_BIT); - m_map->render(); - gl_functions->glFlush(); - double end_t = millis_since_boot(); - - if ((vipc_server != nullptr) && loaded()) { - publish((end_t - start_t) / 1000.0, true); - last_llk_rendered = (*sm)["liveLocationKalman"].getLogMonoTime(); - } + start_render_t = millis_since_boot(); + m_map->startStaticRender(); } void MapRenderer::sendThumbnail(const uint64_t ts, const kj::Array &buf) { diff --git a/selfdrive/navd/map_renderer.h b/selfdrive/navd/map_renderer.h index fd5922b668..7a3d2c316b 100644 --- a/selfdrive/navd/map_renderer.h +++ b/selfdrive/navd/map_renderer.h @@ -43,8 +43,10 @@ private: void initLayers(); + double start_render_t; uint32_t frame_id = 0; uint64_t last_llk_rendered = 0; + bool rendering = false; bool rendered() { return last_llk_rendered == (*sm)["liveLocationKalman"].getLogMonoTime(); } diff --git a/selfdrive/navd/tests/test_map_renderer.py b/selfdrive/navd/tests/test_map_renderer.py index 7d5a4c297f..832e0d1eab 100755 --- a/selfdrive/navd/tests/test_map_renderer.py +++ b/selfdrive/navd/tests/test_map_renderer.py @@ -136,7 +136,7 @@ class TestMapRenderer(unittest.TestCase): invalid_and_not_previously_valid = (expect_valid and not self.sm.valid['mapRenderState'] and not prev_valid) valid_and_not_previously_invalid = (not expect_valid and self.sm.valid['mapRenderState'] and prev_valid) - if (invalid_and_not_previously_valid or valid_and_not_previously_invalid) and frames_since_test_start < 5: + if (invalid_and_not_previously_valid or valid_and_not_previously_invalid) and frames_since_test_start < 20: continue # check output From 67d6f0b769dfb596eba9f0ab4a8a78dc5090eb72 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 17 Apr 2024 15:36:44 -0700 Subject: [PATCH 298/384] Revert "Honda: brazilian HR-V 2023 fingerprint" (#32240) Revert "Honda: Brazilian HR-V 2023 fingerprint (#31503)" This reverts commit db5eb58d914aed9ad35bbef21f76bea0a636c37c. --- selfdrive/car/honda/fingerprints.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 09caf71931..e7d325ca18 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -1013,33 +1013,26 @@ FW_VERSIONS = { }, CAR.HONDA_HRV_3G: { (Ecu.eps, 0x18da30f1, None): [ - b'39990-3M0-G110\x00\x00', b'39990-3W0-A030\x00\x00', ], (Ecu.gateway, 0x18daeff1, None): [ - b'38897-3M0-M110\x00\x00', b'38897-3W1-A010\x00\x00', ], (Ecu.srs, 0x18da53f1, None): [ - b'77959-3M0-K840\x00\x00', b'77959-3V0-A820\x00\x00', ], (Ecu.fwdRadar, 0x18dab0f1, None): [ - b'8S102-3M6-P030\x00\x00', b'8S102-3W0-A060\x00\x00', b'8S102-3W0-AB10\x00\x00', ], (Ecu.vsa, 0x18da28f1, None): [ - b'57114-3M6-M010\x00\x00', b'57114-3W0-A040\x00\x00', ], (Ecu.transmission, 0x18da1ef1, None): [ b'28101-6EH-A010\x00\x00', - b'28101-6JC-M310\x00\x00', ], (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-6CT-A710\x00\x00', - b'37805-6HZ-M630\x00\x00', ], (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ b'46114-3W0-A020\x00\x00', From cb8e336cd771f933c41d6ce4ee5bf055dde94846 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 17 Apr 2024 15:38:05 -0700 Subject: [PATCH 299/384] debug FW query offline: annotate sendcan/can (#32239) bet --- selfdrive/debug/debug_fw_fingerprinting_offline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/debug/debug_fw_fingerprinting_offline.py b/selfdrive/debug/debug_fw_fingerprinting_offline.py index d521ab2e18..8ae9d6d347 100755 --- a/selfdrive/debug/debug_fw_fingerprinting_offline.py +++ b/selfdrive/debug/debug_fw_fingerprinting_offline.py @@ -13,7 +13,7 @@ def main(route: str, addrs: list[int]): - print as fixed width table, easier to read """ - lr = LogReader(route, default_mode=ReadMode.RLOG) + lr = LogReader(route, default_mode=ReadMode.RLOG, sort_by_time=True) start_mono_time = None prev_mono_time = 0 @@ -32,7 +32,7 @@ def main(route: str, addrs: list[int]): if msg.logMonoTime != prev_mono_time: print() prev_mono_time = msg.logMonoTime - print(f"{msg.logMonoTime} rxaddr={can.address}, bus={can.src}, {round((msg.logMonoTime - start_mono_time) * 1e-6, 2)} ms, " + + print(f"{msg.which():>7}: rxaddr={can.address}, bus={can.src}, {round((msg.logMonoTime - start_mono_time) * 1e-6, 2)} ms, " + f"0x{can.dat.hex()}, {can.dat}, {len(can.dat)=}") From 746901e6b02fe24595834a8bc5672d9aa59359b8 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 17 Apr 2024 15:47:19 -0700 Subject: [PATCH 300/384] bump codecov (#32241) --- .github/workflows/selfdrive_tests.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index bfd2b82dc8..0042202edd 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -177,7 +177,7 @@ jobs: QT_QPA_PLATFORM=offscreen ./selfdrive/ui/tests/test_translations && \ ./selfdrive/ui/tests/test_translations.py" - name: "Upload coverage to Codecov" - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: name: ${{ github.job }} env: @@ -226,7 +226,7 @@ jobs: run: | ${{ env.RUN }} "unset PYTHONWARNINGS && AZURE_TOKEN='$AZURE_TOKEN' python selfdrive/test/process_replay/test_processes.py -j$(nproc) --upload-only" - name: "Upload coverage to Codecov" - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: name: ${{ github.job }} env: @@ -284,7 +284,7 @@ jobs: ${{ env.RUN }} "unset PYTHONWARNINGS && \ $PYTEST selfdrive/modeld" - name: "Upload coverage to Codecov" - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: name: ${{ github.job }} env: @@ -321,7 +321,7 @@ jobs: NUM_JOBS: 5 JOB_ID: ${{ matrix.job }} - name: "Upload coverage to Codecov" - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: name: ${{ github.job }}-${{ matrix.job }} env: From 62f053bc4d028dcdf89c6910b0acf72aafadca31 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 17 Apr 2024 16:33:13 -0700 Subject: [PATCH 301/384] consolidate casync build into fewer scripts and fix pc release build (#32225) * less scripts * better * fixes * naming * revert * cleanup * lets test it * fix that one * and rm * don't run this * fix * not here * revert testing * fix docs * default here too * t --------- Co-authored-by: Comma Device --- Jenkinsfile | 14 ++- SConstruct | 4 +- release/README.md | 19 +-- release/build_release.sh | 51 +++++++++ release/copy_build_files.sh | 15 --- release/create_casync_build.sh | 23 ---- release/create_casync_release.py | 27 ----- release/create_prebuilt.sh | 34 ------ release/create_release_manifest.py | 64 ----------- ...nos_release.py => package_casync_agnos.py} | 22 ++-- release/package_casync_build.py | 108 ++++++++++++++++++ release/upload_casync_release.py | 25 ---- 12 files changed, 187 insertions(+), 219 deletions(-) create mode 100755 release/build_release.sh delete mode 100755 release/copy_build_files.sh delete mode 100755 release/create_casync_build.sh delete mode 100755 release/create_casync_release.py delete mode 100755 release/create_prebuilt.sh delete mode 100755 release/create_release_manifest.py rename release/{create_casync_agnos_release.py => package_casync_agnos.py} (72%) create mode 100755 release/package_casync_build.py delete mode 100755 release/upload_casync_release.py diff --git a/Jenkinsfile b/Jenkinsfile index 83bd9b5d8c..1a0e2c73e9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -63,6 +63,7 @@ if [ -f /TICI ]; then rm -rf /tmp/tmp* rm -rf ~/.commacache rm -rf /dev/shm/* + rm -rf /dev/tmp/tmp* if ! systemctl is-active --quiet systemd-resolved; then echo "restarting resolved" @@ -179,12 +180,14 @@ def build_git_release(String channel_name) { def build_casync_release(String channel_name, def is_release) { - def extra_env = is_release ? "RELEASE=1" : "" + def extra_env = is_release ? "RELEASE=1 " : "" + def build_dir = "/data/openpilot" + + extra_env += "TMPDIR=/data/tmp PYTHONPATH=$SOURCE_DIR" return deviceStage("build casync", "tici-needs-can", [], [ - ["build", "${extra_env} BUILD_DIR=/data/openpilot CASYNC_DIR=/data/casync/openpilot $SOURCE_DIR/release/create_casync_build.sh"], - ["create manifest", "$SOURCE_DIR/release/create_release_manifest.py /data/openpilot /data/manifest.json && cat /data/manifest.json"], - ["upload and cleanup", "PYTHONWARNINGS=ignore $SOURCE_DIR/release/upload_casync_release.py /data/casync && rm -rf /data/casync"], + ["build", "${extra_env} $SOURCE_DIR/release/build_release.sh ${build_dir}"], + ["package + upload", "${extra_env} $SOURCE_DIR/release/package_casync_build.py ${build_dir}"], ]) } @@ -199,8 +202,7 @@ def build_stage() { }, 'publish agnos': { pcStage("publish agnos") { - sh "release/create_casync_agnos_release.py /tmp/casync/agnos /tmp/casync_tmp" - sh "PYTHONWARNINGS=ignore ${env.WORKSPACE}/release/upload_casync_release.py /tmp/casync" + sh "PYTHONWARNINGS=ignore release/package_casync_agnos.py" } } ) diff --git a/SConstruct b/SConstruct index 50dbda4b8d..4db1392a74 100644 --- a/SConstruct +++ b/SConstruct @@ -376,11 +376,13 @@ SConscript([ ]) if arch != "Darwin": SConscript([ - 'system/camerad/SConscript', 'system/sensord/SConscript', 'system/logcatd/SConscript', ]) +if arch == "larch64": + SConscript(['system/camerad/SConscript']) + # Build openpilot SConscript(['third_party/SConscript']) diff --git a/release/README.md b/release/README.md index eaf2d2b535..89e6cce6f3 100644 --- a/release/README.md +++ b/release/README.md @@ -4,8 +4,7 @@ ## terms - `channel` - a named version of openpilot (git branch, casync caibx) which receives updates -- `build` - a release which is already built for the comma 3/3x and contains only required files for running openpilot and identifying the release - +- `build` - a copy of openpilot ready for distribution, already built for a specific device - `build_style` - type of build, either `debug` or `release` - `debug` - build with `ALLOW_DEBUG=true`, can test experimental features like longitudinal on alpha cars - `release` - build with `ALLOW_DEBUG=false`, experimental features disabled @@ -22,21 +21,13 @@ | git branches | `debug` | installed manually, experimental features enabled, build required | -## creating casync build - -`create_casync_build.sh` - creates a casync openpilot build, ready to upload to `openpilot-releases` +## build -```bash -# run on a tici, within the directory you want to create the build from. -# creates a prebuilt version of openpilot into BUILD_DIR and outputs the caibx -# of a tarball containing the full prebuilt openpilot release -BUILD_DIR=/data/openpilot_build \ -CASYNC_DIR=/data/casync \ -release/create_casync_build.sh -``` +`release/build_release.sh ` - creates an openpilot build into `build_dir`, ready for distribution -`upload_casync_release.sh` - helper for uploading a casync build to `openpilot-releases` +## packaging a casync release +`release/package_casync_build.py ` - packages an openpilot build into a casync tar and uploads to `openpilot-releases` ## release builds diff --git a/release/build_release.sh b/release/build_release.sh new file mode 100755 index 0000000000..19c06700fa --- /dev/null +++ b/release/build_release.sh @@ -0,0 +1,51 @@ +#!/usr/bin/bash + +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +SOURCE_DIR="$(git -C $DIR rev-parse --show-toplevel)" +BUILD_DIR=${1:-$(mktemp -d)} + +if [ -f /TICI ]; then + FILES_SRC="release/files_tici" +else + FILES_SRC="release/files_pc" +fi + +echo "Building openpilot into $BUILD_DIR" + +rm -rf $BUILD_DIR +mkdir -p $BUILD_DIR + +# Copy required files to BUILD_DIR +cd $SOURCE_DIR +cp -pR --parents $(cat release/files_common) $BUILD_DIR/ +cp -pR --parents $(cat $FILES_SRC) $BUILD_DIR/ + +# Build + cleanup +cd $BUILD_DIR +export PYTHONPATH="$BUILD_DIR" + +rm -f panda/board/obj/panda.bin.signed +rm -f panda/board/obj/panda_h7.bin.signed + +if [ -n "$RELEASE" ]; then + export CERT=/data/pandaextra/certs/release +fi + +scons -j$(nproc) + +# Cleanup +find . -name '*.a' -delete +find . -name '*.o' -delete +find . -name '*.os' -delete +find . -name '*.pyc' -delete +find . -name 'moc_*' -delete +find . -name '__pycache__' -delete +rm -rf .sconsign.dblite Jenkinsfile release/ +rm selfdrive/modeld/models/supercombo.onnx + +# Mark as prebuilt release +touch prebuilt + +echo "----- openpilot has been built to $BUILD_DIR -----" diff --git a/release/copy_build_files.sh b/release/copy_build_files.sh deleted file mode 100755 index b40bd4b763..0000000000 --- a/release/copy_build_files.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -SOURCE_DIR=$1 -TARGET_DIR=$2 - -if [ -f /TICI ]; then - FILES_SRC="release/files_tici" -else - echo "no release files set" - exit 1 -fi - -cd $SOURCE_DIR -cp -pR --parents $(cat release/files_common) $TARGET_DIR/ -cp -pR --parents $(cat $FILES_SRC) $TARGET_DIR/ diff --git a/release/create_casync_build.sh b/release/create_casync_build.sh deleted file mode 100755 index 256bad4b4c..0000000000 --- a/release/create_casync_build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/bash - -set -ex - -DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" - -CASYNC_DIR="${CASYNC_DIR:=/tmp/casync}" -SOURCE_DIR="$(git -C $DIR rev-parse --show-toplevel)" -BUILD_DIR="${BUILD_DIR:=$(mktemp -d)}" -PYTHONPATH="$SOURCE_DIR" - -echo "Creating casync release from $SOURCE_DIR to $CASYNC_DIR" - -cd $SOURCE_DIR -mkdir -p $CASYNC_DIR -rm -rf $BUILD_DIR -mkdir -p $BUILD_DIR - -release/copy_build_files.sh $SOURCE_DIR $BUILD_DIR -release/create_prebuilt.sh $BUILD_DIR - -cd $SOURCE_DIR -release/create_casync_release.py $BUILD_DIR $CASYNC_DIR diff --git a/release/create_casync_release.py b/release/create_casync_release.py deleted file mode 100755 index 11629f3ab5..0000000000 --- a/release/create_casync_release.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python - -import argparse -import os -import pathlib - -from openpilot.system.updated.casync.common import create_casync_release, create_build_metadata_file -from openpilot.system.version import get_build_metadata - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="creates a casync release") - parser.add_argument("target_dir", type=str, help="target directory to build channel from") - parser.add_argument("output_dir", type=str, help="output directory for the channel") - args = parser.parse_args() - - target_dir = pathlib.Path(args.target_dir) - output_dir = pathlib.Path(args.output_dir) - - build_metadata = get_build_metadata() - build_metadata.openpilot.build_style = "release" if os.environ.get("RELEASE", None) is not None else "debug" - - create_build_metadata_file(target_dir, build_metadata) - - digest, caibx = create_casync_release(target_dir, output_dir, build_metadata.canonical) - - print(f"Created casync release from {target_dir} to {caibx} with digest {digest}") diff --git a/release/create_prebuilt.sh b/release/create_prebuilt.sh deleted file mode 100755 index 6d3768c536..0000000000 --- a/release/create_prebuilt.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/bash -e - -# runs on tici to create a prebuilt version of a release - -set -ex - -BUILD_DIR=$1 - -cd $BUILD_DIR - -# Build -export PYTHONPATH="$BUILD_DIR" - -rm -f panda/board/obj/panda.bin.signed -rm -f panda/board/obj/panda_h7.bin.signed - -if [ -n "$RELEASE" ]; then - export CERT=/data/pandaextra/certs/release -fi - -scons -j$(nproc) - -# Cleanup -find . -name '*.a' -delete -find . -name '*.o' -delete -find . -name '*.os' -delete -find . -name '*.pyc' -delete -find . -name 'moc_*' -delete -find . -name '__pycache__' -delete -rm -rf .sconsign.dblite Jenkinsfile release/ -rm selfdrive/modeld/models/supercombo.onnx - -# Mark as prebuilt release -touch prebuilt diff --git a/release/create_release_manifest.py b/release/create_release_manifest.py deleted file mode 100755 index 1d235f10fa..0000000000 --- a/release/create_release_manifest.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import dataclasses -import json -import os -import pathlib - -from openpilot.system.hardware.tici.agnos import AGNOS_MANIFEST_FILE, get_partition_path -from openpilot.system.version import get_build_metadata - - -BASE_URL = "https://commadist.blob.core.windows.net" - -OPENPILOT_RELEASES = f"{BASE_URL}/openpilot-releases/openpilot" -AGNOS_RELEASES = f"{BASE_URL}/openpilot-releases/agnos" - - -def create_partition_manifest(partition): - agnos_filename = os.path.basename(partition["url"]).split(".")[0] - - return { - "type": "partition", - "casync": { - "caibx": f"{AGNOS_RELEASES}/{agnos_filename}.caibx" - }, - "path": get_partition_path(0, partition), - "ab": True, - "size": partition["size"], - "full_check": partition["full_check"], - "hash_raw": partition["hash_raw"], - } - - -def create_openpilot_manifest(build_metadata): - return { - "type": "path_tarred", - "path": "/data/openpilot", - "casync": { - "caibx": f"{OPENPILOT_RELEASES}/{build_metadata.canonical}.caibx" - } - } - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="creates a casync release") - parser.add_argument("target_dir", type=str, help="directory of the channel to create manifest from") - parser.add_argument("output_file", type=str, help="output file to put the manifest") - args = parser.parse_args() - - with open(pathlib.Path(args.target_dir) / AGNOS_MANIFEST_FILE) as f: - agnos_manifest = json.load(f) - - build_metadata = get_build_metadata(args.target_dir) - - ret = { - "build_metadata": dataclasses.asdict(build_metadata), - "manifest": [ - *[create_partition_manifest(entry) for entry in agnos_manifest], - create_openpilot_manifest(build_metadata) - ] - } - - with open(args.output_file, "w") as f: - f.write(json.dumps(ret, indent=2)) diff --git a/release/create_casync_agnos_release.py b/release/package_casync_agnos.py similarity index 72% rename from release/create_casync_agnos_release.py rename to release/package_casync_agnos.py index 1b55d0fcc8..b80cdfa98d 100755 --- a/release/create_casync_agnos_release.py +++ b/release/package_casync_agnos.py @@ -8,27 +8,27 @@ import time from openpilot.common.basedir import BASEDIR from openpilot.system.hardware.tici.agnos import StreamingDecompressor, unsparsify, noop, AGNOS_MANIFEST_FILE from openpilot.system.updated.casync.common import create_casync_from_file +from release.package_casync_build import upload_casync_release if __name__ == "__main__": parser = argparse.ArgumentParser(description="creates a casync release") - parser.add_argument("output_dir", type=str, help="output directory for the channel") - parser.add_argument("working_dir", type=str, help="working directory") parser.add_argument("--manifest", type=str, help="json manifest to create agnos release from", \ default=str(pathlib.Path(BASEDIR) / AGNOS_MANIFEST_FILE)) args = parser.parse_args() - output_dir = pathlib.Path(args.output_dir) - output_dir.mkdir(parents=True, exist_ok=True) + manifest_file = pathlib.Path(args.manifest) - working_dir = pathlib.Path(args.working_dir) - working_dir.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory() as temp_dir: + working_dir = pathlib.Path(temp_dir) + casync_dir = working_dir / "casync" + casync_dir.mkdir() - manifest_file = pathlib.Path(args.manifest) + agnos_casync_dir = casync_dir / "agnos" + agnos_casync_dir.mkdir() - with tempfile.NamedTemporaryFile(dir=str(working_dir)) as entry_file: - entry_path = pathlib.Path(entry_file.name) + entry_path = working_dir / "entry" with open(manifest_file) as f: manifest = json.load(f) @@ -53,5 +53,7 @@ if __name__ == "__main__": start = time.monotonic() agnos_filename = os.path.basename(entry["url"]).split(".")[0] - create_casync_from_file(entry_path, output_dir, agnos_filename) + create_casync_from_file(entry_path, agnos_casync_dir, agnos_filename) print(f"created casnc in {time.monotonic() - start}") + + upload_casync_release(casync_dir) diff --git a/release/package_casync_build.py b/release/package_casync_build.py new file mode 100755 index 0000000000..5f92e893be --- /dev/null +++ b/release/package_casync_build.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 + +# packages a casync release, uploads to azure, and creates a manifest + +import argparse +import dataclasses +import json +import os +import pathlib +import tempfile + +from openpilot.system.hardware.tici.agnos import AGNOS_MANIFEST_FILE, get_partition_path +from openpilot.system.updated.casync.common import create_build_metadata_file, create_casync_release +from openpilot.system.version import get_build_metadata +from openpilot.tools.lib.azure_container import AzureContainer + + +BASE_URL = "https://commadist.blob.core.windows.net" + +OPENPILOT_RELEASES = f"{BASE_URL}/openpilot-releases/openpilot" +AGNOS_RELEASES = f"{BASE_URL}/openpilot-releases/agnos" + + +def create_casync_caibx(target_dir: pathlib.Path, output_dir: pathlib.Path): + output_dir.mkdir() + build_metadata = get_build_metadata() + build_metadata.openpilot.build_style = "release" if os.environ.get("RELEASE", None) is not None else "debug" + + create_build_metadata_file(target_dir, build_metadata) + + digest, caibx = create_casync_release(target_dir, output_dir, build_metadata.canonical) + + print(f"Created casync release from {target_dir} to {caibx} with digest {digest}") + + +def upload_casync_release(casync_dir: pathlib.Path): + if "AZURE_TOKEN_OPENPILOT_RELEASES" in os.environ: + os.environ["AZURE_TOKEN"] = os.environ["AZURE_TOKEN_OPENPILOT_RELEASES"] + + OPENPILOT_RELEASES_CONTAINER = AzureContainer("commadist", "openpilot-releases") + + for f in casync_dir.rglob("*"): + if f.is_file(): + blob_name = f.relative_to(casync_dir) + print(f"uploading {f} to {blob_name}") + OPENPILOT_RELEASES_CONTAINER.upload_file(str(f), str(blob_name), overwrite=True) + + +def create_partition_manifest(partition): + agnos_filename = os.path.basename(partition["url"]).split(".")[0] + + return { + "type": "partition", + "casync": { + "caibx": f"{AGNOS_RELEASES}/{agnos_filename}.caibx" + }, + "path": get_partition_path(0, partition), + "ab": True, + "size": partition["size"], + "full_check": partition["full_check"], + "hash_raw": partition["hash_raw"], + } + + +def create_openpilot_manifest(build_metadata): + return { + "type": "path_tarred", + "path": "/data/openpilot", + "casync": { + "caibx": f"{OPENPILOT_RELEASES}/{build_metadata.canonical}.caibx" + } + } + + +def create_manifest(target_dir): + with open(pathlib.Path(target_dir) / AGNOS_MANIFEST_FILE) as f: + agnos_manifest = json.load(f) + + build_metadata = get_build_metadata(args.target_dir) + + return { + "build_metadata": dataclasses.asdict(build_metadata), + "manifest": [ + *[create_partition_manifest(entry) for entry in agnos_manifest], + create_openpilot_manifest(build_metadata) + ] + } + + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="creates a casync release") + parser.add_argument("target_dir", type=str, help="path to a release build of openpilot to create release from") + args = parser.parse_args() + + target_dir = pathlib.Path(args.target_dir) + + with tempfile.TemporaryDirectory() as temp_dir: + casync_dir = pathlib.Path(temp_dir) / "casync" + casync_dir.mkdir(parents=True) + + manifest_file = pathlib.Path(temp_dir) / "manifest.json" + + create_casync_caibx(target_dir, casync_dir / "openpilot") + upload_casync_release(casync_dir) + manifest = create_manifest(target_dir) + + print(json.dumps(manifest, indent=2)) diff --git a/release/upload_casync_release.py b/release/upload_casync_release.py deleted file mode 100755 index 4261e298a8..0000000000 --- a/release/upload_casync_release.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import os -import pathlib -from openpilot.tools.lib.azure_container import AzureContainer - - -if __name__ == "__main__": - if "AZURE_TOKEN_OPENPILOT_RELEASES" in os.environ: - os.environ["AZURE_TOKEN"] = os.environ["AZURE_TOKEN_OPENPILOT_RELEASES"] - - OPENPILOT_RELEASES_CONTAINER = AzureContainer("commadist", "openpilot-releases") - - parser = argparse.ArgumentParser(description='upload casync folder to azure') - parser.add_argument("casync_dir", type=str, help="casync directory") - args = parser.parse_args() - - casync_dir = pathlib.Path(args.casync_dir) - - for f in casync_dir.rglob("*"): - if f.is_file(): - blob_name = f.relative_to(casync_dir) - print(f"uploading {f} to {blob_name}") - OPENPILOT_RELEASES_CONTAINER.upload_file(str(f), str(blob_name), overwrite=True) From f2ee3f055e0ecc2e93c0a0659d9ed6100c9a4ef1 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 17 Apr 2024 23:25:37 -0700 Subject: [PATCH 302/384] IsoTpParalellQuery: extend timeout for any valid ECU response (#32245) * bump * bump --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 2eb8578196..edcd0fe4d4 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 2eb85781960ec4e69019222d8eea658f9e63d4c1 +Subproject commit edcd0fe4d41be59b7a5f046e68fee93e6898357f From 692a21e4a722d91086998b532ca6759a3f85c345 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 17 Apr 2024 23:36:58 -0700 Subject: [PATCH 303/384] lateral limits: remove Subaru exception (#32244) * remove exception * update Outback params * clean up * adjust to the upper limit * don't change control, only docs * rough --- selfdrive/car/tests/test_lateral_limits.py | 10 ---------- selfdrive/car/torque_data/override.toml | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/selfdrive/car/tests/test_lateral_limits.py b/selfdrive/car/tests/test_lateral_limits.py index 8f1cee269e..e5cfd972bd 100755 --- a/selfdrive/car/tests/test_lateral_limits.py +++ b/selfdrive/car/tests/test_lateral_limits.py @@ -9,7 +9,6 @@ from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.car.car_helpers import interfaces from openpilot.selfdrive.car.fingerprints import all_known_cars from openpilot.selfdrive.car.interfaces import get_torque_params -from openpilot.selfdrive.car.subaru.values import CAR as SUBARU CAR_MODELS = all_known_cars() @@ -22,12 +21,6 @@ MAX_LAT_JERK_UP_TOLERANCE = 0.5 # m/s^3 # jerk is measured over half a second JERK_MEAS_T = 0.5 -# TODO: put these cars within limits -ABOVE_LIMITS_CARS = [ - SUBARU.SUBARU_LEGACY, - SUBARU.SUBARU_OUTBACK, -] - car_model_jerks: defaultdict[str, dict[str, float]] = defaultdict(dict) @@ -50,9 +43,6 @@ class TestLateralLimits(unittest.TestCase): if CP.notCar: raise unittest.SkipTest - if CP.carFingerprint in ABOVE_LIMITS_CARS: - raise unittest.SkipTest - CarControllerParams = importlib.import_module(f'selfdrive.car.{CP.carName}.values').CarControllerParams cls.control_params = CarControllerParams(CP) cls.torque_params = get_torque_params(cls.car_model) diff --git a/selfdrive/car/torque_data/override.toml b/selfdrive/car/torque_data/override.toml index c068bf9a14..f6f4eacc1c 100644 --- a/selfdrive/car/torque_data/override.toml +++ b/selfdrive/car/torque_data/override.toml @@ -38,7 +38,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] # Totally new cars "RAM_1500_5TH_GEN" = [2.0, 2.0, 0.05] "RAM_HD_5TH_GEN" = [1.4, 1.4, 0.05] -"SUBARU_OUTBACK" = [2.0, 2.0, 0.2] +"SUBARU_OUTBACK" = [2.0, 1.5, 0.2] "CADILLAC_ESCALADE" = [1.899999976158142, 1.842270016670227, 0.1120000034570694] "CADILLAC_ESCALADE_ESV_2019" = [1.15, 1.3, 0.2] "CHEVROLET_BOLT_EUV" = [2.0, 2.0, 0.05] From 2e5f2d208ce521c16343c2a73a2ec136eed75b48 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 17 Apr 2024 23:50:42 -0700 Subject: [PATCH 304/384] Update ref_commit --- selfdrive/test/process_replay/ref_commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index a253da0258..4e24f8eb29 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -f759be555103697918d5d6c22292ef10536e68bd \ No newline at end of file +692a21e4a722d91086998b532ca6759a3f85c345 From 09f978d2b6cbe461d29560bcfd1069af22e17c4d Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Thu, 18 Apr 2024 14:24:49 -0300 Subject: [PATCH 305/384] Multilang: update pt-BR translations (#32248) update pt-BR translations --- selfdrive/ui/translations/main_pt-BR.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index 71f6a5caa6..6210e35f2a 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -1168,11 +1168,11 @@ Isso pode levar até um minuto. Always-On Driver Monitoring - + Monitoramento do Motorista Sempre Ativo Enable driver monitoring even when openpilot is not engaged. - + Habilite o monitoramento do motorista mesmo quando o openpilot não estiver acionado. From a8e2c00b9810a226ec77456a74d88dfd24c00d97 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 18 Apr 2024 11:31:38 -0700 Subject: [PATCH 306/384] [bot] Fingerprints: add missing FW versions from new users (#32247) Export fingerprints --- selfdrive/car/toyota/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 8ca0ca8851..6830f9ccec 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1146,12 +1146,14 @@ FW_VERSIONS = { b'\x01F152642F1000\x00\x00\x00\x00', b'\x01F152642F8000\x00\x00\x00\x00', b'\x01F152642F8100\x00\x00\x00\x00', + b'\x01F152642F9000\x00\x00\x00\x00', ], (Ecu.eps, 0x7a1, None): [ b'\x028965B0R11000\x00\x00\x00\x008965B0R12000\x00\x00\x00\x00', b'8965B42371\x00\x00\x00\x00\x00\x00', ], (Ecu.engine, 0x700, None): [ + b'\x01896634A61000\x00\x00\x00\x00', b'\x01896634A88100\x00\x00\x00\x00', b'\x01896634A89100\x00\x00\x00\x00', b'\x01896634AE1001\x00\x00\x00\x00', @@ -1237,6 +1239,7 @@ FW_VERSIONS = { b'\x028966333V4000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', b'\x028966333W1000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', b'\x02896633T09000\x00\x00\x00\x00897CF3307001\x00\x00\x00\x00', + b'\x02896633T10000\x00\x00\x00\x00897CF3307001\x00\x00\x00\x00', ], (Ecu.abs, 0x7b0, None): [ b'\x01F152606281\x00\x00\x00\x00\x00\x00', From 23995131af49b5bed4a1481774246ccb24a714b4 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 18 Apr 2024 16:52:52 -0700 Subject: [PATCH 307/384] car docs: add Camry 2025 to TS --- docs/CARS.md | 1 + selfdrive/car/CARS_template.md | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/CARS.md b/docs/CARS.md index 1b356ac8ed..a41518382a 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -357,6 +357,7 @@ openpilot does not yet support these Toyota models due to a new message authenti * Toyota Tundra 2022+ * Toyota Highlander 2024+ * Toyota Corolla Cross 2022+ (only US model) +* Toyota Camry 2025+ * Lexus NX 2022+ * Toyota bZ4x 2023+ * Subaru Solterra 2023+ diff --git a/selfdrive/car/CARS_template.md b/selfdrive/car/CARS_template.md index 9f9f6c2638..2f49e79b81 100644 --- a/selfdrive/car/CARS_template.md +++ b/selfdrive/car/CARS_template.md @@ -67,6 +67,7 @@ openpilot does not yet support these Toyota models due to a new message authenti * Toyota Tundra 2022+ * Toyota Highlander 2024+ * Toyota Corolla Cross 2022+ (only US model) +* Toyota Camry 2025+ * Lexus NX 2022+ * Toyota bZ4x 2023+ * Subaru Solterra 2023+ From 5d28b929c3c0c6a7d7bf831e064aa9e67b2b85d6 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 18 Apr 2024 19:39:08 -0700 Subject: [PATCH 308/384] distance bars: bars always cycle 1, 2, 3 (#32251) 1, 2, 3 instead of 2, 3, 4 --- selfdrive/car/ford/fordcan.py | 2 +- selfdrive/car/hyundai/hyundaican.py | 2 +- selfdrive/car/hyundai/hyundaicanfd.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/ford/fordcan.py b/selfdrive/car/ford/fordcan.py index 939084c4a0..2cfd61a191 100644 --- a/selfdrive/car/ford/fordcan.py +++ b/selfdrive/car/ford/fordcan.py @@ -212,7 +212,7 @@ def create_acc_ui_msg(packer, CAN: CanBus, CP, main_on: bool, enabled: bool, fcw "AccFllwMde_B_Dsply": 1 if hud_control.leadVisible else 0, # Lead indicator "AccStopMde_B_Dsply": 1 if standstill else 0, "AccWarn_D_Dsply": 0, # ACC warning - "AccTGap_D_Dsply": hud_control.leadDistanceBars + 1, # Time gap + "AccTGap_D_Dsply": hud_control.leadDistanceBars, # Time gap }) # Forwards FCW alert from IPMA diff --git a/selfdrive/car/hyundai/hyundaican.py b/selfdrive/car/hyundai/hyundaican.py index fe43def2ae..b4b951f89e 100644 --- a/selfdrive/car/hyundai/hyundaican.py +++ b/selfdrive/car/hyundai/hyundaican.py @@ -131,7 +131,7 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, hud_control, se scc11_values = { "MainMode_ACC": 1, - "TauGapSet": hud_control.leadDistanceBars + 1, + "TauGapSet": hud_control.leadDistanceBars, "VSetDis": set_speed if enabled else 0, "AliveCounterACC": idx % 0x10, "ObjValid": 1, # close lead makes controls tighter diff --git a/selfdrive/car/hyundai/hyundaicanfd.py b/selfdrive/car/hyundai/hyundaicanfd.py index 17ec9dcdd2..54804f94fd 100644 --- a/selfdrive/car/hyundai/hyundaicanfd.py +++ b/selfdrive/car/hyundai/hyundaicanfd.py @@ -146,7 +146,7 @@ def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_ov "SET_ME_2": 0x4, "SET_ME_3": 0x3, "SET_ME_TMP_64": 0x64, - "DISTANCE_SETTING": hud_control.leadDistanceBars + 1, + "DISTANCE_SETTING": hud_control.leadDistanceBars, } return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values) From 331c7b103a7e4349c75be373589fc68161e69500 Mon Sep 17 00:00:00 2001 From: ZwX1616 Date: Thu, 18 Apr 2024 21:45:59 -0700 Subject: [PATCH 309/384] image processing refactor and test (#32249) * it's something * backup * 16:10 * cleanup * this is fine * close * remove some junk * no heck * disos * real 10 * for some reason this is flipped * 20hz * no return * ae * tear * need curve laster * correct real gains * fix time * cleanup * why the scam * disable for now * 0.7 * hdr * that doesnt work * what * hugeoof * clean up * cleanup * fix regs * welp cant * is this corrent * it is sq * remove * back * stg10bit * back2ten * Revert "remove" This reverts commit 18712ab7e103c12621c929cd0f772ecb9b348247. * 20hz and swb * correct height * 10bit * ui hack for now * slight * perfect * blk64 * ccm * fix page faults * template * set 4x * is this fine * try * this seems to work * Revert "this seems to work" This reverts commit d3c9023d3f14bd9394fed2d6276dba777ed0e606. * needs to be static * close * 64 is optimal * 2 * take * not 1 * offset * whats going on * i have no idea * less resistence * box defs * no * reduce blur artifacts * simplify * fix * fake short is too much for bright * can be subzero * should not use lsvc * no wasted bit * cont no slow * no less than 10bit * it is based * wrong * right * quart * shift * raise noise floor * 4.5/4.7 * same ballpark * int is fine * shane owes me m4a4 * Revert "shane owes me m4a4" This reverts commit b4283fee18efebedae628a6cfd926ff1416dcfe5. * back * Revert "4.5/4.7" This reverts commit e38f96e90cb5370bd378f6b66def9e7e3ed0ce5d. * default * oof * clean up * simpilfy * from sensorinfo * no div * better name * not the wrong one * not anymore relevant * too * not call it debayer * cl headers * arg is 2nd * gone is is_bggr * define * no is hdr * rgb_tmp * p1 * clean up * 4 * cant for * fix somewhre else * const * ap * rects * just set staruc * nnew tmp * pull it for now * 12 * common rect * Revert "not anymore relevant" This reverts commit 1d574673a16cc31b7a255609e07775c3579eef15. * Revert "too" This reverts commit c2d4dcc52a859fe799362f9fcc2ffda99b264e50. * Revert "Revert "too"" This reverts commit 0abbabe1fde51592f1619058638b4ac6a6dee4b3. * no tol is fine * rename * sensor id * unsgin * flag * some linalg * cast * should be h ref * cap --------- Co-authored-by: Comma Device --- common/util.h | 7 + release/files_tici | 2 +- selfdrive/test/process_replay/.gitignore | 1 - .../process_replay/debayer_replay_ref_commit | 1 - .../process_replay/imgproc_replay_ref_hash | 1 + selfdrive/test/process_replay/test_debayer.py | 196 ------------- selfdrive/test/process_replay/test_imgproc.py | 99 +++++++ selfdrive/test/test_onroad.py | 2 +- system/camerad/cameras/camera_common.cc | 45 ++- system/camerad/cameras/camera_common.h | 7 +- system/camerad/cameras/camera_qcom2.cc | 45 ++- system/camerad/cameras/camera_qcom2.h | 9 +- system/camerad/cameras/process_raw.cl | 192 ++++++++++++ system/camerad/sensors/ar0231.cc | 1 + system/camerad/sensors/ar0231_cl.h | 33 +++ system/camerad/sensors/os04c10.cc | 8 +- system/camerad/sensors/os04c10_cl.h | 26 ++ system/camerad/sensors/os04c10_registers.h | 2 +- system/camerad/sensors/ox03c10.cc | 1 + .../real_debayer.cl => sensors/ox03c10_cl.h} | 277 ++---------------- system/camerad/sensors/sensor.h | 1 + system/camerad/test/test_ae_gray.cc | 3 +- 22 files changed, 470 insertions(+), 489 deletions(-) delete mode 100644 selfdrive/test/process_replay/debayer_replay_ref_commit create mode 100644 selfdrive/test/process_replay/imgproc_replay_ref_hash delete mode 100755 selfdrive/test/process_replay/test_debayer.py create mode 100755 selfdrive/test/process_replay/test_imgproc.py create mode 100644 system/camerad/cameras/process_raw.cl create mode 100644 system/camerad/sensors/ar0231_cl.h create mode 100644 system/camerad/sensors/os04c10_cl.h rename system/camerad/{cameras/real_debayer.cl => sensors/ox03c10_cl.h} (83%) diff --git a/common/util.h b/common/util.h index 3bf5a690a6..0e8bcd56bf 100644 --- a/common/util.h +++ b/common/util.h @@ -179,3 +179,10 @@ void update_max_atomic(std::atomic& max, T const& value) { T prev = max; while (prev < value && !max.compare_exchange_weak(prev, value)) {} } + +typedef struct Rect { + int x; + int y; + int w; + int h; +} Rect; diff --git a/release/files_tici b/release/files_tici index 1771c45138..18860e20af 100644 --- a/release/files_tici +++ b/release/files_tici @@ -7,7 +7,7 @@ system/camerad/cameras/camera_qcom2.cc system/camerad/cameras/camera_qcom2.h system/camerad/cameras/camera_util.cc system/camerad/cameras/camera_util.h -system/camerad/cameras/real_debayer.cl +system/camerad/cameras/process_raw.cl system/qcomgpsd/* diff --git a/selfdrive/test/process_replay/.gitignore b/selfdrive/test/process_replay/.gitignore index 63c37e64e1..a35cd58d41 100644 --- a/selfdrive/test/process_replay/.gitignore +++ b/selfdrive/test/process_replay/.gitignore @@ -1,2 +1 @@ fakedata/ -debayer_diff.txt diff --git a/selfdrive/test/process_replay/debayer_replay_ref_commit b/selfdrive/test/process_replay/debayer_replay_ref_commit deleted file mode 100644 index 551fc680ba..0000000000 --- a/selfdrive/test/process_replay/debayer_replay_ref_commit +++ /dev/null @@ -1 +0,0 @@ -8f9ba7540b4549b4a57312129b8ff678d045f70f \ No newline at end of file diff --git a/selfdrive/test/process_replay/imgproc_replay_ref_hash b/selfdrive/test/process_replay/imgproc_replay_ref_hash new file mode 100644 index 0000000000..defcb3681c --- /dev/null +++ b/selfdrive/test/process_replay/imgproc_replay_ref_hash @@ -0,0 +1 @@ +707434c540e685bbe2886b3ff7c82fd61939d362 \ No newline at end of file diff --git a/selfdrive/test/process_replay/test_debayer.py b/selfdrive/test/process_replay/test_debayer.py deleted file mode 100755 index 805d73db88..0000000000 --- a/selfdrive/test/process_replay/test_debayer.py +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys -import bz2 -import numpy as np - -import pyopencl as cl # install with `PYOPENCL_CL_PRETEND_VERSION=2.0 pip install pyopencl` - -from openpilot.system.hardware import PC, TICI -from openpilot.common.basedir import BASEDIR -from openpilot.tools.lib.openpilotci import BASE_URL -from openpilot.common.git import get_commit -from openpilot.system.camerad.snapshot.snapshot import yuv_to_rgb -from openpilot.tools.lib.logreader import LogReader -from openpilot.tools.lib.filereader import FileReader - -TEST_ROUTE = "8345e3b82948d454|2022-05-04--13-45-33/0" - -FRAME_WIDTH = 1928 -FRAME_HEIGHT = 1208 -FRAME_STRIDE = 2896 - -UV_WIDTH = FRAME_WIDTH // 2 -UV_HEIGHT = FRAME_HEIGHT // 2 -UV_SIZE = UV_WIDTH * UV_HEIGHT - - -def get_frame_fn(ref_commit, test_route, tici=True): - return f"{test_route}_debayer{'_tici' if tici else ''}_{ref_commit}.bz2" - - -def bzip_frames(frames): - data = b'' - for y, u, v in frames: - data += y.tobytes() - data += u.tobytes() - data += v.tobytes() - return bz2.compress(data) - - -def unbzip_frames(url): - with FileReader(url) as f: - dat = f.read() - - data = bz2.decompress(dat) - - res = [] - for y_start in range(0, len(data), FRAME_WIDTH * FRAME_HEIGHT + UV_SIZE * 2): - u_start = y_start + FRAME_WIDTH * FRAME_HEIGHT - v_start = u_start + UV_SIZE - - y = np.frombuffer(data[y_start: u_start], dtype=np.uint8).reshape((FRAME_HEIGHT, FRAME_WIDTH)) - u = np.frombuffer(data[u_start: v_start], dtype=np.uint8).reshape((UV_HEIGHT, UV_WIDTH)) - v = np.frombuffer(data[v_start: v_start + UV_SIZE], dtype=np.uint8).reshape((UV_HEIGHT, UV_WIDTH)) - - res.append((y, u, v)) - - return res - - -def init_kernels(frame_offset=0): - ctx = cl.create_some_context(interactive=False) - - with open(os.path.join(BASEDIR, 'system/camerad/cameras/real_debayer.cl')) as f: - build_args = ' -cl-fast-relaxed-math -cl-denorms-are-zero -cl-single-precision-constant' + \ - f' -DFRAME_STRIDE={FRAME_STRIDE} -DRGB_WIDTH={FRAME_WIDTH} -DRGB_HEIGHT={FRAME_HEIGHT} -DFRAME_OFFSET={frame_offset} -DCAM_NUM=0' - if PC: - build_args += ' -DHALF_AS_FLOAT=1 -cl-std=CL2.0' - debayer_prg = cl.Program(ctx, f.read()).build(options=build_args) - - return ctx, debayer_prg - -def debayer_frame(ctx, debayer_prg, data, rgb=False): - q = cl.CommandQueue(ctx) - - yuv_buff = np.empty(FRAME_WIDTH * FRAME_HEIGHT + UV_SIZE * 2, dtype=np.uint8) - - cam_g = cl.Buffer(ctx, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=data) - yuv_g = cl.Buffer(ctx, cl.mem_flags.WRITE_ONLY, FRAME_WIDTH * FRAME_HEIGHT + UV_SIZE * 2) - - local_worksize = (20, 20) if TICI else (4, 4) - ev1 = debayer_prg.debayer10(q, (UV_WIDTH, UV_HEIGHT), local_worksize, cam_g, yuv_g) - cl.enqueue_copy(q, yuv_buff, yuv_g, wait_for=[ev1]).wait() - cl.enqueue_barrier(q) - - y = yuv_buff[:FRAME_WIDTH*FRAME_HEIGHT].reshape((FRAME_HEIGHT, FRAME_WIDTH)) - u = yuv_buff[FRAME_WIDTH*FRAME_HEIGHT:FRAME_WIDTH*FRAME_HEIGHT+UV_SIZE].reshape((UV_HEIGHT, UV_WIDTH)) - v = yuv_buff[FRAME_WIDTH*FRAME_HEIGHT+UV_SIZE:].reshape((UV_HEIGHT, UV_WIDTH)) - - if rgb: - return yuv_to_rgb(y, u, v) - else: - return y, u, v - - -def debayer_replay(lr): - ctx, debayer_prg = init_kernels() - - frames = [] - for m in lr: - if m.which() == 'roadCameraState': - cs = m.roadCameraState - if cs.image: - data = np.frombuffer(cs.image, dtype=np.uint8) - img = debayer_frame(ctx, debayer_prg, data) - - frames.append(img) - - return frames - - -if __name__ == "__main__": - update = "--update" in sys.argv - replay_dir = os.path.dirname(os.path.abspath(__file__)) - ref_commit_fn = os.path.join(replay_dir, "debayer_replay_ref_commit") - - # load logs - lr = list(LogReader(TEST_ROUTE)) - - # run replay - frames = debayer_replay(lr) - - # get diff - failed = False - diff = '' - yuv_i = ['y', 'u', 'v'] - if not update: - with open(ref_commit_fn) as f: - ref_commit = f.read().strip() - frame_fn = get_frame_fn(ref_commit, TEST_ROUTE, tici=TICI) - - try: - cmp_frames = unbzip_frames(BASE_URL + frame_fn) - - if len(frames) != len(cmp_frames): - failed = True - diff += 'amount of frames not equal\n' - - for i, (frame, cmp_frame) in enumerate(zip(frames, cmp_frames, strict=True)): - for j in range(3): - fr = frame[j] - cmp_f = cmp_frame[j] - if fr.shape != cmp_f.shape: - failed = True - diff += f'frame shapes not equal for ({i}, {yuv_i[j]})\n' - diff += f'{ref_commit}: {cmp_f.shape}\n' - diff += f'HEAD: {fr.shape}\n' - elif not np.array_equal(fr, cmp_f): - failed = True - if np.allclose(fr, cmp_f, atol=1): - diff += f'frames not equal for ({i}, {yuv_i[j]}), but are all close\n' - else: - diff += f'frames not equal for ({i}, {yuv_i[j]})\n' - - frame_diff = np.abs(np.subtract(fr, cmp_f)) - diff_len = len(np.nonzero(frame_diff)[0]) - if diff_len > 10000: - diff += f'different at a large amount of pixels ({diff_len})\n' - else: - diff += 'different at (frame, yuv, pixel, ref, HEAD):\n' - for k in zip(*np.nonzero(frame_diff), strict=True): - diff += f'{i}, {yuv_i[j]}, {k}, {cmp_f[k]}, {fr[k]}\n' - - if failed: - print(diff) - with open("debayer_diff.txt", "w") as f: - f.write(diff) - except Exception as e: - print(str(e)) - failed = True - - # upload new refs - if update or (failed and TICI): - from openpilot.tools.lib.openpilotci import upload_file - - print("Uploading new refs") - - frames_bzip = bzip_frames(frames) - - new_commit = get_commit() - frame_fn = os.path.join(replay_dir, get_frame_fn(new_commit, TEST_ROUTE, tici=TICI)) - with open(frame_fn, "wb") as f2: - f2.write(frames_bzip) - - try: - upload_file(frame_fn, os.path.basename(frame_fn)) - except Exception as e: - print("failed to upload", e) - - if update: - with open(ref_commit_fn, 'w') as f: - f.write(str(new_commit)) - - print("\nNew ref commit: ", new_commit) - - sys.exit(int(failed)) diff --git a/selfdrive/test/process_replay/test_imgproc.py b/selfdrive/test/process_replay/test_imgproc.py new file mode 100755 index 0000000000..a980548baa --- /dev/null +++ b/selfdrive/test/process_replay/test_imgproc.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +import os +import numpy as np +import hashlib + +import pyopencl as cl # install with `PYOPENCL_CL_PRETEND_VERSION=2.0 pip install pyopencl` + +from openpilot.system.hardware import PC, TICI +from openpilot.common.basedir import BASEDIR +from openpilot.common.transformations.camera import DEVICE_CAMERAS +from openpilot.system.camerad.snapshot.snapshot import yuv_to_rgb +from openpilot.tools.lib.logreader import LogReader + +# TODO: check all sensors +TEST_ROUTE = "8345e3b82948d454|2022-05-04--13-45-33/0" + +cam = DEVICE_CAMERAS[("tici", "ar0231")] +FRAME_WIDTH, FRAME_HEIGHT = (cam.dcam.width, cam.dcam.height) +FRAME_STRIDE = FRAME_WIDTH * 12 // 8 + 4 + +UV_WIDTH = FRAME_WIDTH // 2 +UV_HEIGHT = FRAME_HEIGHT // 2 +UV_SIZE = UV_WIDTH * UV_HEIGHT + + +def init_kernels(frame_offset=0): + ctx = cl.create_some_context(interactive=False) + + with open(os.path.join(BASEDIR, 'system/camerad/cameras/process_raw.cl')) as f: + build_args = f' -cl-fast-relaxed-math -cl-denorms-are-zero -cl-single-precision-constant -I{BASEDIR}/system/camerad/sensors ' + \ + f' -DFRAME_WIDTH={FRAME_WIDTH} -DFRAME_HEIGHT={FRAME_WIDTH} -DFRAME_STRIDE={FRAME_STRIDE} -DFRAME_OFFSET={frame_offset} ' + \ + f' -DRGB_WIDTH={FRAME_WIDTH} -DRGB_HEIGHT={FRAME_HEIGHT} -DYUV_STRIDE={FRAME_WIDTH} -DUV_OFFSET={FRAME_WIDTH*FRAME_HEIGHT}' + \ + ' -DSENSOR_ID=1 -DVIGNETTING=0 ' + if PC: + build_args += ' -DHALF_AS_FLOAT=1 -cl-std=CL2.0' + imgproc_prg = cl.Program(ctx, f.read()).build(options=build_args) + + return ctx, imgproc_prg + +def proc_frame(ctx, imgproc_prg, data, rgb=False): + q = cl.CommandQueue(ctx) + + yuv_buff = np.empty(FRAME_WIDTH * FRAME_HEIGHT + UV_SIZE * 2, dtype=np.uint8) + + cam_g = cl.Buffer(ctx, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=data) + yuv_g = cl.Buffer(ctx, cl.mem_flags.WRITE_ONLY, FRAME_WIDTH * FRAME_HEIGHT + UV_SIZE * 2) + + krn = imgproc_prg.process_raw + krn.set_scalar_arg_dtypes([None, None, np.int32]) + local_worksize = (20, 20) if TICI else (4, 4) + + ev1 = krn(q, (FRAME_WIDTH//2, FRAME_HEIGHT//2), local_worksize, cam_g, yuv_g, 1) + cl.enqueue_copy(q, yuv_buff, yuv_g, wait_for=[ev1]).wait() + cl.enqueue_barrier(q) + + y = yuv_buff[:FRAME_WIDTH*FRAME_HEIGHT].reshape((FRAME_HEIGHT, FRAME_WIDTH)) + u = yuv_buff[FRAME_WIDTH*FRAME_HEIGHT::2].reshape((UV_HEIGHT, UV_WIDTH)) + v = yuv_buff[FRAME_WIDTH*FRAME_HEIGHT+1::2].reshape((UV_HEIGHT, UV_WIDTH)) + + if rgb: + return yuv_to_rgb(y, u, v) + else: + return y, u, v + + +def imgproc_replay(lr): + ctx, imgproc_prg = init_kernels() + + frames = [] + for m in lr: + if m.which() == 'roadCameraState': + cs = m.roadCameraState + if cs.image: + data = np.frombuffer(cs.image, dtype=np.uint8) + img = proc_frame(ctx, imgproc_prg, data) + + frames.append(img) + + return frames + + +if __name__ == "__main__": + # load logs + lr = list(LogReader(TEST_ROUTE)) + # run replay + out_frames = imgproc_replay(lr) + + all_pix = np.concatenate([np.concatenate([d.flatten() for d in f]) for f in out_frames]) + pix_hash = hashlib.sha1(all_pix).hexdigest() + + with open('imgproc_replay_ref_hash') as f: + ref_hash = f.read() + + if pix_hash != ref_hash: + print("result changed! please check kernel") + print("ref: %s" % ref_hash) + print("new: %s" % pix_hash) + else: + print("test passed") diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 7492ac12a6..5de9d20297 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -300,7 +300,7 @@ class TestOnroad(unittest.TestCase): def test_camera_processing_time(self): result = "\n" result += "------------------------------------------------\n" - result += "-------------- Debayer Timing ------------------\n" + result += "-------------- ImgProc Timing ------------------\n" result += "------------------------------------------------\n" ts = [getattr(m, m.which()).processingTime for m in self.lr if 'CameraState' in m.which()] diff --git a/system/camerad/cameras/camera_common.cc b/system/camerad/cameras/camera_common.cc index aa815bfadf..90bfa19231 100644 --- a/system/camerad/cameras/camera_common.cc +++ b/system/camerad/cameras/camera_common.cc @@ -8,7 +8,6 @@ #include "common/clutil.h" #include "common/swaglog.h" -#include "common/util.h" #include "third_party/linux/include/msm_media_info.h" #include "system/camerad/cameras/camera_qcom2.h" @@ -18,40 +17,38 @@ ExitHandler do_exit; -class Debayer { +class ImgProc { public: - Debayer(cl_device_id device_id, cl_context context, const CameraBuf *b, const CameraState *s, int buf_width, int uv_offset) { + ImgProc(cl_device_id device_id, cl_context context, const CameraBuf *b, const CameraState *s, int buf_width, int uv_offset) { char args[4096]; const SensorInfo *ci = s->ci.get(); snprintf(args, sizeof(args), - "-cl-fast-relaxed-math -cl-denorms-are-zero " + "-cl-fast-relaxed-math -cl-denorms-are-zero -Isensors " "-DFRAME_WIDTH=%d -DFRAME_HEIGHT=%d -DFRAME_STRIDE=%d -DFRAME_OFFSET=%d " "-DRGB_WIDTH=%d -DRGB_HEIGHT=%d -DYUV_STRIDE=%d -DUV_OFFSET=%d " - "-DIS_OX=%d -DIS_OS=%d -DIS_BGGR=%d -DCAM_NUM=%d%s", + "-DSENSOR_ID=%hu -DVIGNETTING=%d ", ci->frame_width, ci->frame_height, ci->frame_stride, ci->frame_offset, b->rgb_width, b->rgb_height, buf_width, uv_offset, - ci->image_sensor == cereal::FrameData::ImageSensor::OX03C10, - ci->image_sensor == cereal::FrameData::ImageSensor::OS04C10, - ci->image_sensor == cereal::FrameData::ImageSensor::OS04C10, - s->camera_num, s->camera_num==1 ? " -DVIGNETTING" : ""); - const char *cl_file = "cameras/real_debayer.cl"; - cl_program prg_debayer = cl_program_from_file(context, device_id, cl_file, args); - krnl_ = CL_CHECK_ERR(clCreateKernel(prg_debayer, "debayer10", &err)); - CL_CHECK(clReleaseProgram(prg_debayer)); + ci->image_sensor, s->camera_num == 1); + const char *cl_file = "cameras/process_raw.cl"; + cl_program prg_imgproc = cl_program_from_file(context, device_id, cl_file, args); + krnl_ = CL_CHECK_ERR(clCreateKernel(prg_imgproc, "process_raw", &err)); + CL_CHECK(clReleaseProgram(prg_imgproc)); } - void queue(cl_command_queue q, cl_mem cam_buf_cl, cl_mem buf_cl, int width, int height, cl_event *debayer_event) { + void queue(cl_command_queue q, cl_mem cam_buf_cl, cl_mem buf_cl, int width, int height, cl_event *imgproc_event, int expo_time) { CL_CHECK(clSetKernelArg(krnl_, 0, sizeof(cl_mem), &cam_buf_cl)); CL_CHECK(clSetKernelArg(krnl_, 1, sizeof(cl_mem), &buf_cl)); + CL_CHECK(clSetKernelArg(krnl_, 2, sizeof(cl_int), &expo_time)); const size_t globalWorkSize[] = {size_t(width / 2), size_t(height / 2)}; - const int debayer_local_worksize = 16; - const size_t localWorkSize[] = {debayer_local_worksize, debayer_local_worksize}; - CL_CHECK(clEnqueueNDRangeKernel(q, krnl_, 2, NULL, globalWorkSize, localWorkSize, 0, 0, debayer_event)); + const int imgproc_local_worksize = 16; + const size_t localWorkSize[] = {imgproc_local_worksize, imgproc_local_worksize}; + CL_CHECK(clEnqueueNDRangeKernel(q, krnl_, 2, NULL, globalWorkSize, localWorkSize, 0, 0, imgproc_event)); } - ~Debayer() { + ~ImgProc() { CL_CHECK(clReleaseKernel(krnl_)); } @@ -92,7 +89,7 @@ void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s, vipc_server->create_buffers_with_sizes(stream_type, YUV_BUFFER_COUNT, false, rgb_width, rgb_height, nv12_size, nv12_width, nv12_uv_offset); LOGD("created %d YUV vipc buffers with size %dx%d", YUV_BUFFER_COUNT, nv12_width, nv12_height); - debayer = new Debayer(device_id, context, this, s, nv12_width, nv12_uv_offset); + imgproc = new ImgProc(device_id, context, this, s, nv12_width, nv12_uv_offset); const cl_queue_properties props[] = {0}; //CL_QUEUE_PRIORITY_KHR, CL_QUEUE_PRIORITY_HIGH_KHR, 0}; q = CL_CHECK_ERR(clCreateCommandQueueWithProperties(context, device_id, props, &err)); @@ -102,7 +99,7 @@ CameraBuf::~CameraBuf() { for (int i = 0; i < frame_buf_count; i++) { camera_bufs[i].free(); } - if (debayer) delete debayer; + if (imgproc) delete imgproc; if (q) CL_CHECK(clReleaseCommandQueue(q)); } @@ -120,7 +117,7 @@ bool CameraBuf::acquire() { double start_time = millis_since_boot(); cl_event event; - debayer->queue(q, camera_bufs[cur_buf_idx].buf_cl, cur_yuv_buf->buf_cl, rgb_width, rgb_height, &event); + imgproc->queue(q, camera_bufs[cur_buf_idx].buf_cl, cur_yuv_buf->buf_cl, rgb_width, rgb_height, &event, cur_frame_data.integ_lines); clWaitForEvents(1, &event); CL_CHECK(clReleaseEvent(event)); cur_frame_data.processing_time = (millis_since_boot() - start_time) / 1000.0; @@ -260,14 +257,14 @@ static void publish_thumbnail(PubMaster *pm, const CameraBuf *b) { pm->send("thumbnail", msg); } -float set_exposure_target(const CameraBuf *b, int x_start, int x_end, int x_skip, int y_start, int y_end, int y_skip) { +float set_exposure_target(const CameraBuf *b, Rect ae_xywh, int x_skip, int y_skip) { int lum_med; uint32_t lum_binning[256] = {0}; const uint8_t *pix_ptr = b->cur_yuv_buf->y; unsigned int lum_total = 0; - for (int y = y_start; y < y_end; y += y_skip) { - for (int x = x_start; x < x_end; x += x_skip) { + for (int y = ae_xywh.y; y < ae_xywh.y + ae_xywh.h; y += y_skip) { + for (int x = ae_xywh.x; x < ae_xywh.x + ae_xywh.w; x += x_skip) { uint8_t lum = pix_ptr[(y * b->rgb_width) + x]; lum_binning[lum]++; lum_total += 1; diff --git a/system/camerad/cameras/camera_common.h b/system/camerad/cameras/camera_common.h index f98691ef00..587968fccb 100644 --- a/system/camerad/cameras/camera_common.h +++ b/system/camerad/cameras/camera_common.h @@ -7,6 +7,7 @@ #include "cereal/messaging/messaging.h" #include "cereal/visionipc/visionipc_server.h" #include "common/queue.h" +#include "common/util.h" const int YUV_BUFFER_COUNT = 20; @@ -44,12 +45,12 @@ typedef struct FrameMetadata { struct MultiCameraState; class CameraState; -class Debayer; +class ImgProc; class CameraBuf { private: VisionIpcServer *vipc_server; - Debayer *debayer = nullptr; + ImgProc *imgproc = nullptr; VisionStreamType stream_type; int cur_buf_idx; SafeQueue safe_queue; @@ -75,7 +76,7 @@ typedef void (*process_thread_cb)(MultiCameraState *s, CameraState *c, int cnt); void fill_frame_data(cereal::FrameData::Builder &framed, const FrameMetadata &frame_data, CameraState *c); kj::Array get_raw_frame_image(const CameraBuf *b); -float set_exposure_target(const CameraBuf *b, int x_start, int x_end, int x_skip, int y_start, int y_end, int y_skip); +float set_exposure_target(const CameraBuf *b, Rect ae_xywh, int x_skip, int y_skip); std::thread start_process_thread(MultiCameraState *cameras, CameraState *cs, process_thread_cb callback); void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx); diff --git a/system/camerad/cameras/camera_qcom2.cc b/system/camerad/cameras/camera_qcom2.cc index 3191b821ac..081279d38d 100644 --- a/system/camerad/cameras/camera_qcom2.cc +++ b/system/camerad/cameras/camera_qcom2.cc @@ -396,6 +396,35 @@ void CameraState::enqueue_req_multi(int start, int n, bool dp) { // ******************* camera ******************* +void CameraState::set_exposure_rect() { + // set areas for each camera, shouldn't be changed + std::vector> ae_targets = { + // (Rect, F) + std::make_pair((Rect){96, 250, 1734, 524}, 567.0), // wide + std::make_pair((Rect){96, 160, 1734, 986}, 2648.0), // road + std::make_pair((Rect){96, 242, 1736, 906}, 567.0) // driver + }; + int h_ref = 1208; + /* + exposure target intrinics is + [ + [F, 0, 0.5*ae_xywh[2]] + [0, F, 0.5*H-ae_xywh[1]] + [0, 0, 1] + ] + */ + auto ae_target = ae_targets[camera_num]; + Rect xywh_ref = ae_target.first; + float fl_ref = ae_target.second; + + ae_xywh = (Rect){ + std::max(0, buf.rgb_width / 2 - (int)(fl_pix / fl_ref * xywh_ref.w / 2)), + std::max(0, buf.rgb_height / 2 - (int)(fl_pix / fl_ref * (h_ref / 2 - xywh_ref.y))), + std::min((int)(fl_pix / fl_ref * xywh_ref.w), buf.rgb_width / 2 + (int)(fl_pix / fl_ref * xywh_ref.w / 2)), + std::min((int)(fl_pix / fl_ref * xywh_ref.h), buf.rgb_height / 2 + (int)(fl_pix / fl_ref * (h_ref / 2 - xywh_ref.y))) + }; +} + void CameraState::sensor_set_parameters() { target_grey_fraction = 0.3; @@ -421,7 +450,7 @@ void CameraState::camera_map_bufs(MultiCameraState *s) { enqueue_req_multi(1, FRAME_BUF_COUNT, 0); } -void CameraState::camera_init(MultiCameraState *s, VisionIpcServer * v, cl_device_id device_id, cl_context ctx, VisionStreamType yuv_type) { +void CameraState::camera_init(MultiCameraState *s, VisionIpcServer * v, cl_device_id device_id, cl_context ctx, VisionStreamType yuv_type, float focal_len) { if (!enabled) return; LOGD("camera init %d", camera_num); @@ -430,6 +459,9 @@ void CameraState::camera_init(MultiCameraState *s, VisionIpcServer * v, cl_devic buf.init(device_id, ctx, this, v, FRAME_BUF_COUNT, yuv_type); camera_map_bufs(s); + + fl_pix = focal_len / ci->pixel_size_mm; + set_exposure_rect(); } void CameraState::camera_open(MultiCameraState *multi_cam_state_, int camera_num_, bool enabled_) { @@ -614,9 +646,9 @@ void CameraState::camera_open(MultiCameraState *multi_cam_state_, int camera_num } void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) { - s->driver_cam.camera_init(s, v, device_id, ctx, VISION_STREAM_DRIVER); - s->road_cam.camera_init(s, v, device_id, ctx, VISION_STREAM_ROAD); - s->wide_road_cam.camera_init(s, v, device_id, ctx, VISION_STREAM_WIDE_ROAD); + s->driver_cam.camera_init(s, v, device_id, ctx, VISION_STREAM_DRIVER, DRIVER_FL_MM); + s->road_cam.camera_init(s, v, device_id, ctx, VISION_STREAM_ROAD, ROAD_FL_MM); + s->wide_road_cam.camera_init(s, v, device_id, ctx, VISION_STREAM_WIDE_ROAD, WIDE_FL_MM); s->pm = new PubMaster({"roadCameraState", "driverCameraState", "wideRoadCameraState", "thumbnail"}); } @@ -902,7 +934,7 @@ void CameraState::set_camera_exposure(float grey_frac) { } static void process_driver_camera(MultiCameraState *s, CameraState *c, int cnt) { - c->set_camera_exposure(set_exposure_target(&c->buf, 96, 1832, 2, 242, 1148, 4)); + c->set_camera_exposure(set_exposure_target(&c->buf, c->ae_xywh, 2, 4)); MessageBuilder msg; auto framed = msg.initEvent().initDriverCameraState(); @@ -927,9 +959,8 @@ void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) { c->ci->processRegisters(c, framed); s->pm->send(c == &s->road_cam ? "roadCameraState" : "wideRoadCameraState", msg); - const auto [x, y, w, h] = (c == &s->wide_road_cam) ? std::tuple(96, 250, 1734, 524) : std::tuple(96, 160, 1734, 986); const int skip = 2; - c->set_camera_exposure(set_exposure_target(b, x, x + w, skip, y, y + h, skip)); + c->set_camera_exposure(set_exposure_target(b, c->ae_xywh, skip, skip)); } void cameras_run(MultiCameraState *s) { diff --git a/system/camerad/cameras/camera_qcom2.h b/system/camerad/cameras/camera_qcom2.h index 47ca578b99..0b15c9c3f0 100644 --- a/system/camerad/cameras/camera_qcom2.h +++ b/system/camerad/cameras/camera_qcom2.h @@ -11,6 +11,10 @@ #define FRAME_BUF_COUNT 4 +#define ROAD_FL_MM 8.0f +#define WIDE_FL_MM 1.71f +#define DRIVER_FL_MM 1.71f + class CameraState { public: MultiCameraState *multi_cam_state; @@ -30,6 +34,7 @@ public: int new_exp_g; int new_exp_t; + Rect ae_xywh; float measured_grey_fraction; float target_grey_fraction; @@ -37,6 +42,7 @@ public: unique_fd csiphy_fd; int camera_num; + float fl_pix; void handle_camera_event(void *evdat); void update_exposure_score(float desired_ev, int exp_t, int exp_g_idx, float exp_gain); @@ -45,9 +51,10 @@ public: void sensors_start(); void camera_open(MultiCameraState *multi_cam_state, int camera_num, bool enabled); + void set_exposure_rect(); void sensor_set_parameters(); void camera_map_bufs(MultiCameraState *s); - void camera_init(MultiCameraState *s, VisionIpcServer *v, cl_device_id device_id, cl_context ctx, VisionStreamType yuv_type); + void camera_init(MultiCameraState *s, VisionIpcServer *v, cl_device_id device_id, cl_context ctx, VisionStreamType yuv_type, float focal_len); void camera_close(); int32_t session_handle; diff --git a/system/camerad/cameras/process_raw.cl b/system/camerad/cameras/process_raw.cl new file mode 100644 index 0000000000..c635fd046e --- /dev/null +++ b/system/camerad/cameras/process_raw.cl @@ -0,0 +1,192 @@ +#include "ar0231_cl.h" +#include "ox03c10_cl.h" +#include "os04c10_cl.h" + +#define UV_WIDTH RGB_WIDTH / 2 +#define UV_HEIGHT RGB_HEIGHT / 2 + +#define RGB_TO_Y(r, g, b) ((((mul24(b, 13) + mul24(g, 65) + mul24(r, 33)) + 64) >> 7) + 16) +#define RGB_TO_U(r, g, b) ((mul24(b, 56) - mul24(g, 37) - mul24(r, 19) + 0x8080) >> 8) +#define RGB_TO_V(r, g, b) ((mul24(r, 56) - mul24(g, 47) - mul24(b, 9) + 0x8080) >> 8) +#define AVERAGE(x, y, z, w) ((convert_ushort(x) + convert_ushort(y) + convert_ushort(z) + convert_ushort(w) + 1) >> 1) + +#if defined(BGGR) + #define ROW_READ_ORDER (int[]){3, 2, 1, 0} + #define RGB_WRITE_ORDER (int[]){2, 3, 0, 1} +#else + #define ROW_READ_ORDER (int[]){0, 1, 2, 3} + #define RGB_WRITE_ORDER (int[]){0, 1, 2, 3} +#endif + +float get_vignetting_s(float r) { + if (r < 62500) { + return (1.0f + 0.0000008f*r); + } else if (r < 490000) { + return (0.9625f + 0.0000014f*r); + } else if (r < 1102500) { + return (1.26434f + 0.0000000000016f*r*r); + } else { + return (0.53503625f + 0.0000000000022f*r*r); + } +} + +int4 parse_12bit(uchar8 pvs) { + // lower bits scambled? + return (int4)(((int)pvs.s0<<4) + (pvs.s1>>4), + ((int)pvs.s2<<4) + (pvs.s4&0xF), + ((int)pvs.s3<<4) + (pvs.s4>>4), + ((int)pvs.s5<<4) + (pvs.s7&0xF)); +} + +int4 parse_10bit(uchar8 pvs, uchar ext, bool aligned) { + if (aligned) { + return (int4)(((int)pvs.s0 << 2) + (pvs.s1 & 0b00000011), + ((int)pvs.s2 << 2) + ((pvs.s6 & 0b11000000) / 64), + ((int)pvs.s3 << 2) + ((pvs.s6 & 0b00110000) / 16), + ((int)pvs.s4 << 2) + ((pvs.s6 & 0b00001100) / 4)); + } else { + return (int4)(((int)pvs.s0 << 2) + ((pvs.s3 & 0b00110000) / 16), + ((int)pvs.s1 << 2) + ((pvs.s3 & 0b00001100) / 4), + ((int)pvs.s2 << 2) + ((pvs.s3 & 0b00000011)), + ((int)pvs.s4 << 2) + ((ext & 0b11000000) / 64)); + } +} + +float get_k(float a, float b, float c, float d) { + return 2.0 - (fabs(a - b) + fabs(c - d)); +} + +__kernel void process_raw(const __global uchar * in, __global uchar * out, int expo_time) +{ + const int gid_x = get_global_id(0); + const int gid_y = get_global_id(1); + + // estimate vignetting + #if VIGNETTING + int gx = (gid_x*2 - RGB_WIDTH/2); + int gy = (gid_y*2 - RGB_HEIGHT/2); + const float vignette_factor = get_vignetting_s((gx*gx + gy*gy) / VIGNETTE_RSZ); + #else + const float vignette_factor = 1.0; + #endif + + const int row_before_offset = (gid_y == 0) ? 2 : 0; + const int row_after_offset = (gid_y == (RGB_HEIGHT/2 - 1)) ? 1 : 3; + + float3 rgb_tmp; + uchar3 rgb_out[4]; // output is 2x2 window + + // read offset + int start_idx; + start_idx = (2 * gid_y - 1) * FRAME_STRIDE + (3 * gid_x - 2) + (FRAME_STRIDE * FRAME_OFFSET); + + // read in 4 rows, 8 uchars each + uchar8 dat[4]; + // row_before + dat[0] = vload8(0, in + start_idx + FRAME_STRIDE*row_before_offset); + // row_0 + if (gid_x == 0 && gid_y == 0) { + // this wasn't a problem due to extra rows + dat[1] = vload8(0, in + start_idx + FRAME_STRIDE*1 + 2); + dat[1] = (uchar8)(0, 0, dat[1].s0, dat[1].s1, dat[1].s2, dat[1].s3, dat[1].s4, dat[1].s5); + } else { + dat[1] = vload8(0, in + start_idx + FRAME_STRIDE*1); + } + // row_1 + dat[2] = vload8(0, in + start_idx + FRAME_STRIDE*2); + // row_after + dat[3] = vload8(0, in + start_idx + FRAME_STRIDE*row_after_offset); + + // read odd rows for staggered second exposure + #if HDR_OFFSET > 0 + uchar8 short_dat[4]; + short_dat[0] = vload8(0, in + start_idx + FRAME_STRIDE*(row_before_offset+HDR_OFFSET/2) + FRAME_STRIDE/2); + short_dat[1] = vload8(0, in + start_idx + FRAME_STRIDE*(1+HDR_OFFSET/2) + FRAME_STRIDE/2); + short_dat[2] = vload8(0, in + start_idx + FRAME_STRIDE*(2+HDR_OFFSET/2) + FRAME_STRIDE/2); + short_dat[3] = vload8(0, in + start_idx + FRAME_STRIDE*(row_after_offset+HDR_OFFSET/2) + FRAME_STRIDE/2); + #endif + + // parse into floats 0.0-1.0 + float4 v_rows[4]; + // no HDR here + int4 parsed = parse_12bit(dat[0]); + v_rows[ROW_READ_ORDER[0]] = normalize_pv(parsed, vignette_factor); + parsed = parse_12bit(dat[1]); + v_rows[ROW_READ_ORDER[1]] = normalize_pv(parsed, vignette_factor); + parsed = parse_12bit(dat[2]); + v_rows[ROW_READ_ORDER[2]] = normalize_pv(parsed, vignette_factor); + parsed = parse_12bit(dat[3]); + v_rows[ROW_READ_ORDER[3]] = normalize_pv(parsed, vignette_factor); + + // mirror padding + if (gid_x == 0) { + v_rows[0].s0 = v_rows[0].s2; + v_rows[1].s0 = v_rows[1].s2; + v_rows[2].s0 = v_rows[2].s2; + v_rows[3].s0 = v_rows[3].s2; + } else if (gid_x == RGB_WIDTH/2 - 1) { + v_rows[0].s3 = v_rows[0].s1; + v_rows[1].s3 = v_rows[1].s1; + v_rows[2].s3 = v_rows[2].s1; + v_rows[3].s3 = v_rows[3].s1; + } + + // debayering + // a simplified version of https://opensignalprocessingjournal.com/contents/volumes/V6/TOSIGPJ-6-1/TOSIGPJ-6-1.pdf + const float k01 = get_k(v_rows[0].s0, v_rows[1].s1, v_rows[0].s2, v_rows[1].s1); + const float k02 = get_k(v_rows[0].s2, v_rows[1].s1, v_rows[2].s2, v_rows[1].s1); + const float k03 = get_k(v_rows[2].s0, v_rows[1].s1, v_rows[2].s2, v_rows[1].s1); + const float k04 = get_k(v_rows[0].s0, v_rows[1].s1, v_rows[2].s0, v_rows[1].s1); + rgb_tmp.x = (k02*v_rows[1].s2+k04*v_rows[1].s0)/(k02+k04); // R_G1 + rgb_tmp.y = v_rows[1].s1; // G1(R) + rgb_tmp.z = (k01*v_rows[0].s1+k03*v_rows[2].s1)/(k01+k03); // B_G1 + rgb_out[RGB_WRITE_ORDER[0]] = convert_uchar3_sat(apply_gamma(color_correct(clamp(rgb_tmp, 0.0, 1.0)), expo_time) * 255.0); + + const float k11 = get_k(v_rows[0].s1, v_rows[2].s1, v_rows[0].s3, v_rows[2].s3); + const float k12 = get_k(v_rows[0].s2, v_rows[1].s1, v_rows[1].s3, v_rows[2].s2); + const float k13 = get_k(v_rows[0].s1, v_rows[0].s3, v_rows[2].s1, v_rows[2].s3); + const float k14 = get_k(v_rows[0].s2, v_rows[1].s3, v_rows[2].s2, v_rows[1].s1); + rgb_tmp.x = v_rows[1].s2; // R + rgb_tmp.y = (k11*(v_rows[0].s2+v_rows[2].s2)*0.5+k13*(v_rows[1].s3+v_rows[1].s1)*0.5)/(k11+k13); // G_R + rgb_tmp.z = (k12*(v_rows[0].s3+v_rows[2].s1)*0.5+k14*(v_rows[0].s1+v_rows[2].s3)*0.5)/(k12+k14); // B_R + rgb_out[RGB_WRITE_ORDER[1]] = convert_uchar3_sat(apply_gamma(color_correct(clamp(rgb_tmp, 0.0, 1.0)), expo_time) * 255.0); + + const float k21 = get_k(v_rows[1].s0, v_rows[3].s0, v_rows[1].s2, v_rows[3].s2); + const float k22 = get_k(v_rows[1].s1, v_rows[2].s0, v_rows[2].s2, v_rows[3].s1); + const float k23 = get_k(v_rows[1].s0, v_rows[1].s2, v_rows[3].s0, v_rows[3].s2); + const float k24 = get_k(v_rows[1].s1, v_rows[2].s2, v_rows[3].s1, v_rows[2].s0); + rgb_tmp.x = (k22*(v_rows[1].s2+v_rows[3].s0)*0.5+k24*(v_rows[1].s0+v_rows[3].s2)*0.5)/(k22+k24); // R_B + rgb_tmp.y = (k21*(v_rows[1].s1+v_rows[3].s1)*0.5+k23*(v_rows[2].s2+v_rows[2].s0)*0.5)/(k21+k23); // G_B + rgb_tmp.z = v_rows[2].s1; // B + rgb_out[RGB_WRITE_ORDER[2]] = convert_uchar3_sat(apply_gamma(color_correct(clamp(rgb_tmp, 0.0, 1.0)), expo_time) * 255.0); + + const float k31 = get_k(v_rows[1].s1, v_rows[2].s2, v_rows[1].s3, v_rows[2].s2); + const float k32 = get_k(v_rows[1].s3, v_rows[2].s2, v_rows[3].s3, v_rows[2].s2); + const float k33 = get_k(v_rows[3].s1, v_rows[2].s2, v_rows[3].s3, v_rows[2].s2); + const float k34 = get_k(v_rows[1].s1, v_rows[2].s2, v_rows[3].s1, v_rows[2].s2); + rgb_tmp.x = (k31*v_rows[1].s2+k33*v_rows[3].s2)/(k31+k33); // R_G2 + rgb_tmp.y = v_rows[2].s2; // G2(B) + rgb_tmp.z = (k32*v_rows[2].s3+k34*v_rows[2].s1)/(k32+k34); // B_G2 + rgb_out[RGB_WRITE_ORDER[3]] = convert_uchar3_sat(apply_gamma(color_correct(clamp(rgb_tmp, 0.0, 1.0)), expo_time) * 255.0); + + // rgb2yuv(nv12) + uchar2 yy = (uchar2)( + RGB_TO_Y(rgb_out[0].s0, rgb_out[0].s1, rgb_out[0].s2), + RGB_TO_Y(rgb_out[1].s0, rgb_out[1].s1, rgb_out[1].s2) + ); + vstore2(yy, 0, out + mad24(gid_y * 2, YUV_STRIDE, gid_x * 2)); + yy = (uchar2)( + RGB_TO_Y(rgb_out[2].s0, rgb_out[2].s1, rgb_out[2].s2), + RGB_TO_Y(rgb_out[3].s0, rgb_out[3].s1, rgb_out[3].s2) + ); + vstore2(yy, 0, out + mad24(gid_y * 2 + 1, YUV_STRIDE, gid_x * 2)); + + const short ar = AVERAGE(rgb_out[0].s0, rgb_out[1].s0, rgb_out[2].s0, rgb_out[3].s0); + const short ag = AVERAGE(rgb_out[0].s1, rgb_out[1].s1, rgb_out[2].s1, rgb_out[3].s1); + const short ab = AVERAGE(rgb_out[0].s2, rgb_out[1].s2, rgb_out[2].s2, rgb_out[3].s2); + uchar2 uv = (uchar2)( + RGB_TO_U(ar, ag, ab), + RGB_TO_V(ar, ag, ab) + ); + vstore2(uv, 0, out + UV_OFFSET + mad24(gid_y, YUV_STRIDE, gid_x * 2)); +} diff --git a/system/camerad/sensors/ar0231.cc b/system/camerad/sensors/ar0231.cc index 5c4934fb61..9b688389c4 100644 --- a/system/camerad/sensors/ar0231.cc +++ b/system/camerad/sensors/ar0231.cc @@ -79,6 +79,7 @@ float ar0231_parse_temp_sensor(uint16_t calib1, uint16_t calib2, uint16_t data_r AR0231::AR0231() { image_sensor = cereal::FrameData::ImageSensor::AR0231; + pixel_size_mm = 0.003; data_word = true; frame_width = 1928; frame_height = 1208; diff --git a/system/camerad/sensors/ar0231_cl.h b/system/camerad/sensors/ar0231_cl.h new file mode 100644 index 0000000000..8e96bbce5b --- /dev/null +++ b/system/camerad/sensors/ar0231_cl.h @@ -0,0 +1,33 @@ +#if SENSOR_ID == 1 + +#define BIT_DEPTH 12 +#define PV_MAX 4096 +#define BLACK_LVL 168 +#define VIGNETTE_RSZ 1.0f + +float4 normalize_pv(int4 parsed, float vignette_factor) { + float4 pv = (convert_float4(parsed) - BLACK_LVL) / (PV_MAX - BLACK_LVL); + return clamp(pv*vignette_factor, 0.0, 1.0); +} + +float3 color_correct(float3 rgb) { + float3 corrected = rgb.x * (float3)(1.82717181, -0.31231438, 0.07307673); + corrected += rgb.y * (float3)(-0.5743977, 1.36858544, -0.53183455); + corrected += rgb.z * (float3)(-0.25277411, -0.05627105, 1.45875782); + return corrected; +} + +float3 apply_gamma(float3 rgb, int expo_time) { + // tone mapping params + const float gamma_k = 0.75; + const float gamma_b = 0.125; + const float mp = 0.01; // ideally midpoint should be adaptive + const float rk = 9 - 100*mp; + + // poly approximation for s curve + return (rgb > mp) ? + ((rk * (rgb-mp) * (1-(gamma_k*mp+gamma_b)) * (1+1/(rk*(1-mp))) / (1+rk*(rgb-mp))) + gamma_k*mp + gamma_b) : + ((rk * (rgb-mp) * (gamma_k*mp+gamma_b) * (1+1/(rk*mp)) / (1-rk*(rgb-mp))) + gamma_k*mp + gamma_b); +} + +#endif \ No newline at end of file diff --git a/system/camerad/sensors/os04c10.cc b/system/camerad/sensors/os04c10.cc index aaef9986b5..cbdc94d289 100644 --- a/system/camerad/sensors/os04c10.cc +++ b/system/camerad/sensors/os04c10.cc @@ -20,6 +20,7 @@ const uint32_t os04c10_analog_gains_reg[] = { OS04C10::OS04C10() { image_sensor = cereal::FrameData::ImageSensor::OS04C10; + pixel_size_mm = 0.002; data_word = false; frame_width = 2688; @@ -42,8 +43,8 @@ OS04C10::OS04C10() { dc_gain_max_weight = 1; dc_gain_on_grey = 0.9; dc_gain_off_grey = 1.0; - exposure_time_min = 2; // 1x - exposure_time_max = 2200; + exposure_time_min = 2; + exposure_time_max = 2400; analog_gain_min_idx = 0x0; analog_gain_rec_idx = 0x0; // 1x analog_gain_max_idx = 0x36; @@ -62,11 +63,8 @@ std::vector OS04C10::getExposureRegisters(int exposure_ti uint32_t long_time = exposure_time; uint32_t real_gain = os04c10_analog_gains_reg[new_exp_g]; - // uint32_t short_time = long_time > exposure_time_min*8 ? long_time / 8 : exposure_time_min; - return { {0x3501, long_time>>8}, {0x3502, long_time&0xFF}, - // {0x3511, short_time>>8}, {0x3512, short_time&0xFF}, {0x3508, real_gain>>8}, {0x3509, real_gain&0xFF}, // {0x350c, real_gain>>8}, {0x350d, real_gain&0xFF}, }; diff --git a/system/camerad/sensors/os04c10_cl.h b/system/camerad/sensors/os04c10_cl.h new file mode 100644 index 0000000000..26c81f3aa3 --- /dev/null +++ b/system/camerad/sensors/os04c10_cl.h @@ -0,0 +1,26 @@ +#if SENSOR_ID == 3 + +#define BGGR + +#define BIT_DEPTH 12 +#define PV_MAX 4096 +#define BLACK_LVL 64 +#define VIGNETTE_RSZ 2.2545f + +float4 normalize_pv(int4 parsed, float vignette_factor) { + float4 pv = (convert_float4(parsed) - BLACK_LVL) / (PV_MAX - BLACK_LVL); + return clamp(pv*vignette_factor, 0.0, 1.0); +} + +float3 color_correct(float3 rgb) { + float3 corrected = rgb.x * (float3)(1.5664815, -0.29808738, -0.03973474); + corrected += rgb.y * (float3)(-0.48672447, 1.41914433, -0.40295248); + corrected += rgb.z * (float3)(-0.07975703, -0.12105695, 1.44268722); + return corrected; +} + +float3 apply_gamma(float3 rgb, int expo_time) { + return powr(rgb, 0.7); +} + +#endif diff --git a/system/camerad/sensors/os04c10_registers.h b/system/camerad/sensors/os04c10_registers.h index f2388d91b8..990d1f7967 100644 --- a/system/camerad/sensors/os04c10_registers.h +++ b/system/camerad/sensors/os04c10_registers.h @@ -310,4 +310,4 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x5104, 0x08}, {0x5105, 0xde}, {0x5106, 0x02}, {0x5107, 0x00}, -}; +}; \ No newline at end of file diff --git a/system/camerad/sensors/ox03c10.cc b/system/camerad/sensors/ox03c10.cc index c74274872f..94efa0ea24 100644 --- a/system/camerad/sensors/ox03c10.cc +++ b/system/camerad/sensors/ox03c10.cc @@ -23,6 +23,7 @@ const uint32_t VS_TIME_MAX_OX03C10 = 34; // vs < 35 OX03C10::OX03C10() { image_sensor = cereal::FrameData::ImageSensor::OX03C10; + pixel_size_mm = 0.003; data_word = false; frame_width = 1928; frame_height = 1208; diff --git a/system/camerad/cameras/real_debayer.cl b/system/camerad/sensors/ox03c10_cl.h similarity index 83% rename from system/camerad/cameras/real_debayer.cl rename to system/camerad/sensors/ox03c10_cl.h index 5f8d046cb5..21441902fc 100644 --- a/system/camerad/cameras/real_debayer.cl +++ b/system/camerad/sensors/ox03c10_cl.h @@ -1,260 +1,43 @@ -#define UV_WIDTH RGB_WIDTH / 2 -#define UV_HEIGHT RGB_HEIGHT / 2 +#if SENSOR_ID == 2 -#define RGB_TO_Y(r, g, b) ((((mul24(b, 13) + mul24(g, 65) + mul24(r, 33)) + 64) >> 7) + 16) -#define RGB_TO_U(r, g, b) ((mul24(b, 56) - mul24(g, 37) - mul24(r, 19) + 0x8080) >> 8) -#define RGB_TO_V(r, g, b) ((mul24(r, 56) - mul24(g, 47) - mul24(b, 9) + 0x8080) >> 8) -#define AVERAGE(x, y, z, w) ((convert_ushort(x) + convert_ushort(y) + convert_ushort(z) + convert_ushort(w) + 1) >> 1) - -float3 color_correct(float3 rgb) { - // color correction - #if IS_OX | IS_OS - float3 x = rgb.x * (float3)(1.5664815 , -0.29808738, -0.03973474); - x += rgb.y * (float3)(-0.48672447, 1.41914433, -0.40295248); - x += rgb.z * (float3)(-0.07975703, -0.12105695, 1.44268722); - #else - float3 x = rgb.x * (float3)(1.82717181, -0.31231438, 0.07307673); - x += rgb.y * (float3)(-0.5743977, 1.36858544, -0.53183455); - x += rgb.z * (float3)(-0.25277411, -0.05627105, 1.45875782); - #endif - - #if IS_OX - return -0.507089*exp(-12.54124638*x)+0.9655*powr(x,0.5)-0.472597*x+0.507089; - #elif IS_OS - return powr(x,0.7); - #else - // tone mapping params - const float gamma_k = 0.75; - const float gamma_b = 0.125; - const float mp = 0.01; // ideally midpoint should be adaptive - const float rk = 9 - 100*mp; - - // poly approximation for s curve - return (x > mp) ? - ((rk * (x-mp) * (1-(gamma_k*mp+gamma_b)) * (1+1/(rk*(1-mp))) / (1+rk*(x-mp))) + gamma_k*mp + gamma_b) : - ((rk * (x-mp) * (gamma_k*mp+gamma_b) * (1+1/(rk*mp)) / (1-rk*(x-mp))) + gamma_k*mp + gamma_b); - #endif -} - -float get_vignetting_s(float r) { - #if IS_OS - r = r / 2.2545f; - #endif - if (r < 62500) { - return (1.0f + 0.0000008f*r); - } else if (r < 490000) { - return (0.9625f + 0.0000014f*r); - } else if (r < 1102500) { - return (1.26434f + 0.0000000000016f*r*r); - } else { - return (0.53503625f + 0.0000000000022f*r*r); - } -} +#define BIT_DEPTH 12 +#define BLACK_LVL 64 +#define VIGNETTE_RSZ 1.0f constant float ox03c10_lut[] = { - 0.0000e+00, 5.9488e-08, 1.1898e-07, 1.7846e-07, 2.3795e-07, 2.9744e-07, 3.5693e-07, 4.1642e-07, 4.7591e-07, 5.3539e-07, 5.9488e-07, 6.5437e-07, 7.1386e-07, 7.7335e-07, 8.3284e-07, 8.9232e-07, 9.5181e-07, 1.0113e-06, 1.0708e-06, 1.1303e-06, 1.1898e-06, 1.2493e-06, 1.3087e-06, 1.3682e-06, 1.4277e-06, 1.4872e-06, 1.5467e-06, 1.6062e-06, 1.6657e-06, 1.7252e-06, 1.7846e-06, 1.8441e-06, 1.9036e-06, 1.9631e-06, 2.0226e-06, 2.0821e-06, 2.1416e-06, 2.2011e-06, 2.2606e-06, 2.3200e-06, 2.3795e-06, 2.4390e-06, 2.4985e-06, 2.5580e-06, 2.6175e-06, 2.6770e-06, 2.7365e-06, 2.7959e-06, 2.8554e-06, 2.9149e-06, 2.9744e-06, 3.0339e-06, 3.0934e-06, 3.1529e-06, 3.2124e-06, 3.2719e-06, 3.3313e-06, 3.3908e-06, 3.4503e-06, 3.5098e-06, 3.5693e-06, 3.6288e-06, 3.6883e-06, 3.7478e-06, 3.8072e-06, 3.8667e-06, 3.9262e-06, 3.9857e-06, 4.0452e-06, 4.1047e-06, 4.1642e-06, 4.2237e-06, 4.2832e-06, 4.3426e-06, 4.4021e-06, 4.4616e-06, 4.5211e-06, 4.5806e-06, 4.6401e-06, 4.6996e-06, 4.7591e-06, 4.8185e-06, 4.8780e-06, 4.9375e-06, 4.9970e-06, 5.0565e-06, 5.1160e-06, 5.1755e-06, 5.2350e-06, 5.2945e-06, 5.3539e-06, 5.4134e-06, 5.4729e-06, 5.5324e-06, 5.5919e-06, 5.6514e-06, 5.7109e-06, 5.7704e-06, 5.8298e-06, 5.8893e-06, 5.9488e-06, 6.0083e-06, 6.0678e-06, 6.1273e-06, 6.1868e-06, 6.2463e-06, 6.3058e-06, 6.3652e-06, 6.4247e-06, 6.4842e-06, 6.5437e-06, 6.6032e-06, 6.6627e-06, 6.7222e-06, 6.7817e-06, 6.8411e-06, 6.9006e-06, 6.9601e-06, 7.0196e-06, 7.0791e-06, 7.1386e-06, 7.1981e-06, 7.2576e-06, 7.3171e-06, 7.3765e-06, 7.4360e-06, 7.4955e-06, 7.5550e-06, 7.6145e-06, 7.6740e-06, 7.7335e-06, 7.7930e-06, 7.8524e-06, 7.9119e-06, 7.9714e-06, 8.0309e-06, 8.0904e-06, 8.1499e-06, 8.2094e-06, 8.2689e-06, 8.3284e-06, 8.3878e-06, 8.4473e-06, 8.5068e-06, 8.5663e-06, 8.6258e-06, 8.6853e-06, 8.7448e-06, 8.8043e-06, 8.8637e-06, 8.9232e-06, 8.9827e-06, 9.0422e-06, 9.1017e-06, 9.1612e-06, 9.2207e-06, 9.2802e-06, 9.3397e-06, 9.3991e-06, 9.4586e-06, 9.5181e-06, 9.5776e-06, 9.6371e-06, 9.6966e-06, 9.7561e-06, 9.8156e-06, 9.8750e-06, 9.9345e-06, 9.9940e-06, 1.0054e-05, 1.0113e-05, 1.0172e-05, 1.0232e-05, 1.0291e-05, 1.0351e-05, 1.0410e-05, 1.0470e-05, 1.0529e-05, 1.0589e-05, 1.0648e-05, 1.0708e-05, 1.0767e-05, 1.0827e-05, 1.0886e-05, 1.0946e-05, 1.1005e-05, 1.1065e-05, 1.1124e-05, 1.1184e-05, 1.1243e-05, 1.1303e-05, 1.1362e-05, 1.1422e-05, 1.1481e-05, 1.1541e-05, 1.1600e-05, 1.1660e-05, 1.1719e-05, 1.1779e-05, 1.1838e-05, 1.1898e-05, 1.1957e-05, 1.2017e-05, 1.2076e-05, 1.2136e-05, 1.2195e-05, 1.2255e-05, 1.2314e-05, 1.2374e-05, 1.2433e-05, 1.2493e-05, 1.2552e-05, 1.2612e-05, 1.2671e-05, 1.2730e-05, 1.2790e-05, 1.2849e-05, 1.2909e-05, 1.2968e-05, 1.3028e-05, 1.3087e-05, 1.3147e-05, 1.3206e-05, 1.3266e-05, 1.3325e-05, 1.3385e-05, 1.3444e-05, 1.3504e-05, 1.3563e-05, 1.3623e-05, 1.3682e-05, 1.3742e-05, 1.3801e-05, 1.3861e-05, 1.3920e-05, 1.3980e-05, 1.4039e-05, 1.4099e-05, 1.4158e-05, 1.4218e-05, 1.4277e-05, 1.4337e-05, 1.4396e-05, 1.4456e-05, 1.4515e-05, 1.4575e-05, 1.4634e-05, 1.4694e-05, 1.4753e-05, 1.4813e-05, 1.4872e-05, 1.4932e-05, 1.4991e-05, 1.5051e-05, 1.5110e-05, 1.5169e-05, - 1.5229e-05, 1.5288e-05, 1.5348e-05, 1.5407e-05, 1.5467e-05, 1.5526e-05, 1.5586e-05, 1.5645e-05, 1.5705e-05, 1.5764e-05, 1.5824e-05, 1.5883e-05, 1.5943e-05, 1.6002e-05, 1.6062e-05, 1.6121e-05, 1.6181e-05, 1.6240e-05, 1.6300e-05, 1.6359e-05, 1.6419e-05, 1.6478e-05, 1.6538e-05, 1.6597e-05, 1.6657e-05, 1.6716e-05, 1.6776e-05, 1.6835e-05, 1.6895e-05, 1.6954e-05, 1.7014e-05, 1.7073e-05, 1.7133e-05, 1.7192e-05, 1.7252e-05, 1.7311e-05, 1.7371e-05, 1.7430e-05, 1.7490e-05, 1.7549e-05, 1.7609e-05, 1.7668e-05, 1.7727e-05, 1.7787e-05, 1.7846e-05, 1.7906e-05, 1.7965e-05, 1.8025e-05, 1.8084e-05, 1.8144e-05, 1.8203e-05, 1.8263e-05, 1.8322e-05, 1.8382e-05, 1.8441e-05, 1.8501e-05, 1.8560e-05, 1.8620e-05, 1.8679e-05, 1.8739e-05, 1.8798e-05, 1.8858e-05, 1.8917e-05, 1.8977e-05, 1.9036e-05, 1.9096e-05, 1.9155e-05, 1.9215e-05, 1.9274e-05, 1.9334e-05, 1.9393e-05, 1.9453e-05, 1.9512e-05, 1.9572e-05, 1.9631e-05, 1.9691e-05, 1.9750e-05, 1.9810e-05, 1.9869e-05, 1.9929e-05, 1.9988e-05, 2.0048e-05, 2.0107e-05, 2.0167e-05, 2.0226e-05, 2.0285e-05, 2.0345e-05, 2.0404e-05, 2.0464e-05, 2.0523e-05, 2.0583e-05, 2.0642e-05, 2.0702e-05, 2.0761e-05, 2.0821e-05, 2.0880e-05, 2.0940e-05, 2.0999e-05, 2.1059e-05, 2.1118e-05, 2.1178e-05, 2.1237e-05, 2.1297e-05, 2.1356e-05, 2.1416e-05, 2.1475e-05, 2.1535e-05, 2.1594e-05, 2.1654e-05, 2.1713e-05, 2.1773e-05, 2.1832e-05, 2.1892e-05, 2.1951e-05, 2.2011e-05, 2.2070e-05, 2.2130e-05, 2.2189e-05, 2.2249e-05, 2.2308e-05, 2.2368e-05, 2.2427e-05, 2.2487e-05, 2.2546e-05, 2.2606e-05, 2.2665e-05, 2.2725e-05, 2.2784e-05, 2.2843e-05, 2.2903e-05, 2.2962e-05, 2.3022e-05, 2.3081e-05, 2.3141e-05, 2.3200e-05, 2.3260e-05, 2.3319e-05, 2.3379e-05, 2.3438e-05, 2.3498e-05, 2.3557e-05, 2.3617e-05, 2.3676e-05, 2.3736e-05, 2.3795e-05, 2.3855e-05, 2.3914e-05, 2.3974e-05, 2.4033e-05, 2.4093e-05, 2.4152e-05, 2.4212e-05, 2.4271e-05, 2.4331e-05, 2.4390e-05, 2.4450e-05, 2.4509e-05, 2.4569e-05, 2.4628e-05, 2.4688e-05, 2.4747e-05, 2.4807e-05, 2.4866e-05, 2.4926e-05, 2.4985e-05, 2.5045e-05, 2.5104e-05, 2.5164e-05, 2.5223e-05, 2.5282e-05, 2.5342e-05, 2.5401e-05, 2.5461e-05, 2.5520e-05, 2.5580e-05, 2.5639e-05, 2.5699e-05, 2.5758e-05, 2.5818e-05, 2.5877e-05, 2.5937e-05, 2.5996e-05, 2.6056e-05, 2.6115e-05, 2.6175e-05, 2.6234e-05, 2.6294e-05, 2.6353e-05, 2.6413e-05, 2.6472e-05, 2.6532e-05, 2.6591e-05, 2.6651e-05, 2.6710e-05, 2.6770e-05, 2.6829e-05, 2.6889e-05, 2.6948e-05, 2.7008e-05, 2.7067e-05, 2.7127e-05, 2.7186e-05, 2.7246e-05, 2.7305e-05, 2.7365e-05, 2.7424e-05, 2.7484e-05, 2.7543e-05, 2.7603e-05, 2.7662e-05, 2.7722e-05, 2.7781e-05, 2.7840e-05, 2.7900e-05, 2.7959e-05, 2.8019e-05, 2.8078e-05, 2.8138e-05, 2.8197e-05, 2.8257e-05, 2.8316e-05, 2.8376e-05, 2.8435e-05, 2.8495e-05, 2.8554e-05, 2.8614e-05, 2.8673e-05, 2.8733e-05, 2.8792e-05, 2.8852e-05, 2.8911e-05, 2.8971e-05, 2.9030e-05, 2.9090e-05, 2.9149e-05, 2.9209e-05, 2.9268e-05, 2.9328e-05, 2.9387e-05, 2.9447e-05, 2.9506e-05, 2.9566e-05, 2.9625e-05, 2.9685e-05, 2.9744e-05, 2.9804e-05, 2.9863e-05, 2.9923e-05, 2.9982e-05, 3.0042e-05, 3.0101e-05, 3.0161e-05, 3.0220e-05, 3.0280e-05, 3.0339e-05, 3.0398e-05, - 3.0458e-05, 3.0577e-05, 3.0697e-05, 3.0816e-05, 3.0936e-05, 3.1055e-05, 3.1175e-05, 3.1294e-05, 3.1414e-05, 3.1533e-05, 3.1652e-05, 3.1772e-05, 3.1891e-05, 3.2011e-05, 3.2130e-05, 3.2250e-05, 3.2369e-05, 3.2489e-05, 3.2608e-05, 3.2727e-05, 3.2847e-05, 3.2966e-05, 3.3086e-05, 3.3205e-05, 3.3325e-05, 3.3444e-05, 3.3563e-05, 3.3683e-05, 3.3802e-05, 3.3922e-05, 3.4041e-05, 3.4161e-05, 3.4280e-05, 3.4400e-05, 3.4519e-05, 3.4638e-05, 3.4758e-05, 3.4877e-05, 3.4997e-05, 3.5116e-05, 3.5236e-05, 3.5355e-05, 3.5475e-05, 3.5594e-05, 3.5713e-05, 3.5833e-05, 3.5952e-05, 3.6072e-05, 3.6191e-05, 3.6311e-05, 3.6430e-05, 3.6550e-05, 3.6669e-05, 3.6788e-05, 3.6908e-05, 3.7027e-05, 3.7147e-05, 3.7266e-05, 3.7386e-05, 3.7505e-05, 3.7625e-05, 3.7744e-05, 3.7863e-05, 3.7983e-05, 3.8102e-05, 3.8222e-05, 3.8341e-05, 3.8461e-05, 3.8580e-05, 3.8700e-05, 3.8819e-05, 3.8938e-05, 3.9058e-05, 3.9177e-05, 3.9297e-05, 3.9416e-05, 3.9536e-05, 3.9655e-05, 3.9775e-05, 3.9894e-05, 4.0013e-05, 4.0133e-05, 4.0252e-05, 4.0372e-05, 4.0491e-05, 4.0611e-05, 4.0730e-05, 4.0850e-05, 4.0969e-05, 4.1088e-05, 4.1208e-05, 4.1327e-05, 4.1447e-05, 4.1566e-05, 4.1686e-05, 4.1805e-05, 4.1925e-05, 4.2044e-05, 4.2163e-05, 4.2283e-05, 4.2402e-05, 4.2522e-05, 4.2641e-05, 4.2761e-05, 4.2880e-05, 4.2999e-05, 4.3119e-05, 4.3238e-05, 4.3358e-05, 4.3477e-05, 4.3597e-05, 4.3716e-05, 4.3836e-05, 4.3955e-05, 4.4074e-05, 4.4194e-05, 4.4313e-05, 4.4433e-05, 4.4552e-05, 4.4672e-05, 4.4791e-05, 4.4911e-05, 4.5030e-05, 4.5149e-05, 4.5269e-05, 4.5388e-05, 4.5508e-05, 4.5627e-05, 4.5747e-05, 4.5866e-05, 4.5986e-05, 4.6105e-05, 4.6224e-05, 4.6344e-05, 4.6463e-05, 4.6583e-05, 4.6702e-05, 4.6822e-05, 4.6941e-05, 4.7061e-05, 4.7180e-05, 4.7299e-05, 4.7419e-05, 4.7538e-05, 4.7658e-05, 4.7777e-05, 4.7897e-05, 4.8016e-05, 4.8136e-05, 4.8255e-05, 4.8374e-05, 4.8494e-05, 4.8613e-05, 4.8733e-05, 4.8852e-05, 4.8972e-05, 4.9091e-05, 4.9211e-05, 4.9330e-05, 4.9449e-05, 4.9569e-05, 4.9688e-05, 4.9808e-05, 4.9927e-05, 5.0047e-05, 5.0166e-05, 5.0286e-05, 5.0405e-05, 5.0524e-05, 5.0644e-05, 5.0763e-05, 5.0883e-05, 5.1002e-05, 5.1122e-05, 5.1241e-05, 5.1361e-05, 5.1480e-05, 5.1599e-05, 5.1719e-05, 5.1838e-05, 5.1958e-05, 5.2077e-05, 5.2197e-05, 5.2316e-05, 5.2435e-05, 5.2555e-05, 5.2674e-05, 5.2794e-05, 5.2913e-05, 5.3033e-05, 5.3152e-05, 5.3272e-05, 5.3391e-05, 5.3510e-05, 5.3630e-05, 5.3749e-05, 5.3869e-05, 5.3988e-05, 5.4108e-05, 5.4227e-05, 5.4347e-05, 5.4466e-05, 5.4585e-05, 5.4705e-05, 5.4824e-05, 5.4944e-05, 5.5063e-05, 5.5183e-05, 5.5302e-05, 5.5422e-05, 5.5541e-05, 5.5660e-05, 5.5780e-05, 5.5899e-05, 5.6019e-05, 5.6138e-05, 5.6258e-05, 5.6377e-05, 5.6497e-05, 5.6616e-05, 5.6735e-05, 5.6855e-05, 5.6974e-05, 5.7094e-05, 5.7213e-05, 5.7333e-05, 5.7452e-05, 5.7572e-05, 5.7691e-05, 5.7810e-05, 5.7930e-05, 5.8049e-05, 5.8169e-05, 5.8288e-05, 5.8408e-05, 5.8527e-05, 5.8647e-05, 5.8766e-05, 5.8885e-05, 5.9005e-05, 5.9124e-05, 5.9244e-05, 5.9363e-05, 5.9483e-05, 5.9602e-05, 5.9722e-05, 5.9841e-05, 5.9960e-05, 6.0080e-05, 6.0199e-05, 6.0319e-05, 6.0438e-05, 6.0558e-05, 6.0677e-05, 6.0797e-05, 6.0916e-05, - 6.1154e-05, 6.1392e-05, 6.1631e-05, 6.1869e-05, 6.2107e-05, 6.2345e-05, 6.2583e-05, 6.2821e-05, 6.3060e-05, 6.3298e-05, 6.3536e-05, 6.3774e-05, 6.4012e-05, 6.4251e-05, 6.4489e-05, 6.4727e-05, 6.4965e-05, 6.5203e-05, 6.5441e-05, 6.5680e-05, 6.5918e-05, 6.6156e-05, 6.6394e-05, 6.6632e-05, 6.6871e-05, 6.7109e-05, 6.7347e-05, 6.7585e-05, 6.7823e-05, 6.8062e-05, 6.8300e-05, 6.8538e-05, 6.8776e-05, 6.9014e-05, 6.9252e-05, 6.9491e-05, 6.9729e-05, 6.9967e-05, 7.0205e-05, 7.0443e-05, 7.0682e-05, 7.0920e-05, 7.1158e-05, 7.1396e-05, 7.1634e-05, 7.1872e-05, 7.2111e-05, 7.2349e-05, 7.2587e-05, 7.2825e-05, 7.3063e-05, 7.3302e-05, 7.3540e-05, 7.3778e-05, 7.4016e-05, 7.4254e-05, 7.4493e-05, 7.4731e-05, 7.4969e-05, 7.5207e-05, 7.5445e-05, 7.5683e-05, 7.5922e-05, 7.6160e-05, 7.6398e-05, 7.6636e-05, 7.6874e-05, 7.7113e-05, 7.7351e-05, 7.7589e-05, 7.7827e-05, 7.8065e-05, 7.8304e-05, 7.8542e-05, 7.8780e-05, 7.9018e-05, 7.9256e-05, 7.9494e-05, 7.9733e-05, 7.9971e-05, 8.0209e-05, 8.0447e-05, 8.0685e-05, 8.0924e-05, 8.1162e-05, 8.1400e-05, 8.1638e-05, 8.1876e-05, 8.2114e-05, 8.2353e-05, 8.2591e-05, 8.2829e-05, 8.3067e-05, 8.3305e-05, 8.3544e-05, 8.3782e-05, 8.4020e-05, 8.4258e-05, 8.4496e-05, 8.4735e-05, 8.4973e-05, 8.5211e-05, 8.5449e-05, 8.5687e-05, 8.5925e-05, 8.6164e-05, 8.6402e-05, 8.6640e-05, 8.6878e-05, 8.7116e-05, 8.7355e-05, 8.7593e-05, 8.7831e-05, 8.8069e-05, 8.8307e-05, 8.8545e-05, 8.8784e-05, 8.9022e-05, 8.9260e-05, 8.9498e-05, 8.9736e-05, 8.9975e-05, 9.0213e-05, 9.0451e-05, 9.0689e-05, 9.0927e-05, 9.1166e-05, 9.1404e-05, 9.1642e-05, 9.1880e-05, 9.2118e-05, 9.2356e-05, 9.2595e-05, 9.2833e-05, 9.3071e-05, 9.3309e-05, 9.3547e-05, 9.3786e-05, 9.4024e-05, 9.4262e-05, 9.4500e-05, 9.4738e-05, 9.4977e-05, 9.5215e-05, 9.5453e-05, 9.5691e-05, 9.5929e-05, 9.6167e-05, 9.6406e-05, 9.6644e-05, 9.6882e-05, 9.7120e-05, 9.7358e-05, 9.7597e-05, 9.7835e-05, 9.8073e-05, 9.8311e-05, 9.8549e-05, 9.8787e-05, 9.9026e-05, 9.9264e-05, 9.9502e-05, 9.9740e-05, 9.9978e-05, 1.0022e-04, 1.0045e-04, 1.0069e-04, 1.0093e-04, 1.0117e-04, 1.0141e-04, 1.0165e-04, 1.0188e-04, 1.0212e-04, 1.0236e-04, 1.0260e-04, 1.0284e-04, 1.0307e-04, 1.0331e-04, 1.0355e-04, 1.0379e-04, 1.0403e-04, 1.0427e-04, 1.0450e-04, 1.0474e-04, 1.0498e-04, 1.0522e-04, 1.0546e-04, 1.0569e-04, 1.0593e-04, 1.0617e-04, 1.0641e-04, 1.0665e-04, 1.0689e-04, 1.0712e-04, 1.0736e-04, 1.0760e-04, 1.0784e-04, 1.0808e-04, 1.0831e-04, 1.0855e-04, 1.0879e-04, 1.0903e-04, 1.0927e-04, 1.0951e-04, 1.0974e-04, 1.0998e-04, 1.1022e-04, 1.1046e-04, 1.1070e-04, 1.1093e-04, 1.1117e-04, 1.1141e-04, 1.1165e-04, 1.1189e-04, 1.1213e-04, 1.1236e-04, 1.1260e-04, 1.1284e-04, 1.1308e-04, 1.1332e-04, 1.1355e-04, 1.1379e-04, 1.1403e-04, 1.1427e-04, 1.1451e-04, 1.1475e-04, 1.1498e-04, 1.1522e-04, 1.1546e-04, 1.1570e-04, 1.1594e-04, 1.1618e-04, 1.1641e-04, 1.1665e-04, 1.1689e-04, 1.1713e-04, 1.1737e-04, 1.1760e-04, 1.1784e-04, 1.1808e-04, 1.1832e-04, 1.1856e-04, 1.1880e-04, 1.1903e-04, 1.1927e-04, 1.1951e-04, 1.1975e-04, 1.1999e-04, 1.2022e-04, 1.2046e-04, 1.2070e-04, 1.2094e-04, 1.2118e-04, 1.2142e-04, 1.2165e-04, 1.2189e-04, - 1.2213e-04, 1.2237e-04, 1.2261e-04, 1.2284e-04, 1.2308e-04, 1.2332e-04, 1.2356e-04, 1.2380e-04, 1.2404e-04, 1.2427e-04, 1.2451e-04, 1.2475e-04, 1.2499e-04, 1.2523e-04, 1.2546e-04, 1.2570e-04, 1.2594e-04, 1.2618e-04, 1.2642e-04, 1.2666e-04, 1.2689e-04, 1.2713e-04, 1.2737e-04, 1.2761e-04, 1.2785e-04, 1.2808e-04, 1.2832e-04, 1.2856e-04, 1.2880e-04, 1.2904e-04, 1.2928e-04, 1.2951e-04, 1.2975e-04, 1.2999e-04, 1.3023e-04, 1.3047e-04, 1.3070e-04, 1.3094e-04, 1.3118e-04, 1.3142e-04, 1.3166e-04, 1.3190e-04, 1.3213e-04, 1.3237e-04, 1.3261e-04, 1.3285e-04, 1.3309e-04, 1.3332e-04, 1.3356e-04, 1.3380e-04, 1.3404e-04, 1.3428e-04, 1.3452e-04, 1.3475e-04, 1.3499e-04, 1.3523e-04, 1.3547e-04, 1.3571e-04, 1.3594e-04, 1.3618e-04, 1.3642e-04, 1.3666e-04, 1.3690e-04, 1.3714e-04, 1.3737e-04, 1.3761e-04, 1.3785e-04, 1.3809e-04, 1.3833e-04, 1.3856e-04, 1.3880e-04, 1.3904e-04, 1.3928e-04, 1.3952e-04, 1.3976e-04, 1.3999e-04, 1.4023e-04, 1.4047e-04, 1.4071e-04, 1.4095e-04, 1.4118e-04, 1.4142e-04, 1.4166e-04, 1.4190e-04, 1.4214e-04, 1.4238e-04, 1.4261e-04, 1.4285e-04, 1.4309e-04, 1.4333e-04, 1.4357e-04, 1.4380e-04, 1.4404e-04, 1.4428e-04, 1.4452e-04, 1.4476e-04, 1.4500e-04, 1.4523e-04, 1.4547e-04, 1.4571e-04, 1.4595e-04, 1.4619e-04, 1.4642e-04, 1.4666e-04, 1.4690e-04, 1.4714e-04, 1.4738e-04, 1.4762e-04, 1.4785e-04, 1.4809e-04, 1.4833e-04, 1.4857e-04, 1.4881e-04, 1.4904e-04, 1.4928e-04, 1.4952e-04, 1.4976e-04, 1.5000e-04, 1.5024e-04, 1.5047e-04, 1.5071e-04, 1.5095e-04, 1.5119e-04, 1.5143e-04, 1.5166e-04, 1.5190e-04, 1.5214e-04, 1.5238e-04, 1.5262e-04, 1.5286e-04, 1.5309e-04, 1.5333e-04, 1.5357e-04, 1.5381e-04, 1.5405e-04, 1.5428e-04, 1.5452e-04, 1.5476e-04, 1.5500e-04, 1.5524e-04, 1.5548e-04, 1.5571e-04, 1.5595e-04, 1.5619e-04, 1.5643e-04, 1.5667e-04, 1.5690e-04, 1.5714e-04, 1.5738e-04, 1.5762e-04, 1.5786e-04, 1.5810e-04, 1.5833e-04, 1.5857e-04, 1.5881e-04, 1.5905e-04, 1.5929e-04, 1.5952e-04, 1.5976e-04, 1.6000e-04, 1.6024e-04, 1.6048e-04, 1.6072e-04, 1.6095e-04, 1.6119e-04, 1.6143e-04, 1.6167e-04, 1.6191e-04, 1.6214e-04, 1.6238e-04, 1.6262e-04, 1.6286e-04, 1.6310e-04, 1.6334e-04, 1.6357e-04, 1.6381e-04, 1.6405e-04, 1.6429e-04, 1.6453e-04, 1.6476e-04, 1.6500e-04, 1.6524e-04, 1.6548e-04, 1.6572e-04, 1.6596e-04, 1.6619e-04, 1.6643e-04, 1.6667e-04, 1.6691e-04, 1.6715e-04, 1.6738e-04, 1.6762e-04, 1.6786e-04, 1.6810e-04, 1.6834e-04, 1.6858e-04, 1.6881e-04, 1.6905e-04, 1.6929e-04, 1.6953e-04, 1.6977e-04, 1.7001e-04, 1.7024e-04, 1.7048e-04, 1.7072e-04, 1.7096e-04, 1.7120e-04, 1.7143e-04, 1.7167e-04, 1.7191e-04, 1.7215e-04, 1.7239e-04, 1.7263e-04, 1.7286e-04, 1.7310e-04, 1.7334e-04, 1.7358e-04, 1.7382e-04, 1.7405e-04, 1.7429e-04, 1.7453e-04, 1.7477e-04, 1.7501e-04, 1.7525e-04, 1.7548e-04, 1.7572e-04, 1.7596e-04, 1.7620e-04, 1.7644e-04, 1.7667e-04, 1.7691e-04, 1.7715e-04, 1.7739e-04, 1.7763e-04, 1.7787e-04, 1.7810e-04, 1.7834e-04, 1.7858e-04, 1.7882e-04, 1.7906e-04, 1.7929e-04, 1.7953e-04, 1.7977e-04, 1.8001e-04, 1.8025e-04, 1.8049e-04, 1.8072e-04, 1.8096e-04, 1.8120e-04, 1.8144e-04, 1.8168e-04, 1.8191e-04, 1.8215e-04, 1.8239e-04, 1.8263e-04, 1.8287e-04, - 1.8311e-04, 1.8334e-04, 1.8358e-04, 1.8382e-04, 1.8406e-04, 1.8430e-04, 1.8453e-04, 1.8477e-04, 1.8501e-04, 1.8525e-04, 1.8549e-04, 1.8573e-04, 1.8596e-04, 1.8620e-04, 1.8644e-04, 1.8668e-04, 1.8692e-04, 1.8715e-04, 1.8739e-04, 1.8763e-04, 1.8787e-04, 1.8811e-04, 1.8835e-04, 1.8858e-04, 1.8882e-04, 1.8906e-04, 1.8930e-04, 1.8954e-04, 1.8977e-04, 1.9001e-04, 1.9025e-04, 1.9049e-04, 1.9073e-04, 1.9097e-04, 1.9120e-04, 1.9144e-04, 1.9168e-04, 1.9192e-04, 1.9216e-04, 1.9239e-04, 1.9263e-04, 1.9287e-04, 1.9311e-04, 1.9335e-04, 1.9359e-04, 1.9382e-04, 1.9406e-04, 1.9430e-04, 1.9454e-04, 1.9478e-04, 1.9501e-04, 1.9525e-04, 1.9549e-04, 1.9573e-04, 1.9597e-04, 1.9621e-04, 1.9644e-04, 1.9668e-04, 1.9692e-04, 1.9716e-04, 1.9740e-04, 1.9763e-04, 1.9787e-04, 1.9811e-04, 1.9835e-04, 1.9859e-04, 1.9883e-04, 1.9906e-04, 1.9930e-04, 1.9954e-04, 1.9978e-04, 2.0002e-04, 2.0025e-04, 2.0049e-04, 2.0073e-04, 2.0097e-04, 2.0121e-04, 2.0145e-04, 2.0168e-04, 2.0192e-04, 2.0216e-04, 2.0240e-04, 2.0264e-04, 2.0287e-04, 2.0311e-04, 2.0335e-04, 2.0359e-04, 2.0383e-04, 2.0407e-04, 2.0430e-04, 2.0454e-04, 2.0478e-04, 2.0502e-04, 2.0526e-04, 2.0549e-04, 2.0573e-04, 2.0597e-04, 2.0621e-04, 2.0645e-04, 2.0669e-04, 2.0692e-04, 2.0716e-04, 2.0740e-04, 2.0764e-04, 2.0788e-04, 2.0811e-04, 2.0835e-04, 2.0859e-04, 2.0883e-04, 2.0907e-04, 2.0931e-04, 2.0954e-04, 2.0978e-04, 2.1002e-04, 2.1026e-04, 2.1050e-04, 2.1073e-04, 2.1097e-04, 2.1121e-04, 2.1145e-04, 2.1169e-04, 2.1193e-04, 2.1216e-04, 2.1240e-04, 2.1264e-04, 2.1288e-04, 2.1312e-04, 2.1335e-04, 2.1359e-04, 2.1383e-04, 2.1407e-04, 2.1431e-04, 2.1455e-04, 2.1478e-04, 2.1502e-04, 2.1526e-04, 2.1550e-04, 2.1574e-04, 2.1597e-04, 2.1621e-04, 2.1645e-04, 2.1669e-04, 2.1693e-04, 2.1717e-04, 2.1740e-04, 2.1764e-04, 2.1788e-04, 2.1812e-04, 2.1836e-04, 2.1859e-04, 2.1883e-04, 2.1907e-04, 2.1931e-04, 2.1955e-04, 2.1979e-04, 2.2002e-04, 2.2026e-04, 2.2050e-04, 2.2074e-04, 2.2098e-04, 2.2121e-04, 2.2145e-04, 2.2169e-04, 2.2193e-04, 2.2217e-04, 2.2241e-04, 2.2264e-04, 2.2288e-04, 2.2312e-04, 2.2336e-04, 2.2360e-04, 2.2383e-04, 2.2407e-04, 2.2431e-04, 2.2455e-04, 2.2479e-04, 2.2503e-04, 2.2526e-04, 2.2550e-04, 2.2574e-04, 2.2598e-04, 2.2622e-04, 2.2646e-04, 2.2669e-04, 2.2693e-04, 2.2717e-04, 2.2741e-04, 2.2765e-04, 2.2788e-04, 2.2812e-04, 2.2836e-04, 2.2860e-04, 2.2884e-04, 2.2908e-04, 2.2931e-04, 2.2955e-04, 2.2979e-04, 2.3003e-04, 2.3027e-04, 2.3050e-04, 2.3074e-04, 2.3098e-04, 2.3122e-04, 2.3146e-04, 2.3170e-04, 2.3193e-04, 2.3217e-04, 2.3241e-04, 2.3265e-04, 2.3289e-04, 2.3312e-04, 2.3336e-04, 2.3360e-04, 2.3384e-04, 2.3408e-04, 2.3432e-04, 2.3455e-04, 2.3479e-04, 2.3503e-04, 2.3527e-04, 2.3551e-04, 2.3574e-04, 2.3598e-04, 2.3622e-04, 2.3646e-04, 2.3670e-04, 2.3694e-04, 2.3717e-04, 2.3741e-04, 2.3765e-04, 2.3789e-04, 2.3813e-04, 2.3836e-04, 2.3860e-04, 2.3884e-04, 2.3908e-04, 2.3932e-04, 2.3956e-04, 2.3979e-04, 2.4003e-04, 2.4027e-04, 2.4051e-04, 2.4075e-04, 2.4098e-04, 2.4122e-04, 2.4146e-04, 2.4170e-04, 2.4194e-04, 2.4218e-04, 2.4241e-04, 2.4265e-04, 2.4289e-04, 2.4313e-04, 2.4337e-04, 2.4360e-04, 2.4384e-04, - 2.4480e-04, 2.4575e-04, 2.4670e-04, 2.4766e-04, 2.4861e-04, 2.4956e-04, 2.5052e-04, 2.5147e-04, 2.5242e-04, 2.5337e-04, 2.5433e-04, 2.5528e-04, 2.5623e-04, 2.5719e-04, 2.5814e-04, 2.5909e-04, 2.6005e-04, 2.6100e-04, 2.6195e-04, 2.6291e-04, 2.6386e-04, 2.6481e-04, 2.6577e-04, 2.6672e-04, 2.6767e-04, 2.6863e-04, 2.6958e-04, 2.7053e-04, 2.7149e-04, 2.7244e-04, 2.7339e-04, 2.7435e-04, 2.7530e-04, 2.7625e-04, 2.7720e-04, 2.7816e-04, 2.7911e-04, 2.8006e-04, 2.8102e-04, 2.8197e-04, 2.8292e-04, 2.8388e-04, 2.8483e-04, 2.8578e-04, 2.8674e-04, 2.8769e-04, 2.8864e-04, 2.8960e-04, 2.9055e-04, 2.9150e-04, 2.9246e-04, 2.9341e-04, 2.9436e-04, 2.9532e-04, 2.9627e-04, 2.9722e-04, 2.9818e-04, 2.9913e-04, 3.0008e-04, 3.0104e-04, 3.0199e-04, 3.0294e-04, 3.0389e-04, 3.0485e-04, 3.0580e-04, 3.0675e-04, 3.0771e-04, 3.0866e-04, 3.0961e-04, 3.1057e-04, 3.1152e-04, 3.1247e-04, 3.1343e-04, 3.1438e-04, 3.1533e-04, 3.1629e-04, 3.1724e-04, 3.1819e-04, 3.1915e-04, 3.2010e-04, 3.2105e-04, 3.2201e-04, 3.2296e-04, 3.2391e-04, 3.2487e-04, 3.2582e-04, 3.2677e-04, 3.2772e-04, 3.2868e-04, 3.2963e-04, 3.3058e-04, 3.3154e-04, 3.3249e-04, 3.3344e-04, 3.3440e-04, 3.3535e-04, 3.3630e-04, 3.3726e-04, 3.3821e-04, 3.3916e-04, 3.4012e-04, 3.4107e-04, 3.4202e-04, 3.4298e-04, 3.4393e-04, 3.4488e-04, 3.4584e-04, 3.4679e-04, 3.4774e-04, 3.4870e-04, 3.4965e-04, 3.5060e-04, 3.5156e-04, 3.5251e-04, 3.5346e-04, 3.5441e-04, 3.5537e-04, 3.5632e-04, 3.5727e-04, 3.5823e-04, 3.5918e-04, 3.6013e-04, 3.6109e-04, 3.6204e-04, 3.6299e-04, 3.6395e-04, 3.6490e-04, 3.6585e-04, 3.6681e-04, 3.6776e-04, 3.6871e-04, 3.6967e-04, 3.7062e-04, 3.7157e-04, 3.7253e-04, 3.7348e-04, 3.7443e-04, 3.7539e-04, 3.7634e-04, 3.7729e-04, 3.7825e-04, 3.7920e-04, 3.8015e-04, 3.8110e-04, 3.8206e-04, 3.8301e-04, 3.8396e-04, 3.8492e-04, 3.8587e-04, 3.8682e-04, 3.8778e-04, 3.8873e-04, 3.8968e-04, 3.9064e-04, 3.9159e-04, 3.9254e-04, 3.9350e-04, 3.9445e-04, 3.9540e-04, 3.9636e-04, 3.9731e-04, 3.9826e-04, 3.9922e-04, 4.0017e-04, 4.0112e-04, 4.0208e-04, 4.0303e-04, 4.0398e-04, 4.0493e-04, 4.0589e-04, 4.0684e-04, 4.0779e-04, 4.0875e-04, 4.0970e-04, 4.1065e-04, 4.1161e-04, 4.1256e-04, 4.1351e-04, 4.1447e-04, 4.1542e-04, 4.1637e-04, 4.1733e-04, 4.1828e-04, 4.1923e-04, 4.2019e-04, 4.2114e-04, 4.2209e-04, 4.2305e-04, 4.2400e-04, 4.2495e-04, 4.2591e-04, 4.2686e-04, 4.2781e-04, 4.2877e-04, 4.2972e-04, 4.3067e-04, 4.3162e-04, 4.3258e-04, 4.3353e-04, 4.3448e-04, 4.3544e-04, 4.3639e-04, 4.3734e-04, 4.3830e-04, 4.3925e-04, 4.4020e-04, 4.4116e-04, 4.4211e-04, 4.4306e-04, 4.4402e-04, 4.4497e-04, 4.4592e-04, 4.4688e-04, 4.4783e-04, 4.4878e-04, 4.4974e-04, 4.5069e-04, 4.5164e-04, 4.5260e-04, 4.5355e-04, 4.5450e-04, 4.5545e-04, 4.5641e-04, 4.5736e-04, 4.5831e-04, 4.5927e-04, 4.6022e-04, 4.6117e-04, 4.6213e-04, 4.6308e-04, 4.6403e-04, 4.6499e-04, 4.6594e-04, 4.6689e-04, 4.6785e-04, 4.6880e-04, 4.6975e-04, 4.7071e-04, 4.7166e-04, 4.7261e-04, 4.7357e-04, 4.7452e-04, 4.7547e-04, 4.7643e-04, 4.7738e-04, 4.7833e-04, 4.7929e-04, 4.8024e-04, 4.8119e-04, 4.8214e-04, 4.8310e-04, 4.8405e-04, 4.8500e-04, 4.8596e-04, 4.8691e-04, 4.8786e-04, - 4.8977e-04, 4.9168e-04, 4.9358e-04, 4.9549e-04, 4.9740e-04, 4.9931e-04, 5.0121e-04, 5.0312e-04, 5.0503e-04, 5.0693e-04, 5.0884e-04, 5.1075e-04, 5.1265e-04, 5.1456e-04, 5.1647e-04, 5.1837e-04, 5.2028e-04, 5.2219e-04, 5.2409e-04, 5.2600e-04, 5.2791e-04, 5.2982e-04, 5.3172e-04, 5.3363e-04, 5.3554e-04, 5.3744e-04, 5.3935e-04, 5.4126e-04, 5.4316e-04, 5.4507e-04, 5.4698e-04, 5.4888e-04, 5.5079e-04, 5.5270e-04, 5.5460e-04, 5.5651e-04, 5.5842e-04, 5.6033e-04, 5.6223e-04, 5.6414e-04, 5.6605e-04, 5.6795e-04, 5.6986e-04, 5.7177e-04, 5.7367e-04, 5.7558e-04, 5.7749e-04, 5.7939e-04, 5.8130e-04, 5.8321e-04, 5.8512e-04, 5.8702e-04, 5.8893e-04, 5.9084e-04, 5.9274e-04, 5.9465e-04, 5.9656e-04, 5.9846e-04, 6.0037e-04, 6.0228e-04, 6.0418e-04, 6.0609e-04, 6.0800e-04, 6.0990e-04, 6.1181e-04, 6.1372e-04, 6.1563e-04, 6.1753e-04, 6.1944e-04, 6.2135e-04, 6.2325e-04, 6.2516e-04, 6.2707e-04, 6.2897e-04, 6.3088e-04, 6.3279e-04, 6.3469e-04, 6.3660e-04, 6.3851e-04, 6.4041e-04, 6.4232e-04, 6.4423e-04, 6.4614e-04, 6.4804e-04, 6.4995e-04, 6.5186e-04, 6.5376e-04, 6.5567e-04, 6.5758e-04, 6.5948e-04, 6.6139e-04, 6.6330e-04, 6.6520e-04, 6.6711e-04, 6.6902e-04, 6.7092e-04, 6.7283e-04, 6.7474e-04, 6.7665e-04, 6.7855e-04, 6.8046e-04, 6.8237e-04, 6.8427e-04, 6.8618e-04, 6.8809e-04, 6.8999e-04, 6.9190e-04, 6.9381e-04, 6.9571e-04, 6.9762e-04, 6.9953e-04, 7.0143e-04, 7.0334e-04, 7.0525e-04, 7.0716e-04, 7.0906e-04, 7.1097e-04, 7.1288e-04, 7.1478e-04, 7.1669e-04, 7.1860e-04, 7.2050e-04, 7.2241e-04, 7.2432e-04, 7.2622e-04, 7.2813e-04, 7.3004e-04, 7.3195e-04, 7.3385e-04, 7.3576e-04, 7.3767e-04, 7.3957e-04, 7.4148e-04, 7.4339e-04, 7.4529e-04, 7.4720e-04, 7.4911e-04, 7.5101e-04, 7.5292e-04, 7.5483e-04, 7.5673e-04, 7.5864e-04, 7.6055e-04, 7.6246e-04, 7.6436e-04, 7.6627e-04, 7.6818e-04, 7.7008e-04, 7.7199e-04, 7.7390e-04, 7.7580e-04, 7.7771e-04, 7.7962e-04, 7.8152e-04, 7.8343e-04, 7.8534e-04, 7.8724e-04, 7.8915e-04, 7.9106e-04, 7.9297e-04, 7.9487e-04, 7.9678e-04, 7.9869e-04, 8.0059e-04, 8.0250e-04, 8.0441e-04, 8.0631e-04, 8.0822e-04, 8.1013e-04, 8.1203e-04, 8.1394e-04, 8.1585e-04, 8.1775e-04, 8.1966e-04, 8.2157e-04, 8.2348e-04, 8.2538e-04, 8.2729e-04, 8.2920e-04, 8.3110e-04, 8.3301e-04, 8.3492e-04, 8.3682e-04, 8.3873e-04, 8.4064e-04, 8.4254e-04, 8.4445e-04, 8.4636e-04, 8.4826e-04, 8.5017e-04, 8.5208e-04, 8.5399e-04, 8.5589e-04, 8.5780e-04, 8.5971e-04, 8.6161e-04, 8.6352e-04, 8.6543e-04, 8.6733e-04, 8.6924e-04, 8.7115e-04, 8.7305e-04, 8.7496e-04, 8.7687e-04, 8.7878e-04, 8.8068e-04, 8.8259e-04, 8.8450e-04, 8.8640e-04, 8.8831e-04, 8.9022e-04, 8.9212e-04, 8.9403e-04, 8.9594e-04, 8.9784e-04, 8.9975e-04, 9.0166e-04, 9.0356e-04, 9.0547e-04, 9.0738e-04, 9.0929e-04, 9.1119e-04, 9.1310e-04, 9.1501e-04, 9.1691e-04, 9.1882e-04, 9.2073e-04, 9.2263e-04, 9.2454e-04, 9.2645e-04, 9.2835e-04, 9.3026e-04, 9.3217e-04, 9.3407e-04, 9.3598e-04, 9.3789e-04, 9.3980e-04, 9.4170e-04, 9.4361e-04, 9.4552e-04, 9.4742e-04, 9.4933e-04, 9.5124e-04, 9.5314e-04, 9.5505e-04, 9.5696e-04, 9.5886e-04, 9.6077e-04, 9.6268e-04, 9.6458e-04, 9.6649e-04, 9.6840e-04, 9.7031e-04, 9.7221e-04, 9.7412e-04, 9.7603e-04, - 9.7984e-04, 9.8365e-04, 9.8747e-04, 9.9128e-04, 9.9510e-04, 9.9891e-04, 1.0027e-03, 1.0065e-03, 1.0104e-03, 1.0142e-03, 1.0180e-03, 1.0218e-03, 1.0256e-03, 1.0294e-03, 1.0332e-03, 1.0371e-03, 1.0409e-03, 1.0447e-03, 1.0485e-03, 1.0523e-03, 1.0561e-03, 1.0599e-03, 1.0638e-03, 1.0676e-03, 1.0714e-03, 1.0752e-03, 1.0790e-03, 1.0828e-03, 1.0866e-03, 1.0905e-03, 1.0943e-03, 1.0981e-03, 1.1019e-03, 1.1057e-03, 1.1095e-03, 1.1133e-03, 1.1172e-03, 1.1210e-03, 1.1248e-03, 1.1286e-03, 1.1324e-03, 1.1362e-03, 1.1400e-03, 1.1439e-03, 1.1477e-03, 1.1515e-03, 1.1553e-03, 1.1591e-03, 1.1629e-03, 1.1667e-03, 1.1706e-03, 1.1744e-03, 1.1782e-03, 1.1820e-03, 1.1858e-03, 1.1896e-03, 1.1934e-03, 1.1973e-03, 1.2011e-03, 1.2049e-03, 1.2087e-03, 1.2125e-03, 1.2163e-03, 1.2201e-03, 1.2240e-03, 1.2278e-03, 1.2316e-03, 1.2354e-03, 1.2392e-03, 1.2430e-03, 1.2468e-03, 1.2507e-03, 1.2545e-03, 1.2583e-03, 1.2621e-03, 1.2659e-03, 1.2697e-03, 1.2735e-03, 1.2774e-03, 1.2812e-03, 1.2850e-03, 1.2888e-03, 1.2926e-03, 1.2964e-03, 1.3002e-03, 1.3040e-03, 1.3079e-03, 1.3117e-03, 1.3155e-03, 1.3193e-03, 1.3231e-03, 1.3269e-03, 1.3307e-03, 1.3346e-03, 1.3384e-03, 1.3422e-03, 1.3460e-03, 1.3498e-03, 1.3536e-03, 1.3574e-03, 1.3613e-03, 1.3651e-03, 1.3689e-03, 1.3727e-03, 1.3765e-03, 1.3803e-03, 1.3841e-03, 1.3880e-03, 1.3918e-03, 1.3956e-03, 1.3994e-03, 1.4032e-03, 1.4070e-03, 1.4108e-03, 1.4147e-03, 1.4185e-03, 1.4223e-03, 1.4261e-03, 1.4299e-03, 1.4337e-03, 1.4375e-03, 1.4414e-03, 1.4452e-03, 1.4490e-03, 1.4528e-03, 1.4566e-03, 1.4604e-03, 1.4642e-03, 1.4681e-03, 1.4719e-03, 1.4757e-03, 1.4795e-03, 1.4833e-03, 1.4871e-03, 1.4909e-03, 1.4948e-03, 1.4986e-03, 1.5024e-03, 1.5062e-03, 1.5100e-03, 1.5138e-03, 1.5176e-03, 1.5215e-03, 1.5253e-03, 1.5291e-03, 1.5329e-03, 1.5367e-03, 1.5405e-03, 1.5443e-03, 1.5482e-03, 1.5520e-03, 1.5558e-03, 1.5596e-03, 1.5634e-03, 1.5672e-03, 1.5710e-03, 1.5749e-03, 1.5787e-03, 1.5825e-03, 1.5863e-03, 1.5901e-03, 1.5939e-03, 1.5977e-03, 1.6016e-03, 1.6054e-03, 1.6092e-03, 1.6130e-03, 1.6168e-03, 1.6206e-03, 1.6244e-03, 1.6283e-03, 1.6321e-03, 1.6359e-03, 1.6397e-03, 1.6435e-03, 1.6473e-03, 1.6511e-03, 1.6550e-03, 1.6588e-03, 1.6626e-03, 1.6664e-03, 1.6702e-03, 1.6740e-03, 1.6778e-03, 1.6817e-03, 1.6855e-03, 1.6893e-03, 1.6931e-03, 1.6969e-03, 1.7007e-03, 1.7045e-03, 1.7084e-03, 1.7122e-03, 1.7160e-03, 1.7198e-03, 1.7236e-03, 1.7274e-03, 1.7312e-03, 1.7351e-03, 1.7389e-03, 1.7427e-03, 1.7465e-03, 1.7503e-03, 1.7541e-03, 1.7579e-03, 1.7618e-03, 1.7656e-03, 1.7694e-03, 1.7732e-03, 1.7770e-03, 1.7808e-03, 1.7846e-03, 1.7885e-03, 1.7923e-03, 1.7961e-03, 1.7999e-03, 1.8037e-03, 1.8075e-03, 1.8113e-03, 1.8152e-03, 1.8190e-03, 1.8228e-03, 1.8266e-03, 1.8304e-03, 1.8342e-03, 1.8380e-03, 1.8419e-03, 1.8457e-03, 1.8495e-03, 1.8533e-03, 1.8571e-03, 1.8609e-03, 1.8647e-03, 1.8686e-03, 1.8724e-03, 1.8762e-03, 1.8800e-03, 1.8838e-03, 1.8876e-03, 1.8914e-03, 1.8953e-03, 1.8991e-03, 1.9029e-03, 1.9067e-03, 1.9105e-03, 1.9143e-03, 1.9181e-03, 1.9220e-03, 1.9258e-03, 1.9296e-03, 1.9334e-03, 1.9372e-03, 1.9410e-03, 1.9448e-03, 1.9487e-03, 1.9525e-03, - 1.9601e-03, 1.9677e-03, 1.9754e-03, 1.9830e-03, 1.9906e-03, 1.9982e-03, 2.0059e-03, 2.0135e-03, 2.0211e-03, 2.0288e-03, 2.0364e-03, 2.0440e-03, 2.0516e-03, 2.0593e-03, 2.0669e-03, 2.0745e-03, 2.0822e-03, 2.0898e-03, 2.0974e-03, 2.1050e-03, 2.1127e-03, 2.1203e-03, 2.1279e-03, 2.1356e-03, 2.1432e-03, 2.1508e-03, 2.1585e-03, 2.1661e-03, 2.1737e-03, 2.1813e-03, 2.1890e-03, 2.1966e-03, 2.2042e-03, 2.2119e-03, 2.2195e-03, 2.2271e-03, 2.2347e-03, 2.2424e-03, 2.2500e-03, 2.2576e-03, 2.2653e-03, 2.2729e-03, 2.2805e-03, 2.2881e-03, 2.2958e-03, 2.3034e-03, 2.3110e-03, 2.3187e-03, 2.3263e-03, 2.3339e-03, 2.3415e-03, 2.3492e-03, 2.3568e-03, 2.3644e-03, 2.3721e-03, 2.3797e-03, 2.3873e-03, 2.3949e-03, 2.4026e-03, 2.4102e-03, 2.4178e-03, 2.4255e-03, 2.4331e-03, 2.4407e-03, 2.4483e-03, 2.4560e-03, 2.4636e-03, 2.4712e-03, 2.4789e-03, 2.4865e-03, 2.4941e-03, 2.5018e-03, 2.5094e-03, 2.5170e-03, 2.5246e-03, 2.5323e-03, 2.5399e-03, 2.5475e-03, 2.5552e-03, 2.5628e-03, 2.5704e-03, 2.5780e-03, 2.5857e-03, 2.5933e-03, 2.6009e-03, 2.6086e-03, 2.6162e-03, 2.6238e-03, 2.6314e-03, 2.6391e-03, 2.6467e-03, 2.6543e-03, 2.6620e-03, 2.6696e-03, 2.6772e-03, 2.6848e-03, 2.6925e-03, 2.7001e-03, 2.7077e-03, 2.7154e-03, 2.7230e-03, 2.7306e-03, 2.7382e-03, 2.7459e-03, 2.7535e-03, 2.7611e-03, 2.7688e-03, 2.7764e-03, 2.7840e-03, 2.7917e-03, 2.7993e-03, 2.8069e-03, 2.8145e-03, 2.8222e-03, 2.8298e-03, 2.8374e-03, 2.8451e-03, 2.8527e-03, 2.8603e-03, 2.8679e-03, 2.8756e-03, 2.8832e-03, 2.8908e-03, 2.8985e-03, 2.9061e-03, 2.9137e-03, 2.9213e-03, 2.9290e-03, 2.9366e-03, 2.9442e-03, 2.9519e-03, 2.9595e-03, 2.9671e-03, 2.9747e-03, 2.9824e-03, 2.9900e-03, 2.9976e-03, 3.0053e-03, 3.0129e-03, 3.0205e-03, 3.0281e-03, 3.0358e-03, 3.0434e-03, 3.0510e-03, 3.0587e-03, 3.0663e-03, 3.0739e-03, 3.0816e-03, 3.0892e-03, 3.0968e-03, 3.1044e-03, 3.1121e-03, 3.1197e-03, 3.1273e-03, 3.1350e-03, 3.1426e-03, 3.1502e-03, 3.1578e-03, 3.1655e-03, 3.1731e-03, 3.1807e-03, 3.1884e-03, 3.1960e-03, 3.2036e-03, 3.2112e-03, 3.2189e-03, 3.2265e-03, 3.2341e-03, 3.2418e-03, 3.2494e-03, 3.2570e-03, 3.2646e-03, 3.2723e-03, 3.2799e-03, 3.2875e-03, 3.2952e-03, 3.3028e-03, 3.3104e-03, 3.3180e-03, 3.3257e-03, 3.3333e-03, 3.3409e-03, 3.3486e-03, 3.3562e-03, 3.3638e-03, 3.3715e-03, 3.3791e-03, 3.3867e-03, 3.3943e-03, 3.4020e-03, 3.4096e-03, 3.4172e-03, 3.4249e-03, 3.4325e-03, 3.4401e-03, 3.4477e-03, 3.4554e-03, 3.4630e-03, 3.4706e-03, 3.4783e-03, 3.4859e-03, 3.4935e-03, 3.5011e-03, 3.5088e-03, 3.5164e-03, 3.5240e-03, 3.5317e-03, 3.5393e-03, 3.5469e-03, 3.5545e-03, 3.5622e-03, 3.5698e-03, 3.5774e-03, 3.5851e-03, 3.5927e-03, 3.6003e-03, 3.6079e-03, 3.6156e-03, 3.6232e-03, 3.6308e-03, 3.6385e-03, 3.6461e-03, 3.6537e-03, 3.6613e-03, 3.6690e-03, 3.6766e-03, 3.6842e-03, 3.6919e-03, 3.6995e-03, 3.7071e-03, 3.7148e-03, 3.7224e-03, 3.7300e-03, 3.7376e-03, 3.7453e-03, 3.7529e-03, 3.7605e-03, 3.7682e-03, 3.7758e-03, 3.7834e-03, 3.7910e-03, 3.7987e-03, 3.8063e-03, 3.8139e-03, 3.8216e-03, 3.8292e-03, 3.8368e-03, 3.8444e-03, 3.8521e-03, 3.8597e-03, 3.8673e-03, 3.8750e-03, 3.8826e-03, 3.8902e-03, 3.8978e-03, 3.9055e-03, - 3.9207e-03, 3.9360e-03, 3.9513e-03, 3.9665e-03, 3.9818e-03, 3.9970e-03, 4.0123e-03, 4.0275e-03, 4.0428e-03, 4.0581e-03, 4.0733e-03, 4.0886e-03, 4.1038e-03, 4.1191e-03, 4.1343e-03, 4.1496e-03, 4.1649e-03, 4.1801e-03, 4.1954e-03, 4.2106e-03, 4.2259e-03, 4.2412e-03, 4.2564e-03, 4.2717e-03, 4.2869e-03, 4.3022e-03, 4.3174e-03, 4.3327e-03, 4.3480e-03, 4.3632e-03, 4.3785e-03, 4.3937e-03, 4.4090e-03, 4.4243e-03, 4.4395e-03, 4.4548e-03, 4.4700e-03, 4.4853e-03, 4.5005e-03, 4.5158e-03, 4.5311e-03, 4.5463e-03, 4.5616e-03, 4.5768e-03, 4.5921e-03, 4.6074e-03, 4.6226e-03, 4.6379e-03, 4.6531e-03, 4.6684e-03, 4.6836e-03, 4.6989e-03, 4.7142e-03, 4.7294e-03, 4.7447e-03, 4.7599e-03, 4.7752e-03, 4.7905e-03, 4.8057e-03, 4.8210e-03, 4.8362e-03, 4.8515e-03, 4.8667e-03, 4.8820e-03, 4.8973e-03, 4.9125e-03, 4.9278e-03, 4.9430e-03, 4.9583e-03, 4.9736e-03, 4.9888e-03, 5.0041e-03, 5.0193e-03, 5.0346e-03, 5.0498e-03, 5.0651e-03, 5.0804e-03, 5.0956e-03, 5.1109e-03, 5.1261e-03, 5.1414e-03, 5.1567e-03, 5.1719e-03, 5.1872e-03, 5.2024e-03, 5.2177e-03, 5.2329e-03, 5.2482e-03, 5.2635e-03, 5.2787e-03, 5.2940e-03, 5.3092e-03, 5.3245e-03, 5.3398e-03, 5.3550e-03, 5.3703e-03, 5.3855e-03, 5.4008e-03, 5.4160e-03, 5.4313e-03, 5.4466e-03, 5.4618e-03, 5.4771e-03, 5.4923e-03, 5.5076e-03, 5.5229e-03, 5.5381e-03, 5.5534e-03, 5.5686e-03, 5.5839e-03, 5.5991e-03, 5.6144e-03, 5.6297e-03, 5.6449e-03, 5.6602e-03, 5.6754e-03, 5.6907e-03, 5.7060e-03, 5.7212e-03, 5.7365e-03, 5.7517e-03, 5.7670e-03, 5.7822e-03, 5.7975e-03, 5.8128e-03, 5.8280e-03, 5.8433e-03, 5.8585e-03, 5.8738e-03, 5.8891e-03, 5.9043e-03, 5.9196e-03, 5.9348e-03, 5.9501e-03, 5.9653e-03, 5.9806e-03, 5.9959e-03, 6.0111e-03, 6.0264e-03, 6.0416e-03, 6.0569e-03, 6.0722e-03, 6.0874e-03, 6.1027e-03, 6.1179e-03, 6.1332e-03, 6.1484e-03, 6.1637e-03, 6.1790e-03, 6.1942e-03, 6.2095e-03, 6.2247e-03, 6.2400e-03, 6.2553e-03, 6.2705e-03, 6.2858e-03, 6.3010e-03, 6.3163e-03, 6.3315e-03, 6.3468e-03, 6.3621e-03, 6.3773e-03, 6.3926e-03, 6.4078e-03, 6.4231e-03, 6.4384e-03, 6.4536e-03, 6.4689e-03, 6.4841e-03, 6.4994e-03, 6.5146e-03, 6.5299e-03, 6.5452e-03, 6.5604e-03, 6.5757e-03, 6.5909e-03, 6.6062e-03, 6.6215e-03, 6.6367e-03, 6.6520e-03, 6.6672e-03, 6.6825e-03, 6.6977e-03, 6.7130e-03, 6.7283e-03, 6.7435e-03, 6.7588e-03, 6.7740e-03, 6.7893e-03, 6.8046e-03, 6.8198e-03, 6.8351e-03, 6.8503e-03, 6.8656e-03, 6.8808e-03, 6.8961e-03, 6.9114e-03, 6.9266e-03, 6.9419e-03, 6.9571e-03, 6.9724e-03, 6.9877e-03, 7.0029e-03, 7.0182e-03, 7.0334e-03, 7.0487e-03, 7.0639e-03, 7.0792e-03, 7.0945e-03, 7.1097e-03, 7.1250e-03, 7.1402e-03, 7.1555e-03, 7.1708e-03, 7.1860e-03, 7.2013e-03, 7.2165e-03, 7.2318e-03, 7.2470e-03, 7.2623e-03, 7.2776e-03, 7.2928e-03, 7.3081e-03, 7.3233e-03, 7.3386e-03, 7.3539e-03, 7.3691e-03, 7.3844e-03, 7.3996e-03, 7.4149e-03, 7.4301e-03, 7.4454e-03, 7.4607e-03, 7.4759e-03, 7.4912e-03, 7.5064e-03, 7.5217e-03, 7.5370e-03, 7.5522e-03, 7.5675e-03, 7.5827e-03, 7.5980e-03, 7.6132e-03, 7.6285e-03, 7.6438e-03, 7.6590e-03, 7.6743e-03, 7.6895e-03, 7.7048e-03, 7.7201e-03, 7.7353e-03, 7.7506e-03, 7.7658e-03, 7.7811e-03, 7.7963e-03, 7.8116e-03, - 7.8421e-03, 7.8726e-03, 7.9032e-03, 7.9337e-03, 7.9642e-03, 7.9947e-03, 8.0252e-03, 8.0557e-03, 8.0863e-03, 8.1168e-03, 8.1473e-03, 8.1778e-03, 8.2083e-03, 8.2388e-03, 8.2694e-03, 8.2999e-03, 8.3304e-03, 8.3609e-03, 8.3914e-03, 8.4219e-03, 8.4525e-03, 8.4830e-03, 8.5135e-03, 8.5440e-03, 8.5745e-03, 8.6051e-03, 8.6356e-03, 8.6661e-03, 8.6966e-03, 8.7271e-03, 8.7576e-03, 8.7882e-03, 8.8187e-03, 8.8492e-03, 8.8797e-03, 8.9102e-03, 8.9407e-03, 8.9713e-03, 9.0018e-03, 9.0323e-03, 9.0628e-03, 9.0933e-03, 9.1238e-03, 9.1544e-03, 9.1849e-03, 9.2154e-03, 9.2459e-03, 9.2764e-03, 9.3069e-03, 9.3375e-03, 9.3680e-03, 9.3985e-03, 9.4290e-03, 9.4595e-03, 9.4900e-03, 9.5206e-03, 9.5511e-03, 9.5816e-03, 9.6121e-03, 9.6426e-03, 9.6731e-03, 9.7037e-03, 9.7342e-03, 9.7647e-03, 9.7952e-03, 9.8257e-03, 9.8563e-03, 9.8868e-03, 9.9173e-03, 9.9478e-03, 9.9783e-03, 1.0009e-02, 1.0039e-02, 1.0070e-02, 1.0100e-02, 1.0131e-02, 1.0161e-02, 1.0192e-02, 1.0222e-02, 1.0253e-02, 1.0283e-02, 1.0314e-02, 1.0345e-02, 1.0375e-02, 1.0406e-02, 1.0436e-02, 1.0467e-02, 1.0497e-02, 1.0528e-02, 1.0558e-02, 1.0589e-02, 1.0619e-02, 1.0650e-02, 1.0680e-02, 1.0711e-02, 1.0741e-02, 1.0772e-02, 1.0802e-02, 1.0833e-02, 1.0863e-02, 1.0894e-02, 1.0924e-02, 1.0955e-02, 1.0985e-02, 1.1016e-02, 1.1046e-02, 1.1077e-02, 1.1107e-02, 1.1138e-02, 1.1168e-02, 1.1199e-02, 1.1230e-02, 1.1260e-02, 1.1291e-02, 1.1321e-02, 1.1352e-02, 1.1382e-02, 1.1413e-02, 1.1443e-02, 1.1474e-02, 1.1504e-02, 1.1535e-02, 1.1565e-02, 1.1596e-02, 1.1626e-02, 1.1657e-02, 1.1687e-02, 1.1718e-02, 1.1748e-02, 1.1779e-02, 1.1809e-02, 1.1840e-02, 1.1870e-02, 1.1901e-02, 1.1931e-02, 1.1962e-02, 1.1992e-02, 1.2023e-02, 1.2053e-02, 1.2084e-02, 1.2115e-02, 1.2145e-02, 1.2176e-02, 1.2206e-02, 1.2237e-02, 1.2267e-02, 1.2298e-02, 1.2328e-02, 1.2359e-02, 1.2389e-02, 1.2420e-02, 1.2450e-02, 1.2481e-02, 1.2511e-02, 1.2542e-02, 1.2572e-02, 1.2603e-02, 1.2633e-02, 1.2664e-02, 1.2694e-02, 1.2725e-02, 1.2755e-02, 1.2786e-02, 1.2816e-02, 1.2847e-02, 1.2877e-02, 1.2908e-02, 1.2938e-02, 1.2969e-02, 1.3000e-02, 1.3030e-02, 1.3061e-02, 1.3091e-02, 1.3122e-02, 1.3152e-02, 1.3183e-02, 1.3213e-02, 1.3244e-02, 1.3274e-02, 1.3305e-02, 1.3335e-02, 1.3366e-02, 1.3396e-02, 1.3427e-02, 1.3457e-02, 1.3488e-02, 1.3518e-02, 1.3549e-02, 1.3579e-02, 1.3610e-02, 1.3640e-02, 1.3671e-02, 1.3701e-02, 1.3732e-02, 1.3762e-02, 1.3793e-02, 1.3823e-02, 1.3854e-02, 1.3885e-02, 1.3915e-02, 1.3946e-02, 1.3976e-02, 1.4007e-02, 1.4037e-02, 1.4068e-02, 1.4098e-02, 1.4129e-02, 1.4159e-02, 1.4190e-02, 1.4220e-02, 1.4251e-02, 1.4281e-02, 1.4312e-02, 1.4342e-02, 1.4373e-02, 1.4403e-02, 1.4434e-02, 1.4464e-02, 1.4495e-02, 1.4525e-02, 1.4556e-02, 1.4586e-02, 1.4617e-02, 1.4647e-02, 1.4678e-02, 1.4708e-02, 1.4739e-02, 1.4770e-02, 1.4800e-02, 1.4831e-02, 1.4861e-02, 1.4892e-02, 1.4922e-02, 1.4953e-02, 1.4983e-02, 1.5014e-02, 1.5044e-02, 1.5075e-02, 1.5105e-02, 1.5136e-02, 1.5166e-02, 1.5197e-02, 1.5227e-02, 1.5258e-02, 1.5288e-02, 1.5319e-02, 1.5349e-02, 1.5380e-02, 1.5410e-02, 1.5441e-02, 1.5471e-02, 1.5502e-02, 1.5532e-02, 1.5563e-02, 1.5593e-02, 1.5624e-02, - 1.5746e-02, 1.5868e-02, 1.5990e-02, 1.6112e-02, 1.6234e-02, 1.6356e-02, 1.6478e-02, 1.6601e-02, 1.6723e-02, 1.6845e-02, 1.6967e-02, 1.7089e-02, 1.7211e-02, 1.7333e-02, 1.7455e-02, 1.7577e-02, 1.7699e-02, 1.7821e-02, 1.7943e-02, 1.8065e-02, 1.8187e-02, 1.8310e-02, 1.8432e-02, 1.8554e-02, 1.8676e-02, 1.8798e-02, 1.8920e-02, 1.9042e-02, 1.9164e-02, 1.9286e-02, 1.9408e-02, 1.9530e-02, 1.9652e-02, 1.9774e-02, 1.9896e-02, 2.0018e-02, 2.0141e-02, 2.0263e-02, 2.0385e-02, 2.0507e-02, 2.0629e-02, 2.0751e-02, 2.0873e-02, 2.0995e-02, 2.1117e-02, 2.1239e-02, 2.1361e-02, 2.1483e-02, 2.1605e-02, 2.1727e-02, 2.1850e-02, 2.1972e-02, 2.2094e-02, 2.2216e-02, 2.2338e-02, 2.2460e-02, 2.2582e-02, 2.2704e-02, 2.2826e-02, 2.2948e-02, 2.3070e-02, 2.3192e-02, 2.3314e-02, 2.3436e-02, 2.3558e-02, 2.3681e-02, 2.3803e-02, 2.3925e-02, 2.4047e-02, 2.4169e-02, 2.4291e-02, 2.4413e-02, 2.4535e-02, 2.4657e-02, 2.4779e-02, 2.4901e-02, 2.5023e-02, 2.5145e-02, 2.5267e-02, 2.5390e-02, 2.5512e-02, 2.5634e-02, 2.5756e-02, 2.5878e-02, 2.6000e-02, 2.6122e-02, 2.6244e-02, 2.6366e-02, 2.6488e-02, 2.6610e-02, 2.6732e-02, 2.6854e-02, 2.6976e-02, 2.7099e-02, 2.7221e-02, 2.7343e-02, 2.7465e-02, 2.7587e-02, 2.7709e-02, 2.7831e-02, 2.7953e-02, 2.8075e-02, 2.8197e-02, 2.8319e-02, 2.8441e-02, 2.8563e-02, 2.8685e-02, 2.8807e-02, 2.8930e-02, 2.9052e-02, 2.9174e-02, 2.9296e-02, 2.9418e-02, 2.9540e-02, 2.9662e-02, 2.9784e-02, 2.9906e-02, 3.0028e-02, 3.0150e-02, 3.0272e-02, 3.0394e-02, 3.0516e-02, 3.0639e-02, 3.0761e-02, 3.0883e-02, 3.1005e-02, 3.1127e-02, 3.1249e-02, 3.1493e-02, 3.1737e-02, 3.1981e-02, 3.2225e-02, 3.2470e-02, 3.2714e-02, 3.2958e-02, 3.3202e-02, 3.3446e-02, 3.3690e-02, 3.3934e-02, 3.4179e-02, 3.4423e-02, 3.4667e-02, 3.4911e-02, 3.5155e-02, 3.5399e-02, 3.5643e-02, 3.5888e-02, 3.6132e-02, 3.6376e-02, 3.6620e-02, 3.6864e-02, 3.7108e-02, 3.7352e-02, 3.7596e-02, 3.7841e-02, 3.8085e-02, 3.8329e-02, 3.8573e-02, 3.8817e-02, 3.9061e-02, 3.9305e-02, 3.9550e-02, 3.9794e-02, 4.0038e-02, 4.0282e-02, 4.0526e-02, 4.0770e-02, 4.1014e-02, 4.1259e-02, 4.1503e-02, 4.1747e-02, 4.1991e-02, 4.2235e-02, 4.2479e-02, 4.2723e-02, 4.2968e-02, 4.3212e-02, 4.3456e-02, 4.3700e-02, 4.3944e-02, 4.4188e-02, 4.4432e-02, 4.4677e-02, 4.4921e-02, 4.5165e-02, 4.5409e-02, 4.5653e-02, 4.5897e-02, 4.6141e-02, 4.6386e-02, 4.6630e-02, 4.6874e-02, 4.7118e-02, 4.7362e-02, 4.7606e-02, 4.7850e-02, 4.8095e-02, 4.8339e-02, 4.8583e-02, 4.8827e-02, 4.9071e-02, 4.9315e-02, 4.9559e-02, 4.9803e-02, 5.0048e-02, 5.0292e-02, 5.0536e-02, 5.0780e-02, 5.1024e-02, 5.1268e-02, 5.1512e-02, 5.1757e-02, 5.2001e-02, 5.2245e-02, 5.2489e-02, 5.2733e-02, 5.2977e-02, 5.3221e-02, 5.3466e-02, 5.3710e-02, 5.3954e-02, 5.4198e-02, 5.4442e-02, 5.4686e-02, 5.4930e-02, 5.5175e-02, 5.5419e-02, 5.5663e-02, 5.5907e-02, 5.6151e-02, 5.6395e-02, 5.6639e-02, 5.6884e-02, 5.7128e-02, 5.7372e-02, 5.7616e-02, 5.7860e-02, 5.8104e-02, 5.8348e-02, 5.8593e-02, 5.8837e-02, 5.9081e-02, 5.9325e-02, 5.9569e-02, 5.9813e-02, 6.0057e-02, 6.0301e-02, 6.0546e-02, 6.0790e-02, 6.1034e-02, 6.1278e-02, 6.1522e-02, 6.1766e-02, 6.2010e-02, 6.2255e-02, 6.2499e-02, - 6.2743e-02, 6.2987e-02, 6.3231e-02, 6.3475e-02, 6.3719e-02, 6.3964e-02, 6.4208e-02, 6.4452e-02, 6.4696e-02, 6.4940e-02, 6.5184e-02, 6.5428e-02, 6.5673e-02, 6.5917e-02, 6.6161e-02, 6.6405e-02, 6.6649e-02, 6.6893e-02, 6.7137e-02, 6.7382e-02, 6.7626e-02, 6.7870e-02, 6.8114e-02, 6.8358e-02, 6.8602e-02, 6.8846e-02, 6.9091e-02, 6.9335e-02, 6.9579e-02, 6.9823e-02, 7.0067e-02, 7.0311e-02, 7.0555e-02, 7.0799e-02, 7.1044e-02, 7.1288e-02, 7.1532e-02, 7.1776e-02, 7.2020e-02, 7.2264e-02, 7.2508e-02, 7.2753e-02, 7.2997e-02, 7.3241e-02, 7.3485e-02, 7.3729e-02, 7.3973e-02, 7.4217e-02, 7.4462e-02, 7.4706e-02, 7.4950e-02, 7.5194e-02, 7.5438e-02, 7.5682e-02, 7.5926e-02, 7.6171e-02, 7.6415e-02, 7.6659e-02, 7.6903e-02, 7.7147e-02, 7.7391e-02, 7.7635e-02, 7.7880e-02, 7.8124e-02, 7.8368e-02, 7.8612e-02, 7.8856e-02, 7.9100e-02, 7.9344e-02, 7.9589e-02, 7.9833e-02, 8.0077e-02, 8.0321e-02, 8.0565e-02, 8.0809e-02, 8.1053e-02, 8.1298e-02, 8.1542e-02, 8.1786e-02, 8.2030e-02, 8.2274e-02, 8.2518e-02, 8.2762e-02, 8.3006e-02, 8.3251e-02, 8.3495e-02, 8.3739e-02, 8.3983e-02, 8.4227e-02, 8.4471e-02, 8.4715e-02, 8.4960e-02, 8.5204e-02, 8.5448e-02, 8.5692e-02, 8.5936e-02, 8.6180e-02, 8.6424e-02, 8.6669e-02, 8.6913e-02, 8.7157e-02, 8.7401e-02, 8.7645e-02, 8.7889e-02, 8.8133e-02, 8.8378e-02, 8.8622e-02, 8.8866e-02, 8.9110e-02, 8.9354e-02, 8.9598e-02, 8.9842e-02, 9.0087e-02, 9.0331e-02, 9.0575e-02, 9.0819e-02, 9.1063e-02, 9.1307e-02, 9.1551e-02, 9.1796e-02, 9.2040e-02, 9.2284e-02, 9.2528e-02, 9.2772e-02, 9.3016e-02, 9.3260e-02, 9.3504e-02, 9.3749e-02, 9.4237e-02, 9.4725e-02, 9.5213e-02, 9.5702e-02, 9.6190e-02, 9.6678e-02, 9.7167e-02, 9.7655e-02, 9.8143e-02, 9.8631e-02, 9.9120e-02, 9.9608e-02, 1.0010e-01, 1.0058e-01, 1.0107e-01, 1.0156e-01, 1.0205e-01, 1.0254e-01, 1.0303e-01, 1.0351e-01, 1.0400e-01, 1.0449e-01, 1.0498e-01, 1.0547e-01, 1.0596e-01, 1.0644e-01, 1.0693e-01, 1.0742e-01, 1.0791e-01, 1.0840e-01, 1.0889e-01, 1.0937e-01, 1.0986e-01, 1.1035e-01, 1.1084e-01, 1.1133e-01, 1.1182e-01, 1.1230e-01, 1.1279e-01, 1.1328e-01, 1.1377e-01, 1.1426e-01, 1.1474e-01, 1.1523e-01, 1.1572e-01, 1.1621e-01, 1.1670e-01, 1.1719e-01, 1.1767e-01, 1.1816e-01, 1.1865e-01, 1.1914e-01, 1.1963e-01, 1.2012e-01, 1.2060e-01, 1.2109e-01, 1.2158e-01, 1.2207e-01, 1.2256e-01, 1.2305e-01, 1.2353e-01, 1.2402e-01, 1.2451e-01, 1.2500e-01, 1.2549e-01, 1.2598e-01, 1.2646e-01, 1.2695e-01, 1.2744e-01, 1.2793e-01, 1.2842e-01, 1.2890e-01, 1.2939e-01, 1.2988e-01, 1.3037e-01, 1.3086e-01, 1.3135e-01, 1.3183e-01, 1.3232e-01, 1.3281e-01, 1.3330e-01, 1.3379e-01, 1.3428e-01, 1.3476e-01, 1.3525e-01, 1.3574e-01, 1.3623e-01, 1.3672e-01, 1.3721e-01, 1.3769e-01, 1.3818e-01, 1.3867e-01, 1.3916e-01, 1.3965e-01, 1.4014e-01, 1.4062e-01, 1.4111e-01, 1.4160e-01, 1.4209e-01, 1.4258e-01, 1.4306e-01, 1.4355e-01, 1.4404e-01, 1.4453e-01, 1.4502e-01, 1.4551e-01, 1.4599e-01, 1.4648e-01, 1.4697e-01, 1.4746e-01, 1.4795e-01, 1.4844e-01, 1.4892e-01, 1.4941e-01, 1.4990e-01, 1.5039e-01, 1.5088e-01, 1.5137e-01, 1.5185e-01, 1.5234e-01, 1.5283e-01, 1.5332e-01, 1.5381e-01, 1.5430e-01, 1.5478e-01, 1.5527e-01, 1.5576e-01, 1.5625e-01, - 1.5674e-01, 1.5723e-01, 1.5771e-01, 1.5820e-01, 1.5869e-01, 1.5918e-01, 1.5967e-01, 1.6015e-01, 1.6064e-01, 1.6113e-01, 1.6162e-01, 1.6211e-01, 1.6260e-01, 1.6308e-01, 1.6357e-01, 1.6406e-01, 1.6455e-01, 1.6504e-01, 1.6553e-01, 1.6601e-01, 1.6650e-01, 1.6699e-01, 1.6748e-01, 1.6797e-01, 1.6846e-01, 1.6894e-01, 1.6943e-01, 1.6992e-01, 1.7041e-01, 1.7090e-01, 1.7139e-01, 1.7187e-01, 1.7236e-01, 1.7285e-01, 1.7334e-01, 1.7383e-01, 1.7431e-01, 1.7480e-01, 1.7529e-01, 1.7578e-01, 1.7627e-01, 1.7676e-01, 1.7724e-01, 1.7773e-01, 1.7822e-01, 1.7871e-01, 1.7920e-01, 1.7969e-01, 1.8017e-01, 1.8066e-01, 1.8115e-01, 1.8164e-01, 1.8213e-01, 1.8262e-01, 1.8310e-01, 1.8359e-01, 1.8408e-01, 1.8457e-01, 1.8506e-01, 1.8555e-01, 1.8603e-01, 1.8652e-01, 1.8701e-01, 1.8750e-01, 1.8848e-01, 1.8945e-01, 1.9043e-01, 1.9140e-01, 1.9238e-01, 1.9336e-01, 1.9433e-01, 1.9531e-01, 1.9629e-01, 1.9726e-01, 1.9824e-01, 1.9922e-01, 2.0019e-01, 2.0117e-01, 2.0215e-01, 2.0312e-01, 2.0410e-01, 2.0508e-01, 2.0605e-01, 2.0703e-01, 2.0801e-01, 2.0898e-01, 2.0996e-01, 2.1094e-01, 2.1191e-01, 2.1289e-01, 2.1387e-01, 2.1484e-01, 2.1582e-01, 2.1680e-01, 2.1777e-01, 2.1875e-01, 2.1972e-01, 2.2070e-01, 2.2168e-01, 2.2265e-01, 2.2363e-01, 2.2461e-01, 2.2558e-01, 2.2656e-01, 2.2754e-01, 2.2851e-01, 2.2949e-01, 2.3047e-01, 2.3144e-01, 2.3242e-01, 2.3340e-01, 2.3437e-01, 2.3535e-01, 2.3633e-01, 2.3730e-01, 2.3828e-01, 2.3926e-01, 2.4023e-01, 2.4121e-01, 2.4219e-01, 2.4316e-01, 2.4414e-01, 2.4512e-01, 2.4609e-01, 2.4707e-01, 2.4805e-01, 2.4902e-01, 2.5000e-01, 2.5097e-01, 2.5195e-01, 2.5293e-01, 2.5390e-01, 2.5488e-01, 2.5586e-01, 2.5683e-01, 2.5781e-01, 2.5879e-01, 2.5976e-01, 2.6074e-01, 2.6172e-01, 2.6269e-01, 2.6367e-01, 2.6465e-01, 2.6562e-01, 2.6660e-01, 2.6758e-01, 2.6855e-01, 2.6953e-01, 2.7051e-01, 2.7148e-01, 2.7246e-01, 2.7344e-01, 2.7441e-01, 2.7539e-01, 2.7637e-01, 2.7734e-01, 2.7832e-01, 2.7930e-01, 2.8027e-01, 2.8125e-01, 2.8222e-01, 2.8320e-01, 2.8418e-01, 2.8515e-01, 2.8613e-01, 2.8711e-01, 2.8808e-01, 2.8906e-01, 2.9004e-01, 2.9101e-01, 2.9199e-01, 2.9297e-01, 2.9394e-01, 2.9492e-01, 2.9590e-01, 2.9687e-01, 2.9785e-01, 2.9883e-01, 2.9980e-01, 3.0078e-01, 3.0176e-01, 3.0273e-01, 3.0371e-01, 3.0469e-01, 3.0566e-01, 3.0664e-01, 3.0762e-01, 3.0859e-01, 3.0957e-01, 3.1055e-01, 3.1152e-01, 3.1250e-01, 3.1347e-01, 3.1445e-01, 3.1543e-01, 3.1640e-01, 3.1738e-01, 3.1836e-01, 3.1933e-01, 3.2031e-01, 3.2129e-01, 3.2226e-01, 3.2324e-01, 3.2422e-01, 3.2519e-01, 3.2617e-01, 3.2715e-01, 3.2812e-01, 3.2910e-01, 3.3008e-01, 3.3105e-01, 3.3203e-01, 3.3301e-01, 3.3398e-01, 3.3496e-01, 3.3594e-01, 3.3691e-01, 3.3789e-01, 3.3887e-01, 3.3984e-01, 3.4082e-01, 3.4180e-01, 3.4277e-01, 3.4375e-01, 3.4472e-01, 3.4570e-01, 3.4668e-01, 3.4765e-01, 3.4863e-01, 3.4961e-01, 3.5058e-01, 3.5156e-01, 3.5254e-01, 3.5351e-01, 3.5449e-01, 3.5547e-01, 3.5644e-01, 3.5742e-01, 3.5840e-01, 3.5937e-01, 3.6035e-01, 3.6133e-01, 3.6230e-01, 3.6328e-01, 3.6426e-01, 3.6523e-01, 3.6621e-01, 3.6719e-01, 3.6816e-01, 3.6914e-01, 3.7012e-01, 3.7109e-01, 3.7207e-01, 3.7305e-01, 3.7402e-01, 3.7500e-01, - 3.7695e-01, 3.7890e-01, 3.8086e-01, 3.8281e-01, 3.8476e-01, 3.8672e-01, 3.8867e-01, 3.9062e-01, 3.9258e-01, 3.9453e-01, 3.9648e-01, 3.9844e-01, 4.0039e-01, 4.0234e-01, 4.0430e-01, 4.0625e-01, 4.0820e-01, 4.1015e-01, 4.1211e-01, 4.1406e-01, 4.1601e-01, 4.1797e-01, 4.1992e-01, 4.2187e-01, 4.2383e-01, 4.2578e-01, 4.2773e-01, 4.2969e-01, 4.3164e-01, 4.3359e-01, 4.3555e-01, 4.3750e-01, 4.3945e-01, 4.4140e-01, 4.4336e-01, 4.4531e-01, 4.4726e-01, 4.4922e-01, 4.5117e-01, 4.5312e-01, 4.5508e-01, 4.5703e-01, 4.5898e-01, 4.6094e-01, 4.6289e-01, 4.6484e-01, 4.6680e-01, 4.6875e-01, 4.7070e-01, 4.7265e-01, 4.7461e-01, 4.7656e-01, 4.7851e-01, 4.8047e-01, 4.8242e-01, 4.8437e-01, 4.8633e-01, 4.8828e-01, 4.9023e-01, 4.9219e-01, 4.9414e-01, 4.9609e-01, 4.9805e-01, 5.0000e-01, 5.0195e-01, 5.0390e-01, 5.0586e-01, 5.0781e-01, 5.0976e-01, 5.1172e-01, 5.1367e-01, 5.1562e-01, 5.1758e-01, 5.1953e-01, 5.2148e-01, 5.2344e-01, 5.2539e-01, 5.2734e-01, 5.2930e-01, 5.3125e-01, 5.3320e-01, 5.3515e-01, 5.3711e-01, 5.3906e-01, 5.4101e-01, 5.4297e-01, 5.4492e-01, 5.4687e-01, 5.4883e-01, 5.5078e-01, 5.5273e-01, 5.5469e-01, 5.5664e-01, 5.5859e-01, 5.6055e-01, 5.6250e-01, 5.6445e-01, 5.6640e-01, 5.6836e-01, 5.7031e-01, 5.7226e-01, 5.7422e-01, 5.7617e-01, 5.7812e-01, 5.8008e-01, 5.8203e-01, 5.8398e-01, 5.8594e-01, 5.8789e-01, 5.8984e-01, 5.9180e-01, 5.9375e-01, 5.9570e-01, 5.9765e-01, 5.9961e-01, 6.0156e-01, 6.0351e-01, 6.0547e-01, 6.0742e-01, 6.0937e-01, 6.1133e-01, 6.1328e-01, 6.1523e-01, 6.1719e-01, 6.1914e-01, 6.2109e-01, 6.2305e-01, 6.2500e-01, 6.2695e-01, 6.2890e-01, 6.3086e-01, 6.3281e-01, 6.3476e-01, 6.3672e-01, 6.3867e-01, 6.4062e-01, 6.4258e-01, 6.4453e-01, 6.4648e-01, 6.4844e-01, 6.5039e-01, 6.5234e-01, 6.5430e-01, 6.5625e-01, 6.5820e-01, 6.6015e-01, 6.6211e-01, 6.6406e-01, 6.6601e-01, 6.6797e-01, 6.6992e-01, 6.7187e-01, 6.7383e-01, 6.7578e-01, 6.7773e-01, 6.7969e-01, 6.8164e-01, 6.8359e-01, 6.8554e-01, 6.8750e-01, 6.8945e-01, 6.9140e-01, 6.9336e-01, 6.9531e-01, 6.9726e-01, 6.9922e-01, 7.0117e-01, 7.0312e-01, 7.0508e-01, 7.0703e-01, 7.0898e-01, 7.1094e-01, 7.1289e-01, 7.1484e-01, 7.1679e-01, 7.1875e-01, 7.2070e-01, 7.2265e-01, 7.2461e-01, 7.2656e-01, 7.2851e-01, 7.3047e-01, 7.3242e-01, 7.3437e-01, 7.3633e-01, 7.3828e-01, 7.4023e-01, 7.4219e-01, 7.4414e-01, 7.4609e-01, 7.4804e-01, 7.5000e-01, 7.5390e-01, 7.5781e-01, 7.6172e-01, 7.6562e-01, 7.6953e-01, 7.7344e-01, 7.7734e-01, 7.8125e-01, 7.8515e-01, 7.8906e-01, 7.9297e-01, 7.9687e-01, 8.0078e-01, 8.0469e-01, 8.0859e-01, 8.1250e-01, 8.1640e-01, 8.2031e-01, 8.2422e-01, 8.2812e-01, 8.3203e-01, 8.3594e-01, 8.3984e-01, 8.4375e-01, 8.4765e-01, 8.5156e-01, 8.5547e-01, 8.5937e-01, 8.6328e-01, 8.6719e-01, 8.7109e-01, 8.7500e-01, 8.7890e-01, 8.8281e-01, 8.8672e-01, 8.9062e-01, 8.9453e-01, 8.9844e-01, 9.0234e-01, 9.0625e-01, 9.1015e-01, 9.1406e-01, 9.1797e-01, 9.2187e-01, 9.2578e-01, 9.2969e-01, 9.3359e-01, 9.3750e-01, 9.4140e-01, 9.4531e-01, 9.4922e-01, 9.5312e-01, 9.5703e-01, 9.6094e-01, 9.6484e-01, 9.6875e-01, 9.7265e-01, 9.7656e-01, 9.8047e-01, 9.8437e-01, 9.8828e-01, 9.9219e-01, 9.9609e-01, 1.0000e+00 + 0.0000e+00, 5.9488e-08, 1.1898e-07, 1.7846e-07, 2.3795e-07, 2.9744e-07, 3.5693e-07, 4.1642e-07, 4.7591e-07, 5.3539e-07, 5.9488e-07, 6.5437e-07, 7.1386e-07, 7.7335e-07, 8.3284e-07, 8.9232e-07, 9.5181e-07, 1.0113e-06, 1.0708e-06, 1.1303e-06, 1.1898e-06, 1.2493e-06, 1.3087e-06, 1.3682e-06, 1.4277e-06, 1.4872e-06, 1.5467e-06, 1.6062e-06, 1.6657e-06, 1.7252e-06, 1.7846e-06, 1.8441e-06, 1.9036e-06, 1.9631e-06, 2.0226e-06, 2.0821e-06, 2.1416e-06, 2.2011e-06, 2.2606e-06, 2.3200e-06, 2.3795e-06, 2.4390e-06, 2.4985e-06, 2.5580e-06, 2.6175e-06, 2.6770e-06, 2.7365e-06, 2.7959e-06, 2.8554e-06, 2.9149e-06, 2.9744e-06, 3.0339e-06, 3.0934e-06, 3.1529e-06, 3.2124e-06, 3.2719e-06, 3.3313e-06, 3.3908e-06, 3.4503e-06, 3.5098e-06, 3.5693e-06, 3.6288e-06, 3.6883e-06, 3.7478e-06, 3.8072e-06, 3.8667e-06, 3.9262e-06, 3.9857e-06, 4.0452e-06, 4.1047e-06, 4.1642e-06, 4.2237e-06, 4.2832e-06, 4.3426e-06, 4.4021e-06, 4.4616e-06, 4.5211e-06, 4.5806e-06, 4.6401e-06, 4.6996e-06, 4.7591e-06, 4.8185e-06, 4.8780e-06, 4.9375e-06, 4.9970e-06, 5.0565e-06, 5.1160e-06, 5.1755e-06, 5.2350e-06, 5.2945e-06, 5.3539e-06, 5.4134e-06, 5.4729e-06, 5.5324e-06, 5.5919e-06, 5.6514e-06, 5.7109e-06, 5.7704e-06, 5.8298e-06, 5.8893e-06, 5.9488e-06, 6.0083e-06, 6.0678e-06, 6.1273e-06, 6.1868e-06, 6.2463e-06, 6.3058e-06, 6.3652e-06, 6.4247e-06, 6.4842e-06, 6.5437e-06, 6.6032e-06, 6.6627e-06, 6.7222e-06, 6.7817e-06, 6.8411e-06, 6.9006e-06, 6.9601e-06, 7.0196e-06, 7.0791e-06, 7.1386e-06, 7.1981e-06, 7.2576e-06, 7.3171e-06, 7.3765e-06, 7.4360e-06, 7.4955e-06, 7.5550e-06, 7.6145e-06, 7.6740e-06, 7.7335e-06, 7.7930e-06, 7.8524e-06, 7.9119e-06, 7.9714e-06, 8.0309e-06, 8.0904e-06, 8.1499e-06, 8.2094e-06, 8.2689e-06, 8.3284e-06, 8.3878e-06, 8.4473e-06, 8.5068e-06, 8.5663e-06, 8.6258e-06, 8.6853e-06, 8.7448e-06, 8.8043e-06, 8.8637e-06, 8.9232e-06, 8.9827e-06, 9.0422e-06, 9.1017e-06, 9.1612e-06, 9.2207e-06, 9.2802e-06, 9.3397e-06, 9.3991e-06, 9.4586e-06, 9.5181e-06, 9.5776e-06, 9.6371e-06, 9.6966e-06, 9.7561e-06, 9.8156e-06, 9.8750e-06, 9.9345e-06, 9.9940e-06, 1.0054e-05, 1.0113e-05, 1.0172e-05, 1.0232e-05, 1.0291e-05, 1.0351e-05, 1.0410e-05, 1.0470e-05, 1.0529e-05, 1.0589e-05, 1.0648e-05, 1.0708e-05, 1.0767e-05, 1.0827e-05, 1.0886e-05, 1.0946e-05, 1.1005e-05, 1.1065e-05, 1.1124e-05, 1.1184e-05, 1.1243e-05, 1.1303e-05, 1.1362e-05, 1.1422e-05, 1.1481e-05, 1.1541e-05, 1.1600e-05, 1.1660e-05, 1.1719e-05, 1.1779e-05, 1.1838e-05, 1.1898e-05, 1.1957e-05, 1.2017e-05, 1.2076e-05, 1.2136e-05, 1.2195e-05, 1.2255e-05, 1.2314e-05, 1.2374e-05, 1.2433e-05, 1.2493e-05, 1.2552e-05, 1.2612e-05, 1.2671e-05, 1.2730e-05, 1.2790e-05, 1.2849e-05, 1.2909e-05, 1.2968e-05, 1.3028e-05, 1.3087e-05, 1.3147e-05, 1.3206e-05, 1.3266e-05, 1.3325e-05, 1.3385e-05, 1.3444e-05, 1.3504e-05, 1.3563e-05, 1.3623e-05, 1.3682e-05, 1.3742e-05, 1.3801e-05, 1.3861e-05, 1.3920e-05, 1.3980e-05, 1.4039e-05, 1.4099e-05, 1.4158e-05, 1.4218e-05, 1.4277e-05, 1.4337e-05, 1.4396e-05, 1.4456e-05, 1.4515e-05, 1.4575e-05, 1.4634e-05, 1.4694e-05, 1.4753e-05, 1.4813e-05, 1.4872e-05, 1.4932e-05, 1.4991e-05, 1.5051e-05, 1.5110e-05, 1.5169e-05, // NOLINT + 1.5229e-05, 1.5288e-05, 1.5348e-05, 1.5407e-05, 1.5467e-05, 1.5526e-05, 1.5586e-05, 1.5645e-05, 1.5705e-05, 1.5764e-05, 1.5824e-05, 1.5883e-05, 1.5943e-05, 1.6002e-05, 1.6062e-05, 1.6121e-05, 1.6181e-05, 1.6240e-05, 1.6300e-05, 1.6359e-05, 1.6419e-05, 1.6478e-05, 1.6538e-05, 1.6597e-05, 1.6657e-05, 1.6716e-05, 1.6776e-05, 1.6835e-05, 1.6895e-05, 1.6954e-05, 1.7014e-05, 1.7073e-05, 1.7133e-05, 1.7192e-05, 1.7252e-05, 1.7311e-05, 1.7371e-05, 1.7430e-05, 1.7490e-05, 1.7549e-05, 1.7609e-05, 1.7668e-05, 1.7727e-05, 1.7787e-05, 1.7846e-05, 1.7906e-05, 1.7965e-05, 1.8025e-05, 1.8084e-05, 1.8144e-05, 1.8203e-05, 1.8263e-05, 1.8322e-05, 1.8382e-05, 1.8441e-05, 1.8501e-05, 1.8560e-05, 1.8620e-05, 1.8679e-05, 1.8739e-05, 1.8798e-05, 1.8858e-05, 1.8917e-05, 1.8977e-05, 1.9036e-05, 1.9096e-05, 1.9155e-05, 1.9215e-05, 1.9274e-05, 1.9334e-05, 1.9393e-05, 1.9453e-05, 1.9512e-05, 1.9572e-05, 1.9631e-05, 1.9691e-05, 1.9750e-05, 1.9810e-05, 1.9869e-05, 1.9929e-05, 1.9988e-05, 2.0048e-05, 2.0107e-05, 2.0167e-05, 2.0226e-05, 2.0285e-05, 2.0345e-05, 2.0404e-05, 2.0464e-05, 2.0523e-05, 2.0583e-05, 2.0642e-05, 2.0702e-05, 2.0761e-05, 2.0821e-05, 2.0880e-05, 2.0940e-05, 2.0999e-05, 2.1059e-05, 2.1118e-05, 2.1178e-05, 2.1237e-05, 2.1297e-05, 2.1356e-05, 2.1416e-05, 2.1475e-05, 2.1535e-05, 2.1594e-05, 2.1654e-05, 2.1713e-05, 2.1773e-05, 2.1832e-05, 2.1892e-05, 2.1951e-05, 2.2011e-05, 2.2070e-05, 2.2130e-05, 2.2189e-05, 2.2249e-05, 2.2308e-05, 2.2368e-05, 2.2427e-05, 2.2487e-05, 2.2546e-05, 2.2606e-05, 2.2665e-05, 2.2725e-05, 2.2784e-05, 2.2843e-05, 2.2903e-05, 2.2962e-05, 2.3022e-05, 2.3081e-05, 2.3141e-05, 2.3200e-05, 2.3260e-05, 2.3319e-05, 2.3379e-05, 2.3438e-05, 2.3498e-05, 2.3557e-05, 2.3617e-05, 2.3676e-05, 2.3736e-05, 2.3795e-05, 2.3855e-05, 2.3914e-05, 2.3974e-05, 2.4033e-05, 2.4093e-05, 2.4152e-05, 2.4212e-05, 2.4271e-05, 2.4331e-05, 2.4390e-05, 2.4450e-05, 2.4509e-05, 2.4569e-05, 2.4628e-05, 2.4688e-05, 2.4747e-05, 2.4807e-05, 2.4866e-05, 2.4926e-05, 2.4985e-05, 2.5045e-05, 2.5104e-05, 2.5164e-05, 2.5223e-05, 2.5282e-05, 2.5342e-05, 2.5401e-05, 2.5461e-05, 2.5520e-05, 2.5580e-05, 2.5639e-05, 2.5699e-05, 2.5758e-05, 2.5818e-05, 2.5877e-05, 2.5937e-05, 2.5996e-05, 2.6056e-05, 2.6115e-05, 2.6175e-05, 2.6234e-05, 2.6294e-05, 2.6353e-05, 2.6413e-05, 2.6472e-05, 2.6532e-05, 2.6591e-05, 2.6651e-05, 2.6710e-05, 2.6770e-05, 2.6829e-05, 2.6889e-05, 2.6948e-05, 2.7008e-05, 2.7067e-05, 2.7127e-05, 2.7186e-05, 2.7246e-05, 2.7305e-05, 2.7365e-05, 2.7424e-05, 2.7484e-05, 2.7543e-05, 2.7603e-05, 2.7662e-05, 2.7722e-05, 2.7781e-05, 2.7840e-05, 2.7900e-05, 2.7959e-05, 2.8019e-05, 2.8078e-05, 2.8138e-05, 2.8197e-05, 2.8257e-05, 2.8316e-05, 2.8376e-05, 2.8435e-05, 2.8495e-05, 2.8554e-05, 2.8614e-05, 2.8673e-05, 2.8733e-05, 2.8792e-05, 2.8852e-05, 2.8911e-05, 2.8971e-05, 2.9030e-05, 2.9090e-05, 2.9149e-05, 2.9209e-05, 2.9268e-05, 2.9328e-05, 2.9387e-05, 2.9447e-05, 2.9506e-05, 2.9566e-05, 2.9625e-05, 2.9685e-05, 2.9744e-05, 2.9804e-05, 2.9863e-05, 2.9923e-05, 2.9982e-05, 3.0042e-05, 3.0101e-05, 3.0161e-05, 3.0220e-05, 3.0280e-05, 3.0339e-05, 3.0398e-05, // NOLINT + 3.0458e-05, 3.0577e-05, 3.0697e-05, 3.0816e-05, 3.0936e-05, 3.1055e-05, 3.1175e-05, 3.1294e-05, 3.1414e-05, 3.1533e-05, 3.1652e-05, 3.1772e-05, 3.1891e-05, 3.2011e-05, 3.2130e-05, 3.2250e-05, 3.2369e-05, 3.2489e-05, 3.2608e-05, 3.2727e-05, 3.2847e-05, 3.2966e-05, 3.3086e-05, 3.3205e-05, 3.3325e-05, 3.3444e-05, 3.3563e-05, 3.3683e-05, 3.3802e-05, 3.3922e-05, 3.4041e-05, 3.4161e-05, 3.4280e-05, 3.4400e-05, 3.4519e-05, 3.4638e-05, 3.4758e-05, 3.4877e-05, 3.4997e-05, 3.5116e-05, 3.5236e-05, 3.5355e-05, 3.5475e-05, 3.5594e-05, 3.5713e-05, 3.5833e-05, 3.5952e-05, 3.6072e-05, 3.6191e-05, 3.6311e-05, 3.6430e-05, 3.6550e-05, 3.6669e-05, 3.6788e-05, 3.6908e-05, 3.7027e-05, 3.7147e-05, 3.7266e-05, 3.7386e-05, 3.7505e-05, 3.7625e-05, 3.7744e-05, 3.7863e-05, 3.7983e-05, 3.8102e-05, 3.8222e-05, 3.8341e-05, 3.8461e-05, 3.8580e-05, 3.8700e-05, 3.8819e-05, 3.8938e-05, 3.9058e-05, 3.9177e-05, 3.9297e-05, 3.9416e-05, 3.9536e-05, 3.9655e-05, 3.9775e-05, 3.9894e-05, 4.0013e-05, 4.0133e-05, 4.0252e-05, 4.0372e-05, 4.0491e-05, 4.0611e-05, 4.0730e-05, 4.0850e-05, 4.0969e-05, 4.1088e-05, 4.1208e-05, 4.1327e-05, 4.1447e-05, 4.1566e-05, 4.1686e-05, 4.1805e-05, 4.1925e-05, 4.2044e-05, 4.2163e-05, 4.2283e-05, 4.2402e-05, 4.2522e-05, 4.2641e-05, 4.2761e-05, 4.2880e-05, 4.2999e-05, 4.3119e-05, 4.3238e-05, 4.3358e-05, 4.3477e-05, 4.3597e-05, 4.3716e-05, 4.3836e-05, 4.3955e-05, 4.4074e-05, 4.4194e-05, 4.4313e-05, 4.4433e-05, 4.4552e-05, 4.4672e-05, 4.4791e-05, 4.4911e-05, 4.5030e-05, 4.5149e-05, 4.5269e-05, 4.5388e-05, 4.5508e-05, 4.5627e-05, 4.5747e-05, 4.5866e-05, 4.5986e-05, 4.6105e-05, 4.6224e-05, 4.6344e-05, 4.6463e-05, 4.6583e-05, 4.6702e-05, 4.6822e-05, 4.6941e-05, 4.7061e-05, 4.7180e-05, 4.7299e-05, 4.7419e-05, 4.7538e-05, 4.7658e-05, 4.7777e-05, 4.7897e-05, 4.8016e-05, 4.8136e-05, 4.8255e-05, 4.8374e-05, 4.8494e-05, 4.8613e-05, 4.8733e-05, 4.8852e-05, 4.8972e-05, 4.9091e-05, 4.9211e-05, 4.9330e-05, 4.9449e-05, 4.9569e-05, 4.9688e-05, 4.9808e-05, 4.9927e-05, 5.0047e-05, 5.0166e-05, 5.0286e-05, 5.0405e-05, 5.0524e-05, 5.0644e-05, 5.0763e-05, 5.0883e-05, 5.1002e-05, 5.1122e-05, 5.1241e-05, 5.1361e-05, 5.1480e-05, 5.1599e-05, 5.1719e-05, 5.1838e-05, 5.1958e-05, 5.2077e-05, 5.2197e-05, 5.2316e-05, 5.2435e-05, 5.2555e-05, 5.2674e-05, 5.2794e-05, 5.2913e-05, 5.3033e-05, 5.3152e-05, 5.3272e-05, 5.3391e-05, 5.3510e-05, 5.3630e-05, 5.3749e-05, 5.3869e-05, 5.3988e-05, 5.4108e-05, 5.4227e-05, 5.4347e-05, 5.4466e-05, 5.4585e-05, 5.4705e-05, 5.4824e-05, 5.4944e-05, 5.5063e-05, 5.5183e-05, 5.5302e-05, 5.5422e-05, 5.5541e-05, 5.5660e-05, 5.5780e-05, 5.5899e-05, 5.6019e-05, 5.6138e-05, 5.6258e-05, 5.6377e-05, 5.6497e-05, 5.6616e-05, 5.6735e-05, 5.6855e-05, 5.6974e-05, 5.7094e-05, 5.7213e-05, 5.7333e-05, 5.7452e-05, 5.7572e-05, 5.7691e-05, 5.7810e-05, 5.7930e-05, 5.8049e-05, 5.8169e-05, 5.8288e-05, 5.8408e-05, 5.8527e-05, 5.8647e-05, 5.8766e-05, 5.8885e-05, 5.9005e-05, 5.9124e-05, 5.9244e-05, 5.9363e-05, 5.9483e-05, 5.9602e-05, 5.9722e-05, 5.9841e-05, 5.9960e-05, 6.0080e-05, 6.0199e-05, 6.0319e-05, 6.0438e-05, 6.0558e-05, 6.0677e-05, 6.0797e-05, 6.0916e-05, // NOLINT + 6.1154e-05, 6.1392e-05, 6.1631e-05, 6.1869e-05, 6.2107e-05, 6.2345e-05, 6.2583e-05, 6.2821e-05, 6.3060e-05, 6.3298e-05, 6.3536e-05, 6.3774e-05, 6.4012e-05, 6.4251e-05, 6.4489e-05, 6.4727e-05, 6.4965e-05, 6.5203e-05, 6.5441e-05, 6.5680e-05, 6.5918e-05, 6.6156e-05, 6.6394e-05, 6.6632e-05, 6.6871e-05, 6.7109e-05, 6.7347e-05, 6.7585e-05, 6.7823e-05, 6.8062e-05, 6.8300e-05, 6.8538e-05, 6.8776e-05, 6.9014e-05, 6.9252e-05, 6.9491e-05, 6.9729e-05, 6.9967e-05, 7.0205e-05, 7.0443e-05, 7.0682e-05, 7.0920e-05, 7.1158e-05, 7.1396e-05, 7.1634e-05, 7.1872e-05, 7.2111e-05, 7.2349e-05, 7.2587e-05, 7.2825e-05, 7.3063e-05, 7.3302e-05, 7.3540e-05, 7.3778e-05, 7.4016e-05, 7.4254e-05, 7.4493e-05, 7.4731e-05, 7.4969e-05, 7.5207e-05, 7.5445e-05, 7.5683e-05, 7.5922e-05, 7.6160e-05, 7.6398e-05, 7.6636e-05, 7.6874e-05, 7.7113e-05, 7.7351e-05, 7.7589e-05, 7.7827e-05, 7.8065e-05, 7.8304e-05, 7.8542e-05, 7.8780e-05, 7.9018e-05, 7.9256e-05, 7.9494e-05, 7.9733e-05, 7.9971e-05, 8.0209e-05, 8.0447e-05, 8.0685e-05, 8.0924e-05, 8.1162e-05, 8.1400e-05, 8.1638e-05, 8.1876e-05, 8.2114e-05, 8.2353e-05, 8.2591e-05, 8.2829e-05, 8.3067e-05, 8.3305e-05, 8.3544e-05, 8.3782e-05, 8.4020e-05, 8.4258e-05, 8.4496e-05, 8.4735e-05, 8.4973e-05, 8.5211e-05, 8.5449e-05, 8.5687e-05, 8.5925e-05, 8.6164e-05, 8.6402e-05, 8.6640e-05, 8.6878e-05, 8.7116e-05, 8.7355e-05, 8.7593e-05, 8.7831e-05, 8.8069e-05, 8.8307e-05, 8.8545e-05, 8.8784e-05, 8.9022e-05, 8.9260e-05, 8.9498e-05, 8.9736e-05, 8.9975e-05, 9.0213e-05, 9.0451e-05, 9.0689e-05, 9.0927e-05, 9.1166e-05, 9.1404e-05, 9.1642e-05, 9.1880e-05, 9.2118e-05, 9.2356e-05, 9.2595e-05, 9.2833e-05, 9.3071e-05, 9.3309e-05, 9.3547e-05, 9.3786e-05, 9.4024e-05, 9.4262e-05, 9.4500e-05, 9.4738e-05, 9.4977e-05, 9.5215e-05, 9.5453e-05, 9.5691e-05, 9.5929e-05, 9.6167e-05, 9.6406e-05, 9.6644e-05, 9.6882e-05, 9.7120e-05, 9.7358e-05, 9.7597e-05, 9.7835e-05, 9.8073e-05, 9.8311e-05, 9.8549e-05, 9.8787e-05, 9.9026e-05, 9.9264e-05, 9.9502e-05, 9.9740e-05, 9.9978e-05, 1.0022e-04, 1.0045e-04, 1.0069e-04, 1.0093e-04, 1.0117e-04, 1.0141e-04, 1.0165e-04, 1.0188e-04, 1.0212e-04, 1.0236e-04, 1.0260e-04, 1.0284e-04, 1.0307e-04, 1.0331e-04, 1.0355e-04, 1.0379e-04, 1.0403e-04, 1.0427e-04, 1.0450e-04, 1.0474e-04, 1.0498e-04, 1.0522e-04, 1.0546e-04, 1.0569e-04, 1.0593e-04, 1.0617e-04, 1.0641e-04, 1.0665e-04, 1.0689e-04, 1.0712e-04, 1.0736e-04, 1.0760e-04, 1.0784e-04, 1.0808e-04, 1.0831e-04, 1.0855e-04, 1.0879e-04, 1.0903e-04, 1.0927e-04, 1.0951e-04, 1.0974e-04, 1.0998e-04, 1.1022e-04, 1.1046e-04, 1.1070e-04, 1.1093e-04, 1.1117e-04, 1.1141e-04, 1.1165e-04, 1.1189e-04, 1.1213e-04, 1.1236e-04, 1.1260e-04, 1.1284e-04, 1.1308e-04, 1.1332e-04, 1.1355e-04, 1.1379e-04, 1.1403e-04, 1.1427e-04, 1.1451e-04, 1.1475e-04, 1.1498e-04, 1.1522e-04, 1.1546e-04, 1.1570e-04, 1.1594e-04, 1.1618e-04, 1.1641e-04, 1.1665e-04, 1.1689e-04, 1.1713e-04, 1.1737e-04, 1.1760e-04, 1.1784e-04, 1.1808e-04, 1.1832e-04, 1.1856e-04, 1.1880e-04, 1.1903e-04, 1.1927e-04, 1.1951e-04, 1.1975e-04, 1.1999e-04, 1.2022e-04, 1.2046e-04, 1.2070e-04, 1.2094e-04, 1.2118e-04, 1.2142e-04, 1.2165e-04, 1.2189e-04, // NOLINT + 1.2213e-04, 1.2237e-04, 1.2261e-04, 1.2284e-04, 1.2308e-04, 1.2332e-04, 1.2356e-04, 1.2380e-04, 1.2404e-04, 1.2427e-04, 1.2451e-04, 1.2475e-04, 1.2499e-04, 1.2523e-04, 1.2546e-04, 1.2570e-04, 1.2594e-04, 1.2618e-04, 1.2642e-04, 1.2666e-04, 1.2689e-04, 1.2713e-04, 1.2737e-04, 1.2761e-04, 1.2785e-04, 1.2808e-04, 1.2832e-04, 1.2856e-04, 1.2880e-04, 1.2904e-04, 1.2928e-04, 1.2951e-04, 1.2975e-04, 1.2999e-04, 1.3023e-04, 1.3047e-04, 1.3070e-04, 1.3094e-04, 1.3118e-04, 1.3142e-04, 1.3166e-04, 1.3190e-04, 1.3213e-04, 1.3237e-04, 1.3261e-04, 1.3285e-04, 1.3309e-04, 1.3332e-04, 1.3356e-04, 1.3380e-04, 1.3404e-04, 1.3428e-04, 1.3452e-04, 1.3475e-04, 1.3499e-04, 1.3523e-04, 1.3547e-04, 1.3571e-04, 1.3594e-04, 1.3618e-04, 1.3642e-04, 1.3666e-04, 1.3690e-04, 1.3714e-04, 1.3737e-04, 1.3761e-04, 1.3785e-04, 1.3809e-04, 1.3833e-04, 1.3856e-04, 1.3880e-04, 1.3904e-04, 1.3928e-04, 1.3952e-04, 1.3976e-04, 1.3999e-04, 1.4023e-04, 1.4047e-04, 1.4071e-04, 1.4095e-04, 1.4118e-04, 1.4142e-04, 1.4166e-04, 1.4190e-04, 1.4214e-04, 1.4238e-04, 1.4261e-04, 1.4285e-04, 1.4309e-04, 1.4333e-04, 1.4357e-04, 1.4380e-04, 1.4404e-04, 1.4428e-04, 1.4452e-04, 1.4476e-04, 1.4500e-04, 1.4523e-04, 1.4547e-04, 1.4571e-04, 1.4595e-04, 1.4619e-04, 1.4642e-04, 1.4666e-04, 1.4690e-04, 1.4714e-04, 1.4738e-04, 1.4762e-04, 1.4785e-04, 1.4809e-04, 1.4833e-04, 1.4857e-04, 1.4881e-04, 1.4904e-04, 1.4928e-04, 1.4952e-04, 1.4976e-04, 1.5000e-04, 1.5024e-04, 1.5047e-04, 1.5071e-04, 1.5095e-04, 1.5119e-04, 1.5143e-04, 1.5166e-04, 1.5190e-04, 1.5214e-04, 1.5238e-04, 1.5262e-04, 1.5286e-04, 1.5309e-04, 1.5333e-04, 1.5357e-04, 1.5381e-04, 1.5405e-04, 1.5428e-04, 1.5452e-04, 1.5476e-04, 1.5500e-04, 1.5524e-04, 1.5548e-04, 1.5571e-04, 1.5595e-04, 1.5619e-04, 1.5643e-04, 1.5667e-04, 1.5690e-04, 1.5714e-04, 1.5738e-04, 1.5762e-04, 1.5786e-04, 1.5810e-04, 1.5833e-04, 1.5857e-04, 1.5881e-04, 1.5905e-04, 1.5929e-04, 1.5952e-04, 1.5976e-04, 1.6000e-04, 1.6024e-04, 1.6048e-04, 1.6072e-04, 1.6095e-04, 1.6119e-04, 1.6143e-04, 1.6167e-04, 1.6191e-04, 1.6214e-04, 1.6238e-04, 1.6262e-04, 1.6286e-04, 1.6310e-04, 1.6334e-04, 1.6357e-04, 1.6381e-04, 1.6405e-04, 1.6429e-04, 1.6453e-04, 1.6476e-04, 1.6500e-04, 1.6524e-04, 1.6548e-04, 1.6572e-04, 1.6596e-04, 1.6619e-04, 1.6643e-04, 1.6667e-04, 1.6691e-04, 1.6715e-04, 1.6738e-04, 1.6762e-04, 1.6786e-04, 1.6810e-04, 1.6834e-04, 1.6858e-04, 1.6881e-04, 1.6905e-04, 1.6929e-04, 1.6953e-04, 1.6977e-04, 1.7001e-04, 1.7024e-04, 1.7048e-04, 1.7072e-04, 1.7096e-04, 1.7120e-04, 1.7143e-04, 1.7167e-04, 1.7191e-04, 1.7215e-04, 1.7239e-04, 1.7263e-04, 1.7286e-04, 1.7310e-04, 1.7334e-04, 1.7358e-04, 1.7382e-04, 1.7405e-04, 1.7429e-04, 1.7453e-04, 1.7477e-04, 1.7501e-04, 1.7525e-04, 1.7548e-04, 1.7572e-04, 1.7596e-04, 1.7620e-04, 1.7644e-04, 1.7667e-04, 1.7691e-04, 1.7715e-04, 1.7739e-04, 1.7763e-04, 1.7787e-04, 1.7810e-04, 1.7834e-04, 1.7858e-04, 1.7882e-04, 1.7906e-04, 1.7929e-04, 1.7953e-04, 1.7977e-04, 1.8001e-04, 1.8025e-04, 1.8049e-04, 1.8072e-04, 1.8096e-04, 1.8120e-04, 1.8144e-04, 1.8168e-04, 1.8191e-04, 1.8215e-04, 1.8239e-04, 1.8263e-04, 1.8287e-04, // NOLINT + 1.8311e-04, 1.8334e-04, 1.8358e-04, 1.8382e-04, 1.8406e-04, 1.8430e-04, 1.8453e-04, 1.8477e-04, 1.8501e-04, 1.8525e-04, 1.8549e-04, 1.8573e-04, 1.8596e-04, 1.8620e-04, 1.8644e-04, 1.8668e-04, 1.8692e-04, 1.8715e-04, 1.8739e-04, 1.8763e-04, 1.8787e-04, 1.8811e-04, 1.8835e-04, 1.8858e-04, 1.8882e-04, 1.8906e-04, 1.8930e-04, 1.8954e-04, 1.8977e-04, 1.9001e-04, 1.9025e-04, 1.9049e-04, 1.9073e-04, 1.9097e-04, 1.9120e-04, 1.9144e-04, 1.9168e-04, 1.9192e-04, 1.9216e-04, 1.9239e-04, 1.9263e-04, 1.9287e-04, 1.9311e-04, 1.9335e-04, 1.9359e-04, 1.9382e-04, 1.9406e-04, 1.9430e-04, 1.9454e-04, 1.9478e-04, 1.9501e-04, 1.9525e-04, 1.9549e-04, 1.9573e-04, 1.9597e-04, 1.9621e-04, 1.9644e-04, 1.9668e-04, 1.9692e-04, 1.9716e-04, 1.9740e-04, 1.9763e-04, 1.9787e-04, 1.9811e-04, 1.9835e-04, 1.9859e-04, 1.9883e-04, 1.9906e-04, 1.9930e-04, 1.9954e-04, 1.9978e-04, 2.0002e-04, 2.0025e-04, 2.0049e-04, 2.0073e-04, 2.0097e-04, 2.0121e-04, 2.0145e-04, 2.0168e-04, 2.0192e-04, 2.0216e-04, 2.0240e-04, 2.0264e-04, 2.0287e-04, 2.0311e-04, 2.0335e-04, 2.0359e-04, 2.0383e-04, 2.0407e-04, 2.0430e-04, 2.0454e-04, 2.0478e-04, 2.0502e-04, 2.0526e-04, 2.0549e-04, 2.0573e-04, 2.0597e-04, 2.0621e-04, 2.0645e-04, 2.0669e-04, 2.0692e-04, 2.0716e-04, 2.0740e-04, 2.0764e-04, 2.0788e-04, 2.0811e-04, 2.0835e-04, 2.0859e-04, 2.0883e-04, 2.0907e-04, 2.0931e-04, 2.0954e-04, 2.0978e-04, 2.1002e-04, 2.1026e-04, 2.1050e-04, 2.1073e-04, 2.1097e-04, 2.1121e-04, 2.1145e-04, 2.1169e-04, 2.1193e-04, 2.1216e-04, 2.1240e-04, 2.1264e-04, 2.1288e-04, 2.1312e-04, 2.1335e-04, 2.1359e-04, 2.1383e-04, 2.1407e-04, 2.1431e-04, 2.1455e-04, 2.1478e-04, 2.1502e-04, 2.1526e-04, 2.1550e-04, 2.1574e-04, 2.1597e-04, 2.1621e-04, 2.1645e-04, 2.1669e-04, 2.1693e-04, 2.1717e-04, 2.1740e-04, 2.1764e-04, 2.1788e-04, 2.1812e-04, 2.1836e-04, 2.1859e-04, 2.1883e-04, 2.1907e-04, 2.1931e-04, 2.1955e-04, 2.1979e-04, 2.2002e-04, 2.2026e-04, 2.2050e-04, 2.2074e-04, 2.2098e-04, 2.2121e-04, 2.2145e-04, 2.2169e-04, 2.2193e-04, 2.2217e-04, 2.2241e-04, 2.2264e-04, 2.2288e-04, 2.2312e-04, 2.2336e-04, 2.2360e-04, 2.2383e-04, 2.2407e-04, 2.2431e-04, 2.2455e-04, 2.2479e-04, 2.2503e-04, 2.2526e-04, 2.2550e-04, 2.2574e-04, 2.2598e-04, 2.2622e-04, 2.2646e-04, 2.2669e-04, 2.2693e-04, 2.2717e-04, 2.2741e-04, 2.2765e-04, 2.2788e-04, 2.2812e-04, 2.2836e-04, 2.2860e-04, 2.2884e-04, 2.2908e-04, 2.2931e-04, 2.2955e-04, 2.2979e-04, 2.3003e-04, 2.3027e-04, 2.3050e-04, 2.3074e-04, 2.3098e-04, 2.3122e-04, 2.3146e-04, 2.3170e-04, 2.3193e-04, 2.3217e-04, 2.3241e-04, 2.3265e-04, 2.3289e-04, 2.3312e-04, 2.3336e-04, 2.3360e-04, 2.3384e-04, 2.3408e-04, 2.3432e-04, 2.3455e-04, 2.3479e-04, 2.3503e-04, 2.3527e-04, 2.3551e-04, 2.3574e-04, 2.3598e-04, 2.3622e-04, 2.3646e-04, 2.3670e-04, 2.3694e-04, 2.3717e-04, 2.3741e-04, 2.3765e-04, 2.3789e-04, 2.3813e-04, 2.3836e-04, 2.3860e-04, 2.3884e-04, 2.3908e-04, 2.3932e-04, 2.3956e-04, 2.3979e-04, 2.4003e-04, 2.4027e-04, 2.4051e-04, 2.4075e-04, 2.4098e-04, 2.4122e-04, 2.4146e-04, 2.4170e-04, 2.4194e-04, 2.4218e-04, 2.4241e-04, 2.4265e-04, 2.4289e-04, 2.4313e-04, 2.4337e-04, 2.4360e-04, 2.4384e-04, // NOLINT + 2.4480e-04, 2.4575e-04, 2.4670e-04, 2.4766e-04, 2.4861e-04, 2.4956e-04, 2.5052e-04, 2.5147e-04, 2.5242e-04, 2.5337e-04, 2.5433e-04, 2.5528e-04, 2.5623e-04, 2.5719e-04, 2.5814e-04, 2.5909e-04, 2.6005e-04, 2.6100e-04, 2.6195e-04, 2.6291e-04, 2.6386e-04, 2.6481e-04, 2.6577e-04, 2.6672e-04, 2.6767e-04, 2.6863e-04, 2.6958e-04, 2.7053e-04, 2.7149e-04, 2.7244e-04, 2.7339e-04, 2.7435e-04, 2.7530e-04, 2.7625e-04, 2.7720e-04, 2.7816e-04, 2.7911e-04, 2.8006e-04, 2.8102e-04, 2.8197e-04, 2.8292e-04, 2.8388e-04, 2.8483e-04, 2.8578e-04, 2.8674e-04, 2.8769e-04, 2.8864e-04, 2.8960e-04, 2.9055e-04, 2.9150e-04, 2.9246e-04, 2.9341e-04, 2.9436e-04, 2.9532e-04, 2.9627e-04, 2.9722e-04, 2.9818e-04, 2.9913e-04, 3.0008e-04, 3.0104e-04, 3.0199e-04, 3.0294e-04, 3.0389e-04, 3.0485e-04, 3.0580e-04, 3.0675e-04, 3.0771e-04, 3.0866e-04, 3.0961e-04, 3.1057e-04, 3.1152e-04, 3.1247e-04, 3.1343e-04, 3.1438e-04, 3.1533e-04, 3.1629e-04, 3.1724e-04, 3.1819e-04, 3.1915e-04, 3.2010e-04, 3.2105e-04, 3.2201e-04, 3.2296e-04, 3.2391e-04, 3.2487e-04, 3.2582e-04, 3.2677e-04, 3.2772e-04, 3.2868e-04, 3.2963e-04, 3.3058e-04, 3.3154e-04, 3.3249e-04, 3.3344e-04, 3.3440e-04, 3.3535e-04, 3.3630e-04, 3.3726e-04, 3.3821e-04, 3.3916e-04, 3.4012e-04, 3.4107e-04, 3.4202e-04, 3.4298e-04, 3.4393e-04, 3.4488e-04, 3.4584e-04, 3.4679e-04, 3.4774e-04, 3.4870e-04, 3.4965e-04, 3.5060e-04, 3.5156e-04, 3.5251e-04, 3.5346e-04, 3.5441e-04, 3.5537e-04, 3.5632e-04, 3.5727e-04, 3.5823e-04, 3.5918e-04, 3.6013e-04, 3.6109e-04, 3.6204e-04, 3.6299e-04, 3.6395e-04, 3.6490e-04, 3.6585e-04, 3.6681e-04, 3.6776e-04, 3.6871e-04, 3.6967e-04, 3.7062e-04, 3.7157e-04, 3.7253e-04, 3.7348e-04, 3.7443e-04, 3.7539e-04, 3.7634e-04, 3.7729e-04, 3.7825e-04, 3.7920e-04, 3.8015e-04, 3.8110e-04, 3.8206e-04, 3.8301e-04, 3.8396e-04, 3.8492e-04, 3.8587e-04, 3.8682e-04, 3.8778e-04, 3.8873e-04, 3.8968e-04, 3.9064e-04, 3.9159e-04, 3.9254e-04, 3.9350e-04, 3.9445e-04, 3.9540e-04, 3.9636e-04, 3.9731e-04, 3.9826e-04, 3.9922e-04, 4.0017e-04, 4.0112e-04, 4.0208e-04, 4.0303e-04, 4.0398e-04, 4.0493e-04, 4.0589e-04, 4.0684e-04, 4.0779e-04, 4.0875e-04, 4.0970e-04, 4.1065e-04, 4.1161e-04, 4.1256e-04, 4.1351e-04, 4.1447e-04, 4.1542e-04, 4.1637e-04, 4.1733e-04, 4.1828e-04, 4.1923e-04, 4.2019e-04, 4.2114e-04, 4.2209e-04, 4.2305e-04, 4.2400e-04, 4.2495e-04, 4.2591e-04, 4.2686e-04, 4.2781e-04, 4.2877e-04, 4.2972e-04, 4.3067e-04, 4.3162e-04, 4.3258e-04, 4.3353e-04, 4.3448e-04, 4.3544e-04, 4.3639e-04, 4.3734e-04, 4.3830e-04, 4.3925e-04, 4.4020e-04, 4.4116e-04, 4.4211e-04, 4.4306e-04, 4.4402e-04, 4.4497e-04, 4.4592e-04, 4.4688e-04, 4.4783e-04, 4.4878e-04, 4.4974e-04, 4.5069e-04, 4.5164e-04, 4.5260e-04, 4.5355e-04, 4.5450e-04, 4.5545e-04, 4.5641e-04, 4.5736e-04, 4.5831e-04, 4.5927e-04, 4.6022e-04, 4.6117e-04, 4.6213e-04, 4.6308e-04, 4.6403e-04, 4.6499e-04, 4.6594e-04, 4.6689e-04, 4.6785e-04, 4.6880e-04, 4.6975e-04, 4.7071e-04, 4.7166e-04, 4.7261e-04, 4.7357e-04, 4.7452e-04, 4.7547e-04, 4.7643e-04, 4.7738e-04, 4.7833e-04, 4.7929e-04, 4.8024e-04, 4.8119e-04, 4.8214e-04, 4.8310e-04, 4.8405e-04, 4.8500e-04, 4.8596e-04, 4.8691e-04, 4.8786e-04, // NOLINT + 4.8977e-04, 4.9168e-04, 4.9358e-04, 4.9549e-04, 4.9740e-04, 4.9931e-04, 5.0121e-04, 5.0312e-04, 5.0503e-04, 5.0693e-04, 5.0884e-04, 5.1075e-04, 5.1265e-04, 5.1456e-04, 5.1647e-04, 5.1837e-04, 5.2028e-04, 5.2219e-04, 5.2409e-04, 5.2600e-04, 5.2791e-04, 5.2982e-04, 5.3172e-04, 5.3363e-04, 5.3554e-04, 5.3744e-04, 5.3935e-04, 5.4126e-04, 5.4316e-04, 5.4507e-04, 5.4698e-04, 5.4888e-04, 5.5079e-04, 5.5270e-04, 5.5460e-04, 5.5651e-04, 5.5842e-04, 5.6033e-04, 5.6223e-04, 5.6414e-04, 5.6605e-04, 5.6795e-04, 5.6986e-04, 5.7177e-04, 5.7367e-04, 5.7558e-04, 5.7749e-04, 5.7939e-04, 5.8130e-04, 5.8321e-04, 5.8512e-04, 5.8702e-04, 5.8893e-04, 5.9084e-04, 5.9274e-04, 5.9465e-04, 5.9656e-04, 5.9846e-04, 6.0037e-04, 6.0228e-04, 6.0418e-04, 6.0609e-04, 6.0800e-04, 6.0990e-04, 6.1181e-04, 6.1372e-04, 6.1563e-04, 6.1753e-04, 6.1944e-04, 6.2135e-04, 6.2325e-04, 6.2516e-04, 6.2707e-04, 6.2897e-04, 6.3088e-04, 6.3279e-04, 6.3469e-04, 6.3660e-04, 6.3851e-04, 6.4041e-04, 6.4232e-04, 6.4423e-04, 6.4614e-04, 6.4804e-04, 6.4995e-04, 6.5186e-04, 6.5376e-04, 6.5567e-04, 6.5758e-04, 6.5948e-04, 6.6139e-04, 6.6330e-04, 6.6520e-04, 6.6711e-04, 6.6902e-04, 6.7092e-04, 6.7283e-04, 6.7474e-04, 6.7665e-04, 6.7855e-04, 6.8046e-04, 6.8237e-04, 6.8427e-04, 6.8618e-04, 6.8809e-04, 6.8999e-04, 6.9190e-04, 6.9381e-04, 6.9571e-04, 6.9762e-04, 6.9953e-04, 7.0143e-04, 7.0334e-04, 7.0525e-04, 7.0716e-04, 7.0906e-04, 7.1097e-04, 7.1288e-04, 7.1478e-04, 7.1669e-04, 7.1860e-04, 7.2050e-04, 7.2241e-04, 7.2432e-04, 7.2622e-04, 7.2813e-04, 7.3004e-04, 7.3195e-04, 7.3385e-04, 7.3576e-04, 7.3767e-04, 7.3957e-04, 7.4148e-04, 7.4339e-04, 7.4529e-04, 7.4720e-04, 7.4911e-04, 7.5101e-04, 7.5292e-04, 7.5483e-04, 7.5673e-04, 7.5864e-04, 7.6055e-04, 7.6246e-04, 7.6436e-04, 7.6627e-04, 7.6818e-04, 7.7008e-04, 7.7199e-04, 7.7390e-04, 7.7580e-04, 7.7771e-04, 7.7962e-04, 7.8152e-04, 7.8343e-04, 7.8534e-04, 7.8724e-04, 7.8915e-04, 7.9106e-04, 7.9297e-04, 7.9487e-04, 7.9678e-04, 7.9869e-04, 8.0059e-04, 8.0250e-04, 8.0441e-04, 8.0631e-04, 8.0822e-04, 8.1013e-04, 8.1203e-04, 8.1394e-04, 8.1585e-04, 8.1775e-04, 8.1966e-04, 8.2157e-04, 8.2348e-04, 8.2538e-04, 8.2729e-04, 8.2920e-04, 8.3110e-04, 8.3301e-04, 8.3492e-04, 8.3682e-04, 8.3873e-04, 8.4064e-04, 8.4254e-04, 8.4445e-04, 8.4636e-04, 8.4826e-04, 8.5017e-04, 8.5208e-04, 8.5399e-04, 8.5589e-04, 8.5780e-04, 8.5971e-04, 8.6161e-04, 8.6352e-04, 8.6543e-04, 8.6733e-04, 8.6924e-04, 8.7115e-04, 8.7305e-04, 8.7496e-04, 8.7687e-04, 8.7878e-04, 8.8068e-04, 8.8259e-04, 8.8450e-04, 8.8640e-04, 8.8831e-04, 8.9022e-04, 8.9212e-04, 8.9403e-04, 8.9594e-04, 8.9784e-04, 8.9975e-04, 9.0166e-04, 9.0356e-04, 9.0547e-04, 9.0738e-04, 9.0929e-04, 9.1119e-04, 9.1310e-04, 9.1501e-04, 9.1691e-04, 9.1882e-04, 9.2073e-04, 9.2263e-04, 9.2454e-04, 9.2645e-04, 9.2835e-04, 9.3026e-04, 9.3217e-04, 9.3407e-04, 9.3598e-04, 9.3789e-04, 9.3980e-04, 9.4170e-04, 9.4361e-04, 9.4552e-04, 9.4742e-04, 9.4933e-04, 9.5124e-04, 9.5314e-04, 9.5505e-04, 9.5696e-04, 9.5886e-04, 9.6077e-04, 9.6268e-04, 9.6458e-04, 9.6649e-04, 9.6840e-04, 9.7031e-04, 9.7221e-04, 9.7412e-04, 9.7603e-04, // NOLINT + 9.7984e-04, 9.8365e-04, 9.8747e-04, 9.9128e-04, 9.9510e-04, 9.9891e-04, 1.0027e-03, 1.0065e-03, 1.0104e-03, 1.0142e-03, 1.0180e-03, 1.0218e-03, 1.0256e-03, 1.0294e-03, 1.0332e-03, 1.0371e-03, 1.0409e-03, 1.0447e-03, 1.0485e-03, 1.0523e-03, 1.0561e-03, 1.0599e-03, 1.0638e-03, 1.0676e-03, 1.0714e-03, 1.0752e-03, 1.0790e-03, 1.0828e-03, 1.0866e-03, 1.0905e-03, 1.0943e-03, 1.0981e-03, 1.1019e-03, 1.1057e-03, 1.1095e-03, 1.1133e-03, 1.1172e-03, 1.1210e-03, 1.1248e-03, 1.1286e-03, 1.1324e-03, 1.1362e-03, 1.1400e-03, 1.1439e-03, 1.1477e-03, 1.1515e-03, 1.1553e-03, 1.1591e-03, 1.1629e-03, 1.1667e-03, 1.1706e-03, 1.1744e-03, 1.1782e-03, 1.1820e-03, 1.1858e-03, 1.1896e-03, 1.1934e-03, 1.1973e-03, 1.2011e-03, 1.2049e-03, 1.2087e-03, 1.2125e-03, 1.2163e-03, 1.2201e-03, 1.2240e-03, 1.2278e-03, 1.2316e-03, 1.2354e-03, 1.2392e-03, 1.2430e-03, 1.2468e-03, 1.2507e-03, 1.2545e-03, 1.2583e-03, 1.2621e-03, 1.2659e-03, 1.2697e-03, 1.2735e-03, 1.2774e-03, 1.2812e-03, 1.2850e-03, 1.2888e-03, 1.2926e-03, 1.2964e-03, 1.3002e-03, 1.3040e-03, 1.3079e-03, 1.3117e-03, 1.3155e-03, 1.3193e-03, 1.3231e-03, 1.3269e-03, 1.3307e-03, 1.3346e-03, 1.3384e-03, 1.3422e-03, 1.3460e-03, 1.3498e-03, 1.3536e-03, 1.3574e-03, 1.3613e-03, 1.3651e-03, 1.3689e-03, 1.3727e-03, 1.3765e-03, 1.3803e-03, 1.3841e-03, 1.3880e-03, 1.3918e-03, 1.3956e-03, 1.3994e-03, 1.4032e-03, 1.4070e-03, 1.4108e-03, 1.4147e-03, 1.4185e-03, 1.4223e-03, 1.4261e-03, 1.4299e-03, 1.4337e-03, 1.4375e-03, 1.4414e-03, 1.4452e-03, 1.4490e-03, 1.4528e-03, 1.4566e-03, 1.4604e-03, 1.4642e-03, 1.4681e-03, 1.4719e-03, 1.4757e-03, 1.4795e-03, 1.4833e-03, 1.4871e-03, 1.4909e-03, 1.4948e-03, 1.4986e-03, 1.5024e-03, 1.5062e-03, 1.5100e-03, 1.5138e-03, 1.5176e-03, 1.5215e-03, 1.5253e-03, 1.5291e-03, 1.5329e-03, 1.5367e-03, 1.5405e-03, 1.5443e-03, 1.5482e-03, 1.5520e-03, 1.5558e-03, 1.5596e-03, 1.5634e-03, 1.5672e-03, 1.5710e-03, 1.5749e-03, 1.5787e-03, 1.5825e-03, 1.5863e-03, 1.5901e-03, 1.5939e-03, 1.5977e-03, 1.6016e-03, 1.6054e-03, 1.6092e-03, 1.6130e-03, 1.6168e-03, 1.6206e-03, 1.6244e-03, 1.6283e-03, 1.6321e-03, 1.6359e-03, 1.6397e-03, 1.6435e-03, 1.6473e-03, 1.6511e-03, 1.6550e-03, 1.6588e-03, 1.6626e-03, 1.6664e-03, 1.6702e-03, 1.6740e-03, 1.6778e-03, 1.6817e-03, 1.6855e-03, 1.6893e-03, 1.6931e-03, 1.6969e-03, 1.7007e-03, 1.7045e-03, 1.7084e-03, 1.7122e-03, 1.7160e-03, 1.7198e-03, 1.7236e-03, 1.7274e-03, 1.7312e-03, 1.7351e-03, 1.7389e-03, 1.7427e-03, 1.7465e-03, 1.7503e-03, 1.7541e-03, 1.7579e-03, 1.7618e-03, 1.7656e-03, 1.7694e-03, 1.7732e-03, 1.7770e-03, 1.7808e-03, 1.7846e-03, 1.7885e-03, 1.7923e-03, 1.7961e-03, 1.7999e-03, 1.8037e-03, 1.8075e-03, 1.8113e-03, 1.8152e-03, 1.8190e-03, 1.8228e-03, 1.8266e-03, 1.8304e-03, 1.8342e-03, 1.8380e-03, 1.8419e-03, 1.8457e-03, 1.8495e-03, 1.8533e-03, 1.8571e-03, 1.8609e-03, 1.8647e-03, 1.8686e-03, 1.8724e-03, 1.8762e-03, 1.8800e-03, 1.8838e-03, 1.8876e-03, 1.8914e-03, 1.8953e-03, 1.8991e-03, 1.9029e-03, 1.9067e-03, 1.9105e-03, 1.9143e-03, 1.9181e-03, 1.9220e-03, 1.9258e-03, 1.9296e-03, 1.9334e-03, 1.9372e-03, 1.9410e-03, 1.9448e-03, 1.9487e-03, 1.9525e-03, // NOLINT + 1.9601e-03, 1.9677e-03, 1.9754e-03, 1.9830e-03, 1.9906e-03, 1.9982e-03, 2.0059e-03, 2.0135e-03, 2.0211e-03, 2.0288e-03, 2.0364e-03, 2.0440e-03, 2.0516e-03, 2.0593e-03, 2.0669e-03, 2.0745e-03, 2.0822e-03, 2.0898e-03, 2.0974e-03, 2.1050e-03, 2.1127e-03, 2.1203e-03, 2.1279e-03, 2.1356e-03, 2.1432e-03, 2.1508e-03, 2.1585e-03, 2.1661e-03, 2.1737e-03, 2.1813e-03, 2.1890e-03, 2.1966e-03, 2.2042e-03, 2.2119e-03, 2.2195e-03, 2.2271e-03, 2.2347e-03, 2.2424e-03, 2.2500e-03, 2.2576e-03, 2.2653e-03, 2.2729e-03, 2.2805e-03, 2.2881e-03, 2.2958e-03, 2.3034e-03, 2.3110e-03, 2.3187e-03, 2.3263e-03, 2.3339e-03, 2.3415e-03, 2.3492e-03, 2.3568e-03, 2.3644e-03, 2.3721e-03, 2.3797e-03, 2.3873e-03, 2.3949e-03, 2.4026e-03, 2.4102e-03, 2.4178e-03, 2.4255e-03, 2.4331e-03, 2.4407e-03, 2.4483e-03, 2.4560e-03, 2.4636e-03, 2.4712e-03, 2.4789e-03, 2.4865e-03, 2.4941e-03, 2.5018e-03, 2.5094e-03, 2.5170e-03, 2.5246e-03, 2.5323e-03, 2.5399e-03, 2.5475e-03, 2.5552e-03, 2.5628e-03, 2.5704e-03, 2.5780e-03, 2.5857e-03, 2.5933e-03, 2.6009e-03, 2.6086e-03, 2.6162e-03, 2.6238e-03, 2.6314e-03, 2.6391e-03, 2.6467e-03, 2.6543e-03, 2.6620e-03, 2.6696e-03, 2.6772e-03, 2.6848e-03, 2.6925e-03, 2.7001e-03, 2.7077e-03, 2.7154e-03, 2.7230e-03, 2.7306e-03, 2.7382e-03, 2.7459e-03, 2.7535e-03, 2.7611e-03, 2.7688e-03, 2.7764e-03, 2.7840e-03, 2.7917e-03, 2.7993e-03, 2.8069e-03, 2.8145e-03, 2.8222e-03, 2.8298e-03, 2.8374e-03, 2.8451e-03, 2.8527e-03, 2.8603e-03, 2.8679e-03, 2.8756e-03, 2.8832e-03, 2.8908e-03, 2.8985e-03, 2.9061e-03, 2.9137e-03, 2.9213e-03, 2.9290e-03, 2.9366e-03, 2.9442e-03, 2.9519e-03, 2.9595e-03, 2.9671e-03, 2.9747e-03, 2.9824e-03, 2.9900e-03, 2.9976e-03, 3.0053e-03, 3.0129e-03, 3.0205e-03, 3.0281e-03, 3.0358e-03, 3.0434e-03, 3.0510e-03, 3.0587e-03, 3.0663e-03, 3.0739e-03, 3.0816e-03, 3.0892e-03, 3.0968e-03, 3.1044e-03, 3.1121e-03, 3.1197e-03, 3.1273e-03, 3.1350e-03, 3.1426e-03, 3.1502e-03, 3.1578e-03, 3.1655e-03, 3.1731e-03, 3.1807e-03, 3.1884e-03, 3.1960e-03, 3.2036e-03, 3.2112e-03, 3.2189e-03, 3.2265e-03, 3.2341e-03, 3.2418e-03, 3.2494e-03, 3.2570e-03, 3.2646e-03, 3.2723e-03, 3.2799e-03, 3.2875e-03, 3.2952e-03, 3.3028e-03, 3.3104e-03, 3.3180e-03, 3.3257e-03, 3.3333e-03, 3.3409e-03, 3.3486e-03, 3.3562e-03, 3.3638e-03, 3.3715e-03, 3.3791e-03, 3.3867e-03, 3.3943e-03, 3.4020e-03, 3.4096e-03, 3.4172e-03, 3.4249e-03, 3.4325e-03, 3.4401e-03, 3.4477e-03, 3.4554e-03, 3.4630e-03, 3.4706e-03, 3.4783e-03, 3.4859e-03, 3.4935e-03, 3.5011e-03, 3.5088e-03, 3.5164e-03, 3.5240e-03, 3.5317e-03, 3.5393e-03, 3.5469e-03, 3.5545e-03, 3.5622e-03, 3.5698e-03, 3.5774e-03, 3.5851e-03, 3.5927e-03, 3.6003e-03, 3.6079e-03, 3.6156e-03, 3.6232e-03, 3.6308e-03, 3.6385e-03, 3.6461e-03, 3.6537e-03, 3.6613e-03, 3.6690e-03, 3.6766e-03, 3.6842e-03, 3.6919e-03, 3.6995e-03, 3.7071e-03, 3.7148e-03, 3.7224e-03, 3.7300e-03, 3.7376e-03, 3.7453e-03, 3.7529e-03, 3.7605e-03, 3.7682e-03, 3.7758e-03, 3.7834e-03, 3.7910e-03, 3.7987e-03, 3.8063e-03, 3.8139e-03, 3.8216e-03, 3.8292e-03, 3.8368e-03, 3.8444e-03, 3.8521e-03, 3.8597e-03, 3.8673e-03, 3.8750e-03, 3.8826e-03, 3.8902e-03, 3.8978e-03, 3.9055e-03, // NOLINT + 3.9207e-03, 3.9360e-03, 3.9513e-03, 3.9665e-03, 3.9818e-03, 3.9970e-03, 4.0123e-03, 4.0275e-03, 4.0428e-03, 4.0581e-03, 4.0733e-03, 4.0886e-03, 4.1038e-03, 4.1191e-03, 4.1343e-03, 4.1496e-03, 4.1649e-03, 4.1801e-03, 4.1954e-03, 4.2106e-03, 4.2259e-03, 4.2412e-03, 4.2564e-03, 4.2717e-03, 4.2869e-03, 4.3022e-03, 4.3174e-03, 4.3327e-03, 4.3480e-03, 4.3632e-03, 4.3785e-03, 4.3937e-03, 4.4090e-03, 4.4243e-03, 4.4395e-03, 4.4548e-03, 4.4700e-03, 4.4853e-03, 4.5005e-03, 4.5158e-03, 4.5311e-03, 4.5463e-03, 4.5616e-03, 4.5768e-03, 4.5921e-03, 4.6074e-03, 4.6226e-03, 4.6379e-03, 4.6531e-03, 4.6684e-03, 4.6836e-03, 4.6989e-03, 4.7142e-03, 4.7294e-03, 4.7447e-03, 4.7599e-03, 4.7752e-03, 4.7905e-03, 4.8057e-03, 4.8210e-03, 4.8362e-03, 4.8515e-03, 4.8667e-03, 4.8820e-03, 4.8973e-03, 4.9125e-03, 4.9278e-03, 4.9430e-03, 4.9583e-03, 4.9736e-03, 4.9888e-03, 5.0041e-03, 5.0193e-03, 5.0346e-03, 5.0498e-03, 5.0651e-03, 5.0804e-03, 5.0956e-03, 5.1109e-03, 5.1261e-03, 5.1414e-03, 5.1567e-03, 5.1719e-03, 5.1872e-03, 5.2024e-03, 5.2177e-03, 5.2329e-03, 5.2482e-03, 5.2635e-03, 5.2787e-03, 5.2940e-03, 5.3092e-03, 5.3245e-03, 5.3398e-03, 5.3550e-03, 5.3703e-03, 5.3855e-03, 5.4008e-03, 5.4160e-03, 5.4313e-03, 5.4466e-03, 5.4618e-03, 5.4771e-03, 5.4923e-03, 5.5076e-03, 5.5229e-03, 5.5381e-03, 5.5534e-03, 5.5686e-03, 5.5839e-03, 5.5991e-03, 5.6144e-03, 5.6297e-03, 5.6449e-03, 5.6602e-03, 5.6754e-03, 5.6907e-03, 5.7060e-03, 5.7212e-03, 5.7365e-03, 5.7517e-03, 5.7670e-03, 5.7822e-03, 5.7975e-03, 5.8128e-03, 5.8280e-03, 5.8433e-03, 5.8585e-03, 5.8738e-03, 5.8891e-03, 5.9043e-03, 5.9196e-03, 5.9348e-03, 5.9501e-03, 5.9653e-03, 5.9806e-03, 5.9959e-03, 6.0111e-03, 6.0264e-03, 6.0416e-03, 6.0569e-03, 6.0722e-03, 6.0874e-03, 6.1027e-03, 6.1179e-03, 6.1332e-03, 6.1484e-03, 6.1637e-03, 6.1790e-03, 6.1942e-03, 6.2095e-03, 6.2247e-03, 6.2400e-03, 6.2553e-03, 6.2705e-03, 6.2858e-03, 6.3010e-03, 6.3163e-03, 6.3315e-03, 6.3468e-03, 6.3621e-03, 6.3773e-03, 6.3926e-03, 6.4078e-03, 6.4231e-03, 6.4384e-03, 6.4536e-03, 6.4689e-03, 6.4841e-03, 6.4994e-03, 6.5146e-03, 6.5299e-03, 6.5452e-03, 6.5604e-03, 6.5757e-03, 6.5909e-03, 6.6062e-03, 6.6215e-03, 6.6367e-03, 6.6520e-03, 6.6672e-03, 6.6825e-03, 6.6977e-03, 6.7130e-03, 6.7283e-03, 6.7435e-03, 6.7588e-03, 6.7740e-03, 6.7893e-03, 6.8046e-03, 6.8198e-03, 6.8351e-03, 6.8503e-03, 6.8656e-03, 6.8808e-03, 6.8961e-03, 6.9114e-03, 6.9266e-03, 6.9419e-03, 6.9571e-03, 6.9724e-03, 6.9877e-03, 7.0029e-03, 7.0182e-03, 7.0334e-03, 7.0487e-03, 7.0639e-03, 7.0792e-03, 7.0945e-03, 7.1097e-03, 7.1250e-03, 7.1402e-03, 7.1555e-03, 7.1708e-03, 7.1860e-03, 7.2013e-03, 7.2165e-03, 7.2318e-03, 7.2470e-03, 7.2623e-03, 7.2776e-03, 7.2928e-03, 7.3081e-03, 7.3233e-03, 7.3386e-03, 7.3539e-03, 7.3691e-03, 7.3844e-03, 7.3996e-03, 7.4149e-03, 7.4301e-03, 7.4454e-03, 7.4607e-03, 7.4759e-03, 7.4912e-03, 7.5064e-03, 7.5217e-03, 7.5370e-03, 7.5522e-03, 7.5675e-03, 7.5827e-03, 7.5980e-03, 7.6132e-03, 7.6285e-03, 7.6438e-03, 7.6590e-03, 7.6743e-03, 7.6895e-03, 7.7048e-03, 7.7201e-03, 7.7353e-03, 7.7506e-03, 7.7658e-03, 7.7811e-03, 7.7963e-03, 7.8116e-03, // NOLINT + 7.8421e-03, 7.8726e-03, 7.9032e-03, 7.9337e-03, 7.9642e-03, 7.9947e-03, 8.0252e-03, 8.0557e-03, 8.0863e-03, 8.1168e-03, 8.1473e-03, 8.1778e-03, 8.2083e-03, 8.2388e-03, 8.2694e-03, 8.2999e-03, 8.3304e-03, 8.3609e-03, 8.3914e-03, 8.4219e-03, 8.4525e-03, 8.4830e-03, 8.5135e-03, 8.5440e-03, 8.5745e-03, 8.6051e-03, 8.6356e-03, 8.6661e-03, 8.6966e-03, 8.7271e-03, 8.7576e-03, 8.7882e-03, 8.8187e-03, 8.8492e-03, 8.8797e-03, 8.9102e-03, 8.9407e-03, 8.9713e-03, 9.0018e-03, 9.0323e-03, 9.0628e-03, 9.0933e-03, 9.1238e-03, 9.1544e-03, 9.1849e-03, 9.2154e-03, 9.2459e-03, 9.2764e-03, 9.3069e-03, 9.3375e-03, 9.3680e-03, 9.3985e-03, 9.4290e-03, 9.4595e-03, 9.4900e-03, 9.5206e-03, 9.5511e-03, 9.5816e-03, 9.6121e-03, 9.6426e-03, 9.6731e-03, 9.7037e-03, 9.7342e-03, 9.7647e-03, 9.7952e-03, 9.8257e-03, 9.8563e-03, 9.8868e-03, 9.9173e-03, 9.9478e-03, 9.9783e-03, 1.0009e-02, 1.0039e-02, 1.0070e-02, 1.0100e-02, 1.0131e-02, 1.0161e-02, 1.0192e-02, 1.0222e-02, 1.0253e-02, 1.0283e-02, 1.0314e-02, 1.0345e-02, 1.0375e-02, 1.0406e-02, 1.0436e-02, 1.0467e-02, 1.0497e-02, 1.0528e-02, 1.0558e-02, 1.0589e-02, 1.0619e-02, 1.0650e-02, 1.0680e-02, 1.0711e-02, 1.0741e-02, 1.0772e-02, 1.0802e-02, 1.0833e-02, 1.0863e-02, 1.0894e-02, 1.0924e-02, 1.0955e-02, 1.0985e-02, 1.1016e-02, 1.1046e-02, 1.1077e-02, 1.1107e-02, 1.1138e-02, 1.1168e-02, 1.1199e-02, 1.1230e-02, 1.1260e-02, 1.1291e-02, 1.1321e-02, 1.1352e-02, 1.1382e-02, 1.1413e-02, 1.1443e-02, 1.1474e-02, 1.1504e-02, 1.1535e-02, 1.1565e-02, 1.1596e-02, 1.1626e-02, 1.1657e-02, 1.1687e-02, 1.1718e-02, 1.1748e-02, 1.1779e-02, 1.1809e-02, 1.1840e-02, 1.1870e-02, 1.1901e-02, 1.1931e-02, 1.1962e-02, 1.1992e-02, 1.2023e-02, 1.2053e-02, 1.2084e-02, 1.2115e-02, 1.2145e-02, 1.2176e-02, 1.2206e-02, 1.2237e-02, 1.2267e-02, 1.2298e-02, 1.2328e-02, 1.2359e-02, 1.2389e-02, 1.2420e-02, 1.2450e-02, 1.2481e-02, 1.2511e-02, 1.2542e-02, 1.2572e-02, 1.2603e-02, 1.2633e-02, 1.2664e-02, 1.2694e-02, 1.2725e-02, 1.2755e-02, 1.2786e-02, 1.2816e-02, 1.2847e-02, 1.2877e-02, 1.2908e-02, 1.2938e-02, 1.2969e-02, 1.3000e-02, 1.3030e-02, 1.3061e-02, 1.3091e-02, 1.3122e-02, 1.3152e-02, 1.3183e-02, 1.3213e-02, 1.3244e-02, 1.3274e-02, 1.3305e-02, 1.3335e-02, 1.3366e-02, 1.3396e-02, 1.3427e-02, 1.3457e-02, 1.3488e-02, 1.3518e-02, 1.3549e-02, 1.3579e-02, 1.3610e-02, 1.3640e-02, 1.3671e-02, 1.3701e-02, 1.3732e-02, 1.3762e-02, 1.3793e-02, 1.3823e-02, 1.3854e-02, 1.3885e-02, 1.3915e-02, 1.3946e-02, 1.3976e-02, 1.4007e-02, 1.4037e-02, 1.4068e-02, 1.4098e-02, 1.4129e-02, 1.4159e-02, 1.4190e-02, 1.4220e-02, 1.4251e-02, 1.4281e-02, 1.4312e-02, 1.4342e-02, 1.4373e-02, 1.4403e-02, 1.4434e-02, 1.4464e-02, 1.4495e-02, 1.4525e-02, 1.4556e-02, 1.4586e-02, 1.4617e-02, 1.4647e-02, 1.4678e-02, 1.4708e-02, 1.4739e-02, 1.4770e-02, 1.4800e-02, 1.4831e-02, 1.4861e-02, 1.4892e-02, 1.4922e-02, 1.4953e-02, 1.4983e-02, 1.5014e-02, 1.5044e-02, 1.5075e-02, 1.5105e-02, 1.5136e-02, 1.5166e-02, 1.5197e-02, 1.5227e-02, 1.5258e-02, 1.5288e-02, 1.5319e-02, 1.5349e-02, 1.5380e-02, 1.5410e-02, 1.5441e-02, 1.5471e-02, 1.5502e-02, 1.5532e-02, 1.5563e-02, 1.5593e-02, 1.5624e-02, // NOLINT + 1.5746e-02, 1.5868e-02, 1.5990e-02, 1.6112e-02, 1.6234e-02, 1.6356e-02, 1.6478e-02, 1.6601e-02, 1.6723e-02, 1.6845e-02, 1.6967e-02, 1.7089e-02, 1.7211e-02, 1.7333e-02, 1.7455e-02, 1.7577e-02, 1.7699e-02, 1.7821e-02, 1.7943e-02, 1.8065e-02, 1.8187e-02, 1.8310e-02, 1.8432e-02, 1.8554e-02, 1.8676e-02, 1.8798e-02, 1.8920e-02, 1.9042e-02, 1.9164e-02, 1.9286e-02, 1.9408e-02, 1.9530e-02, 1.9652e-02, 1.9774e-02, 1.9896e-02, 2.0018e-02, 2.0141e-02, 2.0263e-02, 2.0385e-02, 2.0507e-02, 2.0629e-02, 2.0751e-02, 2.0873e-02, 2.0995e-02, 2.1117e-02, 2.1239e-02, 2.1361e-02, 2.1483e-02, 2.1605e-02, 2.1727e-02, 2.1850e-02, 2.1972e-02, 2.2094e-02, 2.2216e-02, 2.2338e-02, 2.2460e-02, 2.2582e-02, 2.2704e-02, 2.2826e-02, 2.2948e-02, 2.3070e-02, 2.3192e-02, 2.3314e-02, 2.3436e-02, 2.3558e-02, 2.3681e-02, 2.3803e-02, 2.3925e-02, 2.4047e-02, 2.4169e-02, 2.4291e-02, 2.4413e-02, 2.4535e-02, 2.4657e-02, 2.4779e-02, 2.4901e-02, 2.5023e-02, 2.5145e-02, 2.5267e-02, 2.5390e-02, 2.5512e-02, 2.5634e-02, 2.5756e-02, 2.5878e-02, 2.6000e-02, 2.6122e-02, 2.6244e-02, 2.6366e-02, 2.6488e-02, 2.6610e-02, 2.6732e-02, 2.6854e-02, 2.6976e-02, 2.7099e-02, 2.7221e-02, 2.7343e-02, 2.7465e-02, 2.7587e-02, 2.7709e-02, 2.7831e-02, 2.7953e-02, 2.8075e-02, 2.8197e-02, 2.8319e-02, 2.8441e-02, 2.8563e-02, 2.8685e-02, 2.8807e-02, 2.8930e-02, 2.9052e-02, 2.9174e-02, 2.9296e-02, 2.9418e-02, 2.9540e-02, 2.9662e-02, 2.9784e-02, 2.9906e-02, 3.0028e-02, 3.0150e-02, 3.0272e-02, 3.0394e-02, 3.0516e-02, 3.0639e-02, 3.0761e-02, 3.0883e-02, 3.1005e-02, 3.1127e-02, 3.1249e-02, 3.1493e-02, 3.1737e-02, 3.1981e-02, 3.2225e-02, 3.2470e-02, 3.2714e-02, 3.2958e-02, 3.3202e-02, 3.3446e-02, 3.3690e-02, 3.3934e-02, 3.4179e-02, 3.4423e-02, 3.4667e-02, 3.4911e-02, 3.5155e-02, 3.5399e-02, 3.5643e-02, 3.5888e-02, 3.6132e-02, 3.6376e-02, 3.6620e-02, 3.6864e-02, 3.7108e-02, 3.7352e-02, 3.7596e-02, 3.7841e-02, 3.8085e-02, 3.8329e-02, 3.8573e-02, 3.8817e-02, 3.9061e-02, 3.9305e-02, 3.9550e-02, 3.9794e-02, 4.0038e-02, 4.0282e-02, 4.0526e-02, 4.0770e-02, 4.1014e-02, 4.1259e-02, 4.1503e-02, 4.1747e-02, 4.1991e-02, 4.2235e-02, 4.2479e-02, 4.2723e-02, 4.2968e-02, 4.3212e-02, 4.3456e-02, 4.3700e-02, 4.3944e-02, 4.4188e-02, 4.4432e-02, 4.4677e-02, 4.4921e-02, 4.5165e-02, 4.5409e-02, 4.5653e-02, 4.5897e-02, 4.6141e-02, 4.6386e-02, 4.6630e-02, 4.6874e-02, 4.7118e-02, 4.7362e-02, 4.7606e-02, 4.7850e-02, 4.8095e-02, 4.8339e-02, 4.8583e-02, 4.8827e-02, 4.9071e-02, 4.9315e-02, 4.9559e-02, 4.9803e-02, 5.0048e-02, 5.0292e-02, 5.0536e-02, 5.0780e-02, 5.1024e-02, 5.1268e-02, 5.1512e-02, 5.1757e-02, 5.2001e-02, 5.2245e-02, 5.2489e-02, 5.2733e-02, 5.2977e-02, 5.3221e-02, 5.3466e-02, 5.3710e-02, 5.3954e-02, 5.4198e-02, 5.4442e-02, 5.4686e-02, 5.4930e-02, 5.5175e-02, 5.5419e-02, 5.5663e-02, 5.5907e-02, 5.6151e-02, 5.6395e-02, 5.6639e-02, 5.6884e-02, 5.7128e-02, 5.7372e-02, 5.7616e-02, 5.7860e-02, 5.8104e-02, 5.8348e-02, 5.8593e-02, 5.8837e-02, 5.9081e-02, 5.9325e-02, 5.9569e-02, 5.9813e-02, 6.0057e-02, 6.0301e-02, 6.0546e-02, 6.0790e-02, 6.1034e-02, 6.1278e-02, 6.1522e-02, 6.1766e-02, 6.2010e-02, 6.2255e-02, 6.2499e-02, // NOLINT + 6.2743e-02, 6.2987e-02, 6.3231e-02, 6.3475e-02, 6.3719e-02, 6.3964e-02, 6.4208e-02, 6.4452e-02, 6.4696e-02, 6.4940e-02, 6.5184e-02, 6.5428e-02, 6.5673e-02, 6.5917e-02, 6.6161e-02, 6.6405e-02, 6.6649e-02, 6.6893e-02, 6.7137e-02, 6.7382e-02, 6.7626e-02, 6.7870e-02, 6.8114e-02, 6.8358e-02, 6.8602e-02, 6.8846e-02, 6.9091e-02, 6.9335e-02, 6.9579e-02, 6.9823e-02, 7.0067e-02, 7.0311e-02, 7.0555e-02, 7.0799e-02, 7.1044e-02, 7.1288e-02, 7.1532e-02, 7.1776e-02, 7.2020e-02, 7.2264e-02, 7.2508e-02, 7.2753e-02, 7.2997e-02, 7.3241e-02, 7.3485e-02, 7.3729e-02, 7.3973e-02, 7.4217e-02, 7.4462e-02, 7.4706e-02, 7.4950e-02, 7.5194e-02, 7.5438e-02, 7.5682e-02, 7.5926e-02, 7.6171e-02, 7.6415e-02, 7.6659e-02, 7.6903e-02, 7.7147e-02, 7.7391e-02, 7.7635e-02, 7.7880e-02, 7.8124e-02, 7.8368e-02, 7.8612e-02, 7.8856e-02, 7.9100e-02, 7.9344e-02, 7.9589e-02, 7.9833e-02, 8.0077e-02, 8.0321e-02, 8.0565e-02, 8.0809e-02, 8.1053e-02, 8.1298e-02, 8.1542e-02, 8.1786e-02, 8.2030e-02, 8.2274e-02, 8.2518e-02, 8.2762e-02, 8.3006e-02, 8.3251e-02, 8.3495e-02, 8.3739e-02, 8.3983e-02, 8.4227e-02, 8.4471e-02, 8.4715e-02, 8.4960e-02, 8.5204e-02, 8.5448e-02, 8.5692e-02, 8.5936e-02, 8.6180e-02, 8.6424e-02, 8.6669e-02, 8.6913e-02, 8.7157e-02, 8.7401e-02, 8.7645e-02, 8.7889e-02, 8.8133e-02, 8.8378e-02, 8.8622e-02, 8.8866e-02, 8.9110e-02, 8.9354e-02, 8.9598e-02, 8.9842e-02, 9.0087e-02, 9.0331e-02, 9.0575e-02, 9.0819e-02, 9.1063e-02, 9.1307e-02, 9.1551e-02, 9.1796e-02, 9.2040e-02, 9.2284e-02, 9.2528e-02, 9.2772e-02, 9.3016e-02, 9.3260e-02, 9.3504e-02, 9.3749e-02, 9.4237e-02, 9.4725e-02, 9.5213e-02, 9.5702e-02, 9.6190e-02, 9.6678e-02, 9.7167e-02, 9.7655e-02, 9.8143e-02, 9.8631e-02, 9.9120e-02, 9.9608e-02, 1.0010e-01, 1.0058e-01, 1.0107e-01, 1.0156e-01, 1.0205e-01, 1.0254e-01, 1.0303e-01, 1.0351e-01, 1.0400e-01, 1.0449e-01, 1.0498e-01, 1.0547e-01, 1.0596e-01, 1.0644e-01, 1.0693e-01, 1.0742e-01, 1.0791e-01, 1.0840e-01, 1.0889e-01, 1.0937e-01, 1.0986e-01, 1.1035e-01, 1.1084e-01, 1.1133e-01, 1.1182e-01, 1.1230e-01, 1.1279e-01, 1.1328e-01, 1.1377e-01, 1.1426e-01, 1.1474e-01, 1.1523e-01, 1.1572e-01, 1.1621e-01, 1.1670e-01, 1.1719e-01, 1.1767e-01, 1.1816e-01, 1.1865e-01, 1.1914e-01, 1.1963e-01, 1.2012e-01, 1.2060e-01, 1.2109e-01, 1.2158e-01, 1.2207e-01, 1.2256e-01, 1.2305e-01, 1.2353e-01, 1.2402e-01, 1.2451e-01, 1.2500e-01, 1.2549e-01, 1.2598e-01, 1.2646e-01, 1.2695e-01, 1.2744e-01, 1.2793e-01, 1.2842e-01, 1.2890e-01, 1.2939e-01, 1.2988e-01, 1.3037e-01, 1.3086e-01, 1.3135e-01, 1.3183e-01, 1.3232e-01, 1.3281e-01, 1.3330e-01, 1.3379e-01, 1.3428e-01, 1.3476e-01, 1.3525e-01, 1.3574e-01, 1.3623e-01, 1.3672e-01, 1.3721e-01, 1.3769e-01, 1.3818e-01, 1.3867e-01, 1.3916e-01, 1.3965e-01, 1.4014e-01, 1.4062e-01, 1.4111e-01, 1.4160e-01, 1.4209e-01, 1.4258e-01, 1.4306e-01, 1.4355e-01, 1.4404e-01, 1.4453e-01, 1.4502e-01, 1.4551e-01, 1.4599e-01, 1.4648e-01, 1.4697e-01, 1.4746e-01, 1.4795e-01, 1.4844e-01, 1.4892e-01, 1.4941e-01, 1.4990e-01, 1.5039e-01, 1.5088e-01, 1.5137e-01, 1.5185e-01, 1.5234e-01, 1.5283e-01, 1.5332e-01, 1.5381e-01, 1.5430e-01, 1.5478e-01, 1.5527e-01, 1.5576e-01, 1.5625e-01, // NOLINT + 1.5674e-01, 1.5723e-01, 1.5771e-01, 1.5820e-01, 1.5869e-01, 1.5918e-01, 1.5967e-01, 1.6015e-01, 1.6064e-01, 1.6113e-01, 1.6162e-01, 1.6211e-01, 1.6260e-01, 1.6308e-01, 1.6357e-01, 1.6406e-01, 1.6455e-01, 1.6504e-01, 1.6553e-01, 1.6601e-01, 1.6650e-01, 1.6699e-01, 1.6748e-01, 1.6797e-01, 1.6846e-01, 1.6894e-01, 1.6943e-01, 1.6992e-01, 1.7041e-01, 1.7090e-01, 1.7139e-01, 1.7187e-01, 1.7236e-01, 1.7285e-01, 1.7334e-01, 1.7383e-01, 1.7431e-01, 1.7480e-01, 1.7529e-01, 1.7578e-01, 1.7627e-01, 1.7676e-01, 1.7724e-01, 1.7773e-01, 1.7822e-01, 1.7871e-01, 1.7920e-01, 1.7969e-01, 1.8017e-01, 1.8066e-01, 1.8115e-01, 1.8164e-01, 1.8213e-01, 1.8262e-01, 1.8310e-01, 1.8359e-01, 1.8408e-01, 1.8457e-01, 1.8506e-01, 1.8555e-01, 1.8603e-01, 1.8652e-01, 1.8701e-01, 1.8750e-01, 1.8848e-01, 1.8945e-01, 1.9043e-01, 1.9140e-01, 1.9238e-01, 1.9336e-01, 1.9433e-01, 1.9531e-01, 1.9629e-01, 1.9726e-01, 1.9824e-01, 1.9922e-01, 2.0019e-01, 2.0117e-01, 2.0215e-01, 2.0312e-01, 2.0410e-01, 2.0508e-01, 2.0605e-01, 2.0703e-01, 2.0801e-01, 2.0898e-01, 2.0996e-01, 2.1094e-01, 2.1191e-01, 2.1289e-01, 2.1387e-01, 2.1484e-01, 2.1582e-01, 2.1680e-01, 2.1777e-01, 2.1875e-01, 2.1972e-01, 2.2070e-01, 2.2168e-01, 2.2265e-01, 2.2363e-01, 2.2461e-01, 2.2558e-01, 2.2656e-01, 2.2754e-01, 2.2851e-01, 2.2949e-01, 2.3047e-01, 2.3144e-01, 2.3242e-01, 2.3340e-01, 2.3437e-01, 2.3535e-01, 2.3633e-01, 2.3730e-01, 2.3828e-01, 2.3926e-01, 2.4023e-01, 2.4121e-01, 2.4219e-01, 2.4316e-01, 2.4414e-01, 2.4512e-01, 2.4609e-01, 2.4707e-01, 2.4805e-01, 2.4902e-01, 2.5000e-01, 2.5097e-01, 2.5195e-01, 2.5293e-01, 2.5390e-01, 2.5488e-01, 2.5586e-01, 2.5683e-01, 2.5781e-01, 2.5879e-01, 2.5976e-01, 2.6074e-01, 2.6172e-01, 2.6269e-01, 2.6367e-01, 2.6465e-01, 2.6562e-01, 2.6660e-01, 2.6758e-01, 2.6855e-01, 2.6953e-01, 2.7051e-01, 2.7148e-01, 2.7246e-01, 2.7344e-01, 2.7441e-01, 2.7539e-01, 2.7637e-01, 2.7734e-01, 2.7832e-01, 2.7930e-01, 2.8027e-01, 2.8125e-01, 2.8222e-01, 2.8320e-01, 2.8418e-01, 2.8515e-01, 2.8613e-01, 2.8711e-01, 2.8808e-01, 2.8906e-01, 2.9004e-01, 2.9101e-01, 2.9199e-01, 2.9297e-01, 2.9394e-01, 2.9492e-01, 2.9590e-01, 2.9687e-01, 2.9785e-01, 2.9883e-01, 2.9980e-01, 3.0078e-01, 3.0176e-01, 3.0273e-01, 3.0371e-01, 3.0469e-01, 3.0566e-01, 3.0664e-01, 3.0762e-01, 3.0859e-01, 3.0957e-01, 3.1055e-01, 3.1152e-01, 3.1250e-01, 3.1347e-01, 3.1445e-01, 3.1543e-01, 3.1640e-01, 3.1738e-01, 3.1836e-01, 3.1933e-01, 3.2031e-01, 3.2129e-01, 3.2226e-01, 3.2324e-01, 3.2422e-01, 3.2519e-01, 3.2617e-01, 3.2715e-01, 3.2812e-01, 3.2910e-01, 3.3008e-01, 3.3105e-01, 3.3203e-01, 3.3301e-01, 3.3398e-01, 3.3496e-01, 3.3594e-01, 3.3691e-01, 3.3789e-01, 3.3887e-01, 3.3984e-01, 3.4082e-01, 3.4180e-01, 3.4277e-01, 3.4375e-01, 3.4472e-01, 3.4570e-01, 3.4668e-01, 3.4765e-01, 3.4863e-01, 3.4961e-01, 3.5058e-01, 3.5156e-01, 3.5254e-01, 3.5351e-01, 3.5449e-01, 3.5547e-01, 3.5644e-01, 3.5742e-01, 3.5840e-01, 3.5937e-01, 3.6035e-01, 3.6133e-01, 3.6230e-01, 3.6328e-01, 3.6426e-01, 3.6523e-01, 3.6621e-01, 3.6719e-01, 3.6816e-01, 3.6914e-01, 3.7012e-01, 3.7109e-01, 3.7207e-01, 3.7305e-01, 3.7402e-01, 3.7500e-01, // NOLINT + 3.7695e-01, 3.7890e-01, 3.8086e-01, 3.8281e-01, 3.8476e-01, 3.8672e-01, 3.8867e-01, 3.9062e-01, 3.9258e-01, 3.9453e-01, 3.9648e-01, 3.9844e-01, 4.0039e-01, 4.0234e-01, 4.0430e-01, 4.0625e-01, 4.0820e-01, 4.1015e-01, 4.1211e-01, 4.1406e-01, 4.1601e-01, 4.1797e-01, 4.1992e-01, 4.2187e-01, 4.2383e-01, 4.2578e-01, 4.2773e-01, 4.2969e-01, 4.3164e-01, 4.3359e-01, 4.3555e-01, 4.3750e-01, 4.3945e-01, 4.4140e-01, 4.4336e-01, 4.4531e-01, 4.4726e-01, 4.4922e-01, 4.5117e-01, 4.5312e-01, 4.5508e-01, 4.5703e-01, 4.5898e-01, 4.6094e-01, 4.6289e-01, 4.6484e-01, 4.6680e-01, 4.6875e-01, 4.7070e-01, 4.7265e-01, 4.7461e-01, 4.7656e-01, 4.7851e-01, 4.8047e-01, 4.8242e-01, 4.8437e-01, 4.8633e-01, 4.8828e-01, 4.9023e-01, 4.9219e-01, 4.9414e-01, 4.9609e-01, 4.9805e-01, 5.0000e-01, 5.0195e-01, 5.0390e-01, 5.0586e-01, 5.0781e-01, 5.0976e-01, 5.1172e-01, 5.1367e-01, 5.1562e-01, 5.1758e-01, 5.1953e-01, 5.2148e-01, 5.2344e-01, 5.2539e-01, 5.2734e-01, 5.2930e-01, 5.3125e-01, 5.3320e-01, 5.3515e-01, 5.3711e-01, 5.3906e-01, 5.4101e-01, 5.4297e-01, 5.4492e-01, 5.4687e-01, 5.4883e-01, 5.5078e-01, 5.5273e-01, 5.5469e-01, 5.5664e-01, 5.5859e-01, 5.6055e-01, 5.6250e-01, 5.6445e-01, 5.6640e-01, 5.6836e-01, 5.7031e-01, 5.7226e-01, 5.7422e-01, 5.7617e-01, 5.7812e-01, 5.8008e-01, 5.8203e-01, 5.8398e-01, 5.8594e-01, 5.8789e-01, 5.8984e-01, 5.9180e-01, 5.9375e-01, 5.9570e-01, 5.9765e-01, 5.9961e-01, 6.0156e-01, 6.0351e-01, 6.0547e-01, 6.0742e-01, 6.0937e-01, 6.1133e-01, 6.1328e-01, 6.1523e-01, 6.1719e-01, 6.1914e-01, 6.2109e-01, 6.2305e-01, 6.2500e-01, 6.2695e-01, 6.2890e-01, 6.3086e-01, 6.3281e-01, 6.3476e-01, 6.3672e-01, 6.3867e-01, 6.4062e-01, 6.4258e-01, 6.4453e-01, 6.4648e-01, 6.4844e-01, 6.5039e-01, 6.5234e-01, 6.5430e-01, 6.5625e-01, 6.5820e-01, 6.6015e-01, 6.6211e-01, 6.6406e-01, 6.6601e-01, 6.6797e-01, 6.6992e-01, 6.7187e-01, 6.7383e-01, 6.7578e-01, 6.7773e-01, 6.7969e-01, 6.8164e-01, 6.8359e-01, 6.8554e-01, 6.8750e-01, 6.8945e-01, 6.9140e-01, 6.9336e-01, 6.9531e-01, 6.9726e-01, 6.9922e-01, 7.0117e-01, 7.0312e-01, 7.0508e-01, 7.0703e-01, 7.0898e-01, 7.1094e-01, 7.1289e-01, 7.1484e-01, 7.1679e-01, 7.1875e-01, 7.2070e-01, 7.2265e-01, 7.2461e-01, 7.2656e-01, 7.2851e-01, 7.3047e-01, 7.3242e-01, 7.3437e-01, 7.3633e-01, 7.3828e-01, 7.4023e-01, 7.4219e-01, 7.4414e-01, 7.4609e-01, 7.4804e-01, 7.5000e-01, 7.5390e-01, 7.5781e-01, 7.6172e-01, 7.6562e-01, 7.6953e-01, 7.7344e-01, 7.7734e-01, 7.8125e-01, 7.8515e-01, 7.8906e-01, 7.9297e-01, 7.9687e-01, 8.0078e-01, 8.0469e-01, 8.0859e-01, 8.1250e-01, 8.1640e-01, 8.2031e-01, 8.2422e-01, 8.2812e-01, 8.3203e-01, 8.3594e-01, 8.3984e-01, 8.4375e-01, 8.4765e-01, 8.5156e-01, 8.5547e-01, 8.5937e-01, 8.6328e-01, 8.6719e-01, 8.7109e-01, 8.7500e-01, 8.7890e-01, 8.8281e-01, 8.8672e-01, 8.9062e-01, 8.9453e-01, 8.9844e-01, 9.0234e-01, 9.0625e-01, 9.1015e-01, 9.1406e-01, 9.1797e-01, 9.2187e-01, 9.2578e-01, 9.2969e-01, 9.3359e-01, 9.3750e-01, 9.4140e-01, 9.4531e-01, 9.4922e-01, 9.5312e-01, 9.5703e-01, 9.6094e-01, 9.6484e-01, 9.6875e-01, 9.7265e-01, 9.7656e-01, 9.8047e-01, 9.8437e-01, 9.8828e-01, 9.9219e-01, 9.9609e-01, 1.0000e+00 // NOLINT }; -float4 val4_from_12(uchar8 pvs, float gain) { - uint4 parsed = (uint4)(((uint)pvs.s0<<4) + (pvs.s1>>4), // is from the previous 10 bit - ((uint)pvs.s2<<4) + (pvs.s4&0xF), - ((uint)pvs.s3<<4) + (pvs.s4>>4), - ((uint)pvs.s5<<4) + (pvs.s7&0xF)); - #if IS_OX +float4 normalize_pv(int4 parsed, float vignette_factor) { // PWL - //float4 pv = (convert_float4(parsed) - 64.0) / (4096.0 - 64.0); float4 pv = {ox03c10_lut[parsed.s0], ox03c10_lut[parsed.s1], ox03c10_lut[parsed.s2], ox03c10_lut[parsed.s3]}; - - // it's a 24 bit signal, center in the middle 8 bits - return clamp(pv*gain*256.0, 0.0, 1.0); - #else // AR - // normalize and scale - float4 pv = (convert_float4(parsed) - 168.0) / (4096.0 - 168.0); - return clamp(pv*gain, 0.0, 1.0); - #endif - + return clamp(pv*vignette_factor*256.0, 0.0, 1.0); } -float4 val4_from_10(uchar8 pvs, uchar ext, bool aligned, float gain) { - uint4 parsed; - if (aligned) { - parsed = (uint4)(((uint)pvs.s0 << 2) + (pvs.s1 & 0b00000011), - ((uint)pvs.s2 << 2) + ((pvs.s6 & 0b11000000) / 64), - ((uint)pvs.s3 << 2) + ((pvs.s6 & 0b00110000) / 16), - ((uint)pvs.s4 << 2) + ((pvs.s6 & 0b00001100) / 4)); - } else { - parsed = (uint4)(((uint)pvs.s0 << 2) + ((pvs.s3 & 0b00110000) / 16), - ((uint)pvs.s1 << 2) + ((pvs.s3 & 0b00001100) / 4), - ((uint)pvs.s2 << 2) + ((pvs.s3 & 0b00000011)), - ((uint)pvs.s4 << 2) + ((ext & 0b11000000) / 64)); - } - - float4 pv = convert_float4(parsed) / 1024.0; - return clamp(pv*gain, 0.0, 1.0); +float3 color_correct(float3 rgb) { + float3 corrected = rgb.x * (float3)(1.5664815, -0.29808738, -0.03973474); + corrected += rgb.y * (float3)(-0.48672447, 1.41914433, -0.40295248); + corrected += rgb.z * (float3)(-0.07975703, -0.12105695, 1.44268722); + return corrected; } -float get_k(float a, float b, float c, float d) { - return 2.0 - (fabs(a - b) + fabs(c - d)); +float3 apply_gamma(float3 rgb, int expo_time) { + return -0.507089*exp(-12.54124638*rgb) + 0.9655*powr(rgb, 0.5) - 0.472597*rgb + 0.507089; } -__kernel void debayer10(const __global uchar * in, __global uchar * out) -{ - const int gid_x = get_global_id(0); - const int gid_y = get_global_id(1); - - const int row_before_offset = (gid_y == 0) ? 2 : 0; - const int row_after_offset = (gid_y == (RGB_HEIGHT/2 - 1)) ? 1 : 3; - - float3 rgb; - uchar3 rgb_out[4]; - - #if IS_BGGR - constant int row_read_order[] = {3, 2, 1, 0}; - constant int rgb_write_order[] = {2, 3, 0, 1}; - #else - constant int row_read_order[] = {0, 1, 2, 3}; - constant int rgb_write_order[] = {0, 1, 2, 3}; - #endif - - int start_idx; - #if IS_10BIT - bool aligned10; - if (gid_x % 2 == 0) { - aligned10 = true; - start_idx = (2 * gid_y - 1) * FRAME_STRIDE + (5 * gid_x / 2 - 2) + (FRAME_STRIDE * FRAME_OFFSET); - } else { - aligned10 = false; - start_idx = (2 * gid_y - 1) * FRAME_STRIDE + (5 * (gid_x - 1) / 2 + 1) + (FRAME_STRIDE * FRAME_OFFSET); - } - #else - start_idx = (2 * gid_y - 1) * FRAME_STRIDE + (3 * gid_x - 2) + (FRAME_STRIDE * FRAME_OFFSET); - #endif - - // read in 8x4 chars - uchar8 dat[4]; - dat[0] = vload8(0, in + start_idx + FRAME_STRIDE*row_before_offset); - dat[1] = vload8(0, in + start_idx + FRAME_STRIDE*1); - dat[2] = vload8(0, in + start_idx + FRAME_STRIDE*2); - dat[3] = vload8(0, in + start_idx + FRAME_STRIDE*row_after_offset); - - // need extra bit for 10-bit - #if IS_10BIT - uchar extra[4]; - if (!aligned10) { - extra[0] = in[start_idx + FRAME_STRIDE*row_before_offset + 8]; - extra[1] = in[start_idx + FRAME_STRIDE*1 + 8]; - extra[2] = in[start_idx + FRAME_STRIDE*2 + 8]; - extra[3] = in[start_idx + FRAME_STRIDE*row_after_offset + 8]; - } - #endif - - // correct vignetting - #if VIGNETTING - int gx = (gid_x*2 - RGB_WIDTH/2); - int gy = (gid_y*2 - RGB_HEIGHT/2); - const float gain = get_vignetting_s(gx*gx + gy*gy); - #else - const float gain = 1.0; - #endif - - float4 v_rows[4]; - // parse into floats - #if IS_10BIT - v_rows[row_read_order[0]] = val4_from_10(dat[0], extra[0], aligned10, 1.0); - v_rows[row_read_order[1]] = val4_from_10(dat[1], extra[1], aligned10, 1.0); - v_rows[row_read_order[2]] = val4_from_10(dat[2], extra[2], aligned10, 1.0); - v_rows[row_read_order[3]] = val4_from_10(dat[3], extra[3], aligned10, 1.0); - #else - v_rows[row_read_order[0]] = val4_from_12(dat[0], gain); - v_rows[row_read_order[1]] = val4_from_12(dat[1], gain); - v_rows[row_read_order[2]] = val4_from_12(dat[2], gain); - v_rows[row_read_order[3]] = val4_from_12(dat[3], gain); - #endif - - // mirror padding - if (gid_x == 0) { - v_rows[0].s0 = v_rows[0].s2; - v_rows[1].s0 = v_rows[1].s2; - v_rows[2].s0 = v_rows[2].s2; - v_rows[3].s0 = v_rows[3].s2; - } else if (gid_x == RGB_WIDTH/2 - 1) { - v_rows[0].s3 = v_rows[0].s1; - v_rows[1].s3 = v_rows[1].s1; - v_rows[2].s3 = v_rows[2].s1; - v_rows[3].s3 = v_rows[3].s1; - } - - // a simplified version of https://opensignalprocessingjournal.com/contents/volumes/V6/TOSIGPJ-6-1/TOSIGPJ-6-1.pdf - const float k01 = get_k(v_rows[0].s0, v_rows[1].s1, v_rows[0].s2, v_rows[1].s1); - const float k02 = get_k(v_rows[0].s2, v_rows[1].s1, v_rows[2].s2, v_rows[1].s1); - const float k03 = get_k(v_rows[2].s0, v_rows[1].s1, v_rows[2].s2, v_rows[1].s1); - const float k04 = get_k(v_rows[0].s0, v_rows[1].s1, v_rows[2].s0, v_rows[1].s1); - rgb.x = (k02*v_rows[1].s2+k04*v_rows[1].s0)/(k02+k04); // R_G1 - rgb.y = v_rows[1].s1; // G1(R) - rgb.z = (k01*v_rows[0].s1+k03*v_rows[2].s1)/(k01+k03); // B_G1 - rgb_out[rgb_write_order[0]] = convert_uchar3_sat(color_correct(clamp(rgb, 0.0, 1.0)) * 255.0); - - const float k11 = get_k(v_rows[0].s1, v_rows[2].s1, v_rows[0].s3, v_rows[2].s3); - const float k12 = get_k(v_rows[0].s2, v_rows[1].s1, v_rows[1].s3, v_rows[2].s2); - const float k13 = get_k(v_rows[0].s1, v_rows[0].s3, v_rows[2].s1, v_rows[2].s3); - const float k14 = get_k(v_rows[0].s2, v_rows[1].s3, v_rows[2].s2, v_rows[1].s1); - rgb.x = v_rows[1].s2; // R - rgb.y = (k11*(v_rows[0].s2+v_rows[2].s2)*0.5+k13*(v_rows[1].s3+v_rows[1].s1)*0.5)/(k11+k13); // G_R - rgb.z = (k12*(v_rows[0].s3+v_rows[2].s1)*0.5+k14*(v_rows[0].s1+v_rows[2].s3)*0.5)/(k12+k14); // B_R - rgb_out[rgb_write_order[1]] = convert_uchar3_sat(color_correct(clamp(rgb, 0.0, 1.0)) * 255.0); - - const float k21 = get_k(v_rows[1].s0, v_rows[3].s0, v_rows[1].s2, v_rows[3].s2); - const float k22 = get_k(v_rows[1].s1, v_rows[2].s0, v_rows[2].s2, v_rows[3].s1); - const float k23 = get_k(v_rows[1].s0, v_rows[1].s2, v_rows[3].s0, v_rows[3].s2); - const float k24 = get_k(v_rows[1].s1, v_rows[2].s2, v_rows[3].s1, v_rows[2].s0); - rgb.x = (k22*(v_rows[1].s2+v_rows[3].s0)*0.5+k24*(v_rows[1].s0+v_rows[3].s2)*0.5)/(k22+k24); // R_B - rgb.y = (k21*(v_rows[1].s1+v_rows[3].s1)*0.5+k23*(v_rows[2].s2+v_rows[2].s0)*0.5)/(k21+k23); // G_B - rgb.z = v_rows[2].s1; // B - rgb_out[rgb_write_order[2]] = convert_uchar3_sat(color_correct(clamp(rgb, 0.0, 1.0)) * 255.0); - - const float k31 = get_k(v_rows[1].s1, v_rows[2].s2, v_rows[1].s3, v_rows[2].s2); - const float k32 = get_k(v_rows[1].s3, v_rows[2].s2, v_rows[3].s3, v_rows[2].s2); - const float k33 = get_k(v_rows[3].s1, v_rows[2].s2, v_rows[3].s3, v_rows[2].s2); - const float k34 = get_k(v_rows[1].s1, v_rows[2].s2, v_rows[3].s1, v_rows[2].s2); - rgb.x = (k31*v_rows[1].s2+k33*v_rows[3].s2)/(k31+k33); // R_G2 - rgb.y = v_rows[2].s2; // G2(B) - rgb.z = (k32*v_rows[2].s3+k34*v_rows[2].s1)/(k32+k34); // B_G2 - rgb_out[rgb_write_order[3]] = convert_uchar3_sat(color_correct(clamp(rgb, 0.0, 1.0)) * 255.0); - - // write ys - uchar2 yy = (uchar2)( - RGB_TO_Y(rgb_out[0].s0, rgb_out[0].s1, rgb_out[0].s2), - RGB_TO_Y(rgb_out[1].s0, rgb_out[1].s1, rgb_out[1].s2) - ); - vstore2(yy, 0, out + mad24(gid_y * 2, YUV_STRIDE, gid_x * 2)); - yy = (uchar2)( - RGB_TO_Y(rgb_out[2].s0, rgb_out[2].s1, rgb_out[2].s2), - RGB_TO_Y(rgb_out[3].s0, rgb_out[3].s1, rgb_out[3].s2) - ); - vstore2(yy, 0, out + mad24(gid_y * 2 + 1, YUV_STRIDE, gid_x * 2)); - - // write uvs - const short ar = AVERAGE(rgb_out[0].s0, rgb_out[1].s0, rgb_out[2].s0, rgb_out[3].s0); - const short ag = AVERAGE(rgb_out[0].s1, rgb_out[1].s1, rgb_out[2].s1, rgb_out[3].s1); - const short ab = AVERAGE(rgb_out[0].s2, rgb_out[1].s2, rgb_out[2].s2, rgb_out[3].s2); - uchar2 uv = (uchar2)( - RGB_TO_U(ar, ag, ab), - RGB_TO_V(ar, ag, ab) - ); - vstore2(uv, 0, out + UV_OFFSET + mad24(gid_y, YUV_STRIDE, gid_x * 2)); -} +#endif \ No newline at end of file diff --git a/system/camerad/sensors/sensor.h b/system/camerad/sensors/sensor.h index d97fd32a9c..d004163644 100644 --- a/system/camerad/sensors/sensor.h +++ b/system/camerad/sensors/sensor.h @@ -22,6 +22,7 @@ public: virtual void processRegisters(CameraState *c, cereal::FrameData::Builder &framed) const {} cereal::FrameData::ImageSensor image_sensor = cereal::FrameData::ImageSensor::UNKNOWN; + float pixel_size_mm; uint32_t frame_width, frame_height; uint32_t frame_stride; uint32_t frame_offset = 0; diff --git a/system/camerad/test/test_ae_gray.cc b/system/camerad/test/test_ae_gray.cc index 06d784927a..be9a0cc59f 100644 --- a/system/camerad/test/test_ae_gray.cc +++ b/system/camerad/test/test_ae_gray.cc @@ -36,6 +36,7 @@ TEST_CASE("camera.test_set_exposure_target") { cb.cur_yuv_buf = &vb; cb.rgb_width = W; cb.rgb_height = H; + Rect rect = {0, 0, W-1, H-1}; printf("AE test patterns %dx%d\n", cb.rgb_width, cb.rgb_height); @@ -60,7 +61,7 @@ TEST_CASE("camera.test_set_exposure_target") { memset(&fb_y[h_0*W+h_1*W], l[2], h_2*W); memset(&fb_y[h_0*W+h_1*W+h_2*W], l[3], h_3*W); memset(&fb_y[h_0*W+h_1*W+h_2*W+h_3*W], l[4], h_4*W); - float ev = set_exposure_target((const CameraBuf*) &cb, 0, W-1, 1, 0, H-1, 1); + float ev = set_exposure_target((const CameraBuf*) &cb, rect, 1, 1); // printf("%d/%d/%d/%d/%d ev is %f\n", h_0, h_1, h_2, h_3, h_4, ev); // printf("%f\n", ev); From 0d5dd25db51b01486933a5f1299ccac26521d89d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 19 Apr 2024 10:03:47 -0700 Subject: [PATCH 310/384] jenkins: simplify timer check (#32254) simplify timer check --- Jenkinsfile | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1a0e2c73e9..efba905c6b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -9,26 +9,9 @@ def retryWithDelay(int maxRetries, int delay, Closure body) { throw Exception("Failed after ${maxRetries} retries") } -// check if started by timer: https://stackoverflow.com/questions/43516025/how-to-handle-nightly-build-in-jenkins-declarative-pipeline -@NonCPS +// check if started by timer: https://gist.github.com/aaclarker/75b8a0eb2b4d600779f84f8e849f2c37 def isJobStartedByTimer() { - def startedByTimer = false - try { - def buildCauses = currentBuild.rawBuild.getCauses() - for ( buildCause in buildCauses ) { - if (buildCause != null) { - def causeDescription = buildCause.getShortDescription() - echo "shortDescription: ${causeDescription}" - if (causeDescription.contains("Started by timer")) { - startedByTimer = true - } - } - } - } catch(theError) { - echo "Error getting build cause" - } - - return startedByTimer + return currentBuild.getBuildCauses()[0]["shortDescription"].matches("Started by timer"); } def device(String ip, String step_label, String cmd) { From 60c71580dae659f97a74281271923e60c115eb8a Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 19 Apr 2024 11:14:40 -0700 Subject: [PATCH 311/384] [bot] Fingerprints: add missing FW versions from new users (#32253) Export fingerprints --- selfdrive/car/honda/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index e7d325ca18..d53cffe325 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -875,6 +875,7 @@ FW_VERSIONS = { b'37805-5YF-A750\x00\x00', b'37805-5YF-A760\x00\x00', b'37805-5YF-A850\x00\x00', + b'37805-5YF-A860\x00\x00', b'37805-5YF-A870\x00\x00', b'37805-5YF-AD20\x00\x00', b'37805-5YF-C210\x00\x00', From a824bd75ef38d3e40341151dd8bf5fb1eac02f3c Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sat, 20 Apr 2024 02:15:34 +0800 Subject: [PATCH 312/384] replay: refactor `Event` to remove the readers (#32252) Refactor struct Event to remove the MessageReader from it --- tools/cabana/streams/replaystream.cc | 8 +++- tools/cabana/videowidget.cc | 6 ++- tools/replay/SConscript | 2 - tools/replay/camera.cc | 14 ++++-- tools/replay/camera.h | 6 +-- tools/replay/logreader.cc | 68 +++++++++------------------- tools/replay/logreader.h | 19 +++----- tools/replay/replay.cc | 36 ++++++++++----- tools/replay/tests/test_replay.cc | 2 +- tools/replay/util.cc | 1 + 10 files changed, 76 insertions(+), 86 deletions(-) diff --git a/tools/cabana/streams/replaystream.cc b/tools/cabana/streams/replaystream.cc index aff0122b47..3fa8bb0fe9 100644 --- a/tools/cabana/streams/replaystream.cc +++ b/tools/cabana/streams/replaystream.cc @@ -36,7 +36,9 @@ void ReplayStream::mergeSegments() { for (auto it = seg->log->events.cbegin(); it != seg->log->events.cend(); ++it) { if ((*it)->which == cereal::Event::Which::CAN) { const uint64_t ts = (*it)->mono_time; - for (const auto &c : (*it)->event.getCan()) { + capnp::FlatArrayMessageReader reader((*it)->data); + auto event = reader.getRoot(); + for (const auto &c : event.getCan()) { new_events.push_back(newEvent(ts, c)); } } @@ -66,7 +68,9 @@ bool ReplayStream::eventFilter(const Event *event) { static double prev_update_ts = 0; if (event->which == cereal::Event::Which::CAN) { double current_sec = event->mono_time / 1e9 - routeStartTime(); - for (const auto &c : event->event.getCan()) { + capnp::FlatArrayMessageReader reader(event->data); + auto e = reader.getRoot(); + for (const auto &c : e.getCan()) { MessageId id = {.source = c.getSrc(), .address = c.getAddress()}; const auto dat = c.getDat(); updateEvent(id, current_sec, (const uint8_t*)dat.begin(), dat.size()); diff --git a/tools/cabana/videowidget.cc b/tools/cabana/videowidget.cc index a6fd0b2b64..ad20543755 100644 --- a/tools/cabana/videowidget.cc +++ b/tools/cabana/videowidget.cc @@ -263,7 +263,8 @@ void Slider::parseQLog(int segnum, std::shared_ptr qlog) { std::mutex mutex; QtConcurrent::blockingMap(qlog->events.cbegin(), qlog->events.cend(), [&mutex, this](const Event *e) { if (e->which == cereal::Event::Which::THUMBNAIL) { - auto thumb = e->event.getThumbnail(); + capnp::FlatArrayMessageReader reader(e->data); + auto thumb = reader.getRoot().getThumbnail(); auto data = thumb.getThumbnail(); if (QPixmap pm; pm.loadFromData(data.begin(), data.size(), "jpeg")) { QPixmap scaled = pm.scaledToHeight(MIN_VIDEO_HEIGHT - THUMBNAIL_MARGIN * 2, Qt::SmoothTransformation); @@ -271,7 +272,8 @@ void Slider::parseQLog(int segnum, std::shared_ptr qlog) { thumbnails[thumb.getTimestampEof()] = scaled; } } else if (e->which == cereal::Event::Which::CONTROLS_STATE) { - auto cs = e->event.getControlsState(); + capnp::FlatArrayMessageReader reader(e->data); + auto cs = reader.getRoot().getControlsState(); if (cs.getAlertType().size() > 0 && cs.getAlertText1().size() > 0 && cs.getAlertSize() != cereal::ControlsState::AlertSize::NONE) { std::lock_guard lk(mutex); diff --git a/tools/replay/SConscript b/tools/replay/SConscript index db8447003b..5d88f560be 100644 --- a/tools/replay/SConscript +++ b/tools/replay/SConscript @@ -9,8 +9,6 @@ if arch == "Darwin": else: base_libs.append('OpenCL') -qt_env['CXXFLAGS'] += ["-Wno-deprecated-declarations"] - replay_lib_src = ["replay.cc", "consoleui.cc", "camera.cc", "filereader.cc", "logreader.cc", "framereader.cc", "route.cc", "util.cc"] replay_lib = qt_env.Library("qt_replay", replay_lib_src, LIBS=base_libs, FRAMEWORKS=base_frameworks) Export('replay_lib') diff --git a/tools/replay/camera.cc b/tools/replay/camera.cc index 49f3010c6c..9a023db6fa 100644 --- a/tools/replay/camera.cc +++ b/tools/replay/camera.cc @@ -1,7 +1,8 @@ #include "tools/replay/camera.h" +#include + #include -#include #include "third_party/linux/include/msm_media_info.h" #include "tools/replay/util.h" @@ -57,9 +58,14 @@ void CameraServer::cameraThread(Camera &cam) { }; while (true) { - const auto [fr, eidx] = cam.queue.pop(); + const auto [fr, event] = cam.queue.pop(); if (!fr) break; + capnp::FlatArrayMessageReader reader(event->data); + auto evt = reader.getRoot(); + auto eidx = capnp::AnyStruct::Reader(evt).getPointerSection()[0].getAs(); + if (eidx.getType() != cereal::EncodeIndex::Type::FULL_H_E_V_C) continue; + const int id = eidx.getSegmentId(); bool prefetched = (id == cam.cached_id && eidx.getSegmentNum() == cam.cached_seg); auto yuv = prefetched ? cam.cached_buf : read_frame(fr, id); @@ -83,7 +89,7 @@ void CameraServer::cameraThread(Camera &cam) { } } -void CameraServer::pushFrame(CameraType type, FrameReader *fr, const cereal::EncodeIndex::Reader &eidx) { +void CameraServer::pushFrame(CameraType type, FrameReader *fr, const Event *event) { auto &cam = cameras_[type]; if (cam.width != fr->width || cam.height != fr->height) { cam.width = fr->width; @@ -93,7 +99,7 @@ void CameraServer::pushFrame(CameraType type, FrameReader *fr, const cereal::Enc } ++publishing_; - cam.queue.push({fr, eidx}); + cam.queue.push({fr, event}); } void CameraServer::waitForSent() { diff --git a/tools/replay/camera.h b/tools/replay/camera.h index 9f43c5a362..436423ac72 100644 --- a/tools/replay/camera.h +++ b/tools/replay/camera.h @@ -1,7 +1,5 @@ #pragma once -#include - #include #include #include @@ -17,7 +15,7 @@ class CameraServer { public: CameraServer(std::pair camera_size[MAX_CAMERAS] = nullptr); ~CameraServer(); - void pushFrame(CameraType type, FrameReader* fr, const cereal::EncodeIndex::Reader& eidx); + void pushFrame(CameraType type, FrameReader* fr, const Event *event); void waitForSent(); protected: @@ -27,7 +25,7 @@ protected: int width; int height; std::thread thread; - SafeQueue> queue; + SafeQueue> queue; int cached_id = -1; int cached_seg = -1; VisionBuf * cached_buf; diff --git a/tools/replay/logreader.cc b/tools/replay/logreader.cc index c92ff4753f..36b07f19d0 100644 --- a/tools/replay/logreader.cc +++ b/tools/replay/logreader.cc @@ -4,34 +4,7 @@ #include "tools/replay/filereader.h" #include "tools/replay/util.h" -Event::Event(const kj::ArrayPtr &amsg, bool frame) : reader(amsg), frame(frame) { - words = kj::ArrayPtr(amsg.begin(), reader.getEnd()); - event = reader.getRoot(); - which = event.which(); - mono_time = event.getLogMonoTime(); - - // 1) Send video data at t=timestampEof/timestampSof - // 2) Send encodeIndex packet at t=logMonoTime - if (frame) { - auto idx = capnp::AnyStruct::Reader(event).getPointerSection()[0].getAs(); - // C2 only has eof set, and some older routes have neither - uint64_t sof = idx.getTimestampSof(); - uint64_t eof = idx.getTimestampEof(); - if (sof > 0) { - mono_time = sof; - } else if (eof > 0) { - mono_time = eof; - } - } -} - -// class LogReader - LogReader::LogReader(size_t memory_pool_block_size) { -#ifdef HAS_MEMORY_RESOURCE - const size_t buf_size = sizeof(Event) * memory_pool_block_size; - mbr_ = std::make_unique(buf_size); -#endif events.reserve(memory_pool_block_size); } @@ -61,33 +34,28 @@ bool LogReader::parse(std::atomic *abort) { try { kj::ArrayPtr words((const capnp::word *)raw_.data(), raw_.size() / sizeof(capnp::word)); while (words.size() > 0 && !(abort && *abort)) { -#ifdef HAS_MEMORY_RESOURCE - Event *evt = new (mbr_.get()) Event(words); -#else - Event *evt = new Event(words); -#endif + capnp::FlatArrayMessageReader reader(words); + auto event = reader.getRoot(); + auto which = event.which(); + uint64_t mono_time = event.getLogMonoTime(); + auto event_data = kj::arrayPtr(words.begin(), reader.getEnd()); + + Event *evt = events.emplace_back(newEvent(which, mono_time, event_data)); // Add encodeIdx packet again as a frame packet for the video stream if (evt->which == cereal::Event::ROAD_ENCODE_IDX || evt->which == cereal::Event::DRIVER_ENCODE_IDX || evt->which == cereal::Event::WIDE_ROAD_ENCODE_IDX) { - -#ifdef HAS_MEMORY_RESOURCE - Event *frame_evt = new (mbr_.get()) Event(words, true); -#else - Event *frame_evt = new Event(words, true); -#endif - - events.push_back(frame_evt); + auto idx = capnp::AnyStruct::Reader(event).getPointerSection()[0].getAs(); + if (uint64_t sof = idx.getTimestampSof()) { + mono_time = sof; + } + events.emplace_back(newEvent(which, mono_time, event_data, idx.getSegmentNum())); } - words = kj::arrayPtr(evt->reader.getEnd(), words.end()); - events.push_back(evt); + words = kj::arrayPtr(reader.getEnd(), words.end()); } } catch (const kj::Exception &e) { - rWarning("failed to parse log : %s", e.getDescription().cStr()); - if (!events.empty()) { - rWarning("read %zu events from corrupt log", events.size()); - } + rWarning("Failed to parse log : %s.\nRetrieved %zu events from corrupt log", e.getDescription().cStr(), events.size()); } if (!events.empty() && !(abort && *abort)) { @@ -96,3 +64,11 @@ bool LogReader::parse(std::atomic *abort) { } return false; } + +Event *LogReader::newEvent(cereal::Event::Which which, uint64_t mono_time, const kj::ArrayPtr &words, int eidx_segnum) { +#ifdef HAS_MEMORY_RESOURCE + return new (&mbr_) Event(which, mono_time, words, eidx_segnum); +#else + return new Event(which, mono_time, words, eidx_segnum); +#endif +} diff --git a/tools/replay/logreader.h b/tools/replay/logreader.h index 73f822d16c..2a28d7b432 100644 --- a/tools/replay/logreader.h +++ b/tools/replay/logreader.h @@ -4,7 +4,6 @@ #define HAS_MEMORY_RESOURCE 1 #include #endif - #include #include #include @@ -18,13 +17,8 @@ const int DEFAULT_EVENT_MEMORY_POOL_BLOCK_SIZE = 65000; class Event { public: - Event(cereal::Event::Which which, uint64_t mono_time) : reader(kj::ArrayPtr{}) { - // construct a dummy Event for binary search, e.g std::upper_bound - this->which = which; - this->mono_time = mono_time; - } - Event(const kj::ArrayPtr &amsg, bool frame = false); - inline kj::ArrayPtr bytes() const { return words.asBytes(); } + Event(cereal::Event::Which which, uint64_t mono_time, const kj::ArrayPtr &data, int eidx_segnum = -1) + : which(which), mono_time(mono_time), data(data), eidx_segnum(eidx_segnum) {} struct lessThan { inline bool operator()(const Event *l, const Event *r) { @@ -43,10 +37,8 @@ public: uint64_t mono_time; cereal::Event::Which which; - cereal::Event::Reader event; - capnp::FlatArrayMessageReader reader; - kj::ArrayPtr words; - bool frame; + kj::ArrayPtr data; + int32_t eidx_segnum; }; class LogReader { @@ -59,9 +51,10 @@ public: std::vector events; private: + Event *newEvent(cereal::Event::Which which, uint64_t mono_time, const kj::ArrayPtr &words, int eidx_segnum = -1); bool parse(std::atomic *abort); std::string raw_; #ifdef HAS_MEMORY_RESOURCE - std::unique_ptr mbr_; + std::pmr::monotonic_buffer_resource mbr_{DEFAULT_EVENT_MEMORY_POOL_BLOCK_SIZE * sizeof(Event)}; #endif }; diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index ae148f1a5b..2e50722551 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -148,7 +148,9 @@ void Replay::buildTimeline() { for (const Event *e : log->events) { if (e->which == cereal::Event::Which::CONTROLS_STATE) { - auto cs = e->event.getControlsState(); + capnp::FlatArrayMessageReader reader(e->data); + auto event = reader.getRoot(); + auto cs = event.getControlsState(); if (engaged != cs.getEnabled()) { if (engaged) { @@ -232,6 +234,7 @@ void Replay::queueSegment() { auto begin = std::prev(cur, std::min(segment_cache_limit / 2, std::distance(segments_.begin(), cur))); auto end = std::next(begin, std::min(segment_cache_limit, std::distance(begin, segments_.end()))); + begin = std::prev(end, std::min(segment_cache_limit, std::distance(segments_.begin(), end))); // load one segment at a time auto it = std::find_if(cur, end, [](auto &it) { return !it.second || !it.second->isLoaded(); }); if (it != end && !it->second) { @@ -316,7 +319,9 @@ void Replay::startStream(const Segment *cur_segment) { auto it = std::find_if(events.cbegin(), events.cend(), [](auto e) { return e->which == cereal::Event::Which::INIT_DATA; }); if (it != events.cend()) { - uint64_t wall_time = (*it)->event.getInitData().getWallTimeNanos(); + capnp::FlatArrayMessageReader reader((*it)->data); + auto event = reader.getRoot(); + uint64_t wall_time = event.getInitData().getWallTimeNanos(); if (wall_time > 0) { route_date_time_ = QDateTime::fromMSecsSinceEpoch(wall_time / 1e6); } @@ -325,9 +330,11 @@ void Replay::startStream(const Segment *cur_segment) { // write CarParams it = std::find_if(events.begin(), events.end(), [](auto e) { return e->which == cereal::Event::Which::CAR_PARAMS; }); if (it != events.end()) { - car_fingerprint_ = (*it)->event.getCarParams().getCarFingerprint(); + capnp::FlatArrayMessageReader reader((*it)->data); + auto event = reader.getRoot(); + car_fingerprint_ = event.getCarParams().getCarFingerprint(); capnp::MallocMessageBuilder builder; - builder.setRoot((*it)->event.getCarParams()); + builder.setRoot(event.getCarParams()); auto words = capnp::messageToFlatArray(builder); auto bytes = words.asBytes(); Params().put("CarParams", (const char *)bytes.begin(), bytes.size()); @@ -361,14 +368,16 @@ void Replay::publishMessage(const Event *e) { if (event_filter && event_filter(e, filter_opaque)) return; if (sm == nullptr) { - auto bytes = e->bytes(); + auto bytes = e->data.asBytes(); int ret = pm->send(sockets_[e->which], (capnp::byte *)bytes.begin(), bytes.size()); if (ret == -1) { rWarning("stop publishing %s due to multiple publishers error", sockets_[e->which]); sockets_[e->which] = nullptr; } } else { - sm->update_msgs(nanos_since_boot(), {{sockets_[e->which], e->event}}); + capnp::FlatArrayMessageReader reader(e->data); + auto event = reader.getRoot(); + sm->update_msgs(nanos_since_boot(), {{sockets_[e->which], event}}); } } @@ -382,10 +391,13 @@ void Replay::publishFrame(const Event *e) { (e->which == cereal::Event::WIDE_ROAD_ENCODE_IDX && !hasFlag(REPLAY_FLAG_ECAM))) { return; } - auto eidx = capnp::AnyStruct::Reader(e->event).getPointerSection()[0].getAs(); - if (eidx.getType() == cereal::EncodeIndex::Type::FULL_H_E_V_C && isSegmentMerged(eidx.getSegmentNum())) { - CameraType cam = cam_types.at(e->which); - camera_server_->pushFrame(cam, segments_[eidx.getSegmentNum()]->frames[cam].get(), eidx); + + if (isSegmentMerged(e->eidx_segnum)) { + auto &segment = segments_.at(e->eidx_segnum); + auto cam = cam_types.at(e->which); + if (auto &frame = segment->frames[cam]; frame) { + camera_server_->pushFrame(cam, frame.get(), e); + } } } @@ -399,7 +411,7 @@ void Replay::stream() { events_updated_ = false; if (exit_) break; - Event cur_event(cur_which, cur_mono_time_); + Event cur_event{cur_which, cur_mono_time_, {}}; auto eit = std::upper_bound(events_->begin(), events_->end(), &cur_event, Event::lessThan()); if (eit == events_->end()) { rInfo("waiting for events..."); @@ -430,7 +442,7 @@ void Replay::stream() { precise_nano_sleep(behind_ns); } - if (!evt->frame) { + if (evt->eidx_segnum == -1) { publishMessage(evt); } else if (camera_server_) { if (speed_ > 1.0) { diff --git a/tools/replay/tests/test_replay.cc b/tools/replay/tests/test_replay.cc index 92510053ef..a681f347bb 100644 --- a/tools/replay/tests/test_replay.cc +++ b/tools/replay/tests/test_replay.cc @@ -178,7 +178,7 @@ void TestReplay::testSeekTo(int seek_to) { continue; } - Event cur_event(cereal::Event::Which::INIT_DATA, cur_mono_time_); + Event cur_event(cereal::Event::Which::INIT_DATA, cur_mono_time_, {}); auto eit = std::upper_bound(events_->begin(), events_->end(), &cur_event, Event::lessThan()); if (eit == events_->end()) { qDebug() << "waiting for events..."; diff --git a/tools/replay/util.cc b/tools/replay/util.cc index acc018fdb4..deb6293745 100644 --- a/tools/replay/util.cc +++ b/tools/replay/util.cc @@ -298,6 +298,7 @@ std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic BZ2_bzDecompressEnd(&strm); if (bzerror == BZ_STREAM_END && !(abort && *abort)) { out.resize(strm.total_out_lo32); + out.shrink_to_fit(); return out; } return {}; From 3446de2b8e48ca9107746b23b9166332417d0733 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 19 Apr 2024 12:03:23 -0700 Subject: [PATCH 313/384] ui: fix non-updating text2 alerts (#32256) fix joystick --- selfdrive/ui/qt/onroad/alerts.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/onroad/alerts.h b/selfdrive/ui/qt/onroad/alerts.h index ae6d4af9ee..1f76ba305b 100644 --- a/selfdrive/ui/qt/onroad/alerts.h +++ b/selfdrive/ui/qt/onroad/alerts.h @@ -21,7 +21,7 @@ protected: cereal::ControlsState::AlertStatus status; bool equal(const Alert &other) const { - return text1 == other.text1 && other.text2 == other.text2 && type == other.type; + return text1 == other.text1 && text2 == other.text2 && type == other.type; } }; From ba2538c29cba02856e900ebe8ebc1cefb57bdadc Mon Sep 17 00:00:00 2001 From: Andrew Goodbody Date: Fri, 19 Apr 2024 20:33:45 +0100 Subject: [PATCH 314/384] Update actions to replace deprecated versions (#32246) actions/cache@v3 uses the deprecated Node.js 16 so update to use v4 which uses Node.js 20. This also applies to save and restore --- .github/workflows/auto-cache/action.yaml | 6 +++--- .github/workflows/auto_pr_review.yaml | 2 +- .github/workflows/compile-openpilot/action.yaml | 2 +- .github/workflows/repo-maintenance.yaml | 4 ++-- .github/workflows/selfdrive_tests.yaml | 16 ++++++++-------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/auto-cache/action.yaml b/.github/workflows/auto-cache/action.yaml index c5506e4769..e99c46e3c3 100644 --- a/.github/workflows/auto-cache/action.yaml +++ b/.github/workflows/auto-cache/action.yaml @@ -26,7 +26,7 @@ runs: - name: setup github cache if: ${{ !contains(runner.name, 'nsc') && inputs.save != 'false' }} - uses: 'actions/cache@v3' + uses: 'actions/cache@v4' with: path: ${{ inputs.path }} key: ${{ inputs.key }} @@ -34,7 +34,7 @@ runs: - name: setup github cache if: ${{ !contains(runner.name, 'nsc') && inputs.save == 'false' }} - uses: 'actions/cache/restore@v3' + uses: 'actions/cache/restore@v4' with: path: ${{ inputs.path }} key: ${{ inputs.key }} @@ -46,4 +46,4 @@ runs: run: | mkdir -p ${{ inputs.path }} sudo chmod -R 777 ${{ inputs.path }} - sudo chown -R $USER ${{ inputs.path }} \ No newline at end of file + sudo chown -R $USER ${{ inputs.path }} diff --git a/.github/workflows/auto_pr_review.yaml b/.github/workflows/auto_pr_review.yaml index 42ef4dbc1c..8316fedda0 100644 --- a/.github/workflows/auto_pr_review.yaml +++ b/.github/workflows/auto_pr_review.yaml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'commaai/openpilot' steps: - - uses: Vankka/pr-target-branch-action@69ab6dd5c221de3548b3b6c4d102c1f4913d3baa + - uses: Vankka/pr-target-branch-action@def32ec9d93514138d6ac0132ee62e120a72aed5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/compile-openpilot/action.yaml b/.github/workflows/compile-openpilot/action.yaml index 2945b67d2e..4015746c0e 100644 --- a/.github/workflows/compile-openpilot/action.yaml +++ b/.github/workflows/compile-openpilot/action.yaml @@ -14,7 +14,7 @@ runs: ${{ env.RUN }} "rm -rf /tmp/scons_cache/* && \ scons -j$(nproc) --cache-populate" - name: Save scons cache - uses: actions/cache/save@v3 + uses: actions/cache/save@v4 if: github.ref == 'refs/heads/master' with: path: .ci_cache/scons_cache diff --git a/.github/workflows/repo-maintenance.yaml b/.github/workflows/repo-maintenance.yaml index 445a1cf11c..67f6849588 100644 --- a/.github/workflows/repo-maintenance.yaml +++ b/.github/workflows/repo-maintenance.yaml @@ -22,7 +22,7 @@ jobs: git -c submodule."tinygrad".update=none submodule update --remote git add . - name: Create Pull Request - uses: peter-evans/create-pull-request@5b4a9f6a9e2af26e5f02351490b90d01eb8ec1e5 + uses: peter-evans/create-pull-request@9153d834b60caba6d51c9b9510b087acf9f33f83 with: token: ${{ secrets.ACTIONS_CREATE_PR_PAT }} commit-message: bump submodules @@ -49,7 +49,7 @@ jobs: git config --global --add safe.directory '*' pre-commit autoupdate - name: Create Pull Request - uses: peter-evans/create-pull-request@5b4a9f6a9e2af26e5f02351490b90d01eb8ec1e5 + uses: peter-evans/create-pull-request@9153d834b60caba6d51c9b9510b087acf9f33f83 with: token: ${{ secrets.ACTIONS_CREATE_PR_PAT }} commit-message: Update Python packages and pre-commit hooks diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 0042202edd..30ae4da783 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -197,7 +197,7 @@ jobs: docker_hub_pat: ${{ secrets.DOCKER_HUB_PAT }} - name: Cache test routes id: dependency-cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: .ci_cache/comma_download_cache key: proc-replay-${{ hashFiles('.github/workflows/selfdrive_tests.yaml', 'selfdrive/test/process_replay/ref_commit') }} @@ -215,7 +215,7 @@ jobs: id: print-diff if: always() run: cat selfdrive/test/process_replay/diff.txt - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 if: always() continue-on-error: true with: @@ -242,7 +242,7 @@ jobs: - uses: ./.github/workflows/setup-with-retry - name: Cache test routes id: dependency-cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: .ci_cache/comma_download_cache key: regen-${{ hashFiles('.github/workflows/selfdrive_tests.yaml', 'selfdrive/test/process_replay/test_regen.py') }} @@ -357,14 +357,14 @@ jobs: echo "::set-output name=diff::$output" - name: Find comment if: ${{ env.AZURE_TOKEN != '' }} - uses: peter-evans/find-comment@1769778a0c5bd330272d749d12c036d65e70d39d + uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e id: fc with: issue-number: ${{ github.event.pull_request.number }} body-includes: This PR makes changes to - name: Update comment if: ${{ steps.save_diff.outputs.diff != '' && env.AZURE_TOKEN != '' }} - uses: peter-evans/create-or-update-comment@b95e16d2859ad843a14218d1028da5b2c4cbc4b4 + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 with: comment-id: ${{ steps.fc.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} @@ -372,7 +372,7 @@ jobs: edit-mode: replace - name: Delete comment if: ${{ steps.fc.outputs.comment-id != '' && steps.save_diff.outputs.diff == '' && env.AZURE_TOKEN != '' }} - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | github.rest.issues.deleteComment({ @@ -398,7 +398,7 @@ jobs: export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' && python selfdrive/ui/tests/test_ui/run.py" - name: Upload Test Report - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: report - path: selfdrive/ui/tests/test_ui/report \ No newline at end of file + path: selfdrive/ui/tests/test_ui/report From 03d1c48017b2169dd3d559989e72c4925eafb264 Mon Sep 17 00:00:00 2001 From: ZwX1616 Date: Fri, 19 Apr 2024 13:44:03 -0700 Subject: [PATCH 315/384] camerad: OS HDR (#32112) * it's something * backup * 16:10 * cleanup * this is fine * close * remove some junk * no heck * disos * real 10 * for some reason this is flipped * 20hz * no return * ae * tear * need curve laster * correct real gains * fix time * cleanup * why the scam * disable for now * 0.7 * hdr * that doesnt work * what * hugeoof * clean up * cleanup * fix regs * welp cant * is this corrent * it is sq * remove * back * stg10bit * back2ten * Revert "remove" This reverts commit 18712ab7e103c12621c929cd0f772ecb9b348247. * 20hz and swb * correct height * 10bit * ui hack for now * slight * perfect * blk64 * ccm * fix page faults * template * set 4x * is this fine * try * this seems to work * Revert "this seems to work" This reverts commit d3c9023d3f14bd9394fed2d6276dba777ed0e606. * needs to be static * close * 64 is optimal * 2 * take * not 1 * offset * whats going on * i have no idea * less resistence * box defs * no * reduce blur artifacts * simplify * fix * fake short is too much for bright * can be subzero * should not use lsvc * no wasted bit * cont no slow * no less than 10bit * it is based * wrong * right * quart * shift * raise noise floor * 4.5/4.7 * same ballpark * int is fine * shane owes me m4a4 * Revert "shane owes me m4a4" This reverts commit b4283fee18efebedae628a6cfd926ff1416dcfe5. * back * Revert "4.5/4.7" This reverts commit e38f96e90cb5370bd378f6b66def9e7e3ed0ce5d. * default * oof * clean up * simpilfy * from sensorinfo * no div * better name * not the wrong one * not anymore relevant * too * not call it debayer * cl headers * arg is 2nd * gone is is_bggr * define * no is hdr * rgb_tmp * p1 * clean up * 4 * cant for * fix somewhre else * const * ap * rects * just set staruc * nnew tmp * hmm --------- Co-authored-by: Comma Device --- system/camerad/cameras/camera_common.cc | 8 +- system/camerad/cameras/process_raw.cl | 66 +++++++-- system/camerad/sensors/os04c10.cc | 13 +- system/camerad/sensors/os04c10_cl.h | 45 +++++-- system/camerad/sensors/os04c10_registers.h | 150 +++++++++++---------- system/camerad/sensors/sensor.h | 1 + 6 files changed, 184 insertions(+), 99 deletions(-) diff --git a/system/camerad/cameras/camera_common.cc b/system/camerad/cameras/camera_common.cc index 90bfa19231..6dcb8b4d22 100644 --- a/system/camerad/cameras/camera_common.cc +++ b/system/camerad/cameras/camera_common.cc @@ -26,10 +26,10 @@ public: "-cl-fast-relaxed-math -cl-denorms-are-zero -Isensors " "-DFRAME_WIDTH=%d -DFRAME_HEIGHT=%d -DFRAME_STRIDE=%d -DFRAME_OFFSET=%d " "-DRGB_WIDTH=%d -DRGB_HEIGHT=%d -DYUV_STRIDE=%d -DUV_OFFSET=%d " - "-DSENSOR_ID=%hu -DVIGNETTING=%d ", - ci->frame_width, ci->frame_height, ci->frame_stride, ci->frame_offset, + "-DSENSOR_ID=%hu -DHDR_OFFSET=%d -DVIGNETTING=%d ", + ci->frame_width, ci->frame_height, ci->hdr_offset > 0 ? ci->frame_stride * 2 : ci->frame_stride, ci->frame_offset, b->rgb_width, b->rgb_height, buf_width, uv_offset, - ci->image_sensor, s->camera_num == 1); + ci->image_sensor, ci->hdr_offset, s->camera_num == 1); const char *cl_file = "cameras/process_raw.cl"; cl_program prg_imgproc = cl_program_from_file(context, device_id, cl_file, args); krnl_ = CL_CHECK_ERR(clCreateKernel(prg_imgproc, "process_raw", &err)); @@ -74,7 +74,7 @@ void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s, LOGD("allocated %d CL buffers", frame_buf_count); rgb_width = ci->frame_width; - rgb_height = ci->frame_height; + rgb_height = ci->hdr_offset > 0 ? (ci->frame_height - ci->hdr_offset) / 2 : ci->frame_height; int nv12_width = VENUS_Y_STRIDE(COLOR_FMT_NV12, rgb_width); int nv12_height = VENUS_Y_SCANLINES(COLOR_FMT_NV12, rgb_height); diff --git a/system/camerad/cameras/process_raw.cl b/system/camerad/cameras/process_raw.cl index c635fd046e..6f6612fab0 100644 --- a/system/camerad/cameras/process_raw.cl +++ b/system/camerad/cameras/process_raw.cl @@ -78,7 +78,18 @@ __kernel void process_raw(const __global uchar * in, __global uchar * out, int e // read offset int start_idx; - start_idx = (2 * gid_y - 1) * FRAME_STRIDE + (3 * gid_x - 2) + (FRAME_STRIDE * FRAME_OFFSET); + #if BIT_DEPTH == 10 + bool aligned10; + if (gid_x % 2 == 0) { + aligned10 = true; + start_idx = (2 * gid_y - 1) * FRAME_STRIDE + (5 * gid_x / 2 - 2) + (FRAME_STRIDE * FRAME_OFFSET); + } else { + aligned10 = false; + start_idx = (2 * gid_y - 1) * FRAME_STRIDE + (5 * (gid_x - 1) / 2 + 1) + (FRAME_STRIDE * FRAME_OFFSET); + } + #else + start_idx = (2 * gid_y - 1) * FRAME_STRIDE + (3 * gid_x - 2) + (FRAME_STRIDE * FRAME_OFFSET); + #endif // read in 4 rows, 8 uchars each uchar8 dat[4]; @@ -96,6 +107,16 @@ __kernel void process_raw(const __global uchar * in, __global uchar * out, int e dat[2] = vload8(0, in + start_idx + FRAME_STRIDE*2); // row_after dat[3] = vload8(0, in + start_idx + FRAME_STRIDE*row_after_offset); + // need extra bit for 10-bit, 4 rows, 1 uchar each + #if BIT_DEPTH == 10 + uchar extra_dat[4]; + if (!aligned10) { + extra_dat[0] = in[start_idx + FRAME_STRIDE*row_before_offset + 8]; + extra_dat[1] = in[start_idx + FRAME_STRIDE*1 + 8]; + extra_dat[2] = in[start_idx + FRAME_STRIDE*2 + 8]; + extra_dat[3] = in[start_idx + FRAME_STRIDE*row_after_offset + 8]; + } + #endif // read odd rows for staggered second exposure #if HDR_OFFSET > 0 @@ -104,19 +125,44 @@ __kernel void process_raw(const __global uchar * in, __global uchar * out, int e short_dat[1] = vload8(0, in + start_idx + FRAME_STRIDE*(1+HDR_OFFSET/2) + FRAME_STRIDE/2); short_dat[2] = vload8(0, in + start_idx + FRAME_STRIDE*(2+HDR_OFFSET/2) + FRAME_STRIDE/2); short_dat[3] = vload8(0, in + start_idx + FRAME_STRIDE*(row_after_offset+HDR_OFFSET/2) + FRAME_STRIDE/2); + #if BIT_DEPTH == 10 + uchar short_extra_dat[4]; + if (!aligned10) { + short_extra_dat[0] = in[start_idx + FRAME_STRIDE*(row_before_offset+HDR_OFFSET/2) + FRAME_STRIDE/2 + 8]; + short_extra_dat[1] = in[start_idx + FRAME_STRIDE*(1+HDR_OFFSET/2) + FRAME_STRIDE/2 + 8]; + short_extra_dat[2] = in[start_idx + FRAME_STRIDE*(2+HDR_OFFSET/2) + FRAME_STRIDE/2 + 8]; + short_extra_dat[3] = in[start_idx + FRAME_STRIDE*(row_after_offset+HDR_OFFSET/2) + FRAME_STRIDE/2 + 8]; + } + #endif #endif // parse into floats 0.0-1.0 float4 v_rows[4]; - // no HDR here - int4 parsed = parse_12bit(dat[0]); - v_rows[ROW_READ_ORDER[0]] = normalize_pv(parsed, vignette_factor); - parsed = parse_12bit(dat[1]); - v_rows[ROW_READ_ORDER[1]] = normalize_pv(parsed, vignette_factor); - parsed = parse_12bit(dat[2]); - v_rows[ROW_READ_ORDER[2]] = normalize_pv(parsed, vignette_factor); - parsed = parse_12bit(dat[3]); - v_rows[ROW_READ_ORDER[3]] = normalize_pv(parsed, vignette_factor); + #if BIT_DEPTH == 10 + // for now it's always HDR + int4 parsed = parse_10bit(dat[0], extra_dat[0], aligned10); + int4 short_parsed = parse_10bit(short_dat[0], short_extra_dat[0], aligned10); + v_rows[ROW_READ_ORDER[0]] = normalize_pv_hdr(parsed, short_parsed, vignette_factor, expo_time); + parsed = parse_10bit(dat[1], extra_dat[1], aligned10); + short_parsed = parse_10bit(short_dat[1], short_extra_dat[1], aligned10); + v_rows[ROW_READ_ORDER[1]] = normalize_pv_hdr(parsed, short_parsed, vignette_factor, expo_time); + parsed = parse_10bit(dat[2], extra_dat[2], aligned10); + short_parsed = parse_10bit(short_dat[2], short_extra_dat[2], aligned10); + v_rows[ROW_READ_ORDER[2]] = normalize_pv_hdr(parsed, short_parsed, vignette_factor, expo_time); + parsed = parse_10bit(dat[3], extra_dat[3], aligned10); + short_parsed = parse_10bit(short_dat[3], short_extra_dat[3], aligned10); + v_rows[ROW_READ_ORDER[3]] = normalize_pv_hdr(parsed, short_parsed, vignette_factor, expo_time); + #else + // no HDR here + int4 parsed = parse_12bit(dat[0]); + v_rows[ROW_READ_ORDER[0]] = normalize_pv(parsed, vignette_factor); + parsed = parse_12bit(dat[1]); + v_rows[ROW_READ_ORDER[1]] = normalize_pv(parsed, vignette_factor); + parsed = parse_12bit(dat[2]); + v_rows[ROW_READ_ORDER[2]] = normalize_pv(parsed, vignette_factor); + parsed = parse_12bit(dat[3]); + v_rows[ROW_READ_ORDER[3]] = normalize_pv(parsed, vignette_factor); + #endif // mirror padding if (gid_x == 0) { diff --git a/system/camerad/sensors/os04c10.cc b/system/camerad/sensors/os04c10.cc index cbdc94d289..97a317407a 100644 --- a/system/camerad/sensors/os04c10.cc +++ b/system/camerad/sensors/os04c10.cc @@ -23,9 +23,10 @@ OS04C10::OS04C10() { pixel_size_mm = 0.002; data_word = false; + hdr_offset = 64 * 2 + 8; // stagger frame_width = 2688; - frame_height = 1520; - frame_stride = (frame_width * 12 / 8); // no alignment + frame_height = 1520 * 2 + hdr_offset; + frame_stride = (frame_width * 10 / 8); // no alignment extra_height = 0; frame_offset = 0; @@ -34,8 +35,8 @@ OS04C10::OS04C10() { init_reg_array.assign(std::begin(init_array_os04c10), std::end(init_array_os04c10)); probe_reg_addr = 0x300a; probe_expected_data = 0x5304; - mipi_format = CAM_FORMAT_MIPI_RAW_12; - frame_data_type = 0x2c; + mipi_format = CAM_FORMAT_MIPI_RAW_10; + frame_data_type = 0x2b; mclk_frequency = 24000000; // Hz dc_gain_factor = 1; @@ -66,7 +67,7 @@ std::vector OS04C10::getExposureRegisters(int exposure_ti return { {0x3501, long_time>>8}, {0x3502, long_time&0xFF}, {0x3508, real_gain>>8}, {0x3509, real_gain&0xFF}, - // {0x350c, real_gain>>8}, {0x350d, real_gain&0xFF}, + {0x350c, real_gain>>8}, {0x350d, real_gain&0xFF}, }; } @@ -81,6 +82,6 @@ float OS04C10::getExposureScore(float desired_ev, int exp_t, int exp_g_idx, floa score += std::abs(exp_g_idx - (int)analog_gain_rec_idx) * m; score += ((1 - analog_gain_cost_delta) + analog_gain_cost_delta * (exp_g_idx - analog_gain_min_idx) / (analog_gain_max_idx - analog_gain_min_idx)) * - std::abs(exp_g_idx - gain_idx) * 5.0; + std::abs(exp_g_idx - gain_idx) * 3.0; return score; } diff --git a/system/camerad/sensors/os04c10_cl.h b/system/camerad/sensors/os04c10_cl.h index 26c81f3aa3..61775dcdc8 100644 --- a/system/camerad/sensors/os04c10_cl.h +++ b/system/camerad/sensors/os04c10_cl.h @@ -2,25 +2,54 @@ #define BGGR -#define BIT_DEPTH 12 -#define PV_MAX 4096 +#define BIT_DEPTH 10 +#define PV_MAX10 1023 +#define PV_MAX16 65536 // gamma curve is calibrated to 16bit #define BLACK_LVL 64 #define VIGNETTE_RSZ 2.2545f -float4 normalize_pv(int4 parsed, float vignette_factor) { - float4 pv = (convert_float4(parsed) - BLACK_LVL) / (PV_MAX - BLACK_LVL); +float combine_dual_pvs(float lv, float sv, int expo_time) { + float svc = fmax(sv * expo_time, (float)(64 * (PV_MAX10 - BLACK_LVL))); + float svd = sv * fmin(expo_time, 8.0) / 8; + + if (expo_time > 64) { + if (lv < PV_MAX10 - BLACK_LVL) { + return lv / (PV_MAX16 - BLACK_LVL); + } else { + return (svc / 64) / (PV_MAX16 - BLACK_LVL); + } + } else { + if (lv > 32) { + return (lv * 64 / fmax(expo_time, 8.0)) / (PV_MAX16 - BLACK_LVL); + } else { + return svd / (PV_MAX16 - BLACK_LVL); + } + } +} + +float4 normalize_pv_hdr(int4 parsed, int4 short_parsed, float vignette_factor, int expo_time) { + float4 pl = convert_float4(parsed - BLACK_LVL); + float4 ps = convert_float4(short_parsed - BLACK_LVL); + float4 pv; + pv.s0 = combine_dual_pvs(pl.s0, ps.s0, expo_time); + pv.s1 = combine_dual_pvs(pl.s1, ps.s1, expo_time); + pv.s2 = combine_dual_pvs(pl.s2, ps.s2, expo_time); + pv.s3 = combine_dual_pvs(pl.s3, ps.s3, expo_time); return clamp(pv*vignette_factor, 0.0, 1.0); } float3 color_correct(float3 rgb) { - float3 corrected = rgb.x * (float3)(1.5664815, -0.29808738, -0.03973474); - corrected += rgb.y * (float3)(-0.48672447, 1.41914433, -0.40295248); - corrected += rgb.z * (float3)(-0.07975703, -0.12105695, 1.44268722); + float3 corrected = rgb.x * (float3)(1.55361989, -0.268894615, -0.000593219); + corrected += rgb.y * (float3)(-0.421217301, 1.51883144, -0.69760146); + corrected += rgb.z * (float3)(-0.132402589, -0.249936825, 1.69819468); return corrected; } float3 apply_gamma(float3 rgb, int expo_time) { - return powr(rgb, 0.7); + float s = log2((float)expo_time); + if (s < 6) {s = fmin(12.0 - s, 9.0);} + // log function adaptive to number of bits + return clamp(log(1 + rgb*(PV_MAX16 - BLACK_LVL)) * (0.48*s*s - 12.92*s + 115.0) - (1.08*s*s - 29.2*s + 260.0), 0.0, 255.0) / 255.0; } #endif diff --git a/system/camerad/sensors/os04c10_registers.h b/system/camerad/sensors/os04c10_registers.h index 990d1f7967..03fb73fbc9 100644 --- a/system/camerad/sensors/os04c10_registers.h +++ b/system/camerad/sensors/os04c10_registers.h @@ -4,18 +4,18 @@ const struct i2c_random_wr_payload start_reg_array_os04c10[] = {{0x100, 1}}; const struct i2c_random_wr_payload stop_reg_array_os04c10[] = {{0x100, 0}}; const struct i2c_random_wr_payload init_array_os04c10[] = { - // OS04C10_AA_00_02_17_wAO_2688x1524_MIPI728Mbps_Linear12bit_20FPS_4Lane_MCLK24MHz + // DP_2688X1520_NEWSTG_MIPI0776Mbps_30FPS_10BIT_FOURLANE {0x0103, 0x01}, // PLL - {0x0301, 0xe4}, + {0x0301, 0x84}, {0x0303, 0x01}, - {0x0305, 0xb6}, + {0x0305, 0x61}, {0x0306, 0x01}, {0x0307, 0x17}, {0x0323, 0x04}, {0x0324, 0x01}, - {0x0325, 0x62}, + {0x0325, 0x7a}, {0x3012, 0x06}, {0x3013, 0x02}, @@ -30,40 +30,40 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x3660, 0x04}, {0x3666, 0xa5}, {0x3667, 0xa5}, - {0x366a, 0x50}, + {0x366a, 0x54}, {0x3673, 0x0d}, {0x3672, 0x0d}, {0x3671, 0x0d}, {0x3670, 0x0d}, - {0x3685, 0x00}, + {0x3685, 0x0a}, {0x3694, 0x0d}, {0x3693, 0x0d}, {0x3692, 0x0d}, {0x3691, 0x0d}, {0x3696, 0x4c}, {0x3697, 0x4c}, - {0x3698, 0x40}, + {0x3698, 0x00}, {0x3699, 0x80}, - {0x369a, 0x18}, + {0x369a, 0x80}, {0x369b, 0x1f}, - {0x369c, 0x14}, + {0x369c, 0x1f}, {0x369d, 0x80}, {0x369e, 0x40}, {0x369f, 0x21}, {0x36a0, 0x12}, - {0x36a1, 0x5d}, + {0x36a1, 0xdd}, {0x36a2, 0x66}, - {0x370a, 0x02}, - {0x370e, 0x0c}, + {0x370a, 0x00}, + {0x370e, 0x00}, {0x3710, 0x00}, - {0x3713, 0x00}, + {0x3713, 0x04}, {0x3725, 0x02}, {0x372a, 0x03}, {0x3738, 0xce}, - {0x3748, 0x02}, - {0x374a, 0x02}, - {0x374c, 0x02}, - {0x374e, 0x02}, + {0x3748, 0x00}, + {0x374a, 0x00}, + {0x374c, 0x00}, + {0x374e, 0x00}, {0x3756, 0x00}, {0x3757, 0x00}, {0x3767, 0x00}, @@ -81,20 +81,21 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x37ba, 0x03}, {0x37bb, 0x00}, {0x37bc, 0x04}, - {0x37be, 0x08}, + {0x37be, 0x26}, {0x37c4, 0x11}, {0x37c5, 0x80}, {0x37c6, 0x14}, - {0x37c7, 0x08}, + {0x37c7, 0xa8}, {0x37da, 0x11}, {0x381f, 0x08}, {0x3829, 0x03}, + {0x3832, 0x00}, {0x3881, 0x00}, {0x3888, 0x04}, {0x388b, 0x00}, {0x3c80, 0x10}, {0x3c86, 0x00}, - {0x3c8c, 0x20}, + // {0x3c8c, 0x20}, {0x3c9f, 0x01}, {0x3d85, 0x1b}, {0x3d8c, 0x71}, @@ -110,7 +111,7 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x4045, 0x7e}, {0x4047, 0x7e}, {0x4049, 0x7e}, - {0x4090, 0x04}, + {0x4090, 0x14}, {0x40b0, 0x00}, {0x40b1, 0x00}, {0x40b2, 0x00}, @@ -128,7 +129,7 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x4503, 0x00}, {0x4504, 0x06}, {0x4506, 0x00}, - {0x4507, 0x47}, + {0x4507, 0x57}, {0x4803, 0x00}, {0x480c, 0x32}, {0x480e, 0x04}, @@ -138,7 +139,7 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x4823, 0x3f}, {0x4825, 0x30}, {0x4833, 0x10}, - {0x484b, 0x27}, + {0x484b, 0x07}, {0x488b, 0x00}, {0x4d00, 0x04}, {0x4d01, 0xad}, @@ -151,7 +152,7 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x4e0d, 0x00}, // ISP - {0x5001, 0x09}, + {0x5001, 0x00}, {0x5004, 0x00}, {0x5080, 0x04}, {0x5036, 0x80}, @@ -172,32 +173,32 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x301c, 0xf8}, {0x301e, 0xb4}, {0x301f, 0xf0}, - {0x3022, 0x61}, + {0x3022, 0x01}, {0x3109, 0xe7}, {0x3600, 0x00}, - {0x3610, 0x65}, + {0x3610, 0x75}, {0x3611, 0x85}, {0x3613, 0x3a}, {0x3615, 0x60}, - {0x3621, 0xb0}, + {0x3621, 0x90}, {0x3620, 0x0c}, {0x3629, 0x00}, {0x3661, 0x04}, {0x3664, 0x70}, {0x3665, 0x00}, - {0x3681, 0xa6}, - {0x3682, 0x53}, - {0x3683, 0x2a}, - {0x3684, 0x15}, + {0x3681, 0x80}, + {0x3682, 0x40}, + {0x3683, 0x21}, + {0x3684, 0x12}, {0x3700, 0x2a}, {0x3701, 0x12}, {0x3703, 0x28}, {0x3704, 0x0e}, - {0x3706, 0x9d}, + {0x3706, 0x4a}, {0x3709, 0x4a}, - {0x370b, 0x48}, + {0x370b, 0xa2}, {0x370c, 0x01}, - {0x370f, 0x04}, + {0x370f, 0x00}, {0x3714, 0x24}, {0x3716, 0x04}, {0x3719, 0x11}, @@ -205,19 +206,19 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x3720, 0x00}, {0x3724, 0x13}, {0x373f, 0xb0}, - {0x3741, 0x9d}, - {0x3743, 0x9d}, - {0x3745, 0x9d}, - {0x3747, 0x9d}, - {0x3749, 0x48}, - {0x374b, 0x48}, - {0x374d, 0x48}, - {0x374f, 0x48}, + {0x3741, 0x4a}, + {0x3743, 0x4a}, + {0x3745, 0x4a}, + {0x3747, 0x4a}, + {0x3749, 0xa2}, + {0x374b, 0xa2}, + {0x374d, 0xa2}, + {0x374f, 0xa2}, {0x3755, 0x10}, {0x376c, 0x00}, - {0x378d, 0x3c}, - {0x3790, 0x01}, - {0x3791, 0x01}, + {0x378d, 0x30}, + {0x3790, 0x4a}, + {0x3791, 0xa2}, {0x3798, 0x40}, {0x379e, 0x00}, {0x379f, 0x04}, @@ -232,17 +233,17 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x37c0, 0x11}, {0x37c2, 0x04}, {0x37cd, 0x19}, - {0x37e0, 0x08}, - {0x37e6, 0x04}, + // {0x37e0, 0x08}, + // {0x37e6, 0x04}, {0x37e5, 0x02}, - {0x37e1, 0x0c}, - {0x3737, 0x04}, + // {0x37e1, 0x0c}, + // {0x3737, 0x04}, {0x37d8, 0x02}, - {0x37e2, 0x10}, + // {0x37e2, 0x10}, {0x3739, 0x10}, {0x3662, 0x10}, - {0x37e4, 0x20}, - {0x37e3, 0x08}, + // {0x37e4, 0x20}, + // {0x37e3, 0x08}, {0x37d9, 0x08}, {0x4040, 0x00}, {0x4041, 0x07}, @@ -263,51 +264,58 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x3816, 0x01}, {0x3817, 0x01}, - {0x380c, 0x08}, {0x380d, 0x5c}, // HTS - {0x380e, 0x09}, {0x380f, 0x38}, // VTS + {0x380c, 0x04}, {0x380d, 0x2e}, // HTS + {0x380e, 0x09}, {0x380f, 0xdb}, // VTS {0x3820, 0xb0}, - {0x3821, 0x00}, - {0x3880, 0x25}, + {0x3821, 0x04}, + {0x3880, 0x00}, {0x3882, 0x20}, {0x3c91, 0x0b}, {0x3c94, 0x45}, - {0x3cad, 0x00}, - {0x3cae, 0x00}, + // {0x3cad, 0x00}, + // {0x3cae, 0x00}, {0x4000, 0xf3}, {0x4001, 0x60}, - {0x4003, 0x80}, + {0x4003, 0x40}, {0x4300, 0xff}, {0x4302, 0x0f}, - {0x4305, 0x83}, + {0x4305, 0x93}, {0x4505, 0x84}, {0x4809, 0x0e}, {0x480a, 0x04}, - {0x4837, 0x15}, + {0x4837, 0x14}, {0x4c00, 0x08}, {0x4c01, 0x08}, {0x4c04, 0x00}, {0x4c05, 0x00}, {0x5000, 0xf9}, - {0x3822, 0x14}, + // {0x0100, 0x01}, + // {0x320d, 0x00}, + // {0x3208, 0xa0}, + // {0x3822, 0x14}, // initialize exposure {0x3503, 0x88}, // long - {0x3500, 0x00}, {0x3501, 0x00}, {0x3502, 0x80}, + {0x3500, 0x00}, {0x3501, 0x00}, {0x3502, 0x10}, {0x3508, 0x00}, {0x3509, 0x80}, {0x350a, 0x04}, {0x350b, 0x00}, // short - // {0x3510, 0x00}, {0x3511, 0x00}, {0x3512, 0x10}, - // {0x350c, 0x00}, {0x350d, 0x80}, - // {0x350e, 0x04}, {0x350f, 0x00}, + {0x3510, 0x00}, {0x3511, 0x00}, {0x3512, 0x40}, + {0x350c, 0x00}, {0x350d, 0x80}, + {0x350e, 0x04}, {0x350f, 0x00}, // wb - {0x5100, 0x06}, {0x5101, 0xcb}, + // b + {0x5100, 0x06}, {0x5101, 0x7e}, + {0x5140, 0x06}, {0x5141, 0x7e}, + // g {0x5102, 0x04}, {0x5103, 0x00}, - {0x5104, 0x08}, {0x5105, 0xde}, - - {0x5106, 0x02}, {0x5107, 0x00}, -}; \ No newline at end of file + {0x5142, 0x04}, {0x5143, 0x00}, + // r + {0x5104, 0x08}, {0x5105, 0xd6}, + {0x5144, 0x08}, {0x5145, 0xd6}, +}; diff --git a/system/camerad/sensors/sensor.h b/system/camerad/sensors/sensor.h index d004163644..add514b117 100644 --- a/system/camerad/sensors/sensor.h +++ b/system/camerad/sensors/sensor.h @@ -29,6 +29,7 @@ public: uint32_t extra_height = 0; int registers_offset = -1; int stats_offset = -1; + int hdr_offset = -1; int exposure_time_min; int exposure_time_max; From ee01be71e16f8d1c55663362c4f89489fff2c6a6 Mon Sep 17 00:00:00 2001 From: ZwX1616 Date: Fri, 19 Apr 2024 13:51:09 -0700 Subject: [PATCH 316/384] camerad: frame sync OS (#32155) auto Co-authored-by: Comma Device --- system/camerad/sensors/os04c10_registers.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/system/camerad/sensors/os04c10_registers.h b/system/camerad/sensors/os04c10_registers.h index 03fb73fbc9..91eb48b24f 100644 --- a/system/camerad/sensors/os04c10_registers.h +++ b/system/camerad/sensors/os04c10_registers.h @@ -88,8 +88,8 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x37c7, 0xa8}, {0x37da, 0x11}, {0x381f, 0x08}, - {0x3829, 0x03}, - {0x3832, 0x00}, + // {0x3829, 0x03}, + // {0x3832, 0x00}, {0x3881, 0x00}, {0x3888, 0x04}, {0x388b, 0x00}, @@ -250,6 +250,20 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x4008, 0x02}, {0x4009, 0x0d}, + // FSIN + {0x3002, 0x22}, + {0x3663, 0x22}, + {0x368a, 0x04}, + {0x3822, 0x44}, + {0x3823, 0x00}, + {0x3829, 0x03}, + {0x3832, 0xf8}, + {0x382c, 0x00}, + {0x3844, 0x06}, + {0x3843, 0x00}, + {0x382a, 0x00}, + {0x382b, 0x0c}, + // 2704x1536 -> 2688x1520 out {0x3800, 0x00}, {0x3801, 0x00}, {0x3802, 0x00}, {0x3803, 0x00}, From f427427b5e085c7391b617e5c724c6b0326b24f1 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 19 Apr 2024 17:46:40 -0700 Subject: [PATCH 317/384] values: use union arguments (#32258) * use get_args to reduce duplication * clean up --- selfdrive/car/values.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/values.py b/selfdrive/car/values.py index dfbcf3b74f..bf5d378ab4 100644 --- a/selfdrive/car/values.py +++ b/selfdrive/car/values.py @@ -1,4 +1,4 @@ -from typing import cast +from typing import get_args from openpilot.selfdrive.car.body.values import CAR as BODY from openpilot.selfdrive.car.chrysler.values import CAR as CHRYSLER from openpilot.selfdrive.car.ford.values import CAR as FORD @@ -14,6 +14,6 @@ from openpilot.selfdrive.car.toyota.values import CAR as TOYOTA from openpilot.selfdrive.car.volkswagen.values import CAR as VOLKSWAGEN Platform = BODY | CHRYSLER | FORD | GM | HONDA | HYUNDAI | MAZDA | MOCK | NISSAN | SUBARU | TESLA | TOYOTA | VOLKSWAGEN -BRANDS = [BODY, CHRYSLER, FORD, GM, HONDA, HYUNDAI, MAZDA, MOCK, NISSAN, SUBARU, TESLA, TOYOTA, VOLKSWAGEN] +BRANDS = get_args(Platform) -PLATFORMS: dict[str, Platform] = {str(platform): platform for brand in BRANDS for platform in cast(list[Platform], brand)} +PLATFORMS: dict[str, Platform] = {str(platform): platform for brand in BRANDS for platform in brand} From fa1a6bcd6bd27ff823f602fc99d528bac9704d29 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 19 Apr 2024 19:38:39 -0700 Subject: [PATCH 318/384] GM: clean up test (#32261) * not necessary * Update selfdrive/car/gm/tests/test_gm.py --- selfdrive/car/gm/tests/test_gm.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/gm/tests/test_gm.py b/selfdrive/car/gm/tests/test_gm.py index 9b56cfdf08..01ec8533b8 100755 --- a/selfdrive/car/gm/tests/test_gm.py +++ b/selfdrive/car/gm/tests/test_gm.py @@ -3,7 +3,7 @@ from parameterized import parameterized import unittest from openpilot.selfdrive.car.gm.fingerprints import FINGERPRINTS -from openpilot.selfdrive.car.gm.values import CAMERA_ACC_CAR, CAR, GM_RX_OFFSET +from openpilot.selfdrive.car.gm.values import CAMERA_ACC_CAR, GM_RX_OFFSET CAMERA_DIAGNOSTIC_ADDRESS = 0x24b @@ -13,12 +13,10 @@ class TestGMFingerprint(unittest.TestCase): def test_can_fingerprints(self, car_model, fingerprints): self.assertGreater(len(fingerprints), 0) - # Trailblazer is in dashcam - if car_model != CAR.CHEVROLET_TRAILBLAZER: - self.assertTrue(all(len(finger) for finger in fingerprints)) + self.assertTrue(all(len(finger) for finger in fingerprints)) # The camera can sometimes be communicating on startup - if car_model in CAMERA_ACC_CAR - {CAR.CHEVROLET_TRAILBLAZER}: + if car_model in CAMERA_ACC_CAR: for finger in fingerprints: for required_addr in (CAMERA_DIAGNOSTIC_ADDRESS, CAMERA_DIAGNOSTIC_ADDRESS + GM_RX_OFFSET): self.assertEqual(finger.get(required_addr), 8, required_addr) From 9f4cf8017fa3338f5704375cd37d7a5968663faa Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 19 Apr 2024 20:33:48 -0700 Subject: [PATCH 319/384] GM: hide ASCM from car docs (#32260) * stash * clean up * programmatically * Update selfdrive/car/gm/values.py * do flags later * clean up --- docs/CARS.md | 8 +------- selfdrive/car/gm/values.py | 27 +++++++++++++++++---------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index a41518382a..c785e6d701 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -4,7 +4,7 @@ A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. -# 291 Supported Cars +# 285 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -17,16 +17,11 @@ A supported vehicle is one that just works when you install a comma device. All |Audi|Q3 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|RS3 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|S3 2015-17|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Buick|LaCrosse 2017-19[4](#footnotes)|Driver Confidence Package 2|openpilot|18 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Cadillac|Escalade 2017[4](#footnotes)|Driver Assist Package|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Cadillac|Escalade ESV 2016[4](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Cadillac|Escalade ESV 2019[4](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Bolt EUV 2022-23|Premier or Premier Redline Trim without Super Cruise Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Bolt EV 2022-23|2LT Trim with Adaptive Cruise Control Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Equinox 2019-22|Adaptive Cruise Control (ACC)|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Silverado 1500 2020-21|Safety Package II|openpilot available[1](#footnotes)|0 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Trailblazer 2021-22|Adaptive Cruise Control (ACC)|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chevrolet|Volt 2017-18[4](#footnotes)|Adaptive Cruise Control (ACC)|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chrysler|Pacifica 2017-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chrysler|Pacifica 2019-20|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chrysler|Pacifica 2021-23|All|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -61,7 +56,6 @@ A supported vehicle is one that just works when you install a comma device. All |Genesis|GV70 (2.5T Trim) 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|GV70 (3.5T Trim) 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|GV80 2023[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|GMC|Acadia 2018[4](#footnotes)|Adaptive Cruise Control (ACC)|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |GMC|Sierra 1500 2020-21|Driver Alert Package II|openpilot available[1](#footnotes)|0 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Accord 2018-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Accord Hybrid 2018-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 46d15431ca..17f9121092 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -89,44 +89,51 @@ class GMPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('gm_global_a_powertrain_generated', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis')) +@dataclass +class GMASCMPlatformConfig(GMPlatformConfig): + def init(self): + # ASCM is supported, but due to a janky install and hardware configuration, we are not showing in the car docs + self.car_docs = [] + + class CAR(Platforms): - HOLDEN_ASTRA = GMPlatformConfig( + HOLDEN_ASTRA = GMASCMPlatformConfig( [GMCarDocs("Holden Astra 2017")], GMCarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4), ) - CHEVROLET_VOLT = GMPlatformConfig( + CHEVROLET_VOLT = GMASCMPlatformConfig( [GMCarDocs("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ")], GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469), ) - CADILLAC_ATS = GMPlatformConfig( + CADILLAC_ATS = GMASCMPlatformConfig( [GMCarDocs("Cadillac ATS Premium Performance 2018")], GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), ) - CHEVROLET_MALIBU = GMPlatformConfig( + CHEVROLET_MALIBU = GMASCMPlatformConfig( [GMCarDocs("Chevrolet Malibu Premier 2017")], GMCarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4), ) - GMC_ACADIA = GMPlatformConfig( + GMC_ACADIA = GMASCMPlatformConfig( [GMCarDocs("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo")], GMCarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4), ) - BUICK_LACROSSE = GMPlatformConfig( + BUICK_LACROSSE = GMASCMPlatformConfig( [GMCarDocs("Buick LaCrosse 2017-19", "Driver Confidence Package 2")], GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), ) - BUICK_REGAL = GMPlatformConfig( + BUICK_REGAL = GMASCMPlatformConfig( [GMCarDocs("Buick Regal Essence 2018")], GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), ) - CADILLAC_ESCALADE = GMPlatformConfig( + CADILLAC_ESCALADE = GMASCMPlatformConfig( [GMCarDocs("Cadillac Escalade 2017", "Driver Assist Package")], GMCarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3), ) - CADILLAC_ESCALADE_ESV = GMPlatformConfig( + CADILLAC_ESCALADE_ESV = GMASCMPlatformConfig( [GMCarDocs("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")], GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0), ) - CADILLAC_ESCALADE_ESV_2019 = GMPlatformConfig( + CADILLAC_ESCALADE_ESV_2019 = GMASCMPlatformConfig( [GMCarDocs("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")], CADILLAC_ESCALADE_ESV.specs, ) From 8583e61b8498599347aa82c46197f8f4ca6bccb5 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 21 Apr 2024 01:31:09 -0700 Subject: [PATCH 320/384] [bot] Fingerprints: add missing FW versions from new users (#32265) Export fingerprints --- selfdrive/car/hyundai/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 72c435e550..668d45cceb 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -421,6 +421,7 @@ FW_VERSIONS = { (Ecu.abs, 0x7d1, None): [ b'\xf1\x00LX ESC \x01 103\x19\t\x10 58910-S8360', b'\xf1\x00LX ESC \x01 1031\t\x10 58910-S8360', + b'\xf1\x00LX ESC \x01 104 \x10\x15 58910-S8350', b'\xf1\x00LX ESC \x01 104 \x10\x16 58910-S8360', b'\xf1\x00LX ESC \x0b 101\x19\x03\x17 58910-S8330', b'\xf1\x00LX ESC \x0b 101\x19\x03 58910-S8360', @@ -966,6 +967,7 @@ FW_VERSIONS = { b'\xf1\x00NE1_ RDR ----- 1.00 1.00 99110-GI000 ', ], (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00NE1 MFC AT CAN LHD 1.00 1.05 99211-GI010 220614', b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.01 99211-GI010 211007', b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.06 99211-GI000 210813', b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.06 99211-GI010 230110', From b54d701c837f2d066eddca775b23c97d6cb17475 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 21 Apr 2024 01:46:19 -0700 Subject: [PATCH 321/384] [bot] Fingerprints: add missing FW versions from CAN fingerprinting cars (#32264) Export fingerprints --- selfdrive/car/hyundai/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 668d45cceb..92e47524fc 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -85,6 +85,7 @@ FW_VERSIONS = { b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2100 ', ], (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00AE MDPS C 1.00 1.05 56310/G2501 4AEHC105', b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2301 4AEHC107', b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2501 4AEHC107', ], From 17ec4ad24ea446a99235223511792f8e9dfa16c7 Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Sun, 21 Apr 2024 06:29:43 -0300 Subject: [PATCH 322/384] Honda: Brazilian HR-V 2023 fingerprint (#32243) * fingerprint Honda HR-V 2023, brazilian market * update routes --------- Co-authored-by: Shane Smiskol --- selfdrive/car/honda/fingerprints.py | 7 +++++++ selfdrive/car/honda/interface.py | 2 +- selfdrive/car/honda/values.py | 2 +- selfdrive/car/tests/routes.py | 1 + 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index d53cffe325..cda1451649 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -1014,26 +1014,33 @@ FW_VERSIONS = { }, CAR.HONDA_HRV_3G: { (Ecu.eps, 0x18da30f1, None): [ + b'39990-3M0-G110\x00\x00', b'39990-3W0-A030\x00\x00', ], (Ecu.gateway, 0x18daeff1, None): [ + b'38897-3M0-M110\x00\x00', b'38897-3W1-A010\x00\x00', ], (Ecu.srs, 0x18da53f1, None): [ + b'77959-3M0-K840\x00\x00', b'77959-3V0-A820\x00\x00', ], (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S102-3M6-P030\x00\x00', b'8S102-3W0-A060\x00\x00', b'8S102-3W0-AB10\x00\x00', ], (Ecu.vsa, 0x18da28f1, None): [ + b'57114-3M6-M010\x00\x00', b'57114-3W0-A040\x00\x00', ], (Ecu.transmission, 0x18da1ef1, None): [ b'28101-6EH-A010\x00\x00', + b'28101-6JC-M310\x00\x00', ], (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-6CT-A710\x00\x00', + b'37805-6HZ-M630\x00\x00', ], (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ b'46114-3W0-A020\x00\x00', diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 2a5a07093d..2026c385c2 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -193,7 +193,7 @@ class CarInterface(CarInterfaceBase): # These cars use alternate user brake msg (0x1BE) # TODO: Only detect feature for Accord/Accord Hybrid, not all Bosch DBCs have BRAKE_MODULE - if 0x1BE in fingerprint[CAN.pt] and candidate == CAR.HONDA_ACCORD: + if 0x1BE in fingerprint[CAN.pt] and candidate in (CAR.HONDA_ACCORD, CAR.HONDA_HRV_3G): ret.flags |= HondaFlags.BOSCH_ALT_BRAKE.value if ret.flags & HondaFlags.BOSCH_ALT_BRAKE: diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index ecb00d0a3c..1b0da8d7de 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -165,7 +165,7 @@ class CAR(Platforms): [HondaCarDocs("Honda HR-V 2023", "All")], CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41, tireStiffnessFactor=0.5), dbc_dict('honda_civic_ex_2022_can_generated', None), - flags=HondaFlags.BOSCH_RADARLESS | HondaFlags.BOSCH_ALT_BRAKE, + flags=HondaFlags.BOSCH_RADARLESS, ) ACURA_RDX_3G = HondaBoschPlatformConfig( [HondaCarDocs("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 35a9d8a8e7..dd3a8f633d 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -80,6 +80,7 @@ routes = [ CarTestRoute("2c4292a5cd10536c|2021-08-19--21-32-15", HONDA.HONDA_FREED), CarTestRoute("03be5f2fd5c508d1|2020-04-19--18-44-15", HONDA.HONDA_HRV), CarTestRoute("320098ff6c5e4730|2023-04-13--17-47-46", HONDA.HONDA_HRV_3G), + CarTestRoute("147613502316e718/00000001--dd141a3140", HONDA.HONDA_HRV_3G), # Brazilian model CarTestRoute("917b074700869333|2021-05-24--20-40-20", HONDA.ACURA_ILX), CarTestRoute("08a3deb07573f157|2020-03-06--16-11-19", HONDA.HONDA_ACCORD), # 1.5T CarTestRoute("1da5847ac2488106|2021-05-24--19-31-50", HONDA.HONDA_ACCORD), # 2.0T From 099e31ae0a054e7900fa62b84cf563d8d267f441 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 21 Apr 2024 02:55:35 -0700 Subject: [PATCH 323/384] [bot] Fingerprints: add missing FW versions from new users (#32268) Export fingerprints --- selfdrive/car/honda/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index cda1451649..55bd8b7aec 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -658,6 +658,7 @@ FW_VERSIONS = { ], (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-5MR-3050\x00\x00', + b'37805-5MR-3150\x00\x00', b'37805-5MR-3250\x00\x00', b'37805-5MR-4070\x00\x00', b'37805-5MR-4080\x00\x00', From 2c409e0980e6145d375eb73f2d21cd03b01a5354 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 22 Apr 2024 08:09:17 +0800 Subject: [PATCH 324/384] replay: bug fixes and improvements (#32193) --- tools/cabana/streams/replaystream.cc | 9 +- tools/cabana/videowidget.cc | 14 +- tools/replay/consoleui.cc | 3 +- tools/replay/filereader.cc | 5 +- tools/replay/logreader.cc | 43 +--- tools/replay/logreader.h | 32 +-- tools/replay/replay.cc | 305 +++++++++++++++------------ tools/replay/replay.h | 33 +-- tools/replay/route.cc | 2 +- tools/replay/tests/test_replay.cc | 70 ++---- tools/replay/util.cc | 33 ++- tools/replay/util.h | 2 +- 12 files changed, 252 insertions(+), 299 deletions(-) diff --git a/tools/cabana/streams/replaystream.cc b/tools/cabana/streams/replaystream.cc index 3fa8bb0fe9..ddd1c1dfed 100644 --- a/tools/cabana/streams/replaystream.cc +++ b/tools/cabana/streams/replaystream.cc @@ -33,13 +33,12 @@ void ReplayStream::mergeSegments() { std::vector new_events; new_events.reserve(seg->log->events.size()); - for (auto it = seg->log->events.cbegin(); it != seg->log->events.cend(); ++it) { - if ((*it)->which == cereal::Event::Which::CAN) { - const uint64_t ts = (*it)->mono_time; - capnp::FlatArrayMessageReader reader((*it)->data); + for (const Event &e : seg->log->events) { + if (e.which == cereal::Event::Which::CAN) { + capnp::FlatArrayMessageReader reader(e.data); auto event = reader.getRoot(); for (const auto &c : event.getCan()) { - new_events.push_back(newEvent(ts, c)); + new_events.push_back(newEvent(e.mono_time, c)); } } } diff --git a/tools/cabana/videowidget.cc b/tools/cabana/videowidget.cc index ad20543755..261c540340 100644 --- a/tools/cabana/videowidget.cc +++ b/tools/cabana/videowidget.cc @@ -257,13 +257,13 @@ void Slider::setTimeRange(double min, double max) { void Slider::parseQLog(int segnum, std::shared_ptr qlog) { const auto &segments = qobject_cast(can)->route()->segments(); if (segments.size() > 0 && segnum == segments.rbegin()->first && !qlog->events.empty()) { - emit updateMaximumTime(qlog->events.back()->mono_time / 1e9 - can->routeStartTime()); + emit updateMaximumTime(qlog->events.back().mono_time / 1e9 - can->routeStartTime()); } std::mutex mutex; - QtConcurrent::blockingMap(qlog->events.cbegin(), qlog->events.cend(), [&mutex, this](const Event *e) { - if (e->which == cereal::Event::Which::THUMBNAIL) { - capnp::FlatArrayMessageReader reader(e->data); + QtConcurrent::blockingMap(qlog->events.cbegin(), qlog->events.cend(), [&mutex, this](const Event &e) { + if (e.which == cereal::Event::Which::THUMBNAIL) { + capnp::FlatArrayMessageReader reader(e.data); auto thumb = reader.getRoot().getThumbnail(); auto data = thumb.getThumbnail(); if (QPixmap pm; pm.loadFromData(data.begin(), data.size(), "jpeg")) { @@ -271,13 +271,13 @@ void Slider::parseQLog(int segnum, std::shared_ptr qlog) { std::lock_guard lk(mutex); thumbnails[thumb.getTimestampEof()] = scaled; } - } else if (e->which == cereal::Event::Which::CONTROLS_STATE) { - capnp::FlatArrayMessageReader reader(e->data); + } else if (e.which == cereal::Event::Which::CONTROLS_STATE) { + capnp::FlatArrayMessageReader reader(e.data); auto cs = reader.getRoot().getControlsState(); if (cs.getAlertType().size() > 0 && cs.getAlertText1().size() > 0 && cs.getAlertSize() != cereal::ControlsState::AlertSize::NONE) { std::lock_guard lk(mutex); - alerts.emplace(e->mono_time, AlertInfo{cs.getAlertStatus(), cs.getAlertText1().cStr(), cs.getAlertText2().cStr()}); + alerts.emplace(e.mono_time, AlertInfo{cs.getAlertStatus(), cs.getAlertText1().cStr(), cs.getAlertText2().cStr()}); } } }); diff --git a/tools/replay/consoleui.cc b/tools/replay/consoleui.cc index 54056c6cd5..eaff78c691 100644 --- a/tools/replay/consoleui.cc +++ b/tools/replay/consoleui.cc @@ -172,7 +172,7 @@ void ConsoleUI::updateStatus() { if (status != Status::Paused) { auto events = replay->events(); uint64_t current_mono_time = replay->routeStartTime() + replay->currentSeconds() * 1e9; - bool playing = !events->empty() && events->back()->mono_time > current_mono_time; + bool playing = !events->empty() && events->back().mono_time > current_mono_time; status = playing ? Status::Playing : Status::Waiting; } auto [status_str, status_color] = status_text[status]; @@ -368,7 +368,6 @@ void ConsoleUI::handleKey(char c) { } else if (c == ' ') { pauseReplay(!replay->isPaused()); } else if (c == 'q' || c == 'Q') { - replay->stop(); qApp->exit(); } } diff --git a/tools/replay/filereader.cc b/tools/replay/filereader.cc index 22af7f5f86..d74aaebaba 100644 --- a/tools/replay/filereader.cc +++ b/tools/replay/filereader.cc @@ -35,7 +35,10 @@ std::string FileReader::read(const std::string &file, std::atomic *abort) std::string FileReader::download(const std::string &url, std::atomic *abort) { for (int i = 0; i <= max_retries_ && !(abort && *abort); ++i) { - if (i > 0) rWarning("download failed, retrying %d", i); + if (i > 0) { + rWarning("download failed, retrying %d", i); + util::sleep_for(3000); + } std::string result = httpGet(url, chunk_size_, abort); if (!result.empty()) { diff --git a/tools/replay/logreader.cc b/tools/replay/logreader.cc index 36b07f19d0..f52ef4a4eb 100644 --- a/tools/replay/logreader.cc +++ b/tools/replay/logreader.cc @@ -4,16 +4,6 @@ #include "tools/replay/filereader.h" #include "tools/replay/util.h" -LogReader::LogReader(size_t memory_pool_block_size) { - events.reserve(memory_pool_block_size); -} - -LogReader::~LogReader() { - for (Event *e : events) { - delete e; - } -} - bool LogReader::load(const std::string &url, std::atomic *abort, bool local_cache, int chunk_size, int retries) { raw_ = FileReader(local_cache, chunk_size, retries).read(url, abort); if (raw_.empty()) return false; @@ -22,17 +12,13 @@ bool LogReader::load(const std::string &url, std::atomic *abort, bool loca raw_ = decompressBZ2(raw_, abort); if (raw_.empty()) return false; } - return parse(abort); + return load(raw_.data(), raw_.size(), abort); } -bool LogReader::load(const std::byte *data, size_t size, std::atomic *abort) { - raw_.assign((const char *)data, size); - return parse(abort); -} - -bool LogReader::parse(std::atomic *abort) { +bool LogReader::load(const char *data, size_t size, std::atomic *abort) { try { - kj::ArrayPtr words((const capnp::word *)raw_.data(), raw_.size() / sizeof(capnp::word)); + events.reserve(65000); + kj::ArrayPtr words((const capnp::word *)data, size / sizeof(capnp::word)); while (words.size() > 0 && !(abort && *abort)) { capnp::FlatArrayMessageReader reader(words); auto event = reader.getRoot(); @@ -40,16 +26,16 @@ bool LogReader::parse(std::atomic *abort) { uint64_t mono_time = event.getLogMonoTime(); auto event_data = kj::arrayPtr(words.begin(), reader.getEnd()); - Event *evt = events.emplace_back(newEvent(which, mono_time, event_data)); + const Event &evt = events.emplace_back(which, mono_time, event_data); // Add encodeIdx packet again as a frame packet for the video stream - if (evt->which == cereal::Event::ROAD_ENCODE_IDX || - evt->which == cereal::Event::DRIVER_ENCODE_IDX || - evt->which == cereal::Event::WIDE_ROAD_ENCODE_IDX) { + if (evt.which == cereal::Event::ROAD_ENCODE_IDX || + evt.which == cereal::Event::DRIVER_ENCODE_IDX || + evt.which == cereal::Event::WIDE_ROAD_ENCODE_IDX) { auto idx = capnp::AnyStruct::Reader(event).getPointerSection()[0].getAs(); if (uint64_t sof = idx.getTimestampSof()) { mono_time = sof; } - events.emplace_back(newEvent(which, mono_time, event_data, idx.getSegmentNum())); + events.emplace_back(which, mono_time, event_data, idx.getSegmentNum()); } words = kj::arrayPtr(reader.getEnd(), words.end()); @@ -59,16 +45,9 @@ bool LogReader::parse(std::atomic *abort) { } if (!events.empty() && !(abort && *abort)) { - std::sort(events.begin(), events.end(), Event::lessThan()); + events.shrink_to_fit(); + std::sort(events.begin(), events.end()); return true; } return false; } - -Event *LogReader::newEvent(cereal::Event::Which which, uint64_t mono_time, const kj::ArrayPtr &words, int eidx_segnum) { -#ifdef HAS_MEMORY_RESOURCE - return new (&mbr_) Event(which, mono_time, words, eidx_segnum); -#else - return new Event(which, mono_time, words, eidx_segnum); -#endif -} diff --git a/tools/replay/logreader.h b/tools/replay/logreader.h index 2a28d7b432..56633c191b 100644 --- a/tools/replay/logreader.h +++ b/tools/replay/logreader.h @@ -1,10 +1,5 @@ #pragma once -#if __has_include() -#define HAS_MEMORY_RESOURCE 1 -#include -#endif -#include #include #include @@ -13,27 +8,15 @@ const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam}; const int MAX_CAMERAS = std::size(ALL_CAMERAS); -const int DEFAULT_EVENT_MEMORY_POOL_BLOCK_SIZE = 65000; class Event { public: Event(cereal::Event::Which which, uint64_t mono_time, const kj::ArrayPtr &data, int eidx_segnum = -1) : which(which), mono_time(mono_time), data(data), eidx_segnum(eidx_segnum) {} - struct lessThan { - inline bool operator()(const Event *l, const Event *r) { - return l->mono_time < r->mono_time || (l->mono_time == r->mono_time && l->which < r->which); - } - }; - -#if HAS_MEMORY_RESOURCE - void *operator new(size_t size, std::pmr::monotonic_buffer_resource *mbr) { - return mbr->allocate(size); - } - void operator delete(void *ptr) { - // No-op. memory used by EventMemoryPool increases monotonically until the logReader is destroyed. + bool operator<(const Event &other) const { + return mono_time < other.mono_time || (mono_time == other.mono_time && which < other.which); } -#endif uint64_t mono_time; cereal::Event::Which which; @@ -43,18 +26,11 @@ public: class LogReader { public: - LogReader(size_t memory_pool_block_size = DEFAULT_EVENT_MEMORY_POOL_BLOCK_SIZE); - ~LogReader(); bool load(const std::string &url, std::atomic *abort = nullptr, bool local_cache = false, int chunk_size = -1, int retries = 0); - bool load(const std::byte *data, size_t size, std::atomic *abort = nullptr); - std::vector events; + bool load(const char *data, size_t size, std::atomic *abort = nullptr); + std::vector events; private: - Event *newEvent(cereal::Event::Which which, uint64_t mono_time, const kj::ArrayPtr &words, int eidx_segnum = -1); - bool parse(std::atomic *abort); std::string raw_; -#ifdef HAS_MEMORY_RESOURCE - std::pmr::monotonic_buffer_resource mbr_{DEFAULT_EVENT_MEMORY_POOL_BLOCK_SIZE * sizeof(Event)}; -#endif }; diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index 2e50722551..e7657f3531 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -2,15 +2,20 @@ #include #include - #include +#include #include "cereal/services.h" #include "common/params.h" #include "common/timing.h" #include "tools/replay/util.h" +static void interrupt_sleep_handler(int signal) {} + Replay::Replay(QString route, QStringList allow, QStringList block, SubMaster *sm_, uint32_t flags, QString data_dir, QObject *parent) : sm(sm_), flags_(flags), QObject(parent) { + // Register signal handler for SIGUSR1 + std::signal(SIGUSR1, interrupt_sleep_handler); + if (!(flags_ & REPLAY_FLAG_ALL_SERVICES)) { block << "uiDebug" << "userFlag"; } @@ -33,28 +38,21 @@ Replay::Replay(QString route, QStringList allow, QStringList block, SubMaster *s pm = std::make_unique(s); } route_ = std::make_unique(route, data_dir); - events_ = std::make_unique>(); - new_events_ = std::make_unique>(); } Replay::~Replay() { - stop(); -} - -void Replay::stop() { if (!stream_thread_ && segments_.empty()) return; rInfo("shutdown: in progress..."); if (stream_thread_ != nullptr) { - exit_ = updating_events_ = true; + exit_ =true; + paused_ = true; stream_cv_.notify_one(); stream_thread_->quit(); stream_thread_->wait(); - stream_thread_ = nullptr; + delete stream_thread_; } - camera_server_.reset(nullptr); timeline_future.waitForFinished(); - segments_.clear(); rInfo("shutdown: done"); } @@ -84,13 +82,12 @@ void Replay::start(int seconds) { seekTo(route_->identifier().begin_segment * 60 + seconds, false); } -void Replay::updateEvents(const std::function &lambda) { - // set updating_events to true to force stream thread release the lock and wait for events_updated. - updating_events_ = true; +void Replay::updateEvents(const std::function &update_events_function) { + pauseStreamThread(); { std::unique_lock lk(stream_lock_); - events_updated_ = lambda(); - updating_events_ = false; + events_ready_ = update_events_function(); + paused_ = user_paused_; } stream_cv_.notify_one(); } @@ -117,7 +114,7 @@ void Replay::seekTo(double seconds, bool relative) { } return segment_merged; }); - queueSegment(); + updateSegmentsCache(); } void Replay::seekToFlag(FindFlag flag) { @@ -146,34 +143,34 @@ void Replay::buildTimeline() { std::shared_ptr log(new LogReader()); if (!log->load(it->second.qlog.toStdString(), &exit_, !hasFlag(REPLAY_FLAG_NO_FILE_CACHE), 0, 3)) continue; - for (const Event *e : log->events) { - if (e->which == cereal::Event::Which::CONTROLS_STATE) { - capnp::FlatArrayMessageReader reader(e->data); + for (const Event &e : log->events) { + if (e.which == cereal::Event::Which::CONTROLS_STATE) { + capnp::FlatArrayMessageReader reader(e.data); auto event = reader.getRoot(); auto cs = event.getControlsState(); if (engaged != cs.getEnabled()) { if (engaged) { std::lock_guard lk(timeline_lock); - timeline.push_back({toSeconds(engaged_begin), toSeconds(e->mono_time), TimelineType::Engaged}); + timeline.push_back({toSeconds(engaged_begin), toSeconds(e.mono_time), TimelineType::Engaged}); } - engaged_begin = e->mono_time; + engaged_begin = e.mono_time; engaged = cs.getEnabled(); } if (alert_type != cs.getAlertType().cStr() || alert_status != cs.getAlertStatus()) { if (!alert_type.empty() && alert_size != cereal::ControlsState::AlertSize::NONE) { std::lock_guard lk(timeline_lock); - timeline.push_back({toSeconds(alert_begin), toSeconds(e->mono_time), timeline_types[(int)alert_status]}); + timeline.push_back({toSeconds(alert_begin), toSeconds(e.mono_time), timeline_types[(int)alert_status]}); } - alert_begin = e->mono_time; + alert_begin = e.mono_time; alert_type = cs.getAlertType().cStr(); alert_size = cs.getAlertSize(); alert_status = cs.getAlertStatus(); } - } else if (e->which == cereal::Event::Which::USER_FLAG) { + } else if (e.which == cereal::Event::Which::USER_FLAG) { std::lock_guard lk(timeline_lock); - timeline.push_back({toSeconds(e->mono_time), toSeconds(e->mono_time), TimelineType::UserFlag}); + timeline.push_back({toSeconds(e.mono_time), toSeconds(e.mono_time), TimelineType::UserFlag}); } } std::sort(timeline.begin(), timeline.end(), [](auto &l, auto &r) { return std::get<2>(l) < std::get<2>(r); }); @@ -203,16 +200,22 @@ std::optional Replay::find(FindFlag flag) { } void Replay::pause(bool pause) { - updateEvents([=]() { - rWarning("%s at %.2f s", pause ? "paused..." : "resuming", currentSeconds()); - paused_ = pause; - return true; - }); + if (user_paused_ != pause) { + pauseStreamThread(); + { + std::unique_lock lk(stream_lock_); + rWarning("%s at %.2f s", pause ? "paused..." : "resuming", currentSeconds()); + paused_ = user_paused_ = pause; + } + stream_cv_.notify_one(); + } } -void Replay::setCurrentSegment(int n) { - if (current_segment_.exchange(n) != n) { - QMetaObject::invokeMethod(this, &Replay::queueSegment, Qt::QueuedConnection); +void Replay::pauseStreamThread() { + paused_ = true; + // Send SIGUSR1 to interrupt clock_nanosleep + if (stream_thread_ && stream_thread_id) { + pthread_kill(stream_thread_id, SIGUSR1); } } @@ -222,27 +225,22 @@ void Replay::segmentLoadFinished(bool success) { rWarning("failed to load segment %d, removing it from current replay list", seg->seg_num); updateEvents([&]() { segments_.erase(seg->seg_num); - return true; + return !segments_.empty(); }); } - queueSegment(); + updateSegmentsCache(); } -void Replay::queueSegment() { +void Replay::updateSegmentsCache() { auto cur = segments_.lower_bound(current_segment_.load()); if (cur == segments_.end()) return; + // Calculate the range of segments to load auto begin = std::prev(cur, std::min(segment_cache_limit / 2, std::distance(segments_.begin(), cur))); auto end = std::next(begin, std::min(segment_cache_limit, std::distance(begin, segments_.end()))); begin = std::prev(end, std::min(segment_cache_limit, std::distance(segments_.begin(), end))); - // load one segment at a time - auto it = std::find_if(cur, end, [](auto &it) { return !it.second || !it.second->isLoaded(); }); - if (it != end && !it->second) { - rDebug("loading segment %d...", it->first); - it->second = std::make_unique(it->first, route_->at(it->first), flags_); - QObject::connect(it->second.get(), &Segment::loadFinished, this, &Replay::segmentLoadFinished); - } + loadSegmentInRange(begin, cur, end); mergeSegments(begin, end); // free segments out of current semgnt window. @@ -257,69 +255,81 @@ void Replay::queueSegment() { } } +void Replay::loadSegmentInRange(SegmentMap::iterator begin, SegmentMap::iterator cur, SegmentMap::iterator end) { + auto loadNext = [this](auto begin, auto end) { + auto it = std::find_if(begin, end, [](const auto &seg_it) { return !seg_it.second || !seg_it.second->isLoaded(); }); + if (it != end && !it->second) { + rDebug("loading segment %d...", it->first); + it->second = std::make_unique(it->first, route_->at(it->first), flags_); + QObject::connect(it->second.get(), &Segment::loadFinished, this, &Replay::segmentLoadFinished); + return true; + } + return false; + }; + + // Load forward segments, then try reverse + if (!loadNext(cur, end)) { + loadNext(std::make_reverse_iterator(cur), segments_.rend()); + } +} + void Replay::mergeSegments(const SegmentMap::iterator &begin, const SegmentMap::iterator &end) { - std::vector segments_need_merge; + std::set segments_to_merge; size_t new_events_size = 0; for (auto it = begin; it != end; ++it) { if (it->second && it->second->isLoaded()) { - segments_need_merge.push_back(it->first); + segments_to_merge.insert(it->first); new_events_size += it->second->log->events.size(); } } - if (segments_need_merge != segments_merged_) { - std::string s; - for (int i = 0; i < segments_need_merge.size(); ++i) { - s += std::to_string(segments_need_merge[i]); - if (i != segments_need_merge.size() - 1) s += ", "; - } - rDebug("merge segments %s", s.c_str()); - new_events_->clear(); - new_events_->reserve(new_events_size); - for (int n : segments_need_merge) { - size_t size = new_events_->size(); - const auto &events = segments_[n]->log->events; - std::copy_if(events.begin(), events.end(), std::back_inserter(*new_events_), - [this](auto e) { return e->which < sockets_.size() && sockets_[e->which] != nullptr; }); - std::inplace_merge(new_events_->begin(), new_events_->begin() + size, new_events_->end(), Event::lessThan()); - } + if (segments_to_merge == merged_segments_) return; - if (stream_thread_) { - emit segmentsMerged(); + rDebug("merge segments %s", std::accumulate(segments_to_merge.begin(), segments_to_merge.end(), std::string{}, + [](auto & a, int b) { return a + (a.empty() ? "" : ", ") + std::to_string(b); }).c_str()); - // Check if seeking is in progress - if (seeking_to_seconds_ >= 0) { - int target_segment = int(seeking_to_seconds_ / 60); - auto segment_found = std::find(segments_need_merge.begin(), segments_need_merge.end(), target_segment); + std::vector new_events; + new_events.reserve(new_events_size); - // If the target segment is found, emit seekedTo signal and reset seeking_to_seconds_ - if (segment_found != segments_need_merge.end()) { - emit seekedTo(seeking_to_seconds_); - seeking_to_seconds_ = -1; // Reset seeking_to_seconds_ to indicate completion of seek - } - } + // Merge events from segments_to_merge into new_events + for (int n : segments_to_merge) { + size_t size = new_events.size(); + const auto &events = segments_.at(n)->log->events; + std::copy_if(events.begin(), events.end(), std::back_inserter(new_events), + [this](const Event &e) { return e.which < sockets_.size() && sockets_[e.which] != nullptr; }); + std::inplace_merge(new_events.begin(), new_events.begin() + size, new_events.end()); + } + + if (stream_thread_) { + emit segmentsMerged(); + + // Check if seeking is in progress + int target_segment = int(seeking_to_seconds_ / 60); + if (seeking_to_seconds_ >= 0 && segments_to_merge.count(target_segment) > 0) { + emit seekedTo(seeking_to_seconds_); + seeking_to_seconds_ = -1; // Reset seeking_to_seconds_ to indicate completion of seek } - updateEvents([&]() { - events_.swap(new_events_); - segments_merged_ = segments_need_merge; - // Do not wake up the stream thread if the current segment has not been merged. - return isSegmentMerged(current_segment_) || (segments_.count(current_segment_) == 0); - }); } + + updateEvents([&]() { + events_.swap(new_events); + merged_segments_ = segments_to_merge; + // Wake up the stream thread if the current segment is loaded or invalid. + return isSegmentMerged(current_segment_) || (segments_.count(current_segment_) == 0); + }); } void Replay::startStream(const Segment *cur_segment) { const auto &events = cur_segment->log->events; - - route_start_ts_ = events.front()->mono_time; + route_start_ts_ = events.front().mono_time; cur_mono_time_ += route_start_ts_ - 1; // get datetime from INIT_DATA, fallback to datetime in the route name route_date_time_ = route()->datetime(); auto it = std::find_if(events.cbegin(), events.cend(), - [](auto e) { return e->which == cereal::Event::Which::INIT_DATA; }); + [](const Event &e) { return e.which == cereal::Event::Which::INIT_DATA; }); if (it != events.cend()) { - capnp::FlatArrayMessageReader reader((*it)->data); + capnp::FlatArrayMessageReader reader(it->data); auto event = reader.getRoot(); uint64_t wall_time = event.getInitData().getWallTimeNanos(); if (wall_time > 0) { @@ -328,9 +338,9 @@ void Replay::startStream(const Segment *cur_segment) { } // write CarParams - it = std::find_if(events.begin(), events.end(), [](auto e) { return e->which == cereal::Event::Which::CAR_PARAMS; }); + it = std::find_if(events.begin(), events.end(), [](const Event &e) { return e.which == cereal::Event::Which::CAR_PARAMS; }); if (it != events.end()) { - capnp::FlatArrayMessageReader reader((*it)->data); + capnp::FlatArrayMessageReader reader(it->data); auto event = reader.getRoot(); car_fingerprint_ = event.getCarParams().getCarFingerprint(); capnp::MallocMessageBuilder builder; @@ -357,8 +367,7 @@ void Replay::startStream(const Segment *cur_segment) { emit segmentsMerged(); // start stream thread stream_thread_ = new QThread(); - QObject::connect(stream_thread_, &QThread::started, [=]() { stream(); }); - QObject::connect(stream_thread_, &QThread::finished, stream_thread_, &QThread::deleteLater); + QObject::connect(stream_thread_, &QThread::started, [=]() { streamThread(); }); stream_thread_->start(); timeline_future = QtConcurrent::run(this, &Replay::buildTimeline); @@ -382,83 +391,54 @@ void Replay::publishMessage(const Event *e) { } void Replay::publishFrame(const Event *e) { - static const std::map cam_types{ - {cereal::Event::ROAD_ENCODE_IDX, RoadCam}, - {cereal::Event::DRIVER_ENCODE_IDX, DriverCam}, - {cereal::Event::WIDE_ROAD_ENCODE_IDX, WideRoadCam}, - }; - if ((e->which == cereal::Event::DRIVER_ENCODE_IDX && !hasFlag(REPLAY_FLAG_DCAM)) || - (e->which == cereal::Event::WIDE_ROAD_ENCODE_IDX && !hasFlag(REPLAY_FLAG_ECAM))) { - return; + CameraType cam; + switch (e->which) { + case cereal::Event::ROAD_ENCODE_IDX: cam = RoadCam; break; + case cereal::Event::DRIVER_ENCODE_IDX: cam = DriverCam; break; + case cereal::Event::WIDE_ROAD_ENCODE_IDX: cam = WideRoadCam; break; + default: return; // Invalid event type } + if ((cam == DriverCam && !hasFlag(REPLAY_FLAG_DCAM)) || (cam == WideRoadCam && !hasFlag(REPLAY_FLAG_ECAM))) + return; // Camera isdisabled + if (isSegmentMerged(e->eidx_segnum)) { auto &segment = segments_.at(e->eidx_segnum); - auto cam = cam_types.at(e->which); if (auto &frame = segment->frames[cam]; frame) { camera_server_->pushFrame(cam, frame.get(), e); } } } -void Replay::stream() { +void Replay::streamThread() { + stream_thread_id = pthread_self(); cereal::Event::Which cur_which = cereal::Event::Which::INIT_DATA; - double prev_replay_speed = speed_; std::unique_lock lk(stream_lock_); while (true) { - stream_cv_.wait(lk, [=]() { return exit_ || (events_updated_ && !paused_); }); - events_updated_ = false; + stream_cv_.wait(lk, [=]() { return exit_ || ( events_ready_ && !paused_); }); if (exit_) break; - Event cur_event{cur_which, cur_mono_time_, {}}; - auto eit = std::upper_bound(events_->begin(), events_->end(), &cur_event, Event::lessThan()); - if (eit == events_->end()) { + Event event(cur_which, cur_mono_time_, {}); + auto first = std::upper_bound(events_.cbegin(), events_.cend(), event); + if (first == events_.cend()) { rInfo("waiting for events..."); + events_ready_ = false; continue; } - uint64_t evt_start_ts = cur_mono_time_; - uint64_t loop_start_ts = nanos_since_boot(); - - for (auto end = events_->end(); !updating_events_ && eit != end; ++eit) { - const Event *evt = (*eit); - cur_which = evt->which; - cur_mono_time_ = evt->mono_time; - setCurrentSegment(toSeconds(cur_mono_time_) / 60); - - if (sockets_[cur_which] != nullptr) { - // keep time - long etime = (cur_mono_time_ - evt_start_ts) / speed_; - long rtime = nanos_since_boot() - loop_start_ts; - long behind_ns = etime - rtime; - // if behind_ns is greater than 1 second, it means that an invalid segment is skipped by seeking/replaying - if (behind_ns >= 1 * 1e9 || speed_ != prev_replay_speed) { - // reset event start times - evt_start_ts = cur_mono_time_; - loop_start_ts = nanos_since_boot(); - prev_replay_speed = speed_; - } else if (behind_ns > 0) { - precise_nano_sleep(behind_ns); - } + auto it = publishEvents(first, events_.cend()); - if (evt->eidx_segnum == -1) { - publishMessage(evt); - } else if (camera_server_) { - if (speed_ > 1.0) { - camera_server_->waitForSent(); - } - publishFrame(evt); - } - } - } - // wait for frame to be sent before unlock.(frameReader may be deleted after unlock) + // Ensure frames are sent before unlocking to prevent race conditions if (camera_server_) { camera_server_->waitForSent(); } - if (eit == events_->end() && !hasFlag(REPLAY_FLAG_NO_LOOP)) { - int last_segment = segments_.empty() ? 0 : segments_.rbegin()->first; + if (it != events_.cend()) { + cur_which = it->which; + } else if (!hasFlag(REPLAY_FLAG_NO_LOOP)) { + // Check for loop end and restart if necessary + int last_segment = segments_.rbegin()->first; if (current_segment_ >= last_segment && isSegmentMerged(last_segment)) { rInfo("reaches the end of route, restart from beginning"); QMetaObject::invokeMethod(this, std::bind(&Replay::seekTo, this, 0, false), Qt::QueuedConnection); @@ -466,3 +446,48 @@ void Replay::stream() { } } } + +std::vector::const_iterator Replay::publishEvents(std::vector::const_iterator first, + std::vector::const_iterator last) { + uint64_t evt_start_ts = cur_mono_time_; + uint64_t loop_start_ts = nanos_since_boot(); + double prev_replay_speed = speed_; + + for (; !paused_ && first != last; ++first) { + const Event &evt = *first; + int segment = toSeconds(evt.mono_time) / 60; + + if (current_segment_ != segment) { + current_segment_ = segment; + QMetaObject::invokeMethod(this, &Replay::updateSegmentsCache, Qt::QueuedConnection); + } + + // Skip events if socket is not present + if (!sockets_[evt.which]) continue; + + int64_t time_diff = (evt.mono_time - evt_start_ts) / speed_ - (nanos_since_boot() - loop_start_ts); + // if time_diff is greater than 1 second, it means that an invalid segment is skipped + if (time_diff >= 1e9 || speed_ != prev_replay_speed) { + // reset event start times + evt_start_ts = evt.mono_time; + loop_start_ts = nanos_since_boot(); + prev_replay_speed = speed_; + } else if (time_diff > 0) { + precise_nano_sleep(time_diff); + } + + if (paused_) break; + + cur_mono_time_ = evt.mono_time; + if (evt.eidx_segnum == -1) { + publishMessage(&evt); + } else if (camera_server_) { + if (speed_ > 1.0) { + camera_server_->waitForSent(); + } + publishFrame(&evt); + } + } + + return first; +} diff --git a/tools/replay/replay.h b/tools/replay/replay.h index c4140dc806..b8f7852e4f 100644 --- a/tools/replay/replay.h +++ b/tools/replay/replay.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -53,11 +54,10 @@ public: ~Replay(); bool load(); void start(int seconds = 0); - void stop(); void pause(bool pause); void seekToFlag(FindFlag flag); void seekTo(double seconds, bool relative); - inline bool isPaused() const { return paused_; } + inline bool isPaused() const { return user_paused_; } // the filter is called in streaming thread.try to return quickly from it to avoid blocking streaming. // the filter function must return true if the event should be filtered. // otherwise it must return false. @@ -79,7 +79,7 @@ public: inline int totalSeconds() const { return (!segments_.empty()) ? (segments_.rbegin()->first + 1) * 60 : 0; } inline void setSpeed(float speed) { speed_ = speed; } inline float getSpeed() const { return speed_; } - inline const std::vector *events() const { return events_.get(); } + inline const std::vector *events() const { return &events_; } inline const std::map> &segments() const { return segments_; } inline const std::string &carFingerprint() const { return car_fingerprint_; } inline const std::vector> getTimeline() { @@ -99,36 +99,37 @@ protected slots: protected: typedef std::map> SegmentMap; std::optional find(FindFlag flag); + void pauseStreamThread(); void startStream(const Segment *cur_segment); - void stream(); - void setCurrentSegment(int n); - void queueSegment(); + void streamThread(); + void updateSegmentsCache(); + void loadSegmentInRange(SegmentMap::iterator begin, SegmentMap::iterator cur, SegmentMap::iterator end); void mergeSegments(const SegmentMap::iterator &begin, const SegmentMap::iterator &end); - void updateEvents(const std::function& lambda); + void updateEvents(const std::function& update_events_function); + std::vector::const_iterator publishEvents(std::vector::const_iterator first, + std::vector::const_iterator last); void publishMessage(const Event *e); void publishFrame(const Event *e); void buildTimeline(); - inline bool isSegmentMerged(int n) { - return std::find(segments_merged_.begin(), segments_merged_.end(), n) != segments_merged_.end(); - } + inline bool isSegmentMerged(int n) const { return merged_segments_.count(n) > 0; } + pthread_t stream_thread_id = 0; QThread *stream_thread_ = nullptr; std::mutex stream_lock_; + bool user_paused_ = false; std::condition_variable stream_cv_; - std::atomic updating_events_ = false; std::atomic current_segment_ = 0; double seeking_to_seconds_ = -1; SegmentMap segments_; // the following variables must be protected with stream_lock_ std::atomic exit_ = false; - bool paused_ = false; - bool events_updated_ = false; + std::atomic paused_ = false; + bool events_ready_ = false; QDateTime route_date_time_; uint64_t route_start_ts_ = 0; std::atomic cur_mono_time_ = 0; - std::unique_ptr> events_; - std::unique_ptr> new_events_; - std::vector segments_merged_; + std::vector events_; + std::set merged_segments_; // messaging SubMaster *sm = nullptr; diff --git a/tools/replay/route.cc b/tools/replay/route.cc index db7a959595..f2a0754da1 100644 --- a/tools/replay/route.cc +++ b/tools/replay/route.cc @@ -77,7 +77,7 @@ bool Route::loadFromServer(int retries) { return false; } rWarning("Retrying %d/%d", i, retries); - util::sleep_for(500); + util::sleep_for(3000); } return false; } diff --git a/tools/replay/tests/test_replay.cc b/tools/replay/tests/test_replay.cc index a681f347bb..6c005f1bd4 100644 --- a/tools/replay/tests/test_replay.cc +++ b/tools/replay/tests/test_replay.cc @@ -1,7 +1,6 @@ #include #include -#include #include #include "catch2/catch.hpp" @@ -67,7 +66,7 @@ TEST_CASE("LogReader") { corrupt_content.resize(corrupt_content.length() / 2); corrupt_content = decompressBZ2(corrupt_content); LogReader log; - REQUIRE(log.load((std::byte *)corrupt_content.data(), corrupt_content.size())); + REQUIRE(log.load(corrupt_content.data(), corrupt_content.size())); REQUIRE(log.events.size() > 0); } } @@ -88,7 +87,7 @@ void read_segment(int n, const SegmentFile &segment_file, uint32_t flags) { // test LogReader & FrameReader REQUIRE(segment.log->events.size() > 0); - REQUIRE(std::is_sorted(segment.log->events.begin(), segment.log->events.end(), Event::lessThan())); + REQUIRE(std::is_sorted(segment.log->events.begin(), segment.log->events.end())); for (auto cam : ALL_CAMERAS) { auto &fr = segment.frames[cam]; @@ -158,63 +157,20 @@ TEST_CASE("Remote route") { } } -// helper class for unit tests -class TestReplay : public Replay { - public: - TestReplay(const QString &route, uint32_t flags = REPLAY_FLAG_NO_FILE_CACHE | REPLAY_FLAG_NO_VIPC) : Replay(route, {}, {}, nullptr, flags) {} - void test_seek(); - void testSeekTo(int seek_to); -}; - -void TestReplay::testSeekTo(int seek_to) { - seekTo(seek_to, false); - - while (true) { - std::unique_lock lk(stream_lock_); - stream_cv_.wait(lk, [=]() { return events_updated_ == true; }); - events_updated_ = false; - if (cur_mono_time_ != route_start_ts_ + seek_to * 1e9) { - // wake up by the previous merging, skip it. - continue; - } - - Event cur_event(cereal::Event::Which::INIT_DATA, cur_mono_time_, {}); - auto eit = std::upper_bound(events_->begin(), events_->end(), &cur_event, Event::lessThan()); - if (eit == events_->end()) { - qDebug() << "waiting for events..."; - continue; - } - - REQUIRE(std::is_sorted(events_->begin(), events_->end(), Event::lessThan())); - const int seek_to_segment = seek_to / 60; - const int event_seconds = ((*eit)->mono_time - route_start_ts_) / 1e9; - current_segment_ = event_seconds / 60; - INFO("seek to [" << seek_to << "s segment " << seek_to_segment << "], events [" << event_seconds << "s segment" << current_segment_ << "]"); - REQUIRE(event_seconds >= seek_to); - if (event_seconds > seek_to) { - auto it = segments_.lower_bound(seek_to_segment); - REQUIRE(it->first == current_segment_); - } - break; - } -} - -void TestReplay::test_seek() { - // create a dummy stream thread - stream_thread_ = new QThread(this); +TEST_CASE("seek_to") { QEventLoop loop; - std::thread thread = std::thread([&]() { - for (int i = 0; i < 10; ++i) { - testSeekTo(util::random_int(0, 2 * 60)); - } + int seek_to = util::random_int(0, 2 * 59); + Replay replay(DEMO_ROUTE, {}, {}, nullptr, REPLAY_FLAG_NO_VIPC); + + QObject::connect(&replay, &Replay::seekedTo, [&](double sec) { + INFO("seek to " << seek_to << "s seeked to" << sec); + REQUIRE(sec >= seek_to); loop.quit(); }); - loop.exec(); - thread.join(); -} -TEST_CASE("Replay") { - TestReplay replay(DEMO_ROUTE); REQUIRE(replay.load()); - replay.test_seek(); + replay.start(); + replay.seekTo(seek_to, false); + + loop.exec(); } diff --git a/tools/replay/util.cc b/tools/replay/util.cc index deb6293745..f95e1e75b1 100644 --- a/tools/replay/util.cc +++ b/tools/replay/util.cc @@ -4,10 +4,10 @@ #include #include -#include -#include #include #include +#include +#include #include #include #include @@ -158,7 +158,10 @@ size_t getRemoteFileSize(const std::string &url, std::atomic *abort) { int still_running = 1; while (still_running > 0 && !(abort && *abort)) { CURLMcode mc = curl_multi_perform(cm, &still_running); - if (!mc) curl_multi_wait(cm, nullptr, 0, 1000, nullptr); + if (mc != CURLM_OK) break; + if (still_running > 0) { + curl_multi_wait(cm, nullptr, 0, 1000, nullptr); + } } double content_length = -1; @@ -208,10 +211,20 @@ bool httpDownload(const std::string &url, T &buf, size_t chunk_size, size_t cont } int still_running = 1; + size_t prev_written = 0; while (still_running > 0 && !(abort && *abort)) { - curl_multi_wait(cm, nullptr, 0, 1000, nullptr); - curl_multi_perform(cm, &still_running); - download_stats.update(url, written); + CURLMcode mc = curl_multi_perform(cm, &still_running); + if (mc != CURLM_OK) { + break; + } + if (still_running > 0) { + curl_multi_wait(cm, nullptr, 0, 1000, nullptr); + } + + if (((written - prev_written) / (double)content_length) >= 0.01) { + download_stats.update(url, written); + prev_written = written; + } } CURLMsg *msg; @@ -304,9 +317,11 @@ std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic return {}; } -void precise_nano_sleep(long sleep_ns) { - struct timespec req = {.tv_sec = 0, .tv_nsec = sleep_ns}; - struct timespec rem = {}; +void precise_nano_sleep(int64_t nanoseconds) { + struct timespec req, rem; + + req.tv_sec = nanoseconds / 1e9; + req.tv_nsec = nanoseconds % (int64_t)1e9; while (clock_nanosleep(CLOCK_MONOTONIC, 0, &req, &rem) && errno == EINTR) { // Retry sleep if interrupted by a signal req = rem; diff --git a/tools/replay/util.h b/tools/replay/util.h index 6c808095e8..fdb1dbf0f8 100644 --- a/tools/replay/util.h +++ b/tools/replay/util.h @@ -21,7 +21,7 @@ void logMessage(ReplyMsgType type, const char* fmt, ...); #define rError(fmt, ...) ::logMessage(ReplyMsgType::Critical , fmt, ## __VA_ARGS__) std::string sha256(const std::string &str); -void precise_nano_sleep(long sleep_ns); +void precise_nano_sleep(int64_t nanoseconds); std::string decompressBZ2(const std::string &in, std::atomic *abort = nullptr); std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic *abort = nullptr); std::string getUrlWithoutQuery(const std::string &url); From bab8cdfdef025b242150fb855e210ffcadc83a30 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 22 Apr 2024 13:34:24 +0800 Subject: [PATCH 325/384] Cabana: bug fixes (#32272) * Fix SIGSEGV due to thread race conditions after seeking * adding ID as a secondary sorting factor * fix gaps --- tools/cabana/messageswidget.cc | 12 ++++++------ tools/cabana/videowidget.cc | 3 ++- tools/replay/replay.cc | 14 ++++++-------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/tools/cabana/messageswidget.cc b/tools/cabana/messageswidget.cc index 8043b99a70..4c3efa0385 100644 --- a/tools/cabana/messageswidget.cc +++ b/tools/cabana/messageswidget.cc @@ -255,12 +255,12 @@ void MessageListModel::dbcModified() { void MessageListModel::sortItems(std::vector &items) { auto compare = [this](const auto &l, const auto &r) { switch (sort_column) { - case Column::NAME: return l.name < r.name; - case Column::SOURCE: return l.id.source < r.id.source; - case Column::ADDRESS: return l.id.address < r.id.address; - case Column::NODE: return l.node < r.node; - case Column::FREQ: return can->lastMessage(l.id).freq < can->lastMessage(r.id).freq; - case Column::COUNT: return can->lastMessage(l.id).count < can->lastMessage(r.id).count; + case Column::NAME: return std::tie(l.name, l.id) < std::tie(r.name, r.id); + case Column::SOURCE: return std::tie(l.id.source, l.id.address) < std::tie(r.id.source, r.id.address); + case Column::ADDRESS: return std::tie(l.id.address, l.id.source) < std::tie(r.id.address, r.id.source); + case Column::NODE: return std::tie(l.node, l.id) < std::tie(r.node, r.id); + case Column::FREQ: return std::tie(can->lastMessage(l.id).freq, l.id) < std::tie(can->lastMessage(r.id).freq, r.id); + case Column::COUNT: return std::tie(can->lastMessage(l.id).count, l.id) < std::tie(can->lastMessage(r.id).count, r.id); default: return false; // Default case to suppress compiler warning } }; diff --git a/tools/cabana/videowidget.cc b/tools/cabana/videowidget.cc index 261c540340..cd412f7271 100644 --- a/tools/cabana/videowidget.cc +++ b/tools/cabana/videowidget.cc @@ -151,6 +151,7 @@ QWidget *VideoWidget::createCameraWidget() { setMaximumTime(can->totalSeconds()); QObject::connect(slider, &QSlider::sliderReleased, [this]() { can->seekTo(slider->currentSecond()); }); QObject::connect(slider, &Slider::updateMaximumTime, this, &VideoWidget::setMaximumTime, Qt::QueuedConnection); + QObject::connect(can, &AbstractStream::eventsMerged, [this]() { slider->update(); }); QObject::connect(static_cast(can), &ReplayStream::qLogLoaded, slider, &Slider::parseQLog); QObject::connect(cam_widget, &CameraWidget::clicked, []() { can->pause(!can->isPaused()); }); QObject::connect(cam_widget, &CameraWidget::vipcAvailableStreamsUpdated, this, &VideoWidget::vipcAvailableStreamsUpdated); @@ -405,7 +406,7 @@ void InfoLabel::paintEvent(QPaintEvent *event) { font.setPixelSize(11); p.setFont(font); } - QRect text_rect = rect().adjusted(2, 2, -2, -2); + QRect text_rect = rect().adjusted(1, 1, -1, -1); QRect r = p.fontMetrics().boundingRect(text_rect, Qt::AlignTop | Qt::AlignHCenter | Qt::TextWordWrap, text); p.fillRect(text_rect.left(), r.top(), text_rect.width(), r.height(), color); p.drawText(text_rect, Qt::AlignTop | Qt::AlignHCenter | Qt::TextWordWrap, text); diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index e7657f3531..f5339050a8 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -93,10 +93,9 @@ void Replay::updateEvents(const std::function &update_events_function) { } void Replay::seekTo(double seconds, bool relative) { - seeking_to_seconds_ = relative ? seconds + currentSeconds() : seconds; - seeking_to_seconds_ = std::max(double(0.0), seeking_to_seconds_); - updateEvents([&]() { + seeking_to_seconds_ = relative ? seconds + currentSeconds() : seconds; + seeking_to_seconds_ = std::max(double(0.0), seeking_to_seconds_); int target_segment = (int)seeking_to_seconds_ / 60; if (segments_.count(target_segment) == 0) { rWarning("can't seek to %d s segment %d is invalid", (int)seeking_to_seconds_, target_segment); @@ -302,18 +301,17 @@ void Replay::mergeSegments(const SegmentMap::iterator &begin, const SegmentMap:: if (stream_thread_) { emit segmentsMerged(); + } + updateEvents([&]() { + events_.swap(new_events); + merged_segments_ = segments_to_merge; // Check if seeking is in progress int target_segment = int(seeking_to_seconds_ / 60); if (seeking_to_seconds_ >= 0 && segments_to_merge.count(target_segment) > 0) { emit seekedTo(seeking_to_seconds_); seeking_to_seconds_ = -1; // Reset seeking_to_seconds_ to indicate completion of seek } - } - - updateEvents([&]() { - events_.swap(new_events); - merged_segments_ = segments_to_merge; // Wake up the stream thread if the current segment is loaded or invalid. return isSegmentMerged(current_segment_) || (segments_.count(current_segment_) == 0); }); From 5d7b01bbe0eaecce2e81df4e819b7933d72cc427 Mon Sep 17 00:00:00 2001 From: commaci-public <60409688+commaci-public@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:42:22 -0700 Subject: [PATCH 326/384] [bot] Update Python packages and pre-commit hooks (#32276) Update Python packages and pre-commit hooks Co-authored-by: jnewb1 <9648890+jnewb1@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +- poetry.lock | 800 +++++++++++++++++++++------------------- 2 files changed, 430 insertions(+), 376 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e4109b8bf8..ec3ec96794 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: - -L bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints - --builtins clear,rare,informal,usage,code,names,en-GB_to_en-US - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.5 + rev: v0.4.1 hooks: - id: ruff exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' @@ -75,7 +75,7 @@ repos: # relevant rules are whitelisted, see all options with: cpplint --filter= - --filter=-build,-legal,-readability,-runtime,-whitespace,+build/include_subdir,+build/forward_decl,+build/include_what_you_use,+build/deprecated,+whitespace/comma,+whitespace/line_length,+whitespace/empty_if_body,+whitespace/empty_loop_body,+whitespace/empty_conditional_body,+whitespace/forcolon,+whitespace/parens,+whitespace/semicolon,+whitespace/tab,+readability/braces - repo: https://github.com/MarcoGorelli/cython-lint - rev: v0.16.0 + rev: v0.16.2 hooks: - id: cython-lint exclude: '^(third_party/)|(cereal/)|(body/)|(rednose/)|(rednose_repo/)|(opendbc/)|(panda/)|(generated/)' @@ -98,6 +98,6 @@ repos: args: - --lock - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.28.1 + rev: 0.28.2 hooks: - id: check-github-workflows diff --git a/poetry.lock b/poetry.lock index 453ba46e7d..152ae4a49d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,87 +2,87 @@ [[package]] name = "aiohttp" -version = "3.9.3" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"}, - {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"}, - {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"}, - {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"}, - {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"}, - {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"}, - {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"}, - {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"}, - {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"}, - {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"}, - {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"}, - {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] @@ -274,20 +274,20 @@ aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.15.0" +version = "1.16.0" description = "Microsoft Azure Identity Library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "azure-identity-1.15.0.tar.gz", hash = "sha256:4c28fc246b7f9265610eb5261d65931183d019a23d4b0e99357facb2e6c227c8"}, - {file = "azure_identity-1.15.0-py3-none-any.whl", hash = "sha256:a14b1f01c7036f11f148f22cd8c16e05035293d714458d6b44ddf534d93eb912"}, + {file = "azure-identity-1.16.0.tar.gz", hash = "sha256:6ff1d667cdcd81da1ceab42f80a0be63ca846629f518a922f7317a7e3c844e1b"}, + {file = "azure_identity-1.16.0-py3-none-any.whl", hash = "sha256:722fdb60b8fdd55fa44dc378b8072f4b419b56a5e54c0de391f644949f3a826f"}, ] [package.dependencies] -azure-core = ">=1.23.0,<2.0.0" +azure-core = ">=1.23.0" cryptography = ">=2.5" -msal = ">=1.24.0,<2.0.0" -msal-extensions = ">=0.3.0,<2.0.0" +msal = ">=1.24.0" +msal-extensions = ">=0.3.0" [[package]] name = "azure-storage-blob" @@ -1018,6 +1018,23 @@ files = [ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] +[[package]] +name = "ewmhlib" +version = "0.2" +description = "Extended Window Manager Hints implementation in Python 3" +optional = false +python-versions = "*" +files = [ + {file = "EWMHlib-0.2-py3-none-any.whl", hash = "sha256:f5b07d8cfd4c7734462ee744c32d490f2f3233fa7ab354240069344208d2f6f5"}, +] + +[package.dependencies] +python-xlib = {version = ">=0.21", markers = "sys_platform == \"linux\""} +typing-extensions = ">=4.4.0" + +[package.extras] +dev = ["mypy (>=0.990)", "types-python-xlib (>=0.32)", "types-setuptools (>=65.5)"] + [[package]] name = "execnet" version = "2.1.1" @@ -1045,13 +1062,13 @@ files = [ [[package]] name = "filelock" -version = "3.13.3" +version = "3.13.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.3-py3-none-any.whl", hash = "sha256:5ffa845303983e7a0b7ae17636509bc97997d58afeafa72fb141a17b152284cb"}, - {file = "filelock-3.13.3.tar.gz", hash = "sha256:a79895a25bbefdf55d1a2a0a80968f7dbb28edcd6d4234a0afb3f37ecde4b546"}, + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, ] [package.extras] @@ -1564,13 +1581,13 @@ zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2022.1)"] [[package]] name = "identify" -version = "2.5.35" +version = "2.5.36" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, - {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, + {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, + {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, ] [package.extras] @@ -1578,13 +1595,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -2693,36 +2710,36 @@ reference = ["Pillow", "google-re2"] [[package]] name = "onnxruntime" -version = "1.17.1" +version = "1.17.3" description = "ONNX Runtime is a runtime accelerator for Machine Learning models" optional = false python-versions = "*" files = [ - {file = "onnxruntime-1.17.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:d43ac17ac4fa3c9096ad3c0e5255bb41fd134560212dc124e7f52c3159af5d21"}, - {file = "onnxruntime-1.17.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55b5e92a4c76a23981c998078b9bf6145e4fb0b016321a8274b1607bd3c6bd35"}, - {file = "onnxruntime-1.17.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebbcd2bc3a066cf54e6f18c75708eb4d309ef42be54606d22e5bdd78afc5b0d7"}, - {file = "onnxruntime-1.17.1-cp310-cp310-win32.whl", hash = "sha256:5e3716b5eec9092e29a8d17aab55e737480487deabfca7eac3cd3ed952b6ada9"}, - {file = "onnxruntime-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:fbb98cced6782ae1bb799cc74ddcbbeeae8819f3ad1d942a74d88e72b6511337"}, - {file = "onnxruntime-1.17.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:36fd6f87a1ecad87e9c652e42407a50fb305374f9a31d71293eb231caae18784"}, - {file = "onnxruntime-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99a8bddeb538edabc524d468edb60ad4722cff8a49d66f4e280c39eace70500b"}, - {file = "onnxruntime-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd7fddb4311deb5a7d3390cd8e9b3912d4d963efbe4dfe075edbaf18d01c024e"}, - {file = "onnxruntime-1.17.1-cp311-cp311-win32.whl", hash = "sha256:606a7cbfb6680202b0e4f1890881041ffc3ac6e41760a25763bd9fe146f0b335"}, - {file = "onnxruntime-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:53e4e06c0a541696ebdf96085fd9390304b7b04b748a19e02cf3b35c869a1e76"}, - {file = "onnxruntime-1.17.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:40f08e378e0f85929712a2b2c9b9a9cc400a90c8a8ca741d1d92c00abec60843"}, - {file = "onnxruntime-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac79da6d3e1bb4590f1dad4bb3c2979d7228555f92bb39820889af8b8e6bd472"}, - {file = "onnxruntime-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ae9ba47dc099004e3781f2d0814ad710a13c868c739ab086fc697524061695ea"}, - {file = "onnxruntime-1.17.1-cp312-cp312-win32.whl", hash = "sha256:2dff1a24354220ac30e4a4ce2fb1df38cb1ea59f7dac2c116238d63fe7f4c5ff"}, - {file = "onnxruntime-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:6226a5201ab8cafb15e12e72ff2a4fc8f50654e8fa5737c6f0bd57c5ff66827e"}, - {file = "onnxruntime-1.17.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:cd0c07c0d1dfb8629e820b05fda5739e4835b3b82faf43753d2998edf2cf00aa"}, - {file = "onnxruntime-1.17.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:617ebdf49184efa1ba6e4467e602fbfa029ed52c92f13ce3c9f417d303006381"}, - {file = "onnxruntime-1.17.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dae9071e3facdf2920769dceee03b71c684b6439021defa45b830d05e148924"}, - {file = "onnxruntime-1.17.1-cp38-cp38-win32.whl", hash = "sha256:835d38fa1064841679433b1aa8138b5e1218ddf0cfa7a3ae0d056d8fd9cec713"}, - {file = "onnxruntime-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:96621e0c555c2453bf607606d08af3f70fbf6f315230c28ddea91754e17ad4e6"}, - {file = "onnxruntime-1.17.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:7a9539935fb2d78ebf2cf2693cad02d9930b0fb23cdd5cf37a7df813e977674d"}, - {file = "onnxruntime-1.17.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45c6a384e9d9a29c78afff62032a46a993c477b280247a7e335df09372aedbe9"}, - {file = "onnxruntime-1.17.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e19f966450f16863a1d6182a685ca33ae04d7772a76132303852d05b95411ea"}, - {file = "onnxruntime-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e2ae712d64a42aac29ed7a40a426cb1e624a08cfe9273dcfe681614aa65b07dc"}, - {file = "onnxruntime-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:f7e9f7fb049825cdddf4a923cfc7c649d84d63c0134315f8e0aa9e0c3004672c"}, + {file = "onnxruntime-1.17.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:d86dde9c0bb435d709e51bd25991c9fe5b9a5b168df45ce119769edc4d198b15"}, + {file = "onnxruntime-1.17.3-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d87b68bf931ac527b2d3c094ead66bb4381bac4298b65f46c54fe4d1e255865"}, + {file = "onnxruntime-1.17.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26e950cf0333cf114a155f9142e71da344d2b08dfe202763a403ae81cc02ebd1"}, + {file = "onnxruntime-1.17.3-cp310-cp310-win32.whl", hash = "sha256:0962a4d0f5acebf62e1f0bf69b6e0adf16649115d8de854c1460e79972324d68"}, + {file = "onnxruntime-1.17.3-cp310-cp310-win_amd64.whl", hash = "sha256:468ccb8a0faa25c681a41787b1594bf4448b0252d3efc8b62fd8b2411754340f"}, + {file = "onnxruntime-1.17.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e8cd90c1c17d13d47b89ab076471e07fb85467c01dcd87a8b8b5cdfbcb40aa51"}, + {file = "onnxruntime-1.17.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a058b39801baefe454eeb8acf3ada298c55a06a4896fafc224c02d79e9037f60"}, + {file = "onnxruntime-1.17.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f823d5eb4807007f3da7b27ca972263df6a1836e6f327384eb266274c53d05d"}, + {file = "onnxruntime-1.17.3-cp311-cp311-win32.whl", hash = "sha256:b66b23f9109e78ff2791628627a26f65cd335dcc5fbd67ff60162733a2f7aded"}, + {file = "onnxruntime-1.17.3-cp311-cp311-win_amd64.whl", hash = "sha256:570760ca53a74cdd751ee49f13de70d1384dcf73d9888b8deac0917023ccda6d"}, + {file = "onnxruntime-1.17.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:77c318178d9c16e9beadd9a4070d8aaa9f57382c3f509b01709f0f010e583b99"}, + {file = "onnxruntime-1.17.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23da8469049b9759082e22c41a444f44a520a9c874b084711b6343672879f50b"}, + {file = "onnxruntime-1.17.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2949730215af3f9289008b2e31e9bbef952012a77035b911c4977edea06f3f9e"}, + {file = "onnxruntime-1.17.3-cp312-cp312-win32.whl", hash = "sha256:6c7555a49008f403fb3b19204671efb94187c5085976ae526cb625f6ede317bc"}, + {file = "onnxruntime-1.17.3-cp312-cp312-win_amd64.whl", hash = "sha256:58672cf20293a1b8a277a5c6c55383359fcdf6119b2f14df6ce3b140f5001c39"}, + {file = "onnxruntime-1.17.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:4395ba86e3c1e93c794a00619ef1aec597ab78f5a5039f3c6d2e9d0695c0a734"}, + {file = "onnxruntime-1.17.3-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdf354c04344ec38564fc22394e1fe08aa6d70d790df00159205a0055c4a4d3f"}, + {file = "onnxruntime-1.17.3-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a94b600b7af50e922d44b95a57981e3e35103c6e3693241a03d3ca204740bbda"}, + {file = "onnxruntime-1.17.3-cp38-cp38-win32.whl", hash = "sha256:5a335c76f9c002a8586c7f38bc20fe4b3725ced21f8ead835c3e4e507e42b2ab"}, + {file = "onnxruntime-1.17.3-cp38-cp38-win_amd64.whl", hash = "sha256:8f56a86fbd0ddc8f22696ddeda0677b041381f4168a2ca06f712ef6ec6050d6d"}, + {file = "onnxruntime-1.17.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:e0ae39f5452278cd349520c296e7de3e90d62dc5b0157c6868e2748d7f28b871"}, + {file = "onnxruntime-1.17.3-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ff2dc012bd930578aff5232afd2905bf16620815f36783a941aafabf94b3702"}, + {file = "onnxruntime-1.17.3-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf6c37483782e4785019b56e26224a25e9b9a35b849d0169ce69189867a22bb1"}, + {file = "onnxruntime-1.17.3-cp39-cp39-win32.whl", hash = "sha256:351bf5a1140dcc43bfb8d3d1a230928ee61fcd54b0ea664c8e9a889a8e3aa515"}, + {file = "onnxruntime-1.17.3-cp39-cp39-win_amd64.whl", hash = "sha256:57a3de15778da8d6cc43fbf6cf038e1e746146300b5f0b1fbf01f6f795dc6440"}, ] [package.dependencies] @@ -2929,44 +2946,44 @@ test = ["pylint (>=3.0.0,<3.1.0)", "pytest", "pytest-pylint"] [[package]] name = "pandas" -version = "2.2.1" +version = "2.2.2" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88"}, - {file = "pandas-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944"}, - {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359"}, - {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51"}, - {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06"}, - {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9"}, - {file = "pandas-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0"}, - {file = "pandas-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b"}, - {file = "pandas-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a"}, - {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02"}, - {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403"}, - {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd"}, - {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7"}, - {file = "pandas-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e"}, - {file = "pandas-2.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c"}, - {file = "pandas-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee"}, - {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2"}, - {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0"}, - {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc"}, - {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89"}, - {file = "pandas-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb"}, - {file = "pandas-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397"}, - {file = "pandas-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16"}, - {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019"}, - {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df"}, - {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6"}, - {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be"}, - {file = "pandas-2.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab"}, - {file = "pandas-2.2.1.tar.gz", hash = "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572"}, -] - -[package.dependencies] -numpy = {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""} + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = {version = ">=1.23.2", markers = "python_version == \"3.11\""} python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" @@ -3113,13 +3130,13 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest- [[package]] name = "pluggy" -version = "1.4.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, - {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -3291,42 +3308,82 @@ pytweening = ">=1.0.4" [[package]] name = "pycapnp" -version = "1.3.0" +version = "2.0.0" description = "A cython wrapping of the C++ Cap'n Proto library" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pycapnp-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1410e38d1cd1d08fb36c781e8a91b2044306d18775524dfd6c8a3b83e665f47f"}, - {file = "pycapnp-1.3.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:debb37f96db664c140e557855ba433ea59fdf714cff358a50a619e007387692b"}, - {file = "pycapnp-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:108582647317c0f3a52ab1c615333d48546cede475887ebf8a055d1d6f20f249"}, - {file = "pycapnp-1.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1451d131ae0715b840eda1d0c84ea3909b637ac28554a13e57c089aef09e4f36"}, - {file = "pycapnp-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c09d0ea8bc6d6d101a1642f4d9366d929cacd3966bc510a7cd5b14df2fa2986"}, - {file = "pycapnp-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f26bb24bd28db2a6f99b7d17178112103dedef0ee275204f705e86936513c240"}, - {file = "pycapnp-1.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:90c07b969d90d012d0d309ec4c44605ad2d8f91595dcdf8ccc1ee798bf723b77"}, - {file = "pycapnp-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70a9d155d0dc17d343f295ae2228fb0436af329eab941e3b6637d5f5a050616d"}, - {file = "pycapnp-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cb575ab47069f990dc353d0c12f62013b08d0c00ba10c1aebffdc3150abd292"}, - {file = "pycapnp-1.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ba3adae76801b1a4c7c0f96367bdd153286469c45223bf6b50057e5d077e5d2"}, - {file = "pycapnp-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc939f85720451b1d4a05603b127c0ae241e67fcc43121685b906aa3da08d624"}, - {file = "pycapnp-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9d6af7aba49eda201243b0fbcb410b3a8a789a2f7b86adafbde7e95234a07e85"}, - {file = "pycapnp-1.3.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:32e56829e05fc54e14a8b40076d0a0958acef835379c6e39c26648cb754b9011"}, - {file = "pycapnp-1.3.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:f9d29bf65a5fb6cca1d0ed56cd2b0e6b1f63d47af72dfced80bbf6a8315aa2ae"}, - {file = "pycapnp-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8389da70ff8c4008a0aabcdbf04e272aebb0c71476bc29cb7fbefb9ae579c947"}, - {file = "pycapnp-1.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:432b9d49bde68eca83b10f04791c65dc9a2070afcbd406703c4f4a073f02061c"}, - {file = "pycapnp-1.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda76deffa45e567354234d2c21e084251dc270ba226e8d9863406c54e9cb87f"}, - {file = "pycapnp-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e351748b9a1bc3e6379183a24e1e68ecf4f76943872f63c8d42f206523b78cbb"}, - {file = "pycapnp-1.3.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ff4a67282af21fb6a16b99f7d2397c4c6462b3a59b9b751e6860ccfb5c838398"}, - {file = "pycapnp-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f6f011ce96049cff07502e76d91e2a037234aa89bd4fc299c95e403797a73dae"}, - {file = "pycapnp-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b02fd11a155aca4e1b507bc7bd91963ec9a7695d5235837229d105d920385514"}, - {file = "pycapnp-1.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0bfdbae7344835c287be2ca9f3e9fdf8f208941933fb77f6252a937917347de"}, - {file = "pycapnp-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa7d2e0c22fb4f1c7bf44630170ba06df4e1fb47f0977df1d5fe425dc74ce354"}, - {file = "pycapnp-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b82d5c2ed388157b01ae7fbf754fd677d069150336ee74d6f286936af8ce0f18"}, - {file = "pycapnp-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02acfc8d94ed0c2e1b68cde6c845149b5c89eb4c5a71c7fe4978a70370cb17b5"}, - {file = "pycapnp-1.3.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9333029a4c4f71942666ee1eb051740c38c27b034eca4c73d09f26217e2b2dc4"}, - {file = "pycapnp-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:886c09a5802b3ec232a8cd64f44c092bbf3daa1c0ff66942f1f6b9943a71a909"}, - {file = "pycapnp-1.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77c95991b4fc30fd336e3cbed4ffd3fb23aa647427bc96cafd0f77ec5b046766"}, - {file = "pycapnp-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223f600854f46009715231237a02c18a6e5b28492c0976d6602c0d73021c9d3a"}, - {file = "pycapnp-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:45e52d201d4d2ae9ee3290cae8f62c1af982ca2d7a7eaa0b58f53ada9a07c877"}, - {file = "pycapnp-1.3.0.tar.gz", hash = "sha256:7cf514c3068064e593d0401503f7a623c24c55776702a7a2d9cad9854710aa56"}, + {file = "pycapnp-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12fc023da9acd062884c9b394113457908b3c5e26aeb85f668b59c0e84b7b150"}, + {file = "pycapnp-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c8f5e4e68a1b59ae73cd77550b95f8719aea624aa424cd77aa193c6d45ea97ab"}, + {file = "pycapnp-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50ff7f45d77dc2ef0c44a0aef41f37433a0c395b6a1db99b7e6f45e0e9237bd4"}, + {file = "pycapnp-2.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc68ef3d80d9e7e9b96ba2077d8e2effd42f936bda1024f1aedc05022c9401bb"}, + {file = "pycapnp-2.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74a75e5c190e4d722aa0d2702bd04fedc2cb8e0a893031813e7a50cc067a054a"}, + {file = "pycapnp-2.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db1bc53cbe5222f4fd0748ba6b53da9ec58e8f7b2219dc9cd50d15266a3fa85c"}, + {file = "pycapnp-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0509ef856239634be21375cbad73dc7cf7fdfb32c03c312ad41e994f0674f7"}, + {file = "pycapnp-2.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:48372a19b59e8d533768c12988a92af4ea6c2daa1a8ba1c42202cd0dd24a1d24"}, + {file = "pycapnp-2.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:46c16a98cec9ae6dce5ebf488bb0c8425484d7710eed1ee008a26b60470ee755"}, + {file = "pycapnp-2.0.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:be91cdb7895c4e2f1e1cd6b701ed66050c285d2c228f476a775bfd76bbd697f1"}, + {file = "pycapnp-2.0.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:21db83e5f0c3a944b567cd20e4df47dba023e936a45d7057f2a615b8c19356f8"}, + {file = "pycapnp-2.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:825a8a86e034d66d8df8d82b7bf9fdd3f344bd84ff43a838ec08f08fe7461be0"}, + {file = "pycapnp-2.0.0-cp310-cp310-win32.whl", hash = "sha256:13ff9dca5741079d7bbe4e2512634b8ce859b709a1b126481eed404bda0b3d4a"}, + {file = "pycapnp-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:279d9f7c34527d15a62dde0dfc82cb918ed0a900dfa9713960d64bed3f9236a4"}, + {file = "pycapnp-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:829c7eb4e5f23dbcac25466110faf72a691035cf87c5d46e5053da15790e428d"}, + {file = "pycapnp-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dab60fbe3e4eaf99ec97918a0a776216c6c149b6d49261383d91c2201adb475d"}, + {file = "pycapnp-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c48a0582078bb74d7326d28571db0b8e6919563365537a5a13e8f5360c12bfc"}, + {file = "pycapnp-2.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb5ab54aff857e3711d2c0cc934194aaffacdeb3481daa56863daef07d27941"}, + {file = "pycapnp-2.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9600778036e6fe9dbea68f0c37678c5f4d561d2f2306b3cb741de5e1670ef2ae"}, + {file = "pycapnp-2.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7278ba0262fab8c398e77d634ae7ba026866d44b52cbfc27262be8d396ecacd1"}, + {file = "pycapnp-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23b2458d43c82302980a96518c96df257429204d2cc02bfff0c8cb6ebb371e01"}, + {file = "pycapnp-2.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd7755cc3fedc2ad8cc7864a0729471ddeff10c184963fe0f3689e295130f1b2"}, + {file = "pycapnp-2.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d47baf6b3db9981625ffc5ff188e089f2ebca8e7e1afb97aa5eb7bebb7bf3650"}, + {file = "pycapnp-2.0.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b375be92d93fdb6f7ac127ea9390bcec0fed4e485db137b084f9e7114dde7c83"}, + {file = "pycapnp-2.0.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:959bfdf1cddb3e5528e2293c4a375382be9a1bf044b073bc2e7eca1eb6b3a9a2"}, + {file = "pycapnp-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d873af167cf5cc7578ce5432eefcb442f866c8f7a6c57d188baf8c5e709fa39d"}, + {file = "pycapnp-2.0.0-cp311-cp311-win32.whl", hash = "sha256:40ca8018e0b7686d549b920f087049b92a3e6f06976d9f5a8112603fc560cac4"}, + {file = "pycapnp-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:d15cd8e46d541a899c84809095d7d7b3951f43642d1859e7a39bd91910778479"}, + {file = "pycapnp-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0c111ef96676df25b8afef98f369d45f838ad4434e2898e48199eb43ef704efe"}, + {file = "pycapnp-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0d18906eb1fd1b9f206d93a9591ceedce1d52e7766b66e68f271453f104e9dca"}, + {file = "pycapnp-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5d1ed365ab1beabb8838068907a7190cc0b6f16de3499d783627e670fcc0eb2"}, + {file = "pycapnp-2.0.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:495b39a7aa2629931bbca27ad743ce591c6c41e8f81792276be424742d9cd1c1"}, + {file = "pycapnp-2.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50e814fbde072dcc3d868b5b5cbb9b7a66a70bff9ad03942f3be9baf3ca1cfc6"}, + {file = "pycapnp-2.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:920fdda62d5fdef7a48339104dff0ceb9dcc21b138491f854457ba3a3d4d63ec"}, + {file = "pycapnp-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f9142eb4714c152b09dda0b055ea9dd43fd8fd894132e7eb4fa235fb4915edd"}, + {file = "pycapnp-2.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c98f1d0c4d32109d03e42828ce3c65236afc895033633cbed3ca092993702e7b"}, + {file = "pycapnp-2.0.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4d3250c1875a309d67551843cd8bf3c5e7fccf159b7f5c118a92aee36c0e871c"}, + {file = "pycapnp-2.0.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:174e6babe01f5507111c0ed226cd0b5e9325a9d2850751cfe4a57c1670f13881"}, + {file = "pycapnp-2.0.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:ed38ece414341285695526792e020f391f29f5064b2126d0367c8bdeef28e3e9"}, + {file = "pycapnp-2.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8a20b7dc55ef83a1fa446bf12680bce25caeb8f81788b623b072c3ec820db50d"}, + {file = "pycapnp-2.0.0-cp312-cp312-win32.whl", hash = "sha256:145eea66233fb5ac9152cd1c06b999ddb691815126f87f5cc37b9cda5d569f8a"}, + {file = "pycapnp-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:b8b03000769b29b36a8810f458b931f0f706f42027ee6676821eff28092d7734"}, + {file = "pycapnp-2.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6b1d547af10ecf4a3da25143c71ce64a3b0817bf229c560c9f9729d355c3b48d"}, + {file = "pycapnp-2.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecbbdbc2251d5e9d16148601e224ffaf9612d07751af72496472a3e285a1baed"}, + {file = "pycapnp-2.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8158ebb967f7b103d2d5514d6a8cc643b1744cc8e14e14a5c19697507719de7b"}, + {file = "pycapnp-2.0.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:999068b371fd4f21dddfff97640609f325cd8498c2a9d6a6c253164466628ba0"}, + {file = "pycapnp-2.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb46a9191a64ce532f82800e6885abe61e63ae4f612ed1d98c7a493dd6ee6d2b"}, + {file = "pycapnp-2.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fe49a1be55fb01f794434bab42643de7b4e37e774c3d63635f4a9ca9064437e"}, + {file = "pycapnp-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ab6c94687908003fced23ce8c415d85e521e923b0bcbcc5323bac66d14911d5"}, + {file = "pycapnp-2.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a5b814578f4f29c787deef30226c54f11188caef9b375776e8b1d73649e4119"}, + {file = "pycapnp-2.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f169bdc0a683f1cb716c1ab83c5028e75d7bf34674c00b302ca1ebf66e0d27ca"}, + {file = "pycapnp-2.0.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:5f348f8487df6a67891684e3c9c6476930fbb09258fe33f96c9bbdc4c51e6d4e"}, + {file = "pycapnp-2.0.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:57940b9898d8b2565671bdf8d8aa67e6b91c3ba879594b58287134ee20b242c7"}, + {file = "pycapnp-2.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:68a8d2ae0c078df11a5dbf2d2b5b5d48c3893584fe9bb6fa9b88dd6eadf65dda"}, + {file = "pycapnp-2.0.0-cp38-cp38-win32.whl", hash = "sha256:81bbaf65c70dfbe8bc67ea715778bd764f4b1126fd905c0778ab6fd4e358f8f4"}, + {file = "pycapnp-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:34acb733c3a4a2a13607f0d905f776d4567d0c9697e5a9865035d38d3b4fb53b"}, + {file = "pycapnp-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:87931c9322679c733bd522a0d73704d804d6531a8a5258fd8ec65930bf89f2dd"}, + {file = "pycapnp-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7d08748e55f0f49c86f0a1e2c0f96c4e6880c1c8fd5df98c12c3eae557aa441"}, + {file = "pycapnp-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ffd25a63c92f0ef85bccabc7c2c13fe6da7eadf5525025d49206d967afb670d"}, + {file = "pycapnp-2.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8b9b9ea78df282f5ce63ccd435b83b83aabb931807066e84d967444ea005571"}, + {file = "pycapnp-2.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:829b071216ae51c2ea55fd41476adaf3044a303038399276bdba6144b58157c0"}, + {file = "pycapnp-2.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16b78b58969924dd499c7c24627cf392368a3354fcc900667fcabda2621d8250"}, + {file = "pycapnp-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a365a7dff8cb05145616aecc04ea73ed493cd630c10d7ef67d833347ba264b6"}, + {file = "pycapnp-2.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:82ebe35487dcb8061e2f80403d29c20686d1d539562162f1658d36ef43e38cfa"}, + {file = "pycapnp-2.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f496c59face3195f32a50df141a7a042cd3504bd4da123c5dced096eae76699d"}, + {file = "pycapnp-2.0.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f2ed0033b56b1836a8b99de11b939d93aa93d01f5d52650da65447f4f3c03e21"}, + {file = "pycapnp-2.0.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d66097f70b0a0bff5d9431b117d359a0abe46c73ac0eb3b64ad252cf7e99d780"}, + {file = "pycapnp-2.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:245942fe441d5e7a6511110ddea44ea91f0544385ef8afbef7155bec4aaa266f"}, + {file = "pycapnp-2.0.0-cp39-cp39-win32.whl", hash = "sha256:1bcbb55fc12ff41d5e456991e9d4d368ca26ba11c65c41bd384f4edf1307b6f7"}, + {file = "pycapnp-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:d4bee40372c02bcce647084faa6a831d9884a80033f77c7aacbaac697c4bbe46"}, + {file = "pycapnp-2.0.0.tar.gz", hash = "sha256:503ab9b7b16773590ee226f2460408972c6b1c2cb2d819037115b919bef682be"}, ] [[package]] @@ -3552,22 +3609,23 @@ dev = ["coverage[toml] (>=7.2.2)"] [[package]] name = "pymonctl" -version = "0.7" +version = "0.92" description = "Cross-Platform toolkit to get info on and control monitors connected" optional = false python-versions = "*" files = [ - {file = "PyMonCtl-0.7-py3-none-any.whl", hash = "sha256:20c1f7f4cf46ff3349fa60d4e63c4ac300a2b907c0d984a1dd64d452b85ea781"}, + {file = "PyMonCtl-0.92-py3-none-any.whl", hash = "sha256:2495d8dab78f9a7dbce37e74543e60b8bd404a35c3108935697dda7768611b5a"}, ] [package.dependencies] +ewmhlib = {version = ">=0.1", markers = "sys_platform == \"linux\""} pyobjc = {version = ">=8.1", markers = "sys_platform == \"darwin\""} python-xlib = {version = ">=0.21", markers = "sys_platform == \"linux\""} pywin32 = {version = ">=302", markers = "sys_platform == \"win32\""} typing-extensions = ">=4.4.0" [package.extras] -dev = ["mypy (>=0.990)", "types-python-xlib (>=0.32)", "types-pywin32 (>=305.0.0.3)", "types-setuptools (>=65.5)"] +dev = ["mypy (>=0.990)", "pywinctl (>=0.3)", "types-python-xlib (>=0.32)", "types-pywin32 (>=305.0.0.3)", "types-setuptools (>=65.5)"] [[package]] name = "pymsgbox" @@ -6791,22 +6849,23 @@ files = [ [[package]] name = "pywinbox" -version = "0.6" +version = "0.7" description = "Cross-Platform and multi-monitor toolkit to handle rectangular areas and windows box" optional = false python-versions = "*" files = [ - {file = "PyWinBox-0.6-py3-none-any.whl", hash = "sha256:3547e459caf466d3beb2230b02208a348478428ebca61ce3e004fb5468976f33"}, + {file = "PyWinBox-0.7-py3-none-any.whl", hash = "sha256:8b2506a8dd7afa0a910b368762adfac885274132ef9151b0c81b0d2c6ffd6f83"}, ] [package.dependencies] +ewmhlib = {version = ">=0.1", markers = "sys_platform == \"linux\""} pyobjc = {version = ">=8.1", markers = "sys_platform == \"darwin\""} python-xlib = {version = ">=0.21", markers = "sys_platform == \"linux\""} pywin32 = {version = ">=302", markers = "sys_platform == \"win32\""} typing-extensions = ">=4.4.0" [package.extras] -dev = ["mypy (>=0.990)", "pywinctl (>=0.1)", "types-python-xlib (>=0.32)", "types-pywin32 (>=305.0.0.3)", "types-setuptools (>=65.5)"] +dev = ["mypy (>=0.990)", "pywinctl (>=0.3)", "types-python-xlib (>=0.32)", "types-pywin32 (>=305.0.0.3)", "types-setuptools (>=65.5)"] [[package]] name = "pywinctl" @@ -6891,104 +6950,99 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.2" +version = "26.0.2" description = "Python bindings for 0MQ" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, - {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, - {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, - {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, - {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, - {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, - {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, - {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, - {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, - {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, - {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, - {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, - {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, - {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, - {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, - {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, - {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, - {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, - {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, - {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, - {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, - {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, - {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, - {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, - {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, - {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, - {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, - {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, - {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, - {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, - {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, - {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, - {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, - {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, - {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, - {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, - {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, - {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, - {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, - {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, - {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, - {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, - {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, - {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, - {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, - {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, - {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, - {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, - {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, - {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, - {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, - {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, - {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, - {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, - {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, - {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, - {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, - {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, - {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, - {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, - {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, - {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, - {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, - {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, - {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, - {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, - {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, - {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, - {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, - {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, - {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, - {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, + {file = "pyzmq-26.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a60a03b01e8c9c58932ec0cca15b1712d911c2800eb82d4281bc1ae5b6dad50"}, + {file = "pyzmq-26.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:949067079e14ea1973bd740255e0840118c163d4bce8837f539d749f145cf5c3"}, + {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37e7edfa6cf96d036a403775c96afa25058d1bb940a79786a9a2fc94a783abe3"}, + {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:903cc7a84a7d4326b43755c368780800e035aa3d711deae84a533fdffa8755b0"}, + {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cb2e41af165e5f327d06fbdd79a42a4e930267fade4e9f92d17f3ccce03f3a7"}, + {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:55353b8189adcfc4c125fc4ce59d477744118e9c0ec379dd0999c5fa120ac4f5"}, + {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f961423ff6236a752ced80057a20e623044df95924ed1009f844cde8b3a595f9"}, + {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ba77fe84fe4f5f3dc0ef681a6d366685c8ffe1c8439c1d7530997b05ac06a04b"}, + {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:52589f0a745ef61b9c75c872cf91f8c1f7c0668eb3dd99d7abd639d8c0fb9ca7"}, + {file = "pyzmq-26.0.2-cp310-cp310-win32.whl", hash = "sha256:b7b6d2a46c7afe2ad03ec8faf9967090c8ceae85c4d8934d17d7cae6f9062b64"}, + {file = "pyzmq-26.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:86531e20de249d9204cc6d8b13d5a30537748c78820215161d8a3b9ea58ca111"}, + {file = "pyzmq-26.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:f26a05029ecd2bd306b941ff8cb80f7620b7901421052bc429d238305b1cbf2f"}, + {file = "pyzmq-26.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:70770e296a9cb03d955540c99360aab861cbb3cba29516abbd106a15dbd91268"}, + {file = "pyzmq-26.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2740fd7161b39e178554ebf21aa5667a1c9ef0cd2cb74298fd4ef017dae7aec4"}, + {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3706c32dea077faa42b1c92d825b7f86c866f72532d342e0be5e64d14d858"}, + {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fa1416876194927f7723d6b7171b95e1115602967fc6bfccbc0d2d51d8ebae1"}, + {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ef9a79a48794099c57dc2df00340b5d47c5caa1792f9ddb8c7a26b1280bd575"}, + {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1c60fcdfa3229aeee4291c5d60faed3a813b18bdadb86299c4bf49e8e51e8605"}, + {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e943c39c206b04df2eb5d71305761d7c3ca75fd49452115ea92db1b5b98dbdef"}, + {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8da0ed8a598693731c76659880a668f4748b59158f26ed283a93f7f04d47447e"}, + {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7bf51970b11d67096bede97cdbad0f4333f7664f4708b9b2acb352bf4faa3140"}, + {file = "pyzmq-26.0.2-cp311-cp311-win32.whl", hash = "sha256:6f8e6bd5d066be605faa9fe5ec10aa1a46ad9f18fc8646f2b9aaefc8fb575742"}, + {file = "pyzmq-26.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d03da3a0ae691b361edcb39530075461202f699ce05adbb15055a0e1c9bcaa4"}, + {file = "pyzmq-26.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f84e33321b68ff00b60e9dbd1a483e31ab6022c577c8de525b8e771bd274ce68"}, + {file = "pyzmq-26.0.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:44c33ebd1c62a01db7fbc24e18bdda569d6639217d13d5929e986a2b0f69070d"}, + {file = "pyzmq-26.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ac04f904b4fce4afea9cdccbb78e24d468cb610a839d5a698853e14e2a3f9ecf"}, + {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2133de5ba9adc5f481884ccb699eac9ce789708292945c05746880f95b241c0"}, + {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7753c67c570d7fc80c2dc59b90ca1196f1224e0e2e29a548980c95fe0fe27fc1"}, + {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d4e51632e6b12e65e8d9d7612446ecda2eda637a868afa7bce16270194650dd"}, + {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d6c38806f6ecd0acf3104b8d7e76a206bcf56dadd6ce03720d2fa9d9157d5718"}, + {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:48f496bbe14686b51cec15406323ae6942851e14022efd7fc0e2ecd092c5982c"}, + {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e84a3161149c75bb7a7dc8646384186c34033e286a67fec1ad1bdedea165e7f4"}, + {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:dabf796c67aa9f5a4fcc956d47f0d48b5c1ed288d628cf53aa1cf08e88654343"}, + {file = "pyzmq-26.0.2-cp312-cp312-win32.whl", hash = "sha256:3eee4c676af1b109f708d80ef0cf57ecb8aaa5900d1edaf90406aea7e0e20e37"}, + {file = "pyzmq-26.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:26721fec65846b3e4450dad050d67d31b017f97e67f7e0647b5f98aa47f828cf"}, + {file = "pyzmq-26.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:653955c6c233e90de128a1b8e882abc7216f41f44218056bd519969c8c413a15"}, + {file = "pyzmq-26.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:becd8d8fb068fbb5a52096efd83a2d8e54354383f691781f53a4c26aee944542"}, + {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a15e5465e7083c12517209c9dd24722b25e9b63c49a563922922fc03554eb35"}, + {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e8158ac8616941f874841f9fa0f6d2f1466178c2ff91ea08353fdc19de0d40c2"}, + {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea2c6a53e28c7066ea7db86fcc0b71d78d01b818bb11d4a4341ec35059885295"}, + {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bdbc7dab0b0e9c62c97b732899c4242e3282ba803bad668e03650b59b165466e"}, + {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e74b6d5ef57bb65bf1b4a37453d8d86d88550dde3fb0f23b1f1a24e60c70af5b"}, + {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ed4c6ee624ecbc77b18aeeb07bf0700d26571ab95b8f723f0d02e056b5bce438"}, + {file = "pyzmq-26.0.2-cp37-cp37m-win32.whl", hash = "sha256:8a98b3cb0484b83c19d8fb5524c8a469cd9f10e743f5904ac285d92678ee761f"}, + {file = "pyzmq-26.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:aa5f95d71b6eca9cec28aa0a2f8310ea53dea313b63db74932879ff860c1fb8d"}, + {file = "pyzmq-26.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:5ff56c76ce77b9805378a7a73032c17cbdb1a5b84faa1df03c5d3e306e5616df"}, + {file = "pyzmq-26.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bab697fc1574fee4b81da955678708567c43c813c84c91074e452bda5346c921"}, + {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c0fed8aa9ba0488ee1cbdaa304deea92d52fab43d373297002cfcc69c0a20c5"}, + {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:606b922699fcec472ed814dda4dc3ff7c748254e0b26762a0ba21a726eb1c107"}, + {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45f0fd82bad4d199fa993fbf0ac586a7ac5879addbe436a35a389df7e0eb4c91"}, + {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:166c5e41045939a52c01e6f374e493d9a6a45dfe677360d3e7026e38c42e8906"}, + {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d566e859e8b8d5bca08467c093061774924b3d78a5ba290e82735b2569edc84b"}, + {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:264ee0e72b72ca59279dc320deab5ae0fac0d97881aed1875ce4bde2e56ffde0"}, + {file = "pyzmq-26.0.2-cp38-cp38-win32.whl", hash = "sha256:3152bbd3a4744cbdd83dfb210ed701838b8b0c9065cef14671d6d91df12197d0"}, + {file = "pyzmq-26.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:bf77601d75ca692c179154b7e5943c286a4aaffec02c491afe05e60493ce95f2"}, + {file = "pyzmq-26.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:c770a7545b3deca2db185b59175e710a820dd4ed43619f4c02e90b0e227c6252"}, + {file = "pyzmq-26.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d47175f0a380bfd051726bc5c0054036ae4a5d8caf922c62c8a172ccd95c1a2a"}, + {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bce298c1ce077837e110367c321285dc4246b531cde1abfc27e4a5bbe2bed4d"}, + {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c40b09b7e184d6e3e1be1c8af2cc320c0f9f610d8a5df3dd866e6e6e4e32b235"}, + {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d420d856bf728713874cefb911398efe69e1577835851dd297a308a78c14c249"}, + {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d792d3cab987058451e55c70c5926e93e2ceb68ca5a2334863bb903eb860c9cb"}, + {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:83ec17729cf6d3464dab98a11e98294fcd50e6b17eaabd3d841515c23f6dbd3a"}, + {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47c17d5ebfa88ae90f08960c97b49917098665b8cd8be31f2c24e177bcf37a0f"}, + {file = "pyzmq-26.0.2-cp39-cp39-win32.whl", hash = "sha256:d509685d1cd1d018705a811c5f9d5bc237790936ead6d06f6558b77e16cc7235"}, + {file = "pyzmq-26.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:c7cc8cc009e8f6989a6d86c96f87dae5f5fb07d6c96916cdc7719d546152c7db"}, + {file = "pyzmq-26.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:3ada31cb879cd7532f4a85b501f4255c747d4813ab76b35c49ed510ce4865b45"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0a6ceaddc830dd3ca86cb8451cf373d1f05215368e11834538c2902ed5205139"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a967681463aa7a99eb9a62bb18229b653b45c10ff0947b31cc0837a83dfb86f"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6472a73bc115bc40a2076609a90894775abe6faf19a78375675a2f889a613071"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d6aea92bcccfe5e5524d3c70a6f16ffdae548390ddad26f4207d55c55a40593"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e025f6351e49d48a5aa2f5a09293aa769b0ee7369c25bed551647234b7fa0c75"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:40bd7ebe4dbb37d27f0c56e2a844f360239343a99be422085e13e97da13f73f9"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dd40d586ad6f53764104df6e01810fe1b4e88fd353774629a5e6fe253813f79"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2aca15e9ad8c8657b5b3d7ae3d1724dc8c1c1059c06b4b674c3aa36305f4930"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450ec234736732eb0ebeffdb95a352450d4592f12c3e087e2a9183386d22c8bf"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f43be2bebbd09360a2f23af83b243dc25ffe7b583ea8c722e6df03e03a55f02f"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:867f55e54aff254940bcec5eec068e7c0ac1e6bf360ab91479394a8bf356b0e6"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b4dbc033c5ad46f8c429bf238c25a889b8c1d86bfe23a74e1031a991cb3f0000"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6e8dd2961462e337e21092ec2da0c69d814dcb1b6e892955a37444a425e9cfb8"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35391e72df6c14a09b697c7b94384947c1dd326aca883ff98ff137acdf586c33"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1c3d3c92fa54eda94ab369ca5b8d35059987c326ba5e55326eb068862f64b1fc"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7aa61a9cc4f0523373e31fc9255bf4567185a099f85ca3598e64de484da3ab2"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee53a8191271f144cc20b12c19daa9f1546adc84a2f33839e3338039b55c373c"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac60a980f07fa988983f7bfe6404ef3f1e4303f5288a01713bc1266df6d18783"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88896b1b4817d7b2fe1ec7205c4bbe07bf5d92fb249bf2d226ddea8761996068"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:18dfffe23751edee917764ffa133d5d3fef28dfd1cf3adebef8c90bc854c74c4"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6926dd14cfe6967d3322640b6d5c3c3039db71716a5e43cca6e3b474e73e0b36"}, + {file = "pyzmq-26.0.2.tar.gz", hash = "sha256:f0f9bb370449158359bb72a3e12c658327670c0ffe6fbcd1af083152b64f9df0"}, ] [package.dependencies] @@ -7032,28 +7086,28 @@ docs = ["furo (==2024.1.29)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx [[package]] name = "ruff" -version = "0.3.5" +version = "0.4.1" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.5-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:aef5bd3b89e657007e1be6b16553c8813b221ff6d92c7526b7e0227450981eac"}, - {file = "ruff-0.3.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:89b1e92b3bd9fca249153a97d23f29bed3992cff414b222fcd361d763fc53f12"}, - {file = "ruff-0.3.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e55771559c89272c3ebab23326dc23e7f813e492052391fe7950c1a5a139d89"}, - {file = "ruff-0.3.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dabc62195bf54b8a7876add6e789caae0268f34582333cda340497c886111c39"}, - {file = "ruff-0.3.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a05f3793ba25f194f395578579c546ca5d83e0195f992edc32e5907d142bfa3"}, - {file = "ruff-0.3.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:dfd3504e881082959b4160ab02f7a205f0fadc0a9619cc481982b6837b2fd4c0"}, - {file = "ruff-0.3.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87258e0d4b04046cf1d6cc1c56fadbf7a880cc3de1f7294938e923234cf9e498"}, - {file = "ruff-0.3.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:712e71283fc7d9f95047ed5f793bc019b0b0a29849b14664a60fd66c23b96da1"}, - {file = "ruff-0.3.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a532a90b4a18d3f722c124c513ffb5e5eaff0cc4f6d3aa4bda38e691b8600c9f"}, - {file = "ruff-0.3.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:122de171a147c76ada00f76df533b54676f6e321e61bd8656ae54be326c10296"}, - {file = "ruff-0.3.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d80a6b18a6c3b6ed25b71b05eba183f37d9bc8b16ace9e3d700997f00b74660b"}, - {file = "ruff-0.3.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a7b6e63194c68bca8e71f81de30cfa6f58ff70393cf45aab4c20f158227d5936"}, - {file = "ruff-0.3.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a759d33a20c72f2dfa54dae6e85e1225b8e302e8ac655773aff22e542a300985"}, - {file = "ruff-0.3.5-py3-none-win32.whl", hash = "sha256:9d8605aa990045517c911726d21293ef4baa64f87265896e491a05461cae078d"}, - {file = "ruff-0.3.5-py3-none-win_amd64.whl", hash = "sha256:dc56bb16a63c1303bd47563c60482a1512721053d93231cf7e9e1c6954395a0e"}, - {file = "ruff-0.3.5-py3-none-win_arm64.whl", hash = "sha256:faeeae9905446b975dcf6d4499dc93439b131f1443ee264055c5716dd947af55"}, - {file = "ruff-0.3.5.tar.gz", hash = "sha256:a067daaeb1dc2baf9b82a32dae67d154d95212080c80435eb052d95da647763d"}, + {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2d9ef6231e3fbdc0b8c72404a1a0c46fd0dcea84efca83beb4681c318ea6a953"}, + {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9485f54a7189e6f7433e0058cf8581bee45c31a25cd69009d2a040d1bd4bfaef"}, + {file = "ruff-0.4.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2921ac03ce1383e360e8a95442ffb0d757a6a7ddd9a5be68561a671e0e5807e"}, + {file = "ruff-0.4.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eec8d185fe193ad053eda3a6be23069e0c8ba8c5d20bc5ace6e3b9e37d246d3f"}, + {file = "ruff-0.4.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa27d9d72a94574d250f42b7640b3bd2edc4c58ac8ac2778a8c82374bb27984"}, + {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f1ee41580bff1a651339eb3337c20c12f4037f6110a36ae4a2d864c52e5ef954"}, + {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0926cefb57fc5fced629603fbd1a23d458b25418681d96823992ba975f050c2b"}, + {file = "ruff-0.4.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6e37f2e3cd74496a74af9a4fa67b547ab3ca137688c484749189bf3a686ceb"}, + {file = "ruff-0.4.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd703a5975ac1998c2cc5e9494e13b28f31e66c616b0a76e206de2562e0843c"}, + {file = "ruff-0.4.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b92f03b4aa9fa23e1799b40f15f8b95cdc418782a567d6c43def65e1bbb7f1cf"}, + {file = "ruff-0.4.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1c859f294f8633889e7d77de228b203eb0e9a03071b72b5989d89a0cf98ee262"}, + {file = "ruff-0.4.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b34510141e393519a47f2d7b8216fec747ea1f2c81e85f076e9f2910588d4b64"}, + {file = "ruff-0.4.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6e68d248ed688b9d69fd4d18737edcbb79c98b251bba5a2b031ce2470224bdf9"}, + {file = "ruff-0.4.1-py3-none-win32.whl", hash = "sha256:b90506f3d6d1f41f43f9b7b5ff845aeefabed6d2494307bc7b178360a8805252"}, + {file = "ruff-0.4.1-py3-none-win_amd64.whl", hash = "sha256:c7d391e5936af5c9e252743d767c564670dc3889aff460d35c518ee76e4b26d7"}, + {file = "ruff-0.4.1-py3-none-win_arm64.whl", hash = "sha256:a1eaf03d87e6a7cd5e661d36d8c6e874693cb9bc3049d110bc9a97b350680c43"}, + {file = "ruff-0.4.1.tar.gz", hash = "sha256:d592116cdbb65f8b1b7e2a2b48297eb865f6bdc20641879aa9d7b9c11d86db79"}, ] [[package]] @@ -7132,13 +7186,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.44.1" +version = "1.45.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.44.1.tar.gz", hash = "sha256:24e6a53eeabffd2f95d952aa35ca52f0f4201d17f820ac9d3ff7244c665aaf68"}, - {file = "sentry_sdk-1.44.1-py2.py3-none-any.whl", hash = "sha256:5f75eb91d8ab6037c754a87b8501cc581b2827e923682f593bed3539ce5b3999"}, + {file = "sentry-sdk-1.45.0.tar.gz", hash = "sha256:509aa9678c0512344ca886281766c2e538682f8acfa50fd8d405f8c417ad0625"}, + {file = "sentry_sdk-1.45.0-py2.py3-none-any.whl", hash = "sha256:1ce29e30240cc289a027011103a8c83885b15ef2f316a60bcc7c5300afa144f1"}, ] [package.dependencies] @@ -7279,72 +7333,72 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "69.2.0" +version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, - {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shapely" -version = "2.0.3" +version = "2.0.4" description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" files = [ - {file = "shapely-2.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:af7e9abe180b189431b0f490638281b43b84a33a960620e6b2e8d3e3458b61a1"}, - {file = "shapely-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98040462b36ced9671e266b95c326b97f41290d9d17504a1ee4dc313a7667b9c"}, - {file = "shapely-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:71eb736ef2843f23473c6e37f6180f90f0a35d740ab284321548edf4e55d9a52"}, - {file = "shapely-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:881eb9dbbb4a6419667e91fcb20313bfc1e67f53dbb392c6840ff04793571ed1"}, - {file = "shapely-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f10d2ccf0554fc0e39fad5886c839e47e207f99fdf09547bc687a2330efda35b"}, - {file = "shapely-2.0.3-cp310-cp310-win32.whl", hash = "sha256:6dfdc077a6fcaf74d3eab23a1ace5abc50c8bce56ac7747d25eab582c5a2990e"}, - {file = "shapely-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:64c5013dacd2d81b3bb12672098a0b2795c1bf8190cfc2980e380f5ef9d9e4d9"}, - {file = "shapely-2.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:56cee3e4e8159d6f2ce32e421445b8e23154fd02a0ac271d6a6c0b266a8e3cce"}, - {file = "shapely-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:619232c8276fded09527d2a9fd91a7885ff95c0ff9ecd5e3cb1e34fbb676e2ae"}, - {file = "shapely-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2a7d256db6f5b4b407dc0c98dd1b2fcf1c9c5814af9416e5498d0a2e4307a4b"}, - {file = "shapely-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45f0c8cd4583647db3216d965d49363e6548c300c23fd7e57ce17a03f824034"}, - {file = "shapely-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13cb37d3826972a82748a450328fe02a931dcaed10e69a4d83cc20ba021bc85f"}, - {file = "shapely-2.0.3-cp311-cp311-win32.whl", hash = "sha256:9302d7011e3e376d25acd30d2d9e70d315d93f03cc748784af19b00988fc30b1"}, - {file = "shapely-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6b464f2666b13902835f201f50e835f2f153f37741db88f68c7f3b932d3505fa"}, - {file = "shapely-2.0.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e86e7cb8e331a4850e0c2a8b2d66dc08d7a7b301b8d1d34a13060e3a5b4b3b55"}, - {file = "shapely-2.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c91981c99ade980fc49e41a544629751a0ccd769f39794ae913e53b07b2f78b9"}, - {file = "shapely-2.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd45d456983dc60a42c4db437496d3f08a4201fbf662b69779f535eb969660af"}, - {file = "shapely-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:882fb1ffc7577e88c1194f4f1757e277dc484ba096a3b94844319873d14b0f2d"}, - {file = "shapely-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9f2d93bff2ea52fa93245798cddb479766a18510ea9b93a4fb9755c79474889"}, - {file = "shapely-2.0.3-cp312-cp312-win32.whl", hash = "sha256:99abad1fd1303b35d991703432c9481e3242b7b3a393c186cfb02373bf604004"}, - {file = "shapely-2.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:6f555fe3304a1f40398977789bc4fe3c28a11173196df9ece1e15c5bc75a48db"}, - {file = "shapely-2.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983cc418c1fa160b7d797cfef0e0c9f8c6d5871e83eae2c5793fce6a837fad9"}, - {file = "shapely-2.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18bddb8c327f392189a8d5d6b9a858945722d0bb95ccbd6a077b8e8fc4c7890d"}, - {file = "shapely-2.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:442f4dcf1eb58c5a4e3428d88e988ae153f97ab69a9f24e07bf4af8038536325"}, - {file = "shapely-2.0.3-cp37-cp37m-win32.whl", hash = "sha256:31a40b6e3ab00a4fd3a1d44efb2482278642572b8e0451abdc8e0634b787173e"}, - {file = "shapely-2.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:59b16976c2473fec85ce65cc9239bef97d4205ab3acead4e6cdcc72aee535679"}, - {file = "shapely-2.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:705efbce1950a31a55b1daa9c6ae1c34f1296de71ca8427974ec2f27d57554e3"}, - {file = "shapely-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:601c5c0058a6192df704cb889439f64994708563f57f99574798721e9777a44b"}, - {file = "shapely-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f24ecbb90a45c962b3b60d8d9a387272ed50dc010bfe605f1d16dfc94772d8a1"}, - {file = "shapely-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8c2a2989222c6062f7a0656e16276c01bb308bc7e5d999e54bf4e294ce62e76"}, - {file = "shapely-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42bceb9bceb3710a774ce04908fda0f28b291323da2688f928b3f213373b5aee"}, - {file = "shapely-2.0.3-cp38-cp38-win32.whl", hash = "sha256:54d925c9a311e4d109ec25f6a54a8bd92cc03481a34ae1a6a92c1fe6729b7e01"}, - {file = "shapely-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:300d203b480a4589adefff4c4af0b13919cd6d760ba3cbb1e56275210f96f654"}, - {file = "shapely-2.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:083d026e97b6c1f4a9bd2a9171c7692461092ed5375218170d91705550eecfd5"}, - {file = "shapely-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:27b6e1910094d93e9627f2664121e0e35613262fc037051680a08270f6058daf"}, - {file = "shapely-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71b2de56a9e8c0e5920ae5ddb23b923490557ac50cb0b7fa752761bf4851acde"}, - {file = "shapely-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d279e56bbb68d218d63f3efc80c819cedcceef0e64efbf058a1df89dc57201b"}, - {file = "shapely-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88566d01a30f0453f7d038db46bc83ce125e38e47c5f6bfd4c9c287010e9bf74"}, - {file = "shapely-2.0.3-cp39-cp39-win32.whl", hash = "sha256:58afbba12c42c6ed44c4270bc0e22f3dadff5656d711b0ad335c315e02d04707"}, - {file = "shapely-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:5026b30433a70911979d390009261b8c4021ff87c7c3cbd825e62bb2ffa181bc"}, - {file = "shapely-2.0.3.tar.gz", hash = "sha256:4d65d0aa7910af71efa72fd6447e02a8e5dd44da81a983de9d736d6e6ccbe674"}, -] - -[package.dependencies] -numpy = ">=1.14,<2" + {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:011b77153906030b795791f2fdfa2d68f1a8d7e40bce78b029782ade3afe4f2f"}, + {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9831816a5d34d5170aa9ed32a64982c3d6f4332e7ecfe62dc97767e163cb0b17"}, + {file = "shapely-2.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5c4849916f71dc44e19ed370421518c0d86cf73b26e8656192fcfcda08218fbd"}, + {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841f93a0e31e4c64d62ea570d81c35de0f6cea224568b2430d832967536308e6"}, + {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b4431f522b277c79c34b65da128029a9955e4481462cbf7ebec23aab61fc58"}, + {file = "shapely-2.0.4-cp310-cp310-win32.whl", hash = "sha256:92a41d936f7d6743f343be265ace93b7c57f5b231e21b9605716f5a47c2879e7"}, + {file = "shapely-2.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:30982f79f21bb0ff7d7d4a4e531e3fcaa39b778584c2ce81a147f95be1cd58c9"}, + {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de0205cb21ad5ddaef607cda9a3191eadd1e7a62a756ea3a356369675230ac35"}, + {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d56ce3e2a6a556b59a288771cf9d091470116867e578bebced8bfc4147fbfd7"}, + {file = "shapely-2.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:58b0ecc505bbe49a99551eea3f2e8a9b3b24b3edd2a4de1ac0dc17bc75c9ec07"}, + {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:790a168a808bd00ee42786b8ba883307c0e3684ebb292e0e20009588c426da47"}, + {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4310b5494271e18580d61022c0857eb85d30510d88606fa3b8314790df7f367d"}, + {file = "shapely-2.0.4-cp311-cp311-win32.whl", hash = "sha256:63f3a80daf4f867bd80f5c97fbe03314348ac1b3b70fb1c0ad255a69e3749879"}, + {file = "shapely-2.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:c52ed79f683f721b69a10fb9e3d940a468203f5054927215586c5d49a072de8d"}, + {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5bbd974193e2cc274312da16b189b38f5f128410f3377721cadb76b1e8ca5328"}, + {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:41388321a73ba1a84edd90d86ecc8bfed55e6a1e51882eafb019f45895ec0f65"}, + {file = "shapely-2.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0776c92d584f72f1e584d2e43cfc5542c2f3dd19d53f70df0900fda643f4bae6"}, + {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c75c98380b1ede1cae9a252c6dc247e6279403fae38c77060a5e6186c95073ac"}, + {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3e700abf4a37b7b8b90532fa6ed5c38a9bfc777098bc9fbae5ec8e618ac8f30"}, + {file = "shapely-2.0.4-cp312-cp312-win32.whl", hash = "sha256:4f2ab0faf8188b9f99e6a273b24b97662194160cc8ca17cf9d1fb6f18d7fb93f"}, + {file = "shapely-2.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:03152442d311a5e85ac73b39680dd64a9892fa42bb08fd83b3bab4fe6999bfa0"}, + {file = "shapely-2.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:994c244e004bc3cfbea96257b883c90a86e8cbd76e069718eb4c6b222a56f78b"}, + {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05ffd6491e9e8958b742b0e2e7c346635033d0a5f1a0ea083547fcc854e5d5cf"}, + {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbdc1140a7d08faa748256438291394967aa54b40009f54e8d9825e75ef6113"}, + {file = "shapely-2.0.4-cp37-cp37m-win32.whl", hash = "sha256:5af4cd0d8cf2912bd95f33586600cac9c4b7c5053a036422b97cfe4728d2eb53"}, + {file = "shapely-2.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:464157509ce4efa5ff285c646a38b49f8c5ef8d4b340f722685b09bb033c5ccf"}, + {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:489c19152ec1f0e5c5e525356bcbf7e532f311bff630c9b6bc2db6f04da6a8b9"}, + {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b79bbd648664aa6f44ef018474ff958b6b296fed5c2d42db60078de3cffbc8aa"}, + {file = "shapely-2.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:674d7baf0015a6037d5758496d550fc1946f34bfc89c1bf247cabdc415d7747e"}, + {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cd4ccecc5ea5abd06deeaab52fcdba372f649728050c6143cc405ee0c166679"}, + {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5cdcbbe3080181498931b52a91a21a781a35dcb859da741c0345c6402bf00c"}, + {file = "shapely-2.0.4-cp38-cp38-win32.whl", hash = "sha256:55a38dcd1cee2f298d8c2ebc60fc7d39f3b4535684a1e9e2f39a80ae88b0cea7"}, + {file = "shapely-2.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec555c9d0db12d7fd777ba3f8b75044c73e576c720a851667432fabb7057da6c"}, + {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9103abd1678cb1b5f7e8e1af565a652e036844166c91ec031eeb25c5ca8af0"}, + {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:263bcf0c24d7a57c80991e64ab57cba7a3906e31d2e21b455f493d4aab534aaa"}, + {file = "shapely-2.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddf4a9bfaac643e62702ed662afc36f6abed2a88a21270e891038f9a19bc08fc"}, + {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:485246fcdb93336105c29a5cfbff8a226949db37b7473c89caa26c9bae52a242"}, + {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8de4578e838a9409b5b134a18ee820730e507b2d21700c14b71a2b0757396acc"}, + {file = "shapely-2.0.4-cp39-cp39-win32.whl", hash = "sha256:9dab4c98acfb5fb85f5a20548b5c0abe9b163ad3525ee28822ffecb5c40e724c"}, + {file = "shapely-2.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:31c19a668b5a1eadab82ff070b5a260478ac6ddad3a5b62295095174a8d26398"}, + {file = "shapely-2.0.4.tar.gz", hash = "sha256:5dc736127fac70009b8d309a0eeb74f3e08979e530cf7017f2f507ef62e6cfb8"}, +] + +[package.dependencies] +numpy = ">=1.14,<3" [package.extras] docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] @@ -7421,20 +7475,20 @@ numpy = ["NumPy"] [[package]] name = "sphinx" -version = "7.2.6" +version = "7.3.7" description = "Python documentation generator" optional = false python-versions = ">=3.9" files = [ - {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, - {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, + {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, + {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, ] [package.dependencies] -alabaster = ">=0.7,<0.8" +alabaster = ">=0.7.14,<0.8.0" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.21" +docutils = ">=0.18.1,<0.22" imagesize = ">=1.3" Jinja2 = ">=3.0" packaging = ">=21.0" @@ -7450,8 +7504,8 @@ sphinxcontrib-serializinghtml = ">=1.1.9" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] -test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools (>=67.0)"] +lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] [[package]] name = "sphinx-rtd-theme" @@ -7765,13 +7819,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.25.1" +version = "20.25.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, - {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, + {file = "virtualenv-20.25.3-py3-none-any.whl", hash = "sha256:8aac4332f2ea6ef519c648d0bc48a5b1d324994753519919bddbb1aff25a104e"}, + {file = "virtualenv-20.25.3.tar.gz", hash = "sha256:7bb554bbdfeaacc3349fa614ea5bff6ac300fc7c335e9facf3a3bcfc703f45be"}, ] [package.dependencies] @@ -7780,7 +7834,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] From fdc53e4471c7a8f9299b9e3c771a0cc94911b97b Mon Sep 17 00:00:00 2001 From: commaci-public <60409688+commaci-public@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:42:31 -0700 Subject: [PATCH 327/384] [bot] Bump submodules (#32275) bump submodules Co-authored-by: jnewb1 <9648890+jnewb1@users.noreply.github.com> --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index edcd0fe4d4..4d60ae9c62 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit edcd0fe4d41be59b7a5f046e68fee93e6898357f +Subproject commit 4d60ae9c6202be1b277a03cbb670c7f2639ad7cd From fc318f454a76e7e02f0e2fff88a5c75df3132d1c Mon Sep 17 00:00:00 2001 From: Andrew Goodbody Date: Mon, 22 Apr 2024 16:43:26 +0100 Subject: [PATCH 328/384] Update action that pulls in deprecated version of Node.js (#32273) * Update action that pulls in deprecated version of Node.js Missed an action that still pulls in a deprecated version of Node.js, so correct that now. * Fix another action that pulls in deprecated Node.js Found another action that needs updating --- .github/workflows/prebuilt.yaml | 2 +- .github/workflows/release.yaml | 2 +- .github/workflows/stale.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/prebuilt.yaml b/.github/workflows/prebuilt.yaml index 990be73f72..3fdf6db202 100644 --- a/.github/workflows/prebuilt.yaml +++ b/.github/workflows/prebuilt.yaml @@ -22,7 +22,7 @@ jobs: steps: - name: Wait for green check mark if: ${{ github.event_name != 'workflow_dispatch' }} - uses: lewagon/wait-on-check-action@595dabb3acf442d47e29c9ec9ba44db0c6bdd18f + uses: lewagon/wait-on-check-action@ccfb013c15c8afb7bf2b7c028fb74dc5a068cccc with: ref: master wait-interval: 30 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3e3fe46e7a..346c3e85ef 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -24,7 +24,7 @@ jobs: sudo apt-get install -y libyaml-dev - name: Wait for green check mark if: ${{ github.event_name != 'workflow_dispatch' }} - uses: lewagon/wait-on-check-action@595dabb3acf442d47e29c9ec9ba44db0c6bdd18f + uses: lewagon/wait-on-check-action@ccfb013c15c8afb7bf2b7c028fb74dc5a068cccc with: ref: master wait-interval: 30 diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 46649a9d5f..b33945cae2 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -12,7 +12,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: exempt-milestones: true From eb79fd552a963ce675d3eaec88ad7d00f447fd14 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 22 Apr 2024 12:22:37 -0700 Subject: [PATCH 329/384] [bot] Fingerprints: add missing FW versions from new users (#32270) * Export fingerprints * update --- docs/CARS.md | 4 ++-- selfdrive/car/hyundai/fingerprints.py | 2 ++ selfdrive/car/hyundai/values.py | 4 ++-- selfdrive/car/toyota/fingerprints.py | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index c785e6d701..3decabb591 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -45,8 +45,8 @@ A supported vehicle is one that just works when you install a comma device. All |Ford|Maverick 2023-24|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Maverick Hybrid 2022|LARIAT Luxury|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Maverick Hybrid 2023-24|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G70 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G70 2020-21|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G70 2018|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G70 2019-21|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G70 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 92e47524fc..ffd2e2e3fd 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -486,6 +486,7 @@ FW_VERSIONS = { }, CAR.GENESIS_G70_2020: { (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00IK MDPS R 1.00 1.06 57700-G9220 4I2VL106', b'\xf1\x00IK MDPS R 1.00 1.07 57700-G9220 4I2VL107', b'\xf1\x00IK MDPS R 1.00 1.07 57700-G9420 4I4VL107', b'\xf1\x00IK MDPS R 1.00 1.08 57700-G9200 4I2CL108', @@ -493,6 +494,7 @@ FW_VERSIONS = { b'\xf1\x00IK MDPS R 1.00 5.09 57700-G9520 4I4VL509', ], (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00IK__ SCC F-CUP 1.00 1.01 96400-G9100 ', b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 ', b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 \xf1\xa01.02', b'\xf1\x00IK__ SCC FHCUP 1.00 1.00 99110-G9300 ', diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 3339fd8009..2456e4aa6e 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -503,14 +503,14 @@ class CAR(Platforms): flags=HyundaiFlags.EV, ) GENESIS_G70 = HyundaiPlatformConfig( - [HyundaiCarDocs("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], + [HyundaiCarDocs("Genesis G70 2018", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56), flags=HyundaiFlags.LEGACY, ) GENESIS_G70_2020 = HyundaiPlatformConfig( [ # TODO: 2021 MY harness is unknown - HyundaiCarDocs("Genesis G70 2020-21", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + HyundaiCarDocs("Genesis G70 2019-21", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), # TODO: From 3.3T Sport Advanced 2022 & Prestige 2023 Trim, 2.0T is unknown HyundaiCarDocs("Genesis G70 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), ], diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 6830f9ccec..7719649a46 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1293,6 +1293,7 @@ FW_VERSIONS = { b'881513309400\x00\x00\x00\x00', b'881513309500\x00\x00\x00\x00', b'881513310400\x00\x00\x00\x00', + b'881513310500\x00\x00\x00\x00', ], (Ecu.eps, 0x7a1, None): [ b'8965B33502\x00\x00\x00\x00\x00\x00', From 20c6cbc1d2c20b631a6133a10e447bba7406bba6 Mon Sep 17 00:00:00 2001 From: Eric Brown Date: Mon, 22 Apr 2024 13:22:48 -0600 Subject: [PATCH 330/384] Remove ASCM harness footnote from car docs (#32271) * Remove ASCM harness footnote from car docs * Re-add Footnote class * fix --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 211 ++++++++++++++++++------------------- selfdrive/car/gm/values.py | 11 +- 2 files changed, 106 insertions(+), 116 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 3decabb591..6cf224d135 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -11,12 +11,12 @@ A supported vehicle is one that just works when you install a comma device. All |Acura|ILX 2016-19|AcuraWatch Plus|openpilot|25 mph|25 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Acura|RDX 2016-18|AcuraWatch Plus|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Acura|RDX 2019-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Audi|A3 2014-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Audi|A3 Sportback e-tron 2017-18|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Audi|Q2 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Audi|Q3 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Audi|RS3 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Audi|S3 2015-17|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|A3 2014-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|A3 Sportback e-tron 2017-18|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|Q2 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|Q3 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|RS3 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|S3 2015-17|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Bolt EUV 2022-23|Premier or Premier Redline Trim without Super Cruise Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Bolt EV 2022-23|2LT Trim with Adaptive Cruise Control Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Equinox 2019-22|Adaptive Cruise Control (ACC)|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -51,16 +51,16 @@ A supported vehicle is one that just works when you install a comma device. All |Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G80 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Genesis|G90 2017-20|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV60 (Advanced Trim) 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV60 (Performance Trim) 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV70 (2.5T Trim) 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV70 (3.5T Trim) 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV80 2023[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV60 (Advanced Trim) 2023[5](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV60 (Performance Trim) 2023[5](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV70 (2.5T Trim) 2022-23[5](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV70 (3.5T Trim) 2022-23[5](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV80 2023[5](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |GMC|Sierra 1500 2020-21|Driver Alert Package II|openpilot available[1](#footnotes)|0 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Accord 2018-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Accord Hybrid 2018-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Civic 2016-18|Honda Sensing|openpilot|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Civic 2019-21|All|openpilot available[1](#footnotes)|0 mph|2 mph[5](#footnotes)|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Civic 2019-21|All|openpilot available[1](#footnotes)|0 mph|2 mph[4](#footnotes)|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Civic 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch B connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Civic Hatchback 2017-21|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Honda|Civic Hatchback 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch B connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -89,10 +89,10 @@ A supported vehicle is one that just works when you install a comma device. All |Hyundai|Elantra Hybrid 2021-23|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Genesis 2015-16|Smart Cruise Control (SCC)|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|i30 2017-19|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq 5 (Southeast Asia only) 2022-23[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai Q connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq 5 (with HDA II) 2022-23[6](#footnotes)|Highway Driving Assist II|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai Q connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq 5 (without HDA II) 2022-23[6](#footnotes)|Highway Driving Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq 6 (with HDA II) 2023[6](#footnotes)|Highway Driving Assist II|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq 5 (Southeast Asia only) 2022-23[5](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai Q connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq 5 (with HDA II) 2022-23[5](#footnotes)|Highway Driving Assist II|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai Q connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq 5 (without HDA II) 2022-23[5](#footnotes)|Highway Driving Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq 6 (with HDA II) 2023[5](#footnotes)|Highway Driving Assist II|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Ioniq Electric 2019|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Ioniq Electric 2020|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Ioniq Hybrid 2017-19|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -102,10 +102,10 @@ A supported vehicle is one that just works when you install a comma device. All |Hyundai|Kona 2020|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai B connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Kona Electric 2018-21|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai G connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Kona Electric 2022-23|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai O connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Kona Electric (with HDA II, Korea only) 2023[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai R connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Kona Electric (with HDA II, Korea only) 2023[5](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai R connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Kona Hybrid 2020|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai I connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Palisade 2020-22|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Santa Cruz 2022-24[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Santa Cruz 2022-24[5](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Santa Fe 2019-20|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Santa Fe 2021-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Santa Fe Hybrid 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -113,35 +113,35 @@ A supported vehicle is one that just works when you install a comma device. All |Hyundai|Sonata 2018-19|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Sonata 2020-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Sonata Hybrid 2020-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Staria 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Staria 2023[5](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Tucson 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Tucson 2022[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Tucson 2023-24[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Tucson 2022[5](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Tucson 2023-24[5](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Tucson Diesel 2019|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Tucson Hybrid 2022-24[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Tucson Hybrid 2022-24[5](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Hyundai|Veloster 2019-20|Smart Cruise Control (SCC)|Stock|5 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Jeep|Grand Cherokee 2016-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Jeep|Grand Cherokee 2019-21|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Carnival 2022-24[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Carnival (China only) 2023[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Carnival 2022-24[5](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Carnival (China only) 2023[5](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Ceed 2019|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|EV6 (Southeast Asia only) 2022-23[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|EV6 (with HDA II) 2022-23[6](#footnotes)|Highway Driving Assist II|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|EV6 (without HDA II) 2022-23[6](#footnotes)|Highway Driving Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|EV6 (Southeast Asia only) 2022-23[5](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|EV6 (with HDA II) 2022-23[5](#footnotes)|Highway Driving Assist II|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|EV6 (without HDA II) 2022-23[5](#footnotes)|Highway Driving Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Forte 2019-21|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai G connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Forte 2023|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|K5 2021-24|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|K5 Hybrid 2020-22|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|K8 Hybrid (with HDA II) 2023[6](#footnotes)|Highway Driving Assist II|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai Q connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|K8 Hybrid (with HDA II) 2023[5](#footnotes)|Highway Driving Assist II|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai Q connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro EV 2019|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro EV 2020|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro EV 2021|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro EV 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro EV 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro EV 2023[5](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Hybrid 2018|All|Stock|10 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Hybrid 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Hybrid 2022|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro Hybrid 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Hybrid 2023[5](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Plug-in Hybrid 2018-19|All|Stock|10 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Plug-in Hybrid 2020|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Plug-in Hybrid 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -152,11 +152,11 @@ A supported vehicle is one that just works when you install a comma device. All |Kia|Seltos 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Sorento 2018|Advanced Smart Cruise Control & LKAS|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Sorento 2019|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sorento 2021-23[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sorento Hybrid 2021-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sorento Plug-in Hybrid 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sportage 2023-24[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sportage Hybrid 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sorento 2021-23[5](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sorento Hybrid 2021-23[5](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sorento Plug-in Hybrid 2022-23[5](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sportage 2023-24[5](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sportage Hybrid 2023[5](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Stinger 2018-20|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Stinger 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Telluride 2020-22|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -183,8 +183,8 @@ A supported vehicle is one that just works when you install a comma device. All |Lexus|UX Hybrid 2019-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Lincoln|Aviator 2020-23|Co-Pilot360 Plus|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Lincoln|Aviator Plug-in Hybrid 2020-23|Co-Pilot360 Plus|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|MAN|eTGE 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|MAN|TGE 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|MAN|eTGE 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|MAN|TGE 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Mazda|CX-5 2022-24|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Mazda connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Mazda|CX-9 2021-23|All|Stock|0 mph|28 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Mazda connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Nissan|Altima 2019-20|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Nissan B connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -192,27 +192,27 @@ A supported vehicle is one that just works when you install a comma device. All |Nissan|Rogue 2018-20|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Nissan A connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Nissan|X-Trail 2017|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Nissan A connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ram|1500 2019-24|Adaptive Cruise Control (ACC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Ram connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|SEAT|Ateca 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|SEAT|Leon 2014-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|Ascent 2019-21|All[7](#footnotes)|openpilot available[1,8](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Subaru|Crosstrek 2018-19|EyeSight Driver Assistance[7](#footnotes)|openpilot available[1,8](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Subaru|Crosstrek 2020-23|EyeSight Driver Assistance[7](#footnotes)|openpilot available[1,8](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Subaru|Forester 2019-21|All[7](#footnotes)|openpilot available[1,8](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Subaru|Impreza 2017-19|EyeSight Driver Assistance[7](#footnotes)|openpilot available[1,8](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Subaru|Impreza 2020-22|EyeSight Driver Assistance[7](#footnotes)|openpilot available[1,8](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Subaru|Legacy 2020-22|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru B connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Subaru|Outback 2020-22|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru B connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Subaru|XV 2018-19|EyeSight Driver Assistance[7](#footnotes)|openpilot available[1,8](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Subaru|XV 2020-21|EyeSight Driver Assistance[7](#footnotes)|openpilot available[1,8](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| -|Škoda|Fabia 2022-23[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| -|Škoda|Kamiq 2021-23[10,12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| -|Škoda|Karoq 2019-23[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Kodiaq 2017-23[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Octavia 2015-19[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Octavia RS 2016[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Octavia Scout 2017-19[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Scala 2020-23[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| -|Škoda|Superb 2015-22[12](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|SEAT|Ateca 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|SEAT|Leon 2014-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Subaru|Ascent 2019-21|All[6](#footnotes)|openpilot available[1,7](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Crosstrek 2018-19|EyeSight Driver Assistance[6](#footnotes)|openpilot available[1,7](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Crosstrek 2020-23|EyeSight Driver Assistance[6](#footnotes)|openpilot available[1,7](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Forester 2019-21|All[6](#footnotes)|openpilot available[1,7](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Impreza 2017-19|EyeSight Driver Assistance[6](#footnotes)|openpilot available[1,7](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Impreza 2020-22|EyeSight Driver Assistance[6](#footnotes)|openpilot available[1,7](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Legacy 2020-22|All[6](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru B connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Outback 2020-22|All[6](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru B connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|XV 2018-19|EyeSight Driver Assistance[6](#footnotes)|openpilot available[1,7](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|XV 2020-21|EyeSight Driver Assistance[6](#footnotes)|openpilot available[1,7](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Škoda|Fabia 2022-23[11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Škoda|Kamiq 2021-23[9,11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Škoda|Karoq 2019-23[11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Kodiaq 2017-23[11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Octavia 2015-19[11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Octavia RS 2016[11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Octavia Scout 2017-19[11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Scala 2020-23[11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Škoda|Superb 2015-22[11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Alphard 2019-20|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Alphard Hybrid 2021|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Avalon 2016|Toyota Safety Sense P|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -225,8 +225,8 @@ A supported vehicle is one that just works when you install a comma device. All |Toyota|C-HR 2021|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|C-HR Hybrid 2017-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|C-HR Hybrid 2021-22|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Camry 2018-20|All|Stock|0 mph[9](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Camry 2021-24|All|openpilot|0 mph[9](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Camry 2018-20|All|Stock|0 mph[8](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Camry 2021-24|All|openpilot|0 mph[8](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Camry Hybrid 2018-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Camry Hybrid 2021-24|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Corolla 2017-19|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -258,57 +258,56 @@ A supported vehicle is one that just works when you install a comma device. All |Toyota|RAV4 Hybrid 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 Hybrid 2023-24|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Sienna 2018-20|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Arteon 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Arteon eHybrid 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Arteon R 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Atlas 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Atlas Cross Sport 2020-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|California 2021-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Caravelle 2020|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|CC 2018-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Crafter 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|e-Crafter 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|e-Golf 2014-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf 2015-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf Alltrack 2015-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf GTD 2015-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf GTE 2015-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf GTI 2015-21|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf R 2015-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf SportsVan 2015-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Grand California 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Jetta 2018-24|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Jetta GLI 2021-24|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Passat 2015-22[11](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Passat Alltrack 2015-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Passat GTE 2015-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Polo 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| -|Volkswagen|Polo GTI 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| -|Volkswagen|T-Cross 2021|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[14](#footnotes)|| -|Volkswagen|T-Roc 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Taos 2022-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Teramont 2018-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Teramont Cross Sport 2021-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Teramont X 2021-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Tiguan 2018-24|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Tiguan eHybrid 2021-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Touran 2016-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Arteon 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Arteon eHybrid 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Arteon R 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Atlas 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Atlas Cross Sport 2020-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|California 2021-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Caravelle 2020|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|CC 2018-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Crafter 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|e-Crafter 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|e-Golf 2014-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf 2015-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf Alltrack 2015-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf GTD 2015-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf GTE 2015-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf GTI 2015-21|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf R 2015-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf SportsVan 2015-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Grand California 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Jetta 2018-24|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Jetta GLI 2021-24|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Passat 2015-22[10](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Passat Alltrack 2015-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Passat GTE 2015-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Polo 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Volkswagen|Polo GTI 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Volkswagen|T-Cross 2021|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Volkswagen|T-Roc 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Taos 2022-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Teramont 2018-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Teramont Cross Sport 2021-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Teramont X 2021-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Tiguan 2018-24|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Tiguan eHybrid 2021-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Touran 2016-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| ### Footnotes 1openpilot Longitudinal Control (Alpha) is available behind a toggle; the toggle is only available in non-release branches such as `devel` or `master-ci`.
2By default, this car will use the stock Adaptive Cruise Control (ACC) for longitudinal control. If the Driver Support Unit (DSU) is disconnected, openpilot ACC will replace stock ACC. NOTE: disconnecting the DSU disables Automatic Emergency Braking (AEB).
3Refers only to the Focus Mk4 (C519) available in Europe/China/Taiwan/Australasia, not the Focus Mk3 (C346) in North and South America/Southeast Asia.
-4Requires a community built ASCM harness. NOTE: disconnecting the ASCM disables Automatic Emergency Braking (AEB).
-52019 Honda Civic 1.6L Diesel Sedan does not have ALC below 12mph.
-6Requires a CAN FD panda kit if not using comma 3X for this CAN FD car.
-7In the non-US market, openpilot requires the car to come equipped with EyeSight with Lane Keep Assistance.
-8Enabling longitudinal control (alpha) will disable all EyeSight functionality, including AEB, LDW, and RAB.
-9openpilot operates above 28mph for Camry 4CYL L, 4CYL LE and 4CYL SE which don't have Full-Speed Range Dynamic Radar Cruise Control.
-10Not including the China market Kamiq, which is based on the (currently) unsupported PQ34 platform.
-11Refers only to the MQB-based European B8 Passat, not the NMS Passat in the USA/China/Mideast markets.
-12Some Škoda vehicles are equipped with heated windshields, which are known to block GPS signal needed for some comma 3X functionality.
-13Only available for vehicles using a gateway (J533) harness. At this time, vehicles using a camera harness are limited to using stock ACC.
-14Model-years 2022 and beyond may have a combined CAN gateway and BCM, which is supported by openpilot in software, but doesn't yet have a harness available from the comma store.
+42019 Honda Civic 1.6L Diesel Sedan does not have ALC below 12mph.
+5Requires a CAN FD panda kit if not using comma 3X for this CAN FD car.
+6In the non-US market, openpilot requires the car to come equipped with EyeSight with Lane Keep Assistance.
+7Enabling longitudinal control (alpha) will disable all EyeSight functionality, including AEB, LDW, and RAB.
+8openpilot operates above 28mph for Camry 4CYL L, 4CYL LE and 4CYL SE which don't have Full-Speed Range Dynamic Radar Cruise Control.
+9Not including the China market Kamiq, which is based on the (currently) unsupported PQ34 platform.
+10Refers only to the MQB-based European B8 Passat, not the NMS Passat in the USA/China/Mideast markets.
+11Some Škoda vehicles are equipped with heated windshields, which are known to block GPS signal needed for some comma 3X functionality.
+12Only available for vehicles using a gateway (J533) harness. At this time, vehicles using a camera harness are limited to using stock ACC.
+13Model-years 2022 and beyond may have a combined CAN gateway and BCM, which is supported by openpilot in software, but doesn't yet have a harness available from the comma store.
## Community Maintained Cars Although they're not upstream, the community has openpilot running on other makes and models. See the 'Community Supported Models' section of each make [on our wiki](https://wiki.comma.ai/). diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 17f9121092..53a4621d27 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -1,9 +1,8 @@ from dataclasses import dataclass, field -from enum import Enum from cereal import car from openpilot.selfdrive.car import dbc_dict, PlatformConfig, DbcDict, Platforms, CarSpecs -from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column +from openpilot.selfdrive.car.docs_definitions import CarHarness, CarDocs, CarParts from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries Ecu = car.CarParams.Ecu @@ -60,13 +59,6 @@ class CarControllerParams: self.BRAKE_LOOKUP_V = [self.MAX_BRAKE, 0.] -class Footnote(Enum): - OBD_II = CarFootnote( - 'Requires a community built ASCM harness. ' + - 'NOTE: disconnecting the ASCM disables Automatic Emergency Braking (AEB).', - Column.MODEL) - - @dataclass class GMCarDocs(CarDocs): package: str = "Adaptive Cruise Control (ACC)" @@ -76,7 +68,6 @@ class GMCarDocs(CarDocs): self.car_parts = CarParts.common([CarHarness.gm]) else: self.car_parts = CarParts.common([CarHarness.obd_ii]) - self.footnotes.append(Footnote.OBD_II) @dataclass(frozen=True, kw_only=True) From 618d73efd0bc282c2546776b47e7656af22efc69 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 23 Apr 2024 04:22:53 +0800 Subject: [PATCH 331/384] replay: use nanosleep on MacOS (#32263) * use nanosleep on MacOS * Update tools/replay/util.cc Co-authored-by: Willem Melching --------- Co-authored-by: Willem Melching --- tools/replay/util.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tools/replay/util.cc b/tools/replay/util.cc index f95e1e75b1..3ecd4297fd 100644 --- a/tools/replay/util.cc +++ b/tools/replay/util.cc @@ -318,6 +318,23 @@ std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic } void precise_nano_sleep(int64_t nanoseconds) { +#ifdef __APPLE__ + const long estimate_ns = 1 * 1e6; // 1ms + struct timespec req = {.tv_nsec = estimate_ns}; + uint64_t start_sleep = nanos_since_boot(); + while (nanoseconds > estimate_ns) { + nanosleep(&req, nullptr); + uint64_t end_sleep = nanos_since_boot(); + nanoseconds -= (end_sleep - start_sleep); + start_sleep = end_sleep; + } + // spin wait + if (nanoseconds > 0) { + while ((nanos_since_boot() - start_sleep) <= nanoseconds) { + std::this_thread::yield(); + } + } +#else struct timespec req, rem; req.tv_sec = nanoseconds / 1e9; @@ -326,6 +343,7 @@ void precise_nano_sleep(int64_t nanoseconds) { // Retry sleep if interrupted by a signal req = rem; } +#endif } std::string sha256(const std::string &str) { From 124e081fe16c85cc836b7291adbc9bfdcf3da932 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 22 Apr 2024 15:19:12 -0700 Subject: [PATCH 332/384] VW: add missing WMI for EU Atlas (#32280) * test * test is gonna be super platform specific * need the radar to fuzzy fingerprint --- selfdrive/car/volkswagen/fingerprints.py | 1 + selfdrive/car/volkswagen/values.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 285eb0c7d5..5d7f4d5e26 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -100,6 +100,7 @@ FW_VERSIONS = { b'\xf1\x875Q0907572H \xf1\x890620', b'\xf1\x875Q0907572J \xf1\x890654', b'\xf1\x875Q0907572P \xf1\x890682', + b'\xf1\x875Q0907572S \xf1\x890780', ], }, CAR.VOLKSWAGEN_CADDY_MK3: { diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 3c5d60a16b..59ffe12345 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -224,7 +224,7 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=2011, wheelbase=2.98), chassis_codes={"CA"}, - wmis={WMI.VOLKSWAGEN_USA_SUV}, + wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_SUV}, ) VOLKSWAGEN_CADDY_MK3 = VolkswagenPQPlatformConfig( [ From 6dcaeae3698b07e5bc28272a359d5381451439de Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 22 Apr 2024 18:20:14 -0700 Subject: [PATCH 333/384] VW: Add 3C chassis code for Passat (#32279) * Add 3C for Passat in Australia * add radar needed to fuzzy VIN match for b9783084b8aa0083 --- selfdrive/car/volkswagen/fingerprints.py | 1 + selfdrive/car/volkswagen/values.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 5d7f4d5e26..def5ce6e03 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -458,6 +458,7 @@ FW_VERSIONS = { b'\xf1\x873Q0907572C \xf1\x890196', b'\xf1\x875Q0907572P \xf1\x890682', b'\xf1\x875Q0907572R \xf1\x890771', + b'\xf1\x875Q0907572S \xf1\x890780', ], }, CAR.VOLKSWAGEN_PASSAT_NMS: { diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 59ffe12345..a0d38d1b57 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -278,7 +278,7 @@ class CAR(Platforms): VWCarDocs("Volkswagen Passat GTE 2015-22"), ], VolkswagenCarSpecs(mass=1551, wheelbase=2.79), - chassis_codes={"3G"}, + chassis_codes={"3C", "3G"}, wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, ) VOLKSWAGEN_PASSAT_NMS = VolkswagenPQPlatformConfig( From 7f916f2e9d7cb162524f57962e64b2939e1055f0 Mon Sep 17 00:00:00 2001 From: Eric Brown Date: Mon, 22 Apr 2024 19:21:51 -0600 Subject: [PATCH 334/384] Add missing fingerprint migration for Escalade ESV (#32282) Add fingerprint migration for CADILLAC ESCALADE ESV PLATINUM 2019 --- selfdrive/car/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/fingerprints.py b/selfdrive/car/fingerprints.py index 9be6dc8de6..1128a31c29 100644 --- a/selfdrive/car/fingerprints.py +++ b/selfdrive/car/fingerprints.py @@ -126,6 +126,7 @@ MIGRATION = { "HYUNDAI TUCSON HYBRID 4TH GEN": HYUNDAI.HYUNDAI_TUCSON_4TH_GEN, "KIA SPORTAGE HYBRID 5TH GEN": HYUNDAI.KIA_SPORTAGE_5TH_GEN, "KIA SORENTO PLUG-IN HYBRID 4TH GEN": HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, + "CADILLAC ESCALADE ESV PLATINUM 2019": GM.CADILLAC_ESCALADE_ESV_2019, # Removal of platform_str, see https://github.com/commaai/openpilot/pull/31868/ "COMMA BODY": BODY.COMMA_BODY, From bbd1648f0561b7b3270a2bc7b416841ac10fd9db Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 23 Apr 2024 10:21:42 +0800 Subject: [PATCH 335/384] replay: optimize memory usage with `MonotonicBuffer` (#32278) Optimize Memory Usage with MonotonicBuffe --- tools/cabana/streams/abstractstream.h | 1 + tools/cabana/utils/util.cc | 23 ---------------------- tools/cabana/utils/util.h | 16 --------------- tools/replay/logreader.cc | 28 +++++++++++++++++---------- tools/replay/logreader.h | 4 ++++ tools/replay/replay.cc | 7 ++++++- tools/replay/replay.h | 1 + tools/replay/route.cc | 5 +++-- tools/replay/route.h | 4 +++- tools/replay/util.cc | 24 +++++++++++++++++++++++ tools/replay/util.h | 16 +++++++++++++++ 11 files changed, 76 insertions(+), 53 deletions(-) diff --git a/tools/cabana/streams/abstractstream.h b/tools/cabana/streams/abstractstream.h index 10ffcb184a..18c00cb8b6 100644 --- a/tools/cabana/streams/abstractstream.h +++ b/tools/cabana/streams/abstractstream.h @@ -13,6 +13,7 @@ #include "cereal/messaging/messaging.h" #include "tools/cabana/dbc/dbcmanager.h" #include "tools/cabana/utils/util.h" +#include "tools/replay/util.h" struct CanData { void compute(const MessageId &msg_id, const uint8_t *dat, const int size, double current_sec, diff --git a/tools/cabana/utils/util.cc b/tools/cabana/utils/util.cc index a5f6cf0f5e..f85ea6d105 100644 --- a/tools/cabana/utils/util.cc +++ b/tools/cabana/utils/util.cc @@ -263,26 +263,3 @@ QString signalToolTip(const cabana::Signal *sig) { )").arg(sig->name).arg(sig->start_bit).arg(sig->size).arg(sig->msb).arg(sig->lsb) .arg(sig->is_little_endian ? "Y" : "N").arg(sig->is_signed ? "Y" : "N"); } - -// MonotonicBuffer - -void *MonotonicBuffer::allocate(size_t bytes, size_t alignment) { - assert(bytes > 0); - void *p = std::align(alignment, bytes, current_buf, available); - if (p == nullptr) { - available = next_buffer_size = std::max(next_buffer_size, bytes); - current_buf = buffers.emplace_back(std::aligned_alloc(alignment, next_buffer_size)); - next_buffer_size *= growth_factor; - p = current_buf; - } - - current_buf = (char *)current_buf + bytes; - available -= bytes; - return p; -} - -MonotonicBuffer::~MonotonicBuffer() { - for (auto buf : buffers) { - free(buf); - } -} diff --git a/tools/cabana/utils/util.h b/tools/cabana/utils/util.h index 158321f784..218b8eeb51 100644 --- a/tools/cabana/utils/util.h +++ b/tools/cabana/utils/util.h @@ -2,7 +2,6 @@ #include #include -#include #include #include @@ -160,20 +159,5 @@ private: QSocketNotifier *sn; }; -class MonotonicBuffer { -public: - MonotonicBuffer(size_t initial_size) : next_buffer_size(initial_size) {} - ~MonotonicBuffer(); - void *allocate(size_t bytes, size_t alignment = 16ul); - void deallocate(void *p) {} - -private: - void *current_buf = nullptr; - size_t next_buffer_size = 0; - size_t available = 0; - std::deque buffers; - static constexpr float growth_factor = 1.5; -}; - int num_decimals(double num); QString signalToolTip(const cabana::Signal *sig); diff --git a/tools/replay/logreader.cc b/tools/replay/logreader.cc index f52ef4a4eb..0f1638145f 100644 --- a/tools/replay/logreader.cc +++ b/tools/replay/logreader.cc @@ -1,18 +1,19 @@ #include "tools/replay/logreader.h" #include +#include #include "tools/replay/filereader.h" #include "tools/replay/util.h" bool LogReader::load(const std::string &url, std::atomic *abort, bool local_cache, int chunk_size, int retries) { - raw_ = FileReader(local_cache, chunk_size, retries).read(url, abort); - if (raw_.empty()) return false; + std::string data = FileReader(local_cache, chunk_size, retries).read(url, abort); + if (!data.empty() && url.find(".bz2") != std::string::npos) + data = decompressBZ2(data, abort); - if (url.find(".bz2") != std::string::npos) { - raw_ = decompressBZ2(raw_, abort); - if (raw_.empty()) return false; - } - return load(raw_.data(), raw_.size(), abort); + bool success = !data.empty() && load(data.data(), data.size(), abort); + if (filters_.empty()) + raw_ = std::move(data); + return success; } bool LogReader::load(const char *data, size_t size, std::atomic *abort) { @@ -23,9 +24,18 @@ bool LogReader::load(const char *data, size_t size, std::atomic *abort) { capnp::FlatArrayMessageReader reader(words); auto event = reader.getRoot(); auto which = event.which(); - uint64_t mono_time = event.getLogMonoTime(); auto event_data = kj::arrayPtr(words.begin(), reader.getEnd()); + words = kj::arrayPtr(reader.getEnd(), words.end()); + + if (!filters_.empty()) { + if (which >= filters_.size() || !filters_[which]) + continue; + auto buf = buffer_.allocate(event_data.size() * sizeof(capnp::word)); + memcpy(buf, event_data.begin(), event_data.size() * sizeof(capnp::word)); + event_data = kj::arrayPtr((const capnp::word *)buf, event_data.size()); + } + uint64_t mono_time = event.getLogMonoTime(); const Event &evt = events.emplace_back(which, mono_time, event_data); // Add encodeIdx packet again as a frame packet for the video stream if (evt.which == cereal::Event::ROAD_ENCODE_IDX || @@ -37,8 +47,6 @@ bool LogReader::load(const char *data, size_t size, std::atomic *abort) { } events.emplace_back(which, mono_time, event_data, idx.getSegmentNum()); } - - words = kj::arrayPtr(reader.getEnd(), words.end()); } } catch (const kj::Exception &e) { rWarning("Failed to parse log : %s.\nRetrieved %zu events from corrupt log", e.getDescription().cStr(), events.size()); diff --git a/tools/replay/logreader.h b/tools/replay/logreader.h index 56633c191b..782c00b90a 100644 --- a/tools/replay/logreader.h +++ b/tools/replay/logreader.h @@ -5,6 +5,7 @@ #include "cereal/gen/cpp/log.capnp.h" #include "system/camerad/cameras/camera_common.h" +#include "tools/replay/util.h" const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam}; const int MAX_CAMERAS = std::size(ALL_CAMERAS); @@ -26,6 +27,7 @@ public: class LogReader { public: + LogReader(const std::vector &filters = {}) { filters_ = filters; } bool load(const std::string &url, std::atomic *abort = nullptr, bool local_cache = false, int chunk_size = -1, int retries = 0); bool load(const char *data, size_t size, std::atomic *abort = nullptr); @@ -33,4 +35,6 @@ public: private: std::string raw_; + std::vector filters_; + MonotonicBuffer buffer_{1024 * 1024}; }; diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index f5339050a8..43aef7b881 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -27,6 +27,11 @@ Replay::Replay(QString route, QStringList allow, QStringList block, SubMaster *s sockets_[which] = name.c_str(); } } + if (!allow.isEmpty()) { + for (int i = 0; i < sockets_.size(); ++i) { + filters_.push_back(i == cereal::Event::Which::INIT_DATA || i == cereal::Event::Which::CAR_PARAMS || sockets_[i]); + } + } std::vector s; std::copy_if(sockets_.begin(), sockets_.end(), std::back_inserter(s), @@ -259,7 +264,7 @@ void Replay::loadSegmentInRange(SegmentMap::iterator begin, SegmentMap::iterator auto it = std::find_if(begin, end, [](const auto &seg_it) { return !seg_it.second || !seg_it.second->isLoaded(); }); if (it != end && !it->second) { rDebug("loading segment %d...", it->first); - it->second = std::make_unique(it->first, route_->at(it->first), flags_); + it->second = std::make_unique(it->first, route_->at(it->first), flags_, filters_); QObject::connect(it->second.get(), &Segment::loadFinished, this, &Replay::segmentLoadFinished); return true; } diff --git a/tools/replay/replay.h b/tools/replay/replay.h index b8f7852e4f..e3f321e1d7 100644 --- a/tools/replay/replay.h +++ b/tools/replay/replay.h @@ -135,6 +135,7 @@ protected: SubMaster *sm = nullptr; std::unique_ptr pm; std::vector sockets_; + std::vector filters_; std::unique_ptr route_; std::unique_ptr camera_server_; std::atomic flags_ = REPLAY_FLAG_NONE; diff --git a/tools/replay/route.cc b/tools/replay/route.cc index f2a0754da1..1c7010eb8a 100644 --- a/tools/replay/route.cc +++ b/tools/replay/route.cc @@ -131,7 +131,8 @@ void Route::addFileToSegment(int n, const QString &file) { // class Segment -Segment::Segment(int n, const SegmentFile &files, uint32_t flags) : seg_num(n), flags(flags) { +Segment::Segment(int n, const SegmentFile &files, uint32_t flags, const std::vector &filters) + : seg_num(n), flags(flags), filters_(filters) { // [RoadCam, DriverCam, WideRoadCam, log]. fallback to qcamera/qlog const std::array file_list = { (flags & REPLAY_FLAG_QCAMERA) || files.road_cam.isEmpty() ? files.qcamera : files.road_cam, @@ -161,7 +162,7 @@ void Segment::loadFile(int id, const std::string file) { frames[id] = std::make_unique(); success = frames[id]->load(file, flags & REPLAY_FLAG_NO_HW_DECODER, &abort_, local_cache, 20 * 1024 * 1024, 3); } else { - log = std::make_unique(); + log = std::make_unique(filters_); success = log->load(file, &abort_, local_cache, 0, 3); } diff --git a/tools/replay/route.h b/tools/replay/route.h index 654c084ff2..f956497804 100644 --- a/tools/replay/route.h +++ b/tools/replay/route.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -55,7 +56,7 @@ class Segment : public QObject { Q_OBJECT public: - Segment(int n, const SegmentFile &files, uint32_t flags); + Segment(int n, const SegmentFile &files, uint32_t flags, const std::vector &filters = {}); ~Segment(); inline bool isLoaded() const { return !loading_ && !abort_; } @@ -73,4 +74,5 @@ protected: std::atomic loading_ = 0; QFutureSynchronizer synchronizer_; uint32_t flags; + std::vector filters_; }; diff --git a/tools/replay/util.cc b/tools/replay/util.cc index 3ecd4297fd..c8203fd79d 100644 --- a/tools/replay/util.cc +++ b/tools/replay/util.cc @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -354,3 +355,26 @@ std::string sha256(const std::string &str) { SHA256_Final(hash, &sha256); return util::hexdump(hash, SHA256_DIGEST_LENGTH); } + +// MonotonicBuffer + +void *MonotonicBuffer::allocate(size_t bytes, size_t alignment) { + assert(bytes > 0); + void *p = std::align(alignment, bytes, current_buf, available); + if (p == nullptr) { + available = next_buffer_size = std::max(next_buffer_size, bytes); + current_buf = buffers.emplace_back(std::aligned_alloc(alignment, next_buffer_size)); + next_buffer_size *= growth_factor; + p = current_buf; + } + + current_buf = (char *)current_buf + bytes; + available -= bytes; + return p; +} + +MonotonicBuffer::~MonotonicBuffer() { + for (auto buf : buffers) { + free(buf); + } +} diff --git a/tools/replay/util.h b/tools/replay/util.h index fdb1dbf0f8..750c133555 100644 --- a/tools/replay/util.h +++ b/tools/replay/util.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -20,6 +21,21 @@ void logMessage(ReplyMsgType type, const char* fmt, ...); #define rWarning(fmt, ...) ::logMessage(ReplyMsgType::Warning, fmt, ## __VA_ARGS__) #define rError(fmt, ...) ::logMessage(ReplyMsgType::Critical , fmt, ## __VA_ARGS__) +class MonotonicBuffer { +public: + MonotonicBuffer(size_t initial_size) : next_buffer_size(initial_size) {} + ~MonotonicBuffer(); + void *allocate(size_t bytes, size_t alignment = 16ul); + void deallocate(void *p) {} + +private: + void *current_buf = nullptr; + size_t next_buffer_size = 0; + size_t available = 0; + std::deque buffers; + static constexpr float growth_factor = 1.5; +}; + std::string sha256(const std::string &str); void precise_nano_sleep(int64_t nanoseconds); std::string decompressBZ2(const std::string &in, std::atomic *abort = nullptr); From 5e61775561b6f7cfee9867a8a2a14f73a7b3b78f Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 24 Apr 2024 00:53:50 +0800 Subject: [PATCH 336/384] cabana: refactor HistoryLog for simplification and enhancements (#32284) --- tools/cabana/dbc/dbc.cc | 4 +- tools/cabana/dbc/dbc.h | 2 +- tools/cabana/historylog.cc | 230 +++++++++---------------- tools/cabana/historylog.h | 42 ++--- tools/cabana/streams/abstractstream.cc | 6 +- 5 files changed, 100 insertions(+), 184 deletions(-) diff --git a/tools/cabana/dbc/dbc.cc b/tools/cabana/dbc/dbc.cc index b1256098eb..149bb9f59a 100644 --- a/tools/cabana/dbc/dbc.cc +++ b/tools/cabana/dbc/dbc.cc @@ -142,7 +142,7 @@ void cabana::Signal::update() { precision = std::max(num_decimals(factor), num_decimals(offset)); } -QString cabana::Signal::formatValue(double value) const { +QString cabana::Signal::formatValue(double value, bool with_unit) const { // Show enum string int64_t raw_value = round((value - offset) / factor); for (const auto &[val, desc] : val_desc) { @@ -152,7 +152,7 @@ QString cabana::Signal::formatValue(double value) const { } QString val_str = QString::number(value, 'f', precision); - if (!unit.isEmpty()) { + if (with_unit && !unit.isEmpty()) { val_str += " " + unit; } return val_str; diff --git a/tools/cabana/dbc/dbc.h b/tools/cabana/dbc/dbc.h index 0262a546f6..71838a1df5 100644 --- a/tools/cabana/dbc/dbc.h +++ b/tools/cabana/dbc/dbc.h @@ -55,7 +55,7 @@ public: Signal(const Signal &other) = default; void update(); bool getValue(const uint8_t *data, size_t data_size, double *val) const; - QString formatValue(double value) const; + QString formatValue(double value, bool with_unit = true) const; bool operator==(const cabana::Signal &other) const; inline bool operator!=(const cabana::Signal &other) const { return !(*this == other); } diff --git a/tools/cabana/historylog.cc b/tools/cabana/historylog.cc index 90bd9a8f76..55ba0a4919 100644 --- a/tools/cabana/historylog.cc +++ b/tools/cabana/historylog.cc @@ -10,61 +10,49 @@ #include "tools/cabana/utils/export.h" QVariant HistoryLogModel::data(const QModelIndex &index, int role) const { - const bool show_signals = display_signals_mode && sigs.size() > 0; const auto &m = messages[index.row()]; + const int col = index.column(); if (role == Qt::DisplayRole) { - if (index.column() == 0) { - return QString::number((m.mono_time / (double)1e9) - can->routeStartTime(), 'f', 2); - } - int i = index.column() - 1; - return show_signals ? QString::number(m.sig_values[i], 'f', sigs[i]->precision) : QString(); - } else if (role == ColorsRole) { - return QVariant::fromValue((void *)(&m.colors)); - } else if (role == BytesRole) { - return QVariant::fromValue((void *)(&m.data)); + if (col == 0) return QString::number((m.mono_time / (double)1e9) - can->routeStartTime(), 'f', 3); + if (!isHexMode()) return sigs[col - 1]->formatValue(m.sig_values[col - 1], false); } else if (role == Qt::TextAlignmentRole) { return (uint32_t)(Qt::AlignRight | Qt::AlignVCenter); } + + if (isHexMode() && col == 1) { + if (role == ColorsRole) return QVariant::fromValue((void *)(&m.colors)); + if (role == BytesRole) return QVariant::fromValue((void *)(&m.data)); + } return {}; } void HistoryLogModel::setMessage(const MessageId &message_id) { msg_id = message_id; + reset(); } -void HistoryLogModel::refresh(bool fetch_message) { +void HistoryLogModel::reset() { beginResetModel(); sigs.clear(); if (auto dbc_msg = dbc()->msg(msg_id)) { sigs = dbc_msg->getSignals(); } - last_fetch_time = 0; - has_more_data = true; messages.clear(); hex_colors = {}; - if (fetch_message) { - updateState(); - } endResetModel(); + setFilter(0, "", nullptr); } QVariant HistoryLogModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal) { - const bool show_signals = display_signals_mode && !sigs.empty(); if (role == Qt::DisplayRole || role == Qt::ToolTipRole) { - if (section == 0) { - return "Time"; - } - if (show_signals) { - QString name = sigs[section - 1]->name; - if (!sigs[section - 1]->unit.isEmpty()) { - name += QString(" (%1)").arg(sigs[section - 1]->unit); - } - return name; - } else { - return "Data"; - } - } else if (role == Qt::BackgroundRole && section > 0 && show_signals) { + if (section == 0) return "Time"; + if (isHexMode()) return "Data"; + + QString name = sigs[section - 1]->name; + QString unit = sigs[section - 1]->unit; + return unit.isEmpty() ? name : QString("%1 (%2)").arg(name, unit); + } else if (role == Qt::BackgroundRole && section > 0 && !isHexMode()) { // Alpha-blend the signal color with the background to ensure contrast QColor sigColor = sigs[section - 1]->color; sigColor.setAlpha(128); @@ -74,110 +62,80 @@ QVariant HistoryLogModel::headerData(int section, Qt::Orientation orientation, i return {}; } -void HistoryLogModel::setDynamicMode(int state) { - dynamic_mode = state != 0; - refresh(); -} - -void HistoryLogModel::setDisplayType(int type) { - display_signals_mode = type == 0; - refresh(); -} - -void HistoryLogModel::segmentsMerged() { - if (!dynamic_mode) { - has_more_data = true; - } +void HistoryLogModel::setHexMode(bool hex) { + hex_mode = hex; + reset(); } void HistoryLogModel::setFilter(int sig_idx, const QString &value, std::function cmp) { filter_sig_idx = sig_idx; filter_value = value.toDouble(); filter_cmp = value.isEmpty() ? nullptr : cmp; + updateState(true); } -void HistoryLogModel::updateState() { - uint64_t current_time = (can->lastMessage(msg_id).ts + can->routeStartTime()) * 1e9 + 1; - auto new_msgs = dynamic_mode ? fetchData(current_time, last_fetch_time) : fetchData(0); - if (!new_msgs.empty()) { - beginInsertRows({}, 0, new_msgs.size() - 1); - messages.insert(messages.begin(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end())); - endInsertRows(); +void HistoryLogModel::updateState(bool clear) { + if (clear && !messages.empty()) { + beginRemoveRows({}, 0, messages.size() - 1); + messages.clear(); + endRemoveRows(); } - has_more_data = new_msgs.size() >= batch_size; - last_fetch_time = current_time; + uint64_t current_time = (can->lastMessage(msg_id).ts + can->routeStartTime()) * 1e9 + 1; + fetchData(messages.begin(), current_time, messages.empty() ? 0 : messages.front().mono_time); +} + +bool HistoryLogModel::canFetchMore(const QModelIndex &parent) const { + const auto &events = can->events(msg_id); + return !events.empty() && !messages.empty() && messages.back().mono_time > events.front()->mono_time; } void HistoryLogModel::fetchMore(const QModelIndex &parent) { - if (!messages.empty()) { - auto new_msgs = fetchData(messages.back().mono_time); - if (!new_msgs.empty()) { - beginInsertRows({}, messages.size(), messages.size() + new_msgs.size() - 1); - messages.insert(messages.end(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end())); - endInsertRows(); - } - has_more_data = new_msgs.size() >= batch_size; - } + if (!messages.empty()) + fetchData(messages.end(), messages.back().mono_time, 0); } -template -std::deque HistoryLogModel::fetchData(InputIt first, InputIt last, uint64_t min_time) { - std::deque msgs; +void HistoryLogModel::fetchData(std::deque::iterator insert_pos, uint64_t from_time, uint64_t min_time) { + const auto &events = can->events(msg_id); + auto first = std::upper_bound(events.rbegin(), events.rend(), from_time, [](uint64_t ts, auto e) { + return ts > e->mono_time; + }); + + std::vector msgs; std::vector values(sigs.size()); - for (; first != last && (*first)->mono_time > min_time; ++first) { + msgs.reserve(batch_size); + for (; first != events.rend() && (*first)->mono_time > min_time; ++first) { const CanEvent *e = *first; for (int i = 0; i < sigs.size(); ++i) { sigs[i]->getValue(e->dat, e->size, &values[i]); } if (!filter_cmp || filter_cmp(values[filter_sig_idx], filter_value)) { - auto &m = msgs.emplace_back(); - m.mono_time = e->mono_time; - m.data.assign(e->dat, e->dat + e->size); - m.sig_values = values; + msgs.emplace_back(Message{e->mono_time, values, {e->dat, e->dat + e->size}}); if (msgs.size() >= batch_size && min_time == 0) { - return msgs; + break; } } } - return msgs; -} -std::deque HistoryLogModel::fetchData(uint64_t from_time, uint64_t min_time) { - const auto &events = can->events(msg_id); - const auto freq = can->lastMessage(msg_id).freq; - const bool update_colors = !display_signals_mode || sigs.empty(); - const std::vector no_mask; - const auto speed = can->getSpeed(); - if (dynamic_mode) { - auto first = std::upper_bound(events.rbegin(), events.rend(), from_time, [](uint64_t ts, auto e) { - return ts > e->mono_time; - }); - auto msgs = fetchData(first, events.rend(), min_time); - if (update_colors && (min_time > 0 || messages.empty())) { - for (auto it = msgs.rbegin(); it != msgs.rend(); ++it) { - hex_colors.compute(msg_id, it->data.data(), it->data.size(), it->mono_time / (double)1e9, speed, no_mask, freq); - it->colors = hex_colors.colors; + if (!msgs.empty()) { + if (isHexMode() && (min_time > 0 || messages.empty())) { + const auto freq = can->lastMessage(msg_id).freq; + const std::vector no_mask; + for (auto &m : msgs) { + hex_colors.compute(msg_id, m.data.data(), m.data.size(), m.mono_time / (double)1e9, can->getSpeed(), no_mask, freq); + m.colors = hex_colors.colors; } } - return msgs; - } else { - assert(min_time == 0); - auto first = std::upper_bound(events.cbegin(), events.cend(), from_time, CompareCanEvent()); - auto msgs = fetchData(first, events.cend(), 0); - if (update_colors) { - for (auto it = msgs.begin(); it != msgs.end(); ++it) { - hex_colors.compute(msg_id, it->data.data(), it->data.size(), it->mono_time / (double)1e9, speed, no_mask, freq); - it->colors = hex_colors.colors; - } - } - return msgs; + int pos = std::distance(messages.begin(), insert_pos); + beginInsertRows({}, pos , pos + msgs.size() - 1); + messages.insert(insert_pos, std::move_iterator(msgs.begin()), std::move_iterator(msgs.end())); + endInsertRows(); } } // HeaderView QSize HeaderView::sectionSizeFromContents(int logicalIndex) const { - static const QSize time_col_size = fontMetrics().boundingRect({0, 0, 200, 200}, defaultAlignment(), "000000.000").size() + QSize(10, 6); + static const QSize time_col_size = fontMetrics().size(Qt::TextSingleLine, "000000.000") + QSize(10, 6); if (logicalIndex == 0) { return time_col_size; } else { @@ -220,8 +178,7 @@ LogsWidget::LogsWidget(QWidget *parent) : QFrame(parent) { filter_layout->addWidget(value_edit = new QLineEdit(this)); h->addWidget(filters_widget); h->addStretch(0); - h->addWidget(dynamic_mode = new QCheckBox(tr("Dynamic")), 0, Qt::AlignRight); - ToolButton *export_btn = new ToolButton("filetype-csv", tr("Export to CSV file...")); + export_btn = new ToolButton("filetype-csv", tr("Export to CSV file...")); h->addWidget(export_btn, 0, Qt::AlignRight); display_type_cb->addItems({"Signal", "Hex"}); @@ -229,8 +186,6 @@ LogsWidget::LogsWidget(QWidget *parent) : QFrame(parent) { comp_box->addItems({">", "=", "!=", "<"}); value_edit->setClearButtonEnabled(true); value_edit->setValidator(new DoubleValidator(this)); - dynamic_mode->setChecked(true); - dynamic_mode->setEnabled(!can->liveStreaming()); main_layout->addWidget(toolbar); QFrame *line = new QFrame(this); @@ -238,52 +193,38 @@ LogsWidget::LogsWidget(QWidget *parent) : QFrame(parent) { main_layout->addWidget(line); main_layout->addWidget(logs = new QTableView(this)); logs->setModel(model = new HistoryLogModel(this)); - delegate = new MessageBytesDelegate(this); + logs->setItemDelegate(delegate = new MessageBytesDelegate(this)); logs->setHorizontalHeader(new HeaderView(Qt::Horizontal, this)); logs->horizontalHeader()->setDefaultAlignment(Qt::AlignRight | (Qt::Alignment)Qt::TextWordWrap); logs->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); logs->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); logs->verticalHeader()->setDefaultSectionSize(delegate->sizeForBytes(8).height()); - logs->verticalHeader()->setVisible(false); logs->setFrameShape(QFrame::NoFrame); - QObject::connect(display_type_cb, qOverload(&QComboBox::activated), [this](int index) { - logs->setItemDelegateForColumn(1, index == 1 ? delegate : nullptr); - model->setDisplayType(index); - }); - QObject::connect(dynamic_mode, &QCheckBox::stateChanged, model, &HistoryLogModel::setDynamicMode); - QObject::connect(signals_cb, SIGNAL(activated(int)), this, SLOT(setFilter())); - QObject::connect(comp_box, SIGNAL(activated(int)), this, SLOT(setFilter())); - QObject::connect(value_edit, &QLineEdit::textChanged, this, &LogsWidget::setFilter); + QObject::connect(display_type_cb, qOverload(&QComboBox::activated), model, &HistoryLogModel::setHexMode); + QObject::connect(signals_cb, SIGNAL(activated(int)), this, SLOT(filterChanged())); + QObject::connect(comp_box, SIGNAL(activated(int)), this, SLOT(filterChanged())); + QObject::connect(value_edit, &QLineEdit::textEdited, this, &LogsWidget::filterChanged); QObject::connect(export_btn, &QToolButton::clicked, this, &LogsWidget::exportToCSV); - QObject::connect(can, &AbstractStream::seekedTo, model, &HistoryLogModel::refresh); - QObject::connect(dbc(), &DBCManager::DBCFileChanged, this, &LogsWidget::refresh); - QObject::connect(UndoStack::instance(), &QUndoStack::indexChanged, this, &LogsWidget::refresh); - QObject::connect(can, &AbstractStream::eventsMerged, model, &HistoryLogModel::segmentsMerged); + QObject::connect(can, &AbstractStream::seekedTo, model, &HistoryLogModel::reset); + QObject::connect(dbc(), &DBCManager::DBCFileChanged, model, &HistoryLogModel::reset); + QObject::connect(UndoStack::instance(), &QUndoStack::indexChanged, model, &HistoryLogModel::reset); + QObject::connect(model, &HistoryLogModel::modelReset, this, &LogsWidget::modelReset); + QObject::connect(model, &HistoryLogModel::rowsInserted, [this]() { export_btn->setEnabled(true); }); } -void LogsWidget::setMessage(const MessageId &message_id) { - model->setMessage(message_id); - refresh(); -} - -void LogsWidget::refresh() { - model->setFilter(0, "", nullptr); - model->refresh(isVisible()); - bool has_signal = model->sigs.size(); - if (has_signal) { - signals_cb->clear(); - for (auto s : model->sigs) { - signals_cb->addItem(s->name); - } +void LogsWidget::modelReset() { + signals_cb->clear(); + for (auto s : model->sigs) { + signals_cb->addItem(s->name); } - logs->setItemDelegateForColumn(1, !has_signal || display_type_cb->currentIndex() == 1 ? delegate : nullptr); + export_btn->setEnabled(false); value_edit->clear(); comp_box->setCurrentIndex(0); - filters_widget->setVisible(has_signal); + filters_widget->setVisible(!model->sigs.empty()); } -void LogsWidget::setFilter() { +void LogsWidget::filterChanged() { if (value_edit->text().isEmpty() && !value_edit->isModified()) return; std::function cmp = nullptr; @@ -294,19 +235,6 @@ void LogsWidget::setFilter() { case 3: cmp = std::less{}; break; } model->setFilter(signals_cb->currentIndex(), value_edit->text(), cmp); - model->refresh(); -} - -void LogsWidget::updateState() { - if (isVisible() && dynamic_mode->isChecked()) { - model->updateState(); - } -} - -void LogsWidget::showEvent(QShowEvent *event) { - if (dynamic_mode->isChecked() || model->canFetchMore({}) && model->rowCount() == 0) { - model->refresh(); - } } void LogsWidget::exportToCSV() { @@ -314,7 +242,7 @@ void LogsWidget::exportToCSV() { QString fn = QFileDialog::getSaveFileName(this, QString("Export %1 to CSV file").arg(msgName(model->msg_id)), dir, tr("csv (*.csv)")); if (!fn.isEmpty()) { - const bool export_signals = model->display_signals_mode && model->sigs.size() > 0; - export_signals ? utils::exportSignalsToCSV(fn, model->msg_id) : utils::exportToCSV(fn, model->msg_id); + model->isHexMode() ? utils::exportToCSV(fn, model->msg_id) + : utils::exportSignalsToCSV(fn, model->msg_id); } } diff --git a/tools/cabana/historylog.h b/tools/cabana/historylog.h index 21df6a622e..8c9ee922f8 100644 --- a/tools/cabana/historylog.h +++ b/tools/cabana/historylog.h @@ -3,7 +3,6 @@ #include #include -#include #include #include #include @@ -11,7 +10,6 @@ #include "tools/cabana/dbc/dbcmanager.h" #include "tools/cabana/streams/abstractstream.h" -#include "tools/cabana/utils/util.h" class HeaderView : public QHeaderView { public: @@ -26,24 +24,18 @@ class HistoryLogModel : public QAbstractTableModel { public: HistoryLogModel(QObject *parent) : QAbstractTableModel(parent) {} void setMessage(const MessageId &message_id); - void updateState(); + void updateState(bool clear = false); void setFilter(int sig_idx, const QString &value, std::function cmp); QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; void fetchMore(const QModelIndex &parent) override; - inline bool canFetchMore(const QModelIndex &parent) const override { return has_more_data; } + bool canFetchMore(const QModelIndex &parent) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override { return messages.size(); } - int columnCount(const QModelIndex &parent = QModelIndex()) const override { - return display_signals_mode && !sigs.empty() ? sigs.size() + 1 : 2; - } - void refresh(bool fetch_message = true); + int columnCount(const QModelIndex &parent = QModelIndex()) const override { return !isHexMode() ? sigs.size() + 1 : 2; } + inline bool isHexMode() const { return sigs.empty() || hex_mode; } + void reset(); + void setHexMode(bool hex_mode); -public slots: - void setDisplayType(int type); - void setDynamicMode(int state); - void segmentsMerged(); - -public: struct Message { uint64_t mono_time = 0; std::vector sig_values; @@ -51,22 +43,17 @@ public: std::vector colors; }; - template - std::deque fetchData(InputIt first, InputIt last, uint64_t min_time); - std::deque fetchData(uint64_t from_time, uint64_t min_time = 0); + void fetchData(std::deque::iterator insert_pos, uint64_t from_time, uint64_t min_time); MessageId msg_id; CanData hex_colors; - bool has_more_data = true; const int batch_size = 50; int filter_sig_idx = -1; double filter_value = 0; - uint64_t last_fetch_time = 0; std::function filter_cmp = nullptr; std::deque messages; std::vector sigs; - bool dynamic_mode = true; - bool display_signals_mode = true; + bool hex_mode = true; }; class LogsWidget : public QFrame { @@ -74,22 +61,21 @@ class LogsWidget : public QFrame { public: LogsWidget(QWidget *parent); - void setMessage(const MessageId &message_id); - void updateState(); - void showEvent(QShowEvent *event) override; + void setMessage(const MessageId &message_id) { model->setMessage(message_id); } + void updateState() { model->updateState(); } + void showEvent(QShowEvent *event) override { model->updateState(true); } private slots: - void setFilter(); + void filterChanged(); void exportToCSV(); + void modelReset(); private: - void refresh(); - QTableView *logs; HistoryLogModel *model; - QCheckBox *dynamic_mode; QComboBox *signals_cb, *comp_box, *display_type_cb; QLineEdit *value_edit; QWidget *filters_widget; + ToolButton *export_btn; MessageBytesDelegate *delegate; }; diff --git a/tools/cabana/streams/abstractstream.cc b/tools/cabana/streams/abstractstream.cc index afb1ec200c..9c52908c36 100644 --- a/tools/cabana/streams/abstractstream.cc +++ b/tools/cabana/streams/abstractstream.cc @@ -137,9 +137,11 @@ void AbstractStream::updateLastMsgsTo(double sec) { auto prev = std::prev(it); double ts = (*prev)->mono_time / 1e9 - routeStartTime(); auto &m = msgs[id]; - // Keep last changes + // Keep suppressed bits. if (auto old_m = messages_.find(id); old_m != messages_.end()) { - m.last_changes = old_m->second.last_changes; + std::transform(old_m->second.last_changes.cbegin(), old_m->second.last_changes.cend(), + std::back_inserter(m.last_changes), + [](const auto &change) { return CanData::ByteLastChange{.suppressed = change.suppressed}; }); } m.compute(id, (*prev)->dat, (*prev)->size, ts, getSpeed(), {}); m.count = std::distance(ev.begin(), prev) + 1; From 07df3d28a4b8828bbf80948e5374aeae845d7865 Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:40:05 -0300 Subject: [PATCH 337/384] Added alwaysOnDM toggle description to RELEASES.md (#32266) --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index 2af124d4e6..58638d053c 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -3,6 +3,7 @@ Version 0.9.7 (2024-XX-XX) * New driving model * Adjust driving personality with the follow distance button * Support for hybrid variants of supported Ford models +* Added toggle to enable driver monitoring even when openpilot is not engaged Version 0.9.6 (2024-02-27) ======================== From e095c7c8588e70669d1bec8379ca9a4290828928 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 24 Apr 2024 14:55:34 -0700 Subject: [PATCH 338/384] Update RELEASES.md --- RELEASES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RELEASES.md b/RELEASES.md index 58638d053c..da22a87a47 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,9 +1,10 @@ -Version 0.9.7 (2024-XX-XX) +Version 0.9.7 (2024-05-XX) ======================== * New driving model * Adjust driving personality with the follow distance button * Support for hybrid variants of supported Ford models * Added toggle to enable driver monitoring even when openpilot is not engaged +* Fingerprinting without the OBD-II port on all cars Version 0.9.6 (2024-02-27) ======================== From a6396be53e54aa81644a10c2936706d0f1a2d6e8 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 25 Apr 2024 06:55:58 +0800 Subject: [PATCH 339/384] cabana: improve `DBCFile::parse()` (#32160) improve parse() --- tools/cabana/dbc/dbcfile.cc | 243 +++++++++++++++++++++--------------- tools/cabana/dbc/dbcfile.h | 8 ++ 2 files changed, 153 insertions(+), 98 deletions(-) diff --git a/tools/cabana/dbc/dbcfile.cc b/tools/cabana/dbc/dbcfile.cc index bf246fd342..4a1c52819a 100644 --- a/tools/cabana/dbc/dbcfile.cc +++ b/tools/cabana/dbc/dbcfile.cc @@ -3,7 +3,6 @@ #include #include #include -#include DBCFile::DBCFile(const QString &dbc_file_name) { QFile file(dbc_file_name); @@ -76,117 +75,44 @@ cabana::Msg *DBCFile::msg(const QString &name) { return it != msgs.end() ? &(it->second) : nullptr; } +cabana::Signal *DBCFile::signal(uint32_t address, const QString name) { + auto m = msg(address); + return m ? (cabana::Signal *)m->sig(name) : nullptr; +} + void DBCFile::parse(const QString &content) { - static QRegularExpression bo_regexp(R"(^BO_ (\w+) (\w+) *: (\w+) (\w+))"); - static QRegularExpression sg_regexp(R"(^SG_ (\w+) : (\d+)\|(\d+)@(\d+)([\+|\-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[([0-9.+\-eE]+)\|([0-9.+\-eE]+)\] \"(.*)\" (.*))"); - static QRegularExpression sgm_regexp(R"(^SG_ (\w+) (\w+) *: (\d+)\|(\d+)@(\d+)([\+|\-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[([0-9.+\-eE]+)\|([0-9.+\-eE]+)\] \"(.*)\" (.*))"); - static QRegularExpression msg_comment_regexp(R"(^CM_ BO_ *(\w+) *\"((?:[^"\\]|\\.)*)\"\s*;)"); - static QRegularExpression sg_comment_regexp(R"(^CM_ SG_ *(\w+) *(\w+) *\"((?:[^"\\]|\\.)*)\"\s*;)"); - static QRegularExpression val_regexp(R"(VAL_ (\w+) (\w+) (\s*[-+]?[0-9]+\s+\".+?\"[^;]*))"); + msgs.clear(); int line_num = 0; QString line; - auto dbc_assert = [&line_num, &line, this](bool condition, const QString &msg = "") { - if (!condition) throw std::runtime_error(QString("[%1:%2]%3: %4").arg(filename).arg(line_num).arg(msg).arg(line).toStdString()); - }; - auto get_sig = [this](uint32_t address, const QString &name) -> cabana::Signal * { - auto m = (cabana::Msg *)msg(address); - return m ? (cabana::Signal *)m->sig(name) : nullptr; - }; - - msgs.clear(); - QTextStream stream((QString *)&content); cabana::Msg *current_msg = nullptr; int multiplexor_cnt = 0; bool seen_first = false; + QTextStream stream((QString *)&content); + while (!stream.atEnd()) { ++line_num; QString raw_line = stream.readLine(); line = raw_line.trimmed(); bool seen = true; - if (line.startsWith("BO_ ")) { - multiplexor_cnt = 0; - auto match = bo_regexp.match(line); - dbc_assert(match.hasMatch()); - auto address = match.captured(1).toUInt(); - dbc_assert(msgs.count(address) == 0, QString("Duplicate message address: %1").arg(address)); - current_msg = &msgs[address]; - current_msg->address = address; - current_msg->name = match.captured(2); - current_msg->size = match.captured(3).toULong(); - current_msg->transmitter = match.captured(4).trimmed(); - } else if (line.startsWith("SG_ ")) { - int offset = 0; - auto match = sg_regexp.match(line); - if (!match.hasMatch()) { - match = sgm_regexp.match(line); - offset = 1; - } - dbc_assert(match.hasMatch()); - dbc_assert(current_msg, "No Message"); - auto name = match.captured(1); - dbc_assert(current_msg->sig(name) == nullptr, "Duplicate signal name"); - cabana::Signal s{}; - if (offset == 1) { - auto indicator = match.captured(2); - if (indicator == "M") { - // Only one signal within a single message can be the multiplexer switch. - dbc_assert(++multiplexor_cnt < 2, "Multiple multiplexor"); - s.type = cabana::Signal::Type::Multiplexor; - } else { - s.type = cabana::Signal::Type::Multiplexed; - s.multiplex_value = indicator.mid(1).toInt(); - } - } - s.name = name; - s.start_bit = match.captured(offset + 2).toInt(); - s.size = match.captured(offset + 3).toInt(); - s.is_little_endian = match.captured(offset + 4).toInt() == 1; - s.is_signed = match.captured(offset + 5) == "-"; - s.factor = match.captured(offset + 6).toDouble(); - s.offset = match.captured(offset + 7).toDouble(); - s.min = match.captured(8 + offset).toDouble(); - s.max = match.captured(9 + offset).toDouble(); - s.unit = match.captured(10 + offset); - s.receiver_name = match.captured(11 + offset).trimmed(); - - current_msg->sigs.push_back(new cabana::Signal(s)); - } else if (line.startsWith("VAL_ ")) { - auto match = val_regexp.match(line); - dbc_assert(match.hasMatch()); - if (auto s = get_sig(match.captured(1).toUInt(), match.captured(2))) { - QStringList desc_list = match.captured(3).trimmed().split('"'); - for (int i = 0; i < desc_list.size(); i += 2) { - auto val = desc_list[i].trimmed(); - if (!val.isEmpty() && (i + 1) < desc_list.size()) { - auto desc = desc_list[i + 1].trimmed(); - s->val_desc.push_back({val.toDouble(), desc}); - } - } - } - } else if (line.startsWith("CM_ BO_")) { - if (!line.endsWith("\";")) { - int pos = stream.pos() - raw_line.length() - 1; - line = content.mid(pos, content.indexOf("\";", pos)); - } - auto match = msg_comment_regexp.match(line); - dbc_assert(match.hasMatch()); - if (auto m = (cabana::Msg *)msg(match.captured(1).toUInt())) { - m->comment = match.captured(2).trimmed().replace("\\\"", "\""); - } - } else if (line.startsWith("CM_ SG_ ")) { - if (!line.endsWith("\";")) { - int pos = stream.pos() - raw_line.length() - 1; - line = content.mid(pos, content.indexOf("\";", pos)); + try { + if (line.startsWith("BO_ ")) { + multiplexor_cnt = 0; + current_msg = parseBO(line); + } else if (line.startsWith("SG_ ")) { + parseSG(line, current_msg, multiplexor_cnt); + } else if (line.startsWith("VAL_ ")) { + parseVAL(line); + } else if (line.startsWith("CM_ BO_")) { + parseCM_BO(line, content, raw_line, stream); + } else if (line.startsWith("CM_ SG_ ")) { + parseCM_SG(line, content, raw_line, stream); + } else { + seen = false; } - auto match = sg_comment_regexp.match(line); - dbc_assert(match.hasMatch()); - if (auto s = get_sig(match.captured(1).toUInt(), match.captured(2))) { - s->comment = match.captured(3).trimmed().replace("\\\"", "\""); - } - } else { - seen = false; + } catch (std::exception &e) { + throw std::runtime_error(QString("[%1:%2]%3: %4").arg(filename).arg(line_num).arg(e.what()).arg(line).toStdString()); } if (seen) { @@ -201,6 +127,127 @@ void DBCFile::parse(const QString &content) { } } +cabana::Msg *DBCFile::parseBO(const QString &line) { + static QRegularExpression bo_regexp(R"(^BO_ (?
\w+) (?\w+) *: (?\w+) (?\w+))"); + + QRegularExpressionMatch match = bo_regexp.match(line); + if (!match.hasMatch()) + throw std::runtime_error("Invalid BO_ line format"); + + uint32_t address = match.captured("address").toUInt(); + if (msgs.count(address) > 0) + throw std::runtime_error(QString("Duplicate message address: %1").arg(address).toStdString()); + + // Create a new message object + cabana::Msg *msg = &msgs[address]; + msg->address = address; + msg->name = match.captured("name"); + msg->size = match.captured("size").toULong(); + msg->transmitter = match.captured("transmitter").trimmed(); + return msg; +} + +void DBCFile::parseCM_BO(const QString &line, const QString &content, const QString &raw_line, const QTextStream &stream) { + static QRegularExpression msg_comment_regexp(R"(^CM_ BO_ *(?
\w+) *\"(?(?:[^"\\]|\\.)*)\"\s*;)"); + + QString parse_line = line; + if (!parse_line.endsWith("\";")) { + int pos = stream.pos() - raw_line.length() - 1; + parse_line = content.mid(pos, content.indexOf("\";", pos)); + } + auto match = msg_comment_regexp.match(parse_line); + if (!match.hasMatch()) + throw std::runtime_error("Invalid message comment format"); + + if (auto m = (cabana::Msg *)msg(match.captured("address").toUInt())) + m->comment = match.captured("comment").trimmed().replace("\\\"", "\""); +} + +void DBCFile::parseSG(const QString &line, cabana::Msg *current_msg, int &multiplexor_cnt) { + static QRegularExpression sg_regexp(R"(^SG_ (\w+) : (\d+)\|(\d+)@(\d+)([\+|\-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[([0-9.+\-eE]+)\|([0-9.+\-eE]+)\] \"(.*)\" (.*))"); + static QRegularExpression sgm_regexp(R"(^SG_ (\w+) (\w+) *: (\d+)\|(\d+)@(\d+)([\+|\-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[([0-9.+\-eE]+)\|([0-9.+\-eE]+)\] \"(.*)\" (.*))"); + + if (!current_msg) + throw std::runtime_error("No Message"); + + int offset = 0; + auto match = sg_regexp.match(line); + if (!match.hasMatch()) { + match = sgm_regexp.match(line); + offset = 1; + } + if (!match.hasMatch()) + throw std::runtime_error("Invalid SG_ line format"); + + QString name = match.captured(1); + if (current_msg->sig(name) != nullptr) + throw std::runtime_error("Duplicate signal name"); + + cabana::Signal s{}; + if (offset == 1) { + auto indicator = match.captured(2); + if (indicator == "M") { + ++multiplexor_cnt; + // Only one signal within a single message can be the multiplexer switch. + if (multiplexor_cnt >= 2) + throw std::runtime_error("Multiple multiplexor"); + + s.type = cabana::Signal::Type::Multiplexor; + } else { + s.type = cabana::Signal::Type::Multiplexed; + s.multiplex_value = indicator.mid(1).toInt(); + } + } + s.name = name; + s.start_bit = match.captured(offset + 2).toInt(); + s.size = match.captured(offset + 3).toInt(); + s.is_little_endian = match.captured(offset + 4).toInt() == 1; + s.is_signed = match.captured(offset + 5) == "-"; + s.factor = match.captured(offset + 6).toDouble(); + s.offset = match.captured(offset + 7).toDouble(); + s.min = match.captured(8 + offset).toDouble(); + s.max = match.captured(9 + offset).toDouble(); + s.unit = match.captured(10 + offset); + s.receiver_name = match.captured(11 + offset).trimmed(); + current_msg->sigs.push_back(new cabana::Signal(s)); +} + +void DBCFile::parseCM_SG(const QString &line, const QString &content, const QString &raw_line, const QTextStream &stream) { + static QRegularExpression sg_comment_regexp(R"(^CM_ SG_ *(\w+) *(\w+) *\"((?:[^"\\]|\\.)*)\"\s*;)"); + + QString parse_line = line; + if (!parse_line.endsWith("\";")) { + int pos = stream.pos() - raw_line.length() - 1; + parse_line = content.mid(pos, content.indexOf("\";", pos)); + } + auto match = sg_comment_regexp.match(parse_line); + if (!match.hasMatch()) + throw std::runtime_error("Invalid CM_ SG_ line format"); + + if (auto s = signal(match.captured(1).toUInt(), match.captured(2))) { + s->comment = match.captured(3).trimmed().replace("\\\"", "\""); + } +} + +void DBCFile::parseVAL(const QString &line) { + static QRegularExpression val_regexp(R"(VAL_ (\w+) (\w+) (\s*[-+]?[0-9]+\s+\".+?\"[^;]*))"); + + auto match = val_regexp.match(line); + if (!match.hasMatch()) + throw std::runtime_error("invalid VAL_ line format"); + + if (auto s = signal(match.captured(1).toUInt(), match.captured(2))) { + QStringList desc_list = match.captured(3).trimmed().split('"'); + for (int i = 0; i < desc_list.size(); i += 2) { + auto val = desc_list[i].trimmed(); + if (!val.isEmpty() && (i + 1) < desc_list.size()) { + auto desc = desc_list[i + 1].trimmed(); + s->val_desc.push_back({val.toDouble(), desc}); + } + } + } +} + QString DBCFile::generateDBC() { QString dbc_string, comment, val_desc; for (const auto &[address, m] : msgs) { diff --git a/tools/cabana/dbc/dbcfile.h b/tools/cabana/dbc/dbcfile.h index 29f19a80e4..20de04a861 100644 --- a/tools/cabana/dbc/dbcfile.h +++ b/tools/cabana/dbc/dbcfile.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "tools/cabana/dbc/dbc.h" @@ -26,6 +27,7 @@ public: cabana::Msg *msg(uint32_t address); cabana::Msg *msg(const QString &name); inline cabana::Msg *msg(const MessageId &id) { return msg(id.address); } + cabana::Signal *signal(uint32_t address, const QString name); inline QString name() const { return name_.isEmpty() ? "untitled" : name_; } inline bool isEmpty() const { return msgs.empty() && name_.isEmpty(); } @@ -34,6 +36,12 @@ public: private: void parse(const QString &content); + cabana::Msg *parseBO(const QString &line); + void parseSG(const QString &line, cabana::Msg *current_msg, int &multiplexor_cnt); + void parseCM_BO(const QString &line, const QString &content, const QString &raw_line, const QTextStream &stream); + void parseCM_SG(const QString &line, const QString &content, const QString &raw_line, const QTextStream &stream); + void parseVAL(const QString &line); + QString header; std::map msgs; QString name_; From 2d1078ee5bcddc12122a06ffaefef31f9656ef65 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 25 Apr 2024 06:56:25 +0800 Subject: [PATCH 340/384] cabana: some improvements (#32161) some improvements --- tools/cabana/chart/chart.cc | 6 ++-- tools/cabana/dbc/dbc.h | 4 +-- tools/cabana/historylog.h | 2 +- tools/cabana/messageswidget.cc | 44 +++++++++++--------------- tools/cabana/messageswidget.h | 1 + tools/cabana/streams/abstractstream.cc | 18 +++++------ tools/cabana/utils/util.cc | 38 ++++++++++++---------- tools/cabana/utils/util.h | 2 ++ 8 files changed, 59 insertions(+), 56 deletions(-) diff --git a/tools/cabana/chart/chart.cc b/tools/cabana/chart/chart.cc index 6f08a9f20b..dd34782e33 100644 --- a/tools/cabana/chart/chart.cc +++ b/tools/cabana/chart/chart.cc @@ -111,6 +111,8 @@ void ChartView::setTheme(QChart::ChartTheme theme) { axis_y->setLabelsBrush(palette().text()); chart()->legend()->setLabelColor(palette().color(QPalette::Text)); } + axis_x->setLineVisible(false); + axis_y->setLineVisible(false); for (auto &s : sigs) { s.series->setColor(s.sig->color); } @@ -745,8 +747,8 @@ void ChartView::drawTimeline(QPainter *painter) { const auto plot_area = chart()->plotArea(); // draw vertical time line qreal x = std::clamp(chart()->mapToPosition(QPointF{cur_sec, 0}).x(), plot_area.left(), plot_area.right()); - painter->setPen(QPen(chart()->titleBrush().color(), 2)); - painter->drawLine(QPointF{x, plot_area.top()}, QPointF{x, plot_area.bottom() + 1}); + painter->setPen(QPen(chart()->titleBrush().color(), 1)); + painter->drawLine(QPointF{x, plot_area.top() - 1}, QPointF{x, plot_area.bottom() + 1}); // draw current time under the axis-x QString time_str = QString::number(cur_sec, 'f', 2); diff --git a/tools/cabana/dbc/dbc.h b/tools/cabana/dbc/dbc.h index 71838a1df5..da44319b5c 100644 --- a/tools/cabana/dbc/dbc.h +++ b/tools/cabana/dbc/dbc.h @@ -29,11 +29,11 @@ struct MessageId { } bool operator<(const MessageId &other) const { - return std::pair{source, address} < std::pair{other.source, other.address}; + return std::tie(source, address) < std::tie(other.source, other.address); } bool operator>(const MessageId &other) const { - return std::pair{source, address} > std::pair{other.source, other.address}; + return std::tie(source, address) > std::tie(other.source, other.address); } }; diff --git a/tools/cabana/historylog.h b/tools/cabana/historylog.h index 8c9ee922f8..1ac6e5bbad 100644 --- a/tools/cabana/historylog.h +++ b/tools/cabana/historylog.h @@ -53,7 +53,7 @@ public: std::function filter_cmp = nullptr; std::deque messages; std::vector sigs; - bool hex_mode = true; + bool hex_mode = false; }; class LogsWidget : public QFrame { diff --git a/tools/cabana/messageswidget.cc b/tools/cabana/messageswidget.cc index 4c3efa0385..396cfdc38b 100644 --- a/tools/cabana/messageswidget.cc +++ b/tools/cabana/messageswidget.cc @@ -43,7 +43,6 @@ MessagesWidget::MessagesWidget(QWidget *parent) : menu(new QMenu(this)), QWidget view->setItemsExpandable(false); view->setIndentation(0); view->setRootIsDecorated(false); - view->setUniformRowHeights(!settings.multiple_lines_hex); // Must be called before setting any header parameters to avoid overriding restoreHeaderState(settings.message_header_state); @@ -135,15 +134,9 @@ void MessagesWidget::selectMessage(const MessageId &msg_id) { } void MessagesWidget::suppressHighlighted() { - if (sender() == suppress_add) { - size_t n = can->suppressHighlighted(); - suppress_clear->setText(tr("Clear (%1)").arg(n)); - suppress_clear->setEnabled(true); - } else { - can->clearSuppressed(); - suppress_clear->setText(tr("Clear")); - suppress_clear->setEnabled(false); - } + int n = sender() == suppress_add ? can->suppressHighlighted() : (can->clearSuppressed(), 0); + suppress_clear->setText(n > 0 ? tr("Clear (%1)").arg(n) : tr("Clear")); + suppress_clear->setEnabled(n > 0); } void MessagesWidget::headerContextMenuEvent(const QPoint &pos) { @@ -174,7 +167,6 @@ void MessagesWidget::menuAboutToShow() { void MessagesWidget::setMultiLineBytes(bool multi) { settings.multiple_lines_hex = multi; delegate->setMultipleLines(multi); - view->setUniformRowHeights(!multi); view->updateBytesSectionSize(); view->doItemsLayout(); } @@ -207,22 +199,22 @@ QVariant MessageListModel::data(const QModelIndex &index, int role) const { } }; + const static QString NA = QStringLiteral("N/A"); const auto &item = items_[index.row()]; - const auto &data = can->lastMessage(item.id); if (role == Qt::DisplayRole) { switch (index.column()) { case Column::NAME: return item.name; - case Column::SOURCE: return item.id.source != INVALID_SOURCE ? QString::number(item.id.source) : "N/A"; + case Column::SOURCE: return item.id.source != INVALID_SOURCE ? QString::number(item.id.source) : NA; case Column::ADDRESS: return QString::number(item.id.address, 16); case Column::NODE: return item.node; - case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(data.freq) : "N/A"; - case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(data.count) : "N/A"; - case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : "N/A"; + case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(can->lastMessage(item.id).freq) : NA; + case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(can->lastMessage(item.id).count) : NA; + case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : NA; } } else if (role == ColorsRole) { - return QVariant::fromValue((void*)(&data.colors)); + return QVariant::fromValue((void*)(&can->lastMessage(item.id).colors)); } else if (role == BytesRole && index.column() == Column::DATA && item.id.source != INVALID_SOURCE) { - return QVariant::fromValue((void*)(&data.dat)); + return QVariant::fromValue((void*)(&can->lastMessage(item.id).dat)); } else if (role == Qt::ForegroundRole && !item.active) { return settings.theme == DARK_THEME ? QApplication::palette().color(QPalette::Text).darker(150) : QColor(Qt::gray); } else if (role == Qt::ToolTipRole && index.column() == Column::NAME) { @@ -366,18 +358,17 @@ bool MessageListModel::filterAndSort() { } void MessageListModel::msgsReceived(const std::set *new_msgs, bool has_new_ids) { - if (has_new_ids || filters_.contains(Column::FREQ) || filters_.contains(Column::COUNT) || filters_.contains(Column::DATA)) { + if (has_new_ids || ((filters_.count(Column::FREQ) || filters_.count(Column::COUNT) || filters_.count(Column::DATA)) && + ++sort_threshold_ == settings.fps)) { + sort_threshold_ = 0; if (filterAndSort()) return; } - for (int i = 0; i < items_.size(); ++i) { - auto &item = items_[i]; - bool prev_active = item.active; + + for (auto &item : items_) { item.active = isMessageActive(item.id); - if (item.active != prev_active || !new_msgs || new_msgs->count(item.id)) { - for (int col = 0; col < columnCount(); ++col) - emit dataChanged(index(i, col), index(i, col), {Qt::DisplayRole}); - } } + // Update viewport + emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); } void MessageListModel::sort(int column, Qt::SortOrder order) { @@ -420,6 +411,7 @@ void MessageView::updateBytesSectionSize() { max_bytes = std::max(max_bytes, m.dat.size()); } } + setUniformRowHeights(!delegate->multipleLines() || max_bytes <= 8); header()->resizeSection(MessageListModel::Column::DATA, delegate->sizeForBytes(max_bytes).width()); } diff --git a/tools/cabana/messageswidget.h b/tools/cabana/messageswidget.h index c110db2b56..823fcb74e3 100644 --- a/tools/cabana/messageswidget.h +++ b/tools/cabana/messageswidget.h @@ -61,6 +61,7 @@ private: std::set dbc_messages_; int sort_column = 0; Qt::SortOrder sort_order = Qt::AscendingOrder; + int sort_threshold_ = 0; }; class MessageView : public QTreeView { diff --git a/tools/cabana/streams/abstractstream.cc b/tools/cabana/streams/abstractstream.cc index 9c52908c36..593d1bf5d8 100644 --- a/tools/cabana/streams/abstractstream.cc +++ b/tools/cabana/streams/abstractstream.cc @@ -130,6 +130,7 @@ void AbstractStream::updateLastMsgsTo(double sec) { current_sec_ = sec; uint64_t last_ts = (sec + routeStartTime()) * 1e9; std::unordered_map msgs; + msgs.reserve(events_.size()); for (const auto &[id, ev] : events_) { auto it = std::upper_bound(ev.begin(), ev.end(), last_ts, CompareCanEvent()); @@ -171,6 +172,8 @@ const CanEvent *AbstractStream::newEvent(uint64_t mono_time, const cereal::CanDa void AbstractStream::mergeEvents(const std::vector &events) { static MessageEventsMap msg_events; std::for_each(msg_events.begin(), msg_events.end(), [](auto &e) { e.second.clear(); }); + + // Group events by message ID for (auto e : events) { msg_events[{.source = e->src, .address = e->address}].push_back(e); } @@ -207,7 +210,7 @@ inline QColor blend(const QColor &a, const QColor &b) { return QColor((a.red() + b.red()) / 2, (a.green() + b.green()) / 2, (a.blue() + b.blue()) / 2, (a.alpha() + b.alpha()) / 2); } -// Calculate the frequency of the past minute. +// Calculate the frequency from the past one minute data double calc_freq(const MessageId &msg_id, double current_sec) { const auto &events = can->events(msg_id); uint64_t cur_mono_time = (can->routeStartTime() + current_sec) * 1e9; @@ -255,11 +258,8 @@ void CanData::compute(const MessageId &msg_id, const uint8_t *can_data, const in if (last != cur) { const int delta = cur - last; // Keep track if signal is changing randomly, or mostly moving in the same direction - if (std::signbit(delta) == std::signbit(last_change.delta)) { - last_change.same_delta_counter = std::min(16, last_change.same_delta_counter + 1); - } else { - last_change.same_delta_counter = std::max(0, last_change.same_delta_counter - 4); - } + last_change.same_delta_counter += std::signbit(delta) == std::signbit(last_change.delta) ? 1 : -4; + last_change.same_delta_counter = std::clamp(last_change.same_delta_counter, 0, 16); const double delta_t = ts - last_change.ts; // Mostly moves in the same direction, color based on delta up/down @@ -272,10 +272,10 @@ void CanData::compute(const MessageId &msg_id, const uint8_t *can_data, const in } // Track bit level changes - const uint8_t tmp = (cur ^ last); + const uint8_t diff = (cur ^ last); for (int bit = 0; bit < 8; bit++) { - if (tmp & (1 << (7 - bit))) { - last_change.bit_change_counts[bit] += 1; + if (diff & (1u << bit)) { + ++last_change.bit_change_counts[7 - bit]; } } diff --git a/tools/cabana/utils/util.cc b/tools/cabana/utils/util.cc index f85ea6d105..4556f90850 100644 --- a/tools/cabana/utils/util.cc +++ b/tools/cabana/utils/util.cc @@ -51,7 +51,8 @@ std::pair SegmentTree::get_minmax(int n, int left, int right, in // MessageBytesDelegate -MessageBytesDelegate::MessageBytesDelegate(QObject *parent, bool multiple_lines) : multiple_lines(multiple_lines), QStyledItemDelegate(parent) { +MessageBytesDelegate::MessageBytesDelegate(QObject *parent, bool multiple_lines) + : font_metrics(QApplication::font()), multiple_lines(multiple_lines), QStyledItemDelegate(parent) { fixed_font = QFontDatabase::systemFont(QFontDatabase::FixedFont); byte_size = QFontMetrics(fixed_font).size(Qt::TextSingleLine, "00 ") + QSize(0, 2); for (int i = 0; i < 256; ++i) { @@ -73,31 +74,38 @@ QSize MessageBytesDelegate::sizeHint(const QStyleOptionViewItem &option, const Q } void MessageBytesDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { - auto data = index.data(BytesRole); - if (!data.isValid()) { - return QStyledItemDelegate::paint(painter, option, index); - } - - QFont old_font = painter->font(); - QPen old_pen = painter->pen(); if (option.state & QStyle::State_Selected) { painter->fillRect(option.rect, option.palette.brush(QPalette::Normal, QPalette::Highlight)); } - const QPoint pt{option.rect.left() + h_margin, option.rect.top() + v_margin}; - painter->setFont(fixed_font); - const auto &bytes = *static_cast*>(data.value()); - const auto &colors = *static_cast*>(index.data(ColorsRole).value()); + QRect item_rect = option.rect.adjusted(h_margin, v_margin, -h_margin, -v_margin); + QColor highlighted_color = option.palette.color(QPalette::HighlightedText); auto text_color = index.data(Qt::ForegroundRole).value(); bool inactive = text_color.isValid(); if (!inactive) { text_color = option.palette.color(QPalette::Text); } + auto data = index.data(BytesRole); + if (!data.isValid()) { + painter->setFont(option.font); + painter->setPen(option.state & QStyle::State_Selected ? highlighted_color : text_color); + QString text = font_metrics.elidedText(index.data(Qt::DisplayRole).toString(), Qt::ElideRight, item_rect.width()); + painter->drawText(item_rect, Qt::AlignLeft | Qt::AlignVCenter, text); + return; + } + + // Paint hex column + const auto &bytes = *static_cast *>(data.value()); + const auto &colors = *static_cast *>(index.data(ColorsRole).value()); + painter->setFont(fixed_font); + const QPen text_pen(option.state & QStyle::State_Selected ? highlighted_color : text_color); + const QPoint pt = item_rect.topLeft(); for (int i = 0; i < bytes.size(); ++i) { int row = !multiple_lines ? 0 : i / 8; int column = !multiple_lines ? i : i % 8; - QRect r = QRect({pt.x() + column * byte_size.width(), pt.y() + row * byte_size.height()}, byte_size); + QRect r({pt.x() + column * byte_size.width(), pt.y() + row * byte_size.height()}, byte_size); + if (!inactive && i < colors.size() && colors[i].alpha() > 0) { if (option.state & QStyle::State_Selected) { painter->setPen(option.palette.color(QPalette::Text)); @@ -105,12 +113,10 @@ void MessageBytesDelegate::paint(QPainter *painter, const QStyleOptionViewItem & } painter->fillRect(r, colors[i]); } else { - painter->setPen(option.state & QStyle::State_Selected ? option.palette.color(QPalette::HighlightedText) : text_color); + painter->setPen(text_pen); } utils::drawStaticText(painter, r, hex_text_table[bytes[i]]); } - painter->setFont(old_font); - painter->setPen(old_pen); } // TabBar diff --git a/tools/cabana/utils/util.h b/tools/cabana/utils/util.h index 218b8eeb51..0ebd7e41f8 100644 --- a/tools/cabana/utils/util.h +++ b/tools/cabana/utils/util.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -76,6 +77,7 @@ public: private: std::array hex_text_table; + QFontMetrics font_metrics; QFont fixed_font; QSize byte_size = {}; bool multiple_lines = false; From 97dc444023eafbd1dfa45855edc27fbeb6909be5 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 24 Apr 2024 17:05:18 -0700 Subject: [PATCH 341/384] fix uiview (#32290) * fix uiview * add DMoji! --- selfdrive/debug/uiview.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/selfdrive/debug/uiview.py b/selfdrive/debug/uiview.py index f4440a912c..958ee72e04 100755 --- a/selfdrive/debug/uiview.py +++ b/selfdrive/debug/uiview.py @@ -4,12 +4,13 @@ import time from cereal import car, log, messaging from openpilot.common.params import Params from openpilot.selfdrive.manager.process_config import managed_processes +from openpilot.system.hardware import HARDWARE if __name__ == "__main__": - CP = car.CarParams(notCar=True) + CP = car.CarParams(notCar=True, wheelbase=1, steerRatio=10) Params().put("CarParams", CP.to_bytes()) - procs = ['camerad', 'ui', 'modeld', 'calibrationd'] + procs = ['camerad', 'ui', 'modeld', 'calibrationd', 'plannerd', 'dmonitoringmodeld', 'dmonitoringd'] for p in procs: managed_processes[p].start() @@ -17,6 +18,7 @@ if __name__ == "__main__": msgs = {s: messaging.new_message(s) for s in ['controlsState', 'deviceState', 'carParams']} msgs['deviceState'].deviceState.started = True + msgs['deviceState'].deviceState.deviceType = HARDWARE.get_device_type() msgs['carParams'].carParams.openpilotLongitudinalControl = True msgs['pandaStates'] = messaging.new_message('pandaStates', 1) From b13456f81fdd6b0e83ba79e71f1f67fe6d220af9 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 25 Apr 2024 10:44:18 +0800 Subject: [PATCH 342/384] replay: shared decoder context (#32255) share decoder context cleanup includes --- tools/replay/framereader.cc | 152 ++++++++++++++++++++++-------------- tools/replay/framereader.h | 43 +++++----- tools/replay/route.cc | 2 +- 3 files changed, 120 insertions(+), 77 deletions(-) diff --git a/tools/replay/framereader.cc b/tools/replay/framereader.cc index fb70a82c40..26ef4684a4 100644 --- a/tools/replay/framereader.cc +++ b/tools/replay/framereader.cc @@ -1,5 +1,10 @@ #include "tools/replay/framereader.h" +#include +#include +#include +#include + #include "common/util.h" #include "third_party/libyuv/include/libyuv.h" #include "tools/replay/util.h" @@ -12,7 +17,6 @@ #define HW_PIX_FMT AV_PIX_FMT_CUDA #endif - namespace { enum AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts) { @@ -21,11 +25,32 @@ enum AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat * if (*p == *hw_pix_fmt) return *p; } rWarning("Please run replay with the --no-hw-decoder flag!"); - // fallback to YUV420p *hw_pix_fmt = AV_PIX_FMT_NONE; return AV_PIX_FMT_YUV420P; } +struct DecoderManager { + VideoDecoder *acquire(CameraType type, AVCodecParameters *codecpar, bool hw_decoder) { + auto key = std::tuple(type, codecpar->width, codecpar->height); + std::unique_lock lock(mutex_); + if (auto it = decoders_.find(key); it != decoders_.end()) { + return it->second.get(); + } + + auto decoder = std::make_unique(); + if (!decoder->open(codecpar, hw_decoder)) { + decoder.reset(nullptr); + } + decoders_[key] = std::move(decoder); + return decoders_[key].get(); + } + + std::mutex mutex_; + std::map, std::unique_ptr> decoders_; +}; + +DecoderManager decoder_manager; + } // namespace FrameReader::FrameReader() { @@ -33,12 +58,10 @@ FrameReader::FrameReader() { } FrameReader::~FrameReader() { - if (decoder_ctx) avcodec_free_context(&decoder_ctx); if (input_ctx) avformat_close_input(&input_ctx); - if (hw_device_ctx) av_buffer_unref(&hw_device_ctx); } -bool FrameReader::load(const std::string &url, bool no_hw_decoder, std::atomic *abort, bool local_cache, int chunk_size, int retries) { +bool FrameReader::load(CameraType type, const std::string &url, bool no_hw_decoder, std::atomic *abort, bool local_cache, int chunk_size, int retries) { auto local_file_path = url.find("https://") == 0 ? cacheFilePath(url) : url; if (!util::file_exists(local_file_path)) { FileReader f(local_cache, chunk_size, retries); @@ -46,10 +69,10 @@ bool FrameReader::load(const std::string &url, bool no_hw_decoder, std::atomic *abort) { +bool FrameReader::loadFromFile(CameraType type, const std::string &file, bool no_hw_decoder, std::atomic *abort) { if (avformat_open_input(&input_ctx, file.c_str(), nullptr, nullptr) != 0 || avformat_find_stream_info(input_ctx, nullptr) < 0) { rError("Failed to open input file or find video stream"); @@ -57,20 +80,57 @@ bool FrameReader::loadFromFile(const std::string &file, bool no_hw_decoder, std: } input_ctx->probesize = 10 * 1024 * 1024; // 10MB - AVStream *video = input_ctx->streams[0]; - const AVCodec *decoder = avcodec_find_decoder(video->codecpar->codec_id); + decoder_ = decoder_manager.acquire(type, input_ctx->streams[0]->codecpar, !no_hw_decoder); + if (!decoder_) { + return false; + } + width = decoder_->width; + height = decoder_->height; + + AVPacket pkt; + packets_info.reserve(60 * 20); // 20fps, one minute + while (!(abort && *abort) && av_read_frame(input_ctx, &pkt) == 0) { + packets_info.emplace_back(PacketInfo{.flags = pkt.flags, .pos = pkt.pos}); + av_packet_unref(&pkt); + } + avio_seek(input_ctx->pb, 0, SEEK_SET); + return !packets_info.empty(); +} + +bool FrameReader::get(int idx, VisionBuf *buf) { + if (!buf || idx < 0 || idx >= packets_info.size()) { + return false; + } + return decoder_->decode(this, idx, buf); +} + +// class VideoDecoder + +VideoDecoder::VideoDecoder() { + av_frame_ = av_frame_alloc(); + hw_frame_ = av_frame_alloc(); +} + +VideoDecoder::~VideoDecoder() { + if (hw_device_ctx) av_buffer_unref(&hw_device_ctx); + if (decoder_ctx) avcodec_free_context(&decoder_ctx); + av_frame_free(&av_frame_); + av_frame_free(&hw_frame_); +} + +bool VideoDecoder::open(AVCodecParameters *codecpar, bool hw_decoder) { + const AVCodec *decoder = avcodec_find_decoder(codecpar->codec_id); if (!decoder) return false; decoder_ctx = avcodec_alloc_context3(decoder); - if (!decoder_ctx || avcodec_parameters_to_context(decoder_ctx, video->codecpar) != 0) { + if (!decoder_ctx || avcodec_parameters_to_context(decoder_ctx, codecpar) != 0) { rError("Failed to allocate or initialize codec context"); return false; } - width = (decoder_ctx->width + 3) & ~3; height = decoder_ctx->height; - if (has_hw_decoder && !no_hw_decoder && !initHardwareDecoder(HW_DEVICE_TYPE)) { + if (hw_decoder && !initHardwareDecoder(HW_DEVICE_TYPE)) { rWarning("No device with hardware decoder found. fallback to CPU decoding."); } @@ -78,36 +138,25 @@ bool FrameReader::loadFromFile(const std::string &file, bool no_hw_decoder, std: rError("Failed to open codec"); return false; } - - AVPacket pkt; - packets_info.reserve(60 * 20); // 20fps, one minute - while (!(abort && *abort) && av_read_frame(input_ctx, &pkt) == 0) { - packets_info.emplace_back(PacketInfo{.flags = pkt.flags, .pos = pkt.pos}); - av_packet_unref(&pkt); - } - - avio_seek(input_ctx->pb, 0, SEEK_SET); - return !packets_info.empty(); + return true; } -bool FrameReader::initHardwareDecoder(AVHWDeviceType hw_device_type) { - for (int i = 0;; i++) { - const AVCodecHWConfig *config = avcodec_get_hw_config(decoder_ctx->codec, i); - if (!config) { - rWarning("decoder %s does not support hw device type %s.", decoder_ctx->codec->name, - av_hwdevice_get_type_name(hw_device_type)); - return false; - } +bool VideoDecoder::initHardwareDecoder(AVHWDeviceType hw_device_type) { + const AVCodecHWConfig *config = nullptr; + for (int i = 0; (config = avcodec_get_hw_config(decoder_ctx->codec, i)) != nullptr; i++) { if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX && config->device_type == hw_device_type) { hw_pix_fmt = config->pix_fmt; break; } } + if (!config) { + rWarning("Hardware configuration not found"); + return false; + } int ret = av_hwdevice_ctx_create(&hw_device_ctx, hw_device_type, nullptr, nullptr, 0); if (ret < 0) { hw_pix_fmt = AV_PIX_FMT_NONE; - has_hw_decoder = false; rWarning("Failed to create specified HW device %d.", ret); return false; } @@ -118,34 +167,27 @@ bool FrameReader::initHardwareDecoder(AVHWDeviceType hw_device_type) { return true; } -bool FrameReader::get(int idx, VisionBuf *buf) { - if (!buf || idx < 0 || idx >= packets_info.size()) { - return false; - } - return decode(idx, buf); -} - -bool FrameReader::decode(int idx, VisionBuf *buf) { +bool VideoDecoder::decode(FrameReader *reader, int idx, VisionBuf *buf) { int from_idx = idx; - if (idx != prev_idx + 1) { + if (idx != reader->prev_idx + 1) { // seeking to the nearest key frame for (int i = idx; i >= 0; --i) { - if (packets_info[i].flags & AV_PKT_FLAG_KEY) { + if (reader->packets_info[i].flags & AV_PKT_FLAG_KEY) { from_idx = i; break; } } - avio_seek(input_ctx->pb, packets_info[from_idx].pos, SEEK_SET); + avio_seek(reader->input_ctx->pb, reader->packets_info[from_idx].pos, SEEK_SET); } - prev_idx = idx; + reader->prev_idx = idx; bool result = false; AVPacket pkt; for (int i = from_idx; i <= idx; ++i) { - if (av_read_frame(input_ctx, &pkt) == 0) { + if (av_read_frame(reader->input_ctx, &pkt) == 0) { AVFrame *f = decodeFrame(&pkt); if (f && i == idx) { - result = copyBuffers(f, buf); + result = copyBuffer(f, buf); } av_packet_unref(&pkt); } @@ -153,33 +195,27 @@ bool FrameReader::decode(int idx, VisionBuf *buf) { return result; } -AVFrame *FrameReader::decodeFrame(AVPacket *pkt) { +AVFrame *VideoDecoder::decodeFrame(AVPacket *pkt) { int ret = avcodec_send_packet(decoder_ctx, pkt); if (ret < 0) { rError("Error sending a packet for decoding: %d", ret); return nullptr; } - av_frame_.reset(av_frame_alloc()); - ret = avcodec_receive_frame(decoder_ctx, av_frame_.get()); + ret = avcodec_receive_frame(decoder_ctx, av_frame_); if (ret != 0) { rError("avcodec_receive_frame error: %d", ret); return nullptr; } - if (av_frame_->format == hw_pix_fmt) { - hw_frame.reset(av_frame_alloc()); - if ((ret = av_hwframe_transfer_data(hw_frame.get(), av_frame_.get(), 0)) < 0) { - rError("error transferring the data from GPU to CPU"); - return nullptr; - } - return hw_frame.get(); - } else { - return av_frame_.get(); + if (av_frame_->format == hw_pix_fmt && av_hwframe_transfer_data(hw_frame_, av_frame_, 0) < 0) { + rError("error transferring frame data from GPU to CPU"); + return nullptr; } + return (av_frame_->format == hw_pix_fmt) ? hw_frame_ : av_frame_; } -bool FrameReader::copyBuffers(AVFrame *f, VisionBuf *buf) { +bool VideoDecoder::copyBuffer(AVFrame *f, VisionBuf *buf) { if (hw_pix_fmt == HW_PIX_FMT) { for (int i = 0; i < height/2; i++) { memcpy(buf->y + (i*2 + 0)*buf->stride, f->data[0] + (i*2 + 0)*f->linesize[0], width); diff --git a/tools/replay/framereader.h b/tools/replay/framereader.h index a25b508cc7..b9abefb7c3 100644 --- a/tools/replay/framereader.h +++ b/tools/replay/framereader.h @@ -1,10 +1,10 @@ #pragma once -#include #include #include #include "cereal/visionipc/visionbuf.h" +#include "system/camerad/cameras/camera_common.h" #include "tools/replay/filereader.h" extern "C" { @@ -12,39 +12,46 @@ extern "C" { #include } -struct AVFrameDeleter { - void operator()(AVFrame* frame) const { av_frame_free(&frame); } -}; +class VideoDecoder; class FrameReader { public: FrameReader(); ~FrameReader(); - bool load(const std::string &url, bool no_hw_decoder = false, std::atomic *abort = nullptr, bool local_cache = false, + bool load(CameraType type, const std::string &url, bool no_hw_decoder = false, std::atomic *abort = nullptr, bool local_cache = false, int chunk_size = -1, int retries = 0); - bool loadFromFile(const std::string &file, bool no_hw_decoder = false, std::atomic *abort = nullptr); + bool loadFromFile(CameraType type, const std::string &file, bool no_hw_decoder = false, std::atomic *abort = nullptr); bool get(int idx, VisionBuf *buf); size_t getFrameCount() const { return packets_info.size(); } int width = 0, height = 0; -private: - bool initHardwareDecoder(AVHWDeviceType hw_device_type); - bool decode(int idx, VisionBuf *buf); - AVFrame * decodeFrame(AVPacket *pkt); - bool copyBuffers(AVFrame *f, VisionBuf *buf); - - std::unique_ptrav_frame_, hw_frame; + VideoDecoder *decoder_ = nullptr; AVFormatContext *input_ctx = nullptr; - AVCodecContext *decoder_ctx = nullptr; - - AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE; - AVBufferRef *hw_device_ctx = nullptr; int prev_idx = -1; struct PacketInfo { int flags; int64_t pos; }; std::vector packets_info; - inline static std::atomic has_hw_decoder = true; +}; + + +class VideoDecoder { +public: + VideoDecoder(); + ~VideoDecoder(); + bool open(AVCodecParameters *codecpar, bool hw_decoder); + bool decode(FrameReader *reader, int idx, VisionBuf *buf); + int width = 0, height = 0; + +private: + bool initHardwareDecoder(AVHWDeviceType hw_device_type); + AVFrame *decodeFrame(AVPacket *pkt); + bool copyBuffer(AVFrame *f, VisionBuf *buf); + + AVFrame *av_frame_, *hw_frame_; + AVCodecContext *decoder_ctx = nullptr; + AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE; + AVBufferRef *hw_device_ctx = nullptr; }; diff --git a/tools/replay/route.cc b/tools/replay/route.cc index 1c7010eb8a..e8e73459ea 100644 --- a/tools/replay/route.cc +++ b/tools/replay/route.cc @@ -160,7 +160,7 @@ void Segment::loadFile(int id, const std::string file) { bool success = false; if (id < MAX_CAMERAS) { frames[id] = std::make_unique(); - success = frames[id]->load(file, flags & REPLAY_FLAG_NO_HW_DECODER, &abort_, local_cache, 20 * 1024 * 1024, 3); + success = frames[id]->load((CameraType)id, file, flags & REPLAY_FLAG_NO_HW_DECODER, &abort_, local_cache, 20 * 1024 * 1024, 3); } else { log = std::make_unique(filters_); success = log->load(file, &abort_, local_cache, 0, 3); From bbbd510fcc37b507010c9499edbb3622574dcf4b Mon Sep 17 00:00:00 2001 From: Mauricio Alvarez Leon <65101411+BBBmau@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:47:22 -0700 Subject: [PATCH 343/384] update pip/poetry versions (#32289) --- tools/install_python_dependencies.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/install_python_dependencies.sh b/tools/install_python_dependencies.sh index f7ba316480..df815b582f 100755 --- a/tools/install_python_dependencies.sh +++ b/tools/install_python_dependencies.sh @@ -54,8 +54,8 @@ fi eval "$(pyenv init --path)" echo "update pip" -pip install pip==23.3 -pip install poetry==1.6.1 +pip install pip==24.0 +pip install poetry==1.7.0 poetry config virtualenvs.prefer-active-python true --local poetry config virtualenvs.in-project true --local From 06c4a541da5ec703074024e75ab11713f3da39fd Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 25 Apr 2024 11:14:42 +0800 Subject: [PATCH 344/384] ui/map: check valid before accessing `PositionECEF` (#31961) check valid --- selfdrive/ui/qt/maps/map.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc index 664364e04f..5f178e9f8f 100644 --- a/selfdrive/ui/qt/maps/map.cc +++ b/selfdrive/ui/qt/maps/map.cc @@ -123,12 +123,15 @@ void MapWindow::updateState(const UIState &s) { auto locationd_pos = locationd_location.getPositionGeodetic(); auto locationd_orientation = locationd_location.getCalibratedOrientationNED(); auto locationd_velocity = locationd_location.getVelocityCalibrated(); + auto locationd_ecef = locationd_location.getPositionECEF(); - // Check std norm - auto pos_ecef_std = locationd_location.getPositionECEF().getStd(); - bool pos_accurate_enough = sqrt(pow(pos_ecef_std[0], 2) + pow(pos_ecef_std[1], 2) + pow(pos_ecef_std[2], 2)) < 100; - - locationd_valid = (locationd_pos.getValid() && locationd_orientation.getValid() && locationd_velocity.getValid() && pos_accurate_enough); + locationd_valid = (locationd_pos.getValid() && locationd_orientation.getValid() && locationd_velocity.getValid() && locationd_ecef.getValid()); + if (locationd_valid) { + // Check std norm + auto pos_ecef_std = locationd_ecef.getStd(); + bool pos_accurate_enough = sqrt(pow(pos_ecef_std[0], 2) + pow(pos_ecef_std[1], 2) + pow(pos_ecef_std[2], 2)) < 100; + locationd_valid = pos_accurate_enough; + } if (locationd_valid) { last_position = QMapLibre::Coordinate(locationd_pos.getValue()[0], locationd_pos.getValue()[1]); From 3bcb6f82afa47405d70a3cfd6bfe7eab2fceb1b4 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 25 Apr 2024 11:15:37 +0800 Subject: [PATCH 345/384] ui/network: add error handling for refreshFinished (#32167) --- selfdrive/ui/qt/network/wifi_manager.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/network/wifi_manager.cc b/selfdrive/ui/qt/network/wifi_manager.cc index 0c50d02f4f..c7991990eb 100644 --- a/selfdrive/ui/qt/network/wifi_manager.cc +++ b/selfdrive/ui/qt/network/wifi_manager.cc @@ -99,10 +99,20 @@ void WifiManager::refreshFinished(QDBusPendingCallWatcher *watcher) { seenNetworks.clear(); const QDBusReply> watcher_reply = *watcher; + if (!watcher_reply.isValid()) { + qCritical() << "Failed to refresh"; + watcher->deleteLater(); + return; + } + for (const QDBusObjectPath &path : watcher_reply.value()) { QDBusReply reply = call(path.path(), NM_DBUS_INTERFACE_PROPERTIES, "GetAll", NM_DBUS_INTERFACE_ACCESS_POINT); - auto properties = reply.value(); + if (!reply.isValid()) { + qCritical() << "Failed to retrieve properties for path:" << path.path(); + continue; + } + auto properties = reply.value(); const QByteArray ssid = properties["Ssid"].toByteArray(); if (ssid.isEmpty()) continue; From d7d378aeefb10b9194e14534b075615216b117af Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 25 Apr 2024 11:16:02 +0800 Subject: [PATCH 346/384] ui/network: add error handing for dbus `call` (#32164) --- selfdrive/ui/qt/network/wifi_manager.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/selfdrive/ui/qt/network/wifi_manager.cc b/selfdrive/ui/qt/network/wifi_manager.cc index c7991990eb..717da47096 100644 --- a/selfdrive/ui/qt/network/wifi_manager.cc +++ b/selfdrive/ui/qt/network/wifi_manager.cc @@ -1,5 +1,7 @@ #include "selfdrive/ui/qt/network/wifi_manager.h" +#include + #include "selfdrive/ui/ui.h" #include "selfdrive/ui/qt/widgets/prime.h" @@ -14,9 +16,15 @@ bool compare_by_strength(const Network &a, const Network &b) { template T call(const QString &path, const QString &interface, const QString &method, Args &&...args) { - QDBusInterface nm = QDBusInterface(NM_DBUS_SERVICE, path, interface, QDBusConnection::systemBus()); + QDBusInterface nm(NM_DBUS_SERVICE, path, interface, QDBusConnection::systemBus()); nm.setTimeout(DBUS_TIMEOUT); - QDBusMessage response = nm.call(method, args...); + + QDBusMessage response = nm.call(method, std::forward(args)...); + if (response.type() == QDBusMessage::ErrorMessage) { + qCritical() << "DBus call error:" << response.errorMessage(); + return T(); + } + if constexpr (std::is_same_v) { return response; } else if (response.arguments().count() >= 1) { From 3efd0ff4fa504b699171ec967dce6bef9f78baa4 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 26 Apr 2024 01:35:49 +0800 Subject: [PATCH 347/384] cabana: increase cache limits (#32295) --- tools/cabana/settings.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/cabana/settings.cc b/tools/cabana/settings.cc index b63789a026..523cbf3be7 100644 --- a/tools/cabana/settings.cc +++ b/tools/cabana/settings.cc @@ -12,6 +12,9 @@ #include "tools/cabana/utils/util.h" +const int MIN_CACHE_MINIUTES = 30; +const int MAX_CACHE_MINIUTES = 120; + Settings settings; template @@ -72,7 +75,7 @@ SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) { fps->setValue(settings.fps); form_layout->addRow(tr("Max Cached Minutes"), cached_minutes = new QSpinBox(this)); - cached_minutes->setRange(5, 60); + cached_minutes->setRange(MIN_CACHE_MINIUTES, MAX_CACHE_MINIUTES); cached_minutes->setSingleStep(1); cached_minutes->setValue(settings.max_cached_minutes); main_layout->addWidget(groupbox); From 7e6dda546ee58d4cf05352f9ff9fab97b3e9464f Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 26 Apr 2024 02:05:45 +0800 Subject: [PATCH 348/384] ui/cameraview: merge EGL Image Clearing code into `clearEGLImages()` (#32292) --- selfdrive/ui/qt/widgets/cameraview.cc | 37 ++++++++++----------------- selfdrive/ui/qt/widgets/cameraview.h | 1 + 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/selfdrive/ui/qt/widgets/cameraview.cc b/selfdrive/ui/qt/widgets/cameraview.cc index e4f1396268..16a5ffbf07 100644 --- a/selfdrive/ui/qt/widgets/cameraview.cc +++ b/selfdrive/ui/qt/widgets/cameraview.cc @@ -6,14 +6,6 @@ #include #endif -#include -#include -#include -#include - -#include -#include - namespace { const char frame_vertex_shader[] = @@ -197,15 +189,7 @@ void CameraWidget::stopVipcThread() { vipc_thread = nullptr; } -#ifdef QCOM2 - EGLDisplay egl_display = eglGetCurrentDisplay(); - assert(egl_display != EGL_NO_DISPLAY); - for (auto &pair : egl_images) { - eglDestroyImageKHR(egl_display, pair.second); - assert(eglGetError() == EGL_SUCCESS); - } - egl_images.clear(); -#endif + clearEGLImages(); } void CameraWidget::availableStreamsUpdated(std::set streams) { @@ -336,12 +320,7 @@ void CameraWidget::vipcConnected(VisionIpcClient *vipc_client) { stream_stride = vipc_client->buffers[0].stride; #ifdef QCOM2 - EGLDisplay egl_display = eglGetCurrentDisplay(); - assert(egl_display != EGL_NO_DISPLAY); - for (auto &pair : egl_images) { - eglDestroyImageKHR(egl_display, pair.second); - } - egl_images.clear(); + clearEGLImages(); for (int i = 0; i < vipc_client->num_buffers; i++) { // import buffers into OpenGL int fd = dup(vipc_client->buffers[i].fd); // eglDestroyImageKHR will close, so duplicate @@ -435,3 +414,15 @@ void CameraWidget::clearFrames() { frames.clear(); available_streams.clear(); } + + +void CameraWidget::clearEGLImages() { +#ifdef QCOM2 + EGLDisplay egl_display = eglGetCurrentDisplay(); + assert(egl_display != EGL_NO_DISPLAY); + for (auto &pair : egl_images) { + eglDestroyImageKHR(egl_display, pair.second); + } + egl_images.clear(); +#endif +} diff --git a/selfdrive/ui/qt/widgets/cameraview.h b/selfdrive/ui/qt/widgets/cameraview.h index c97038cf43..4f1cbede69 100644 --- a/selfdrive/ui/qt/widgets/cameraview.h +++ b/selfdrive/ui/qt/widgets/cameraview.h @@ -58,6 +58,7 @@ protected: void updateCalibration(const mat3 &calib); void vipcThread(); void clearFrames(); + void clearEGLImages(); int glWidth(); int glHeight(); From edb683a62bf0944974d9c781b3fe1ab4daba739b Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 26 Apr 2024 02:08:27 +0800 Subject: [PATCH 349/384] camerad: Localizing the variable "ret" (#32294) Localizing the variable "ret" --- system/camerad/cameras/camera_qcom2.cc | 16 +++++----------- system/camerad/cameras/camera_util.cc | 3 +-- system/camerad/main.cc | 3 +-- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/system/camerad/cameras/camera_qcom2.cc b/system/camerad/cameras/camera_qcom2.cc index 081279d38d..096e288cc2 100644 --- a/system/camerad/cameras/camera_qcom2.cc +++ b/system/camerad/cameras/camera_qcom2.cc @@ -31,8 +31,7 @@ int CameraState::clear_req_queue() { req_mgr_flush_request.session_hdl = session_handle; req_mgr_flush_request.link_hdl = link_handle; req_mgr_flush_request.flush_type = CAM_REQ_MGR_FLUSH_TYPE_ALL; - int ret; - ret = do_cam_control(multi_cam_state->video0_fd, CAM_REQ_MGR_FLUSH_REQ, &req_mgr_flush_request, sizeof(req_mgr_flush_request)); + int ret = do_cam_control(multi_cam_state->video0_fd, CAM_REQ_MGR_FLUSH_REQ, &req_mgr_flush_request, sizeof(req_mgr_flush_request)); // LOGD("flushed all req: %d", ret); return ret; } @@ -470,7 +469,6 @@ void CameraState::camera_open(MultiCameraState *multi_cam_state_, int camera_num enabled = enabled_; if (!enabled) return; - int ret; sensor_fd = open_v4l_by_name_and_index("cam-sensor-driver", camera_num); assert(sensor_fd >= 0); LOGD("opened sensor for %d", camera_num); @@ -501,7 +499,7 @@ void CameraState::camera_open(MultiCameraState *multi_cam_state_, int camera_num // create session struct cam_req_mgr_session_info session_info = {}; - ret = do_cam_control(multi_cam_state->video0_fd, CAM_REQ_MGR_CREATE_SESSION, &session_info, sizeof(session_info)); + int ret = do_cam_control(multi_cam_state->video0_fd, CAM_REQ_MGR_CREATE_SESSION, &session_info, sizeof(session_info)); LOGD("get session: %d 0x%X", ret, session_info.session_hdl); session_handle = session_info.session_hdl; @@ -654,8 +652,6 @@ void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_i } void cameras_open(MultiCameraState *s) { - int ret; - LOG("-- Opening devices"); // video0 is req_mgr, the target of many ioctls s->video0_fd = HANDLE_EINTR(open("/dev/v4l/by-path/platform-soc:qcom_cam-req-mgr-video-index0", O_RDWR | O_NONBLOCK)); @@ -679,7 +675,7 @@ void cameras_open(MultiCameraState *s) { query_cap_cmd.handle_type = 1; query_cap_cmd.caps_handle = (uint64_t)&isp_query_cap_cmd; query_cap_cmd.size = sizeof(isp_query_cap_cmd); - ret = do_cam_control(s->isp_fd, CAM_QUERY_CAP, &query_cap_cmd, sizeof(query_cap_cmd)); + int ret = do_cam_control(s->isp_fd, CAM_QUERY_CAP, &query_cap_cmd, sizeof(query_cap_cmd)); assert(ret == 0); LOGD("using MMU handle: %x", isp_query_cap_cmd.device_iommu.non_secure); LOGD("using MMU handle: %x", isp_query_cap_cmd.cdm_iommu.non_secure); @@ -703,15 +699,13 @@ void cameras_open(MultiCameraState *s) { } void CameraState::camera_close() { - int ret; - // stop devices LOG("-- Stop devices %d", camera_num); if (enabled) { // ret = device_control(sensor_fd, CAM_STOP_DEV, session_handle, sensor_dev_handle); // LOGD("stop sensor: %d", ret); - ret = device_control(multi_cam_state->isp_fd, CAM_STOP_DEV, session_handle, isp_dev_handle); + int ret = device_control(multi_cam_state->isp_fd, CAM_STOP_DEV, session_handle, isp_dev_handle); LOGD("stop isp: %d", ret); ret = device_control(csiphy_fd, CAM_STOP_DEV, session_handle, csiphy_dev_handle); LOGD("stop csiphy: %d", ret); @@ -746,7 +740,7 @@ void CameraState::camera_close() { LOGD("released buffers"); } - ret = device_control(sensor_fd, CAM_RELEASE_DEV, session_handle, sensor_dev_handle); + int ret = device_control(sensor_fd, CAM_RELEASE_DEV, session_handle, sensor_dev_handle); LOGD("release sensor: %d", ret); // destroyed session diff --git a/system/camerad/cameras/camera_util.cc b/system/camerad/cameras/camera_util.cc index 4fe38997ce..7bd23fd9fe 100644 --- a/system/camerad/cameras/camera_util.cc +++ b/system/camerad/cameras/camera_util.cc @@ -86,11 +86,10 @@ void *alloc_w_mmu_hdl(int video0_fd, int len, uint32_t *handle, int align, int f } void release(int video0_fd, uint32_t handle) { - int ret; struct cam_mem_mgr_release_cmd mem_mgr_release_cmd = {0}; mem_mgr_release_cmd.buf_handle = handle; - ret = do_cam_control(video0_fd, CAM_REQ_MGR_RELEASE_BUF, &mem_mgr_release_cmd, sizeof(mem_mgr_release_cmd)); + int ret = do_cam_control(video0_fd, CAM_REQ_MGR_RELEASE_BUF, &mem_mgr_release_cmd, sizeof(mem_mgr_release_cmd)); assert(ret == 0); } diff --git a/system/camerad/main.cc b/system/camerad/main.cc index 19de21c9bb..b86b4f57ff 100644 --- a/system/camerad/main.cc +++ b/system/camerad/main.cc @@ -12,8 +12,7 @@ int main(int argc, char *argv[]) { return 0; } - int ret; - ret = util::set_realtime_priority(53); + int ret = util::set_realtime_priority(53); assert(ret == 0); ret = util::set_core_affinity({6}); assert(ret == 0 || Params().getBool("IsOffroad")); // failure ok while offroad due to offlining cores From d56f188854135ff4d1cf2cb6bf184a8301a82edd Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 25 Apr 2024 11:14:03 -0700 Subject: [PATCH 350/384] Revert "ui/cameraview: merge EGL Image Clearing code into `clearEGLImages()` (#32292)" This reverts commit 7e6dda546ee58d4cf05352f9ff9fab97b3e9464f. --- selfdrive/ui/qt/widgets/cameraview.cc | 37 +++++++++++++++++---------- selfdrive/ui/qt/widgets/cameraview.h | 1 - 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/selfdrive/ui/qt/widgets/cameraview.cc b/selfdrive/ui/qt/widgets/cameraview.cc index 16a5ffbf07..e4f1396268 100644 --- a/selfdrive/ui/qt/widgets/cameraview.cc +++ b/selfdrive/ui/qt/widgets/cameraview.cc @@ -6,6 +6,14 @@ #include #endif +#include +#include +#include +#include + +#include +#include + namespace { const char frame_vertex_shader[] = @@ -189,7 +197,15 @@ void CameraWidget::stopVipcThread() { vipc_thread = nullptr; } - clearEGLImages(); +#ifdef QCOM2 + EGLDisplay egl_display = eglGetCurrentDisplay(); + assert(egl_display != EGL_NO_DISPLAY); + for (auto &pair : egl_images) { + eglDestroyImageKHR(egl_display, pair.second); + assert(eglGetError() == EGL_SUCCESS); + } + egl_images.clear(); +#endif } void CameraWidget::availableStreamsUpdated(std::set streams) { @@ -320,7 +336,12 @@ void CameraWidget::vipcConnected(VisionIpcClient *vipc_client) { stream_stride = vipc_client->buffers[0].stride; #ifdef QCOM2 - clearEGLImages(); + EGLDisplay egl_display = eglGetCurrentDisplay(); + assert(egl_display != EGL_NO_DISPLAY); + for (auto &pair : egl_images) { + eglDestroyImageKHR(egl_display, pair.second); + } + egl_images.clear(); for (int i = 0; i < vipc_client->num_buffers; i++) { // import buffers into OpenGL int fd = dup(vipc_client->buffers[i].fd); // eglDestroyImageKHR will close, so duplicate @@ -414,15 +435,3 @@ void CameraWidget::clearFrames() { frames.clear(); available_streams.clear(); } - - -void CameraWidget::clearEGLImages() { -#ifdef QCOM2 - EGLDisplay egl_display = eglGetCurrentDisplay(); - assert(egl_display != EGL_NO_DISPLAY); - for (auto &pair : egl_images) { - eglDestroyImageKHR(egl_display, pair.second); - } - egl_images.clear(); -#endif -} diff --git a/selfdrive/ui/qt/widgets/cameraview.h b/selfdrive/ui/qt/widgets/cameraview.h index 4f1cbede69..c97038cf43 100644 --- a/selfdrive/ui/qt/widgets/cameraview.h +++ b/selfdrive/ui/qt/widgets/cameraview.h @@ -58,7 +58,6 @@ protected: void updateCalibration(const mat3 &calib); void vipcThread(); void clearFrames(); - void clearEGLImages(); int glWidth(); int glHeight(); From 98ff2dd76e867a4b0a959bc4f4206076f7546937 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 26 Apr 2024 14:16:13 -0700 Subject: [PATCH 351/384] [bot] Fingerprints: add missing FW versions from new users (#32300) Export fingerprints --- selfdrive/car/toyota/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 7719649a46..a57e58fbb7 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1037,6 +1037,7 @@ FW_VERSIONS = { b'\x02896634A13001\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', b'\x02896634A13101\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', b'\x02896634A13201\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896634A14001\x00\x00\x00\x00897CF0R01000\x00\x00\x00\x00', b'\x02896634A14001\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00', b'\x02896634A14001\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', b'\x02896634A14101\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', From 5783bdc513bcc9d1606b07c4adacb49236e04fb0 Mon Sep 17 00:00:00 2001 From: Jack Merrill <8814123+jackmerrill@users.noreply.github.com> Date: Fri, 26 Apr 2024 19:07:17 -0400 Subject: [PATCH 352/384] Subaru: Increase RPM Limit (#32299) Increase the Subaru RPM limit in values.py, update panda submodule --- panda | 2 +- selfdrive/car/subaru/values.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/panda b/panda index 4d60ae9c62..d4a01f7555 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 4d60ae9c6202be1b277a03cbb670c7f2639ad7cd +Subproject commit d4a01f75554e636770ad7baa0c267deeb2c5f84f diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 0542635370..e8ced2b9af 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -38,7 +38,7 @@ class CarControllerParams: BRAKE_MAX = 600 # about -3.5m/s2 from testing RPM_MIN = 0 - RPM_MAX = 2400 + RPM_MAX = 3600 RPM_INACTIVE = 600 # a good base rpm for zero acceleration From adabd108e26767e6ed7ff6168d16742641281509 Mon Sep 17 00:00:00 2001 From: Armand du Parc Locmaria Date: Fri, 26 Apr 2024 20:04:10 -0700 Subject: [PATCH 353/384] commabody: ignore fcw alerts (#32301) * ignore modelV2 and longitudinalPlan on the body to avoid fcw alerts * move joystick_mode up because ignore depends on it * revert and ignore fcw itself instead --- selfdrive/controls/controlsd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 72f1514d88..13d7b25b29 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -369,7 +369,7 @@ class Controls: stock_long_is_braking = self.enabled and not self.CP.openpilotLongitudinalControl and CS.aEgo < -1.25 model_fcw = self.sm['modelV2'].meta.hardBrakePredicted and not CS.brakePressed and not stock_long_is_braking planner_fcw = self.sm['longitudinalPlan'].fcw and self.enabled - if planner_fcw or model_fcw: + if (planner_fcw or model_fcw) and not (self.CP.notCar and self.joystick_mode): self.events.add(EventName.fcw) for m in messaging.drain_sock(self.log_sock, wait_for_one=False): From 37877185f812321ecf3c8b5e787838d9b9204b75 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sun, 28 Apr 2024 07:31:48 +0800 Subject: [PATCH 354/384] cabana: show enum string in chart tooltip (#32303) --- tools/cabana/chart/chart.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cabana/chart/chart.cc b/tools/cabana/chart/chart.cc index dd34782e33..ce52825ac5 100644 --- a/tools/cabana/chart/chart.cc +++ b/tools/cabana/chart/chart.cc @@ -581,7 +581,7 @@ void ChartView::showTip(double sec) { // use reverse iterator to find last item <= sec. auto it = std::lower_bound(s.vals.crbegin(), s.vals.crend(), sec, [](auto &p, double x) { return p.x() > x; }); if (it != s.vals.crend() && it->x() >= axis_x->min()) { - value = QString::number(it->y()); + value = s.sig->formatValue(it->y(), false); s.track_pt = *it; x = std::max(x, chart()->mapToPosition(*it).x()); } From 3e1617deaacc3a03e5b79dc9b432dddb877edc61 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 28 Apr 2024 14:14:55 -0700 Subject: [PATCH 355/384] bump submodules - ubuntu 24.04 (#32312) --- body | 2 +- cereal | 2 +- opendbc | 2 +- rednose_repo | 2 +- teleoprtc_repo | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/body b/body index 61ace31efa..864c5449ef 160000 --- a/body +++ b/body @@ -1 +1 @@ -Subproject commit 61ace31efad27ae0d6d86888842f82bc92545e72 +Subproject commit 864c5449ef4f339589366f5abbfc2d2211e010dd diff --git a/cereal b/cereal index db1359ec22..861144c136 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit db1359ec22f6ab60c6e76abc4531bc843345d6b5 +Subproject commit 861144c136c91f70dcbc652c2ffe99f57440ad47 diff --git a/opendbc b/opendbc index 83884c2b20..e0d4be4a62 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 83884c2b2022e4a16ae535d1ed72aca4711324b7 +Subproject commit e0d4be4a6215d44809718dc84efe1b9f0299ad63 diff --git a/rednose_repo b/rednose_repo index 1dc61a60e6..24c50f57bb 160000 --- a/rednose_repo +++ b/rednose_repo @@ -1 +1 @@ -Subproject commit 1dc61a60e684b4bc8c591a8bce7e24e02aa8f400 +Subproject commit 24c50f57bb4247322560da6cfa585cfc035d9824 diff --git a/teleoprtc_repo b/teleoprtc_repo index 3116a5053b..f2e5a6dd9e 160000 --- a/teleoprtc_repo +++ b/teleoprtc_repo @@ -1 +1 @@ -Subproject commit 3116a5053bc22b912254f1f7000ab9e267916cd5 +Subproject commit f2e5a6dd9e13a184b2f0e95a6c8afd308ec2da89 From 1b0ce23bbe0a63a5aec04e901fa5bfcd4bea64f0 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 28 Apr 2024 15:33:37 -0700 Subject: [PATCH 356/384] bump panda; ubuntu 24.04 --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index d4a01f7555..53e0f13739 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit d4a01f75554e636770ad7baa0c267deeb2c5f84f +Subproject commit 53e0f13739e920f6d2f1cd1bdf6a5676c01be3e8 From a44add160e206aa87a2996372860846cc54ca29c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 28 Apr 2024 16:24:04 -0700 Subject: [PATCH 357/384] prep for ubuntu 24.04 (#32307) * update to ubuntu 24.04 * latest * revert those * fix that * vla * try that * fix uid * keep 20.04 support * just prep for now --- .github/ISSUE_TEMPLATE/pc_bug_report.yml | 2 +- .github/workflows/badges.yaml | 2 +- .github/workflows/docs.yaml | 2 +- .github/workflows/prebuilt.yaml | 2 +- .github/workflows/release.yaml | 2 +- .github/workflows/repo-maintenance.yaml | 4 ++-- .github/workflows/selfdrive_tests.yaml | 26 ++++++++++++------------ .github/workflows/tools_tests.yaml | 6 +++--- SConstruct | 1 + tools/install_ubuntu_dependencies.sh | 13 +++++------- 10 files changed, 29 insertions(+), 31 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/pc_bug_report.yml b/.github/ISSUE_TEMPLATE/pc_bug_report.yml index db3eb22e5c..761c8b1a0a 100644 --- a/.github/ISSUE_TEMPLATE/pc_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/pc_bug_report.yml @@ -24,7 +24,7 @@ body: id: os-version attributes: label: OS Version - placeholder: Ubuntu 20.04 + placeholder: Ubuntu 24.04 validations: required: true diff --git a/.github/workflows/badges.yaml b/.github/workflows/badges.yaml index 2f1a7d67c4..cf8bdc7109 100644 --- a/.github/workflows/badges.yaml +++ b/.github/workflows/badges.yaml @@ -12,7 +12,7 @@ env: jobs: badges: name: create badges - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.repository == 'commaai/openpilot' permissions: contents: write diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index c555eafc73..a32989f7d0 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -20,7 +20,7 @@ env: jobs: docs: name: build docs - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest timeout-minutes: 45 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/prebuilt.yaml b/.github/workflows/prebuilt.yaml index 3fdf6db202..d8963ec89f 100644 --- a/.github/workflows/prebuilt.yaml +++ b/.github/workflows/prebuilt.yaml @@ -11,7 +11,7 @@ env: jobs: build_prebuilt: name: build prebuilt - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.repository == 'commaai/openpilot' env: PUSH_IMAGE: true diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 346c3e85ef..34e333bb59 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -12,7 +12,7 @@ jobs: ImageOS: ubuntu20 container: image: ghcr.io/commaai/openpilot-base:latest - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.repository == 'commaai/openpilot' permissions: checks: read diff --git a/.github/workflows/repo-maintenance.yaml b/.github/workflows/repo-maintenance.yaml index 67f6849588..f359f63d1b 100644 --- a/.github/workflows/repo-maintenance.yaml +++ b/.github/workflows/repo-maintenance.yaml @@ -8,7 +8,7 @@ on: jobs: bump_submodules: name: bump_submodules - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest container: image: ghcr.io/commaai/openpilot-base:latest if: github.repository == 'commaai/openpilot' @@ -34,7 +34,7 @@ jobs: labels: bot package_updates: name: package_updates - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest container: image: ghcr.io/commaai/openpilot-base:latest if: github.repository == 'commaai/openpilot' diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 30ae4da783..2be83b1654 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -26,7 +26,7 @@ env: jobs: build_release: name: build release - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest env: STRIPPED_DIR: /tmp/releasepilot steps: @@ -71,7 +71,7 @@ jobs: ((github.repository == 'commaai/openpilot') && ((github.event_name != 'pull_request') || (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && '["x86_64", "aarch64"]' || '["x86_64"]' ) }} - runs-on: ${{ (matrix.arch == 'aarch64') && 'namespace-profile-arm64-2x8' || 'ubuntu-20.04' }} + runs-on: ${{ (matrix.arch == 'aarch64') && 'namespace-profile-arm64-2x8' || 'ubuntu-latest' }} steps: - uses: actions/checkout@v4 with: @@ -87,7 +87,7 @@ jobs: strategy: matrix: arch: ${{ fromJson( (github.repository == 'commaai/openpilot') && '["x86_64", "aarch64"]' || '["x86_64"]' ) }} - runs-on: ${{ (matrix.arch == 'aarch64') && 'namespace-profile-arm64-2x8' || 'ubuntu-20.04' }} + runs-on: ${{ (matrix.arch == 'aarch64') && 'namespace-profile-arm64-2x8' || 'ubuntu-latest' }} if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' && github.repository == 'commaai/openpilot' steps: - uses: actions/checkout@v4 @@ -104,7 +104,7 @@ jobs: docker_push_multiarch: name: docker push multiarch tag - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' && github.repository == 'commaai/openpilot' needs: [docker_push] steps: @@ -123,7 +123,7 @@ jobs: name: static analysis runs-on: ${{ ((github.repository == 'commaai/openpilot') && ((github.event_name != 'pull_request') || - (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }} + (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-latest' }} steps: - uses: actions/checkout@v4 with: @@ -136,7 +136,7 @@ jobs: valgrind: name: valgrind - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: @@ -156,7 +156,7 @@ jobs: name: unit tests runs-on: ${{ ((github.repository == 'commaai/openpilot') && ((github.event_name != 'pull_request') || - (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }} + (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-latest' }} steps: - uses: actions/checkout@v4 with: @@ -187,7 +187,7 @@ jobs: name: process replay runs-on: ${{ ((github.repository == 'commaai/openpilot') && ((github.event_name != 'pull_request') || - (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }} + (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-latest' }} steps: - uses: actions/checkout@v4 with: @@ -234,7 +234,7 @@ jobs: regen: name: regen - runs-on: 'ubuntu-20.04' + runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v4 with: @@ -259,7 +259,7 @@ jobs: test_modeld: name: model tests - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: @@ -294,7 +294,7 @@ jobs: name: cars runs-on: ${{ ((github.repository == 'commaai/openpilot') && ((github.event_name != 'pull_request') || - (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }} + (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-latest' }} strategy: fail-fast: false matrix: @@ -329,7 +329,7 @@ jobs: car_docs_diff: name: PR comments - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.event_name == 'pull_request' steps: - uses: actions/checkout@v4 @@ -383,7 +383,7 @@ jobs: create_ui_report: name: Create UI Report - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/tools_tests.yaml b/.github/workflows/tools_tests.yaml index ff0e29e9e2..89c3efbac6 100644 --- a/.github/workflows/tools_tests.yaml +++ b/.github/workflows/tools_tests.yaml @@ -22,7 +22,7 @@ env: jobs: plotjuggler: name: plotjuggler - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest timeout-minutes: 45 steps: - uses: actions/checkout@v4 @@ -39,7 +39,7 @@ jobs: simulator: name: simulator - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.repository == 'commaai/openpilot' timeout-minutes: 45 steps: @@ -85,7 +85,7 @@ jobs: notebooks: name: notebooks - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: false && github.repository == 'commaai/openpilot' timeout-minutes: 45 steps: diff --git a/SConstruct b/SConstruct index 4db1392a74..1e9f2a6b5a 100644 --- a/SConstruct +++ b/SConstruct @@ -193,6 +193,7 @@ env = Environment( "-Wno-c99-designator", "-Wno-reorder-init-list", "-Wno-error=unused-but-set-variable", + "-Wno-vla-cxx-extension", ] + cflags + ccflags, CPPPATH=cpppath + [ diff --git a/tools/install_ubuntu_dependencies.sh b/tools/install_ubuntu_dependencies.sh index 28e6bf8ccf..75d19141b6 100755 --- a/tools/install_ubuntu_dependencies.sh +++ b/tools/install_ubuntu_dependencies.sh @@ -81,7 +81,7 @@ function install_ubuntu_common_requirements() { valgrind } -# Install Ubuntu 22.04 LTS packages +# Install Ubuntu 24.04 LTS packages function install_ubuntu_lts_latest_requirements() { install_ubuntu_common_requirements @@ -108,10 +108,7 @@ function install_ubuntu_focal_requirements() { if [ -f "/etc/os-release" ]; then source /etc/os-release case "$VERSION_CODENAME" in - "jammy") - install_ubuntu_lts_latest_requirements - ;; - "kinetic") + "jammy" | "kinetic" | "noble") install_ubuntu_lts_latest_requirements ;; "focal") @@ -124,10 +121,10 @@ if [ -f "/etc/os-release" ]; then if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1 fi - if [ "$UBUNTU_CODENAME" = "jammy" ] || [ "$UBUNTU_CODENAME" = "kinetic" ]; then - install_ubuntu_lts_latest_requirements - else + if [ "$UBUNTU_CODENAME" = "focal" ]; then install_ubuntu_focal_requirements + else + install_ubuntu_lts_latest_requirements fi esac else From 45c021955ac463eb16600d6e1a3b33a83d1010e7 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 29 Apr 2024 08:53:24 -0700 Subject: [PATCH 358/384] [bot] Fingerprints: add missing FW versions from new users (#32315) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 76d04d2e36..95f878a5b6 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -439,6 +439,7 @@ FW_VERSIONS = { b'68292406AG', b'68292406AH', b'68432418AB', + b'68432418AC', b'68432418AD', b'68436004AD', b'68436004AE', @@ -520,6 +521,7 @@ FW_VERSIONS = { b'68378702AI ', b'68378710AL ', b'68378742AI ', + b'68378742AK ', b'68378748AL ', b'68378758AM ', b'68448163AJ', @@ -569,6 +571,7 @@ FW_VERSIONS = { b'68360085AJ', b'68360085AL', b'68360086AH', + b'68360086AK', b'68384328AD', b'68384332AD', b'68445531AC', From 82f7ab8f7dc79ae581c0066c178f430dd13d3bd3 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 29 Apr 2024 09:00:12 -0700 Subject: [PATCH 359/384] CI: set bot PR author --- .github/workflows/repo-maintenance.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/repo-maintenance.yaml b/.github/workflows/repo-maintenance.yaml index f359f63d1b..0e6606112b 100644 --- a/.github/workflows/repo-maintenance.yaml +++ b/.github/workflows/repo-maintenance.yaml @@ -24,6 +24,7 @@ jobs: - name: Create Pull Request uses: peter-evans/create-pull-request@9153d834b60caba6d51c9b9510b087acf9f33f83 with: + author: Vehicle Researcher token: ${{ secrets.ACTIONS_CREATE_PR_PAT }} commit-message: bump submodules title: '[bot] Bump submodules' @@ -51,6 +52,7 @@ jobs: - name: Create Pull Request uses: peter-evans/create-pull-request@9153d834b60caba6d51c9b9510b087acf9f33f83 with: + author: Vehicle Researcher token: ${{ secrets.ACTIONS_CREATE_PR_PAT }} commit-message: Update Python packages and pre-commit hooks title: '[bot] Update Python packages and pre-commit hooks' From fa7edadaa7113387bd107aab568f23176975c3a3 Mon Sep 17 00:00:00 2001 From: commaci-public <60409688+commaci-public@users.noreply.github.com> Date: Mon, 29 Apr 2024 09:10:03 -0700 Subject: [PATCH 360/384] [bot] Update Python packages and pre-commit hooks (#32314) Update Python packages and pre-commit hooks Co-authored-by: Vehicle Researcher --- .pre-commit-config.yaml | 2 +- poetry.lock | 306 ++++++++++++++++++++-------------------- 2 files changed, 157 insertions(+), 151 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ec3ec96794..d17fe6b7db 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: - -L bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints - --builtins clear,rare,informal,usage,code,names,en-GB_to_en-US - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.1 + rev: v0.4.2 hooks: - id: ruff exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' diff --git a/poetry.lock b/poetry.lock index 152ae4a49d..60bdc72ac1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "aiohttp" @@ -751,63 +751,63 @@ test = ["pytest", "pytest-timeout"] [[package]] name = "coverage" -version = "7.4.4" +version = "7.5.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, - {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, - {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, - {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, - {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, - {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, - {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, - {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, - {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, - {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, - {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, - {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, - {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, - {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, + {file = "coverage-7.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c"}, + {file = "coverage-7.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58"}, + {file = "coverage-7.5.0-cp310-cp310-win32.whl", hash = "sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4"}, + {file = "coverage-7.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a"}, + {file = "coverage-7.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375"}, + {file = "coverage-7.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff"}, + {file = "coverage-7.5.0-cp311-cp311-win32.whl", hash = "sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d"}, + {file = "coverage-7.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656"}, + {file = "coverage-7.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9"}, + {file = "coverage-7.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2"}, + {file = "coverage-7.5.0-cp312-cp312-win32.whl", hash = "sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4"}, + {file = "coverage-7.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475"}, + {file = "coverage-7.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e"}, + {file = "coverage-7.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88"}, + {file = "coverage-7.5.0-cp38-cp38-win32.whl", hash = "sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25"}, + {file = "coverage-7.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a"}, + {file = "coverage-7.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1"}, + {file = "coverage-7.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0"}, + {file = "coverage-7.5.0-cp39-cp39-win32.whl", hash = "sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7"}, + {file = "coverage-7.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493"}, + {file = "coverage-7.5.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067"}, + {file = "coverage-7.5.0.tar.gz", hash = "sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8"}, ] [package.extras] @@ -1062,13 +1062,13 @@ files = [ [[package]] name = "filelock" -version = "3.13.4" +version = "3.14.0" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, - {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, + {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, + {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, ] [package.extras] @@ -1356,17 +1356,18 @@ rewrite = ["tokenize-rt (>=3)"] [[package]] name = "geopandas" -version = "0.14.3" +version = "0.14.4" description = "Geographic pandas extensions" optional = false python-versions = ">=3.9" files = [ - {file = "geopandas-0.14.3-py3-none-any.whl", hash = "sha256:41b31ad39e21bc9e8c4254f78f8dc4ce3d33d144e22e630a00bb336c83160204"}, - {file = "geopandas-0.14.3.tar.gz", hash = "sha256:748af035d4a068a4ae00cab384acb61d387685c833b0022e0729aa45216b23ac"}, + {file = "geopandas-0.14.4-py3-none-any.whl", hash = "sha256:3bb6473cb59d51e1a7fe2dbc24a1a063fb0ebdeddf3ce08ddbf8c7ddc99689aa"}, + {file = "geopandas-0.14.4.tar.gz", hash = "sha256:56765be9d58e2c743078085db3bd07dc6be7719f0dbe1dfdc1d705cb80be7c25"}, ] [package.dependencies] fiona = ">=1.8.21" +numpy = ">=1.22" packaging = "*" pandas = ">=1.4.0" pyproj = ">=3.3.0" @@ -2514,38 +2515,38 @@ files = [ [[package]] name = "mypy" -version = "1.9.0" +version = "1.10.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, - {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, - {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, - {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, - {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, - {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, - {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, - {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, - {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, - {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, - {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, - {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, - {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, - {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, - {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, - {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, - {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, - {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, - {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, - {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, - {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, - {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, - {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, - {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, - {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, - {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, - {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, + {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, + {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, + {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, + {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, + {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, + {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, + {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, + {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, + {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, + {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, + {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, + {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, + {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, + {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, + {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, + {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, + {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, + {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, + {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, + {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, + {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, + {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, + {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, + {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, + {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, + {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, + {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, ] [package.dependencies] @@ -2571,17 +2572,17 @@ files = [ [[package]] name = "myst-parser" -version = "2.0.0" +version = "3.0.1" description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," optional = false python-versions = ">=3.8" files = [ - {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"}, - {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"}, + {file = "myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1"}, + {file = "myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87"}, ] [package.dependencies] -docutils = ">=0.16,<0.21" +docutils = ">=0.18,<0.22" jinja2 = "*" markdown-it-py = ">=3.0,<4.0" mdit-py-plugins = ">=0.4,<1.0" @@ -2591,9 +2592,9 @@ sphinx = ">=6,<8" [package.extras] code-style = ["pre-commit (>=3.0,<4.0)"] linkify = ["linkify-it-py (>=2.0,<3.0)"] -rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] -testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] -testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] +rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"] [[package]] name = "natsort" @@ -3115,18 +3116,19 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, + {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "pluggy" @@ -6634,23 +6636,23 @@ cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "8.1.1" +version = "8.2.0" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, - {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, + {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, + {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.4,<2.0" +pluggy = ">=1.5,<2.0" [package.extras] -testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" @@ -6730,18 +6732,18 @@ pytest = ">=7.0.0" [[package]] name = "pytest-xdist" -version = "3.5.0" +version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"}, - {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"}, + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, ] [package.dependencies] -execnet = ">=1.1" -pytest = ">=6.2.0" +execnet = ">=2.1" +pytest = ">=7.0.0" [package.extras] psutil = ["psutil (>=3.0)"] @@ -6788,13 +6790,13 @@ files = [ [[package]] name = "pytools" -version = "2024.1.1" +version = "2024.1.2" description = "A collection of tools for Python" optional = false python-versions = "~=3.8" files = [ - {file = "pytools-2024.1.1-py2.py3-none-any.whl", hash = "sha256:9f1d03040d78d9d2a607d08de64ec4e350aecdf4ee019f627ce1f1f0c2a4400d"}, - {file = "pytools-2024.1.1.tar.gz", hash = "sha256:2c88edfa990c8e325167c37659fb1e10a3c1133dfaf752bbd7d8456402b8dcff"}, + {file = "pytools-2024.1.2-py2.py3-none-any.whl", hash = "sha256:f61287b5341e53e3fe96c82385469b57a8983ff3db815a2bf3f533c38e8d516b"}, + {file = "pytools-2024.1.2.tar.gz", hash = "sha256:081871e451505c4b986ebafa68aeeabfdc7beb3faa1baa50f726aebe21e1d057"}, ] [package.dependencies] @@ -6869,20 +6871,21 @@ dev = ["mypy (>=0.990)", "pywinctl (>=0.3)", "types-python-xlib (>=0.32)", "type [[package]] name = "pywinctl" -version = "0.3" +version = "0.4" description = "Cross-Platform toolkit to get info on and control windows on screen" optional = false python-versions = "*" files = [ - {file = "PyWinCtl-0.3-py3-none-any.whl", hash = "sha256:3603981c87b0c64987e7be857d89450f98792b01f49006a17dac758e11141dd7"}, + {file = "PyWinCtl-0.4-py3-none-any.whl", hash = "sha256:8c4a92bd57e35fd280c5c04f048cc822e236abffe2fa17351096b0e28907172d"}, ] [package.dependencies] -pymonctl = ">=0.6" +ewmhlib = {version = ">=0.2", markers = "sys_platform == \"linux\""} +pymonctl = ">=0.92" pyobjc = {version = ">=8.1", markers = "sys_platform == \"darwin\""} python-xlib = {version = ">=0.21", markers = "sys_platform == \"linux\""} pywin32 = {version = ">=302", markers = "sys_platform == \"win32\""} -pywinbox = ">=0.6" +pywinbox = ">=0.7" typing-extensions = ">=4.4.0" [package.extras] @@ -7086,28 +7089,28 @@ docs = ["furo (==2024.1.29)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx [[package]] name = "ruff" -version = "0.4.1" +version = "0.4.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2d9ef6231e3fbdc0b8c72404a1a0c46fd0dcea84efca83beb4681c318ea6a953"}, - {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9485f54a7189e6f7433e0058cf8581bee45c31a25cd69009d2a040d1bd4bfaef"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2921ac03ce1383e360e8a95442ffb0d757a6a7ddd9a5be68561a671e0e5807e"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eec8d185fe193ad053eda3a6be23069e0c8ba8c5d20bc5ace6e3b9e37d246d3f"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa27d9d72a94574d250f42b7640b3bd2edc4c58ac8ac2778a8c82374bb27984"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f1ee41580bff1a651339eb3337c20c12f4037f6110a36ae4a2d864c52e5ef954"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0926cefb57fc5fced629603fbd1a23d458b25418681d96823992ba975f050c2b"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6e37f2e3cd74496a74af9a4fa67b547ab3ca137688c484749189bf3a686ceb"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd703a5975ac1998c2cc5e9494e13b28f31e66c616b0a76e206de2562e0843c"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b92f03b4aa9fa23e1799b40f15f8b95cdc418782a567d6c43def65e1bbb7f1cf"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1c859f294f8633889e7d77de228b203eb0e9a03071b72b5989d89a0cf98ee262"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b34510141e393519a47f2d7b8216fec747ea1f2c81e85f076e9f2910588d4b64"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6e68d248ed688b9d69fd4d18737edcbb79c98b251bba5a2b031ce2470224bdf9"}, - {file = "ruff-0.4.1-py3-none-win32.whl", hash = "sha256:b90506f3d6d1f41f43f9b7b5ff845aeefabed6d2494307bc7b178360a8805252"}, - {file = "ruff-0.4.1-py3-none-win_amd64.whl", hash = "sha256:c7d391e5936af5c9e252743d767c564670dc3889aff460d35c518ee76e4b26d7"}, - {file = "ruff-0.4.1-py3-none-win_arm64.whl", hash = "sha256:a1eaf03d87e6a7cd5e661d36d8c6e874693cb9bc3049d110bc9a97b350680c43"}, - {file = "ruff-0.4.1.tar.gz", hash = "sha256:d592116cdbb65f8b1b7e2a2b48297eb865f6bdc20641879aa9d7b9c11d86db79"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd"}, + {file = "ruff-0.4.2-py3-none-win32.whl", hash = "sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe"}, + {file = "ruff-0.4.2-py3-none-win_amd64.whl", hash = "sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798"}, + {file = "ruff-0.4.2-py3-none-win_arm64.whl", hash = "sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf"}, + {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"}, ] [[package]] @@ -7186,18 +7189,18 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.45.0" +version = "2.0.1" description = "Python client for Sentry (https://sentry.io)" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "sentry-sdk-1.45.0.tar.gz", hash = "sha256:509aa9678c0512344ca886281766c2e538682f8acfa50fd8d405f8c417ad0625"}, - {file = "sentry_sdk-1.45.0-py2.py3-none-any.whl", hash = "sha256:1ce29e30240cc289a027011103a8c83885b15ef2f316a60bcc7c5300afa144f1"}, + {file = "sentry_sdk-2.0.1-py2.py3-none-any.whl", hash = "sha256:b54c54a2160f509cf2757260d0cf3885b608c6192c2555a3857e3a4d0f84bdb3"}, + {file = "sentry_sdk-2.0.1.tar.gz", hash = "sha256:c278e0f523f6f0ee69dc43ad26dcdb1202dffe5ac326ae31472e012d941bee21"}, ] [package.dependencies] certifi = "*" -urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} +urllib3 = ">=1.26.11" [package.extras] aiohttp = ["aiohttp (>=3.5)"] @@ -7528,18 +7531,21 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] [[package]] name = "sphinx-sitemap" -version = "2.5.1" +version = "2.6.0" description = "Sitemap generator for Sphinx" optional = false python-versions = "*" files = [ - {file = "sphinx-sitemap-2.5.1.tar.gz", hash = "sha256:984bef068bbdbc26cfae209a8b61392e9681abc9191b477cd30da406e3a60ee5"}, - {file = "sphinx_sitemap-2.5.1-py3-none-any.whl", hash = "sha256:0b7bce2835f287687f75584d7695e4eb8efaec028e5e7b36e9f791de3c344686"}, + {file = "sphinx_sitemap-2.6.0-py3-none-any.whl", hash = "sha256:7478e417d141f99c9af27ccd635f44c03a471a08b20e778a0f9daef7ace1d30b"}, + {file = "sphinx_sitemap-2.6.0.tar.gz", hash = "sha256:5e0c66b9f2e371ede80c659866a9eaad337d46ab02802f9c7e5f7bc5893c28d2"}, ] [package.dependencies] sphinx = ">=1.2" +[package.extras] +dev = ["build", "flake8", "pre-commit", "pytest", "sphinx", "tox"] + [[package]] name = "sphinxcontrib-applehelp" version = "1.0.8" @@ -7819,13 +7825,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.25.3" +version = "20.26.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.25.3-py3-none-any.whl", hash = "sha256:8aac4332f2ea6ef519c648d0bc48a5b1d324994753519919bddbb1aff25a104e"}, - {file = "virtualenv-20.25.3.tar.gz", hash = "sha256:7bb554bbdfeaacc3349fa614ea5bff6ac300fc7c335e9facf3a3bcfc703f45be"}, + {file = "virtualenv-20.26.1-py3-none-any.whl", hash = "sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75"}, + {file = "virtualenv-20.26.1.tar.gz", hash = "sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b"}, ] [package.dependencies] @@ -7839,17 +7845,17 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "websocket-client" -version = "1.7.0" +version = "1.8.0" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.8" files = [ - {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, - {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, ] [package.extras] -docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] From f3a49a29b73e319fdded6aa28ad40071dfd7f922 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 29 Apr 2024 16:35:49 -0700 Subject: [PATCH 361/384] unpin casadi (#32316) --- poetry.lock | 98 ++++++++++++++++++++++++++------------------------ pyproject.toml | 6 ++-- 2 files changed, 55 insertions(+), 49 deletions(-) diff --git a/poetry.lock b/poetry.lock index 60bdc72ac1..2e66336f11 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohttp" @@ -340,54 +340,59 @@ Sphinx = ">=4.0,<5.0.0 || >5.0.0" [[package]] name = "casadi" -version = "3.6.3" +version = "3.6.5" description = "CasADi -- framework for algorithmic differentiation and numeric optimization" optional = false python-versions = "*" files = [ - {file = "casadi-3.6.3-cp27-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:884c07617fbbedbd047900d6f2ab86e933064efc517b973fa4139fc60543e498"}, - {file = "casadi-3.6.3-cp27-none-manylinux1_i686.whl", hash = "sha256:6f9c1fadfb1eb729f8906f01cd2b45f542846a386fb63d59eb1872451dda8de3"}, - {file = "casadi-3.6.3-cp27-none-manylinux2010_x86_64.whl", hash = "sha256:041639615a866a7244e88905c40c15ef8f84bdedf0b4f92f72e4c5b56f8fe2dc"}, - {file = "casadi-3.6.3-cp27-none-win_amd64.whl", hash = "sha256:418d345e47cbc957a49e28c7765a7f6e37f5eb73ab969e6c6cfcd204189c559c"}, - {file = "casadi-3.6.3-cp310-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:9c8d360ee80dd65c0c7625e3dccfabdd6e78629a754fb28f6fd77e3d4893dc80"}, - {file = "casadi-3.6.3-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:a74cf436d42adf69d5ea16ba13d95f40585e148e856d00553f96740704fe2a03"}, - {file = "casadi-3.6.3-cp310-none-manylinux2014_aarch64.whl", hash = "sha256:1995029b4f11d492cb5277645534bdd377340eaabe51dba3c6d9ed3a25f83f4c"}, - {file = "casadi-3.6.3-cp310-none-manylinux2014_i686.whl", hash = "sha256:501ac40357dae0d224499f1b41b7d409703137ac7c8c1bcbb26444cff9d00de3"}, - {file = "casadi-3.6.3-cp310-none-manylinux2014_x86_64.whl", hash = "sha256:d86511c92f09fa464937098bb47b5cdfd07952a0a2b236938b9370537e4532d6"}, - {file = "casadi-3.6.3-cp310-none-win_amd64.whl", hash = "sha256:4d41d07a9a4c1cd9aa55a43ffe8921721dc5937b124075e903b4c0948e5dcb9b"}, - {file = "casadi-3.6.3-cp311-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:9a2aab9799e8a597b737c8ebbde6fce9cad6177d51fef8f73310d429e4b76cb4"}, - {file = "casadi-3.6.3-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:55cff88af39c486895d5d6ec3c1862050dbd51ca879df81be1b1c86cb97e9115"}, - {file = "casadi-3.6.3-cp311-none-manylinux2014_aarch64.whl", hash = "sha256:387e4832a6b98ecf71d7c6ceb129ca7bfe120dd6705162aecee70df13bd8cb62"}, - {file = "casadi-3.6.3-cp311-none-manylinux2014_i686.whl", hash = "sha256:8357cfae956d1c4d2c8e765e93fcfad537f83e8278d2bd7c9d4f66213fdc6f4e"}, - {file = "casadi-3.6.3-cp311-none-manylinux2014_x86_64.whl", hash = "sha256:de87a486a4578f609bb93327004ee0a4598723cff5c0118828e1de31f01ea65b"}, - {file = "casadi-3.6.3-cp311-none-win_amd64.whl", hash = "sha256:d5b5d49b3749aa075678206645b106fea104485285441f771ba5ef347d4bc394"}, - {file = "casadi-3.6.3-cp35-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:9ba455b1afc4b70249810098458951bd37cb346350ed00e913ec93ddb3f15251"}, - {file = "casadi-3.6.3-cp35-none-manylinux1_i686.whl", hash = "sha256:397b3754a0560e9c4ebb3ce9220bfe5194f6ef63dca6caa6695b7e43a170895b"}, - {file = "casadi-3.6.3-cp35-none-manylinux2010_x86_64.whl", hash = "sha256:406423816ef79ba82e579bd999ba9aaa16ffcb071261d8ff32e3c404ee1e816b"}, - {file = "casadi-3.6.3-cp35-none-win_amd64.whl", hash = "sha256:62fcabf79dfc1f3b7cf06eca1408556bc74a59a9de9dde4b779eff20ac243006"}, - {file = "casadi-3.6.3-cp36-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:7972b476b20557592fd1193140e6d1067a91b98cbc96767b3ec2f68e500c5342"}, - {file = "casadi-3.6.3-cp36-none-manylinux2014_aarch64.whl", hash = "sha256:692c284d838d11052c08fc8b38357858607f701ea6495bf9e22a0f2033811325"}, - {file = "casadi-3.6.3-cp36-none-manylinux2014_i686.whl", hash = "sha256:e5bb5ae64de87568c5c3895ca649b209283e2ad61ddeaef1685c7e856e4044e0"}, - {file = "casadi-3.6.3-cp36-none-manylinux2014_x86_64.whl", hash = "sha256:6b15e0bf452f7b3dface72e7d75ef2fe8566574abec51313540a6a251243e099"}, - {file = "casadi-3.6.3-cp36-none-win_amd64.whl", hash = "sha256:b7148bc8b107b1bae4f66fe5b815edb69aca69de8ead2ee25e1b059781654550"}, - {file = "casadi-3.6.3-cp37-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:3a184a4930a046ee788923a129032372f043027df7a2e08d25fd1fe72d1da8bd"}, - {file = "casadi-3.6.3-cp37-none-manylinux2014_aarch64.whl", hash = "sha256:44ceea824512a594b286fff7646470d7ac58e363bcb40ce23a6ec0577e6af3f9"}, - {file = "casadi-3.6.3-cp37-none-manylinux2014_i686.whl", hash = "sha256:ce42fb3df4e795bbb2178c4f9929bd8d0d359890ae1225c64a0c2795374fda25"}, - {file = "casadi-3.6.3-cp37-none-manylinux2014_x86_64.whl", hash = "sha256:39a73fa7383862abae27ebe4158d23d588286b22d74505af8569f4b91acc51d7"}, - {file = "casadi-3.6.3-cp37-none-win_amd64.whl", hash = "sha256:bede02743ac570b6289e8496563aa326dd4fdecc8c3e4f817b909cf6bc1b42cc"}, - {file = "casadi-3.6.3-cp38-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:7e80e8eee3bb174f941d592dbc440f57c76c5d81bad59f3a361dbf47e6175a43"}, - {file = "casadi-3.6.3-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:c0bcd64e8bb0db6e6dcc24d1ee10ef7f2305ed2e9d2786c1dcae43e7fcd05943"}, - {file = "casadi-3.6.3-cp38-none-manylinux2014_aarch64.whl", hash = "sha256:012970fec19a88326e010b8e8ef4d569e32246dabb8cad86c485263e3961f3b1"}, - {file = "casadi-3.6.3-cp38-none-manylinux2014_i686.whl", hash = "sha256:4c718672247d12b437f5b8b2f62eae5c6541bd9125f233ae4977fbf3b2ff2de7"}, - {file = "casadi-3.6.3-cp38-none-manylinux2014_x86_64.whl", hash = "sha256:3a3685525a278f5b450b8be9ab14bb367f2d0fc97f8400021ba406f63fab7795"}, - {file = "casadi-3.6.3-cp38-none-win_amd64.whl", hash = "sha256:0e6f2ae61abb3969ccf9503e2ee576a4f5b437ba40a082e26660a5d9513c839c"}, - {file = "casadi-3.6.3-cp39-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:7093cb7182db81b6184148121d61a68876ff9be55fb73c456927a344ff5983a2"}, - {file = "casadi-3.6.3-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:0a5383b295a499312657eb5c99a0e8f22e8bb06da774663bae69b322ec34dd6d"}, - {file = "casadi-3.6.3-cp39-none-manylinux2014_aarch64.whl", hash = "sha256:6632b30197aa0d491afb7f6d30980636342eaf8a88fe7680c5eb3a37d4013c01"}, - {file = "casadi-3.6.3-cp39-none-manylinux2014_i686.whl", hash = "sha256:5990366a5266dda537d45c6df583001a1519b86db00e1725e2d17304500e511d"}, - {file = "casadi-3.6.3-cp39-none-manylinux2014_x86_64.whl", hash = "sha256:5177b2592f4c147fec882fad92b7282262979bdf8ad5a337f6531464eee19226"}, - {file = "casadi-3.6.3-cp39-none-win_amd64.whl", hash = "sha256:d5b917443733123c634dbde7e5f971ffb87994af01c0d0d528f6d10ac78d97f7"}, - {file = "casadi-3.6.3.tar.gz", hash = "sha256:2a953bd001327c9ae79018a1efa455852c8a4b4f47f5bdda5f0a07ec820d1880"}, + {file = "casadi-3.6.5-cp27-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:6039081fdd1daf4ef7fa2b52814a954d75bfc03eb0dc62414e02af5d25746e8f"}, + {file = "casadi-3.6.5-cp27-none-manylinux1_i686.whl", hash = "sha256:b5192dfabf6f5266b168b984d124dd3086c1c5a408c0743ff3a82290a8ccf3b5"}, + {file = "casadi-3.6.5-cp27-none-manylinux2010_x86_64.whl", hash = "sha256:35b2ff6098e386a4d5e8bc681744e52bcd2f2f15cfa44c09814a8979b51a6794"}, + {file = "casadi-3.6.5-cp27-none-win_amd64.whl", hash = "sha256:caf395d1e36bfb215b154e8df61583d534a07ddabb18cbe50f259b7692a41ac8"}, + {file = "casadi-3.6.5-cp310-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:314886ef44bd01f1a98579e7784a3bed6e0584e88f9465cf9596af2523efb0dd"}, + {file = "casadi-3.6.5-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:c6789c8060a99b329bb584d97c1eab6a5e4f3e2d2db391e6c2001c6323774990"}, + {file = "casadi-3.6.5-cp310-none-manylinux2014_aarch64.whl", hash = "sha256:e40afb3c062817dd6ce2497cd001f00f107ee1ea41ec4d6ee9f9a5056d219e83"}, + {file = "casadi-3.6.5-cp310-none-manylinux2014_i686.whl", hash = "sha256:ee5a4ed50d2becd0bd6d203c7a60ffad27c14a3e0ae357480de11c846a8dd928"}, + {file = "casadi-3.6.5-cp310-none-manylinux2014_x86_64.whl", hash = "sha256:1ddb6e4afdd1da95d7d9d652ed973c1b7f50ef1454965a9170b657e223a2c73e"}, + {file = "casadi-3.6.5-cp310-none-win_amd64.whl", hash = "sha256:e96ca81b00b9621007d45db1254fcf232d518ebcc802f42853f57b4df977c567"}, + {file = "casadi-3.6.5-cp311-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:bebd3909db24ba711e094aacc0a2329b9903d422d73f61be851873731244b7d1"}, + {file = "casadi-3.6.5-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:ccb962ea02b7d6d245d5cd40fb52c29e812040a45273c6eed32cb8fcff673dda"}, + {file = "casadi-3.6.5-cp311-none-manylinux2014_aarch64.whl", hash = "sha256:1ce199a4ea1d376edbe5399cd622a4564040c83f50c50114fe50a69a8ea81d92"}, + {file = "casadi-3.6.5-cp311-none-manylinux2014_i686.whl", hash = "sha256:d12b67d467a5b2b0a909378ef7231fbc9af0da923baa13b1d5464d8471601ac3"}, + {file = "casadi-3.6.5-cp311-none-manylinux2014_x86_64.whl", hash = "sha256:3a3fb8af868f83d4a4f26d878c49f4acc4ed7ee92e731c73e650e5893418a634"}, + {file = "casadi-3.6.5-cp311-none-win_amd64.whl", hash = "sha256:3bdd645151beda013af5fd019fb554756e7dac37541b9f120cdfba90405b2671"}, + {file = "casadi-3.6.5-cp312-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:33afd1a4da0c86b4316953fe541635a8a7dc51703282e24a870ada13a46adb53"}, + {file = "casadi-3.6.5-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:0d6ee0558b4ecdd8aa4aa70fd31528b135801f1086c28a9cb78d8e8242b7aedd"}, + {file = "casadi-3.6.5-cp312-none-manylinux2014_i686.whl", hash = "sha256:be40e9897d80fb72a97e750b2143c32f63f8800cfb78f9b396d8ce7a913fca39"}, + {file = "casadi-3.6.5-cp312-none-manylinux2014_x86_64.whl", hash = "sha256:0118637823e292a9270133e02c9c6d3f3c7f75e8c91a6f6dc5275ade82dd1d9d"}, + {file = "casadi-3.6.5-cp312-none-win_amd64.whl", hash = "sha256:fe2b64d777e36cc3f101220dd1e219a0e11c3e4ee2b5e708b30fea9a27107e41"}, + {file = "casadi-3.6.5-cp35-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:a1ae36449adec534125d4af5be912b6fb9dafe74d1fee39f6c82263695e21ca5"}, + {file = "casadi-3.6.5-cp35-none-manylinux1_i686.whl", hash = "sha256:32644c47fbfb643d5cf9769c7bbc94c6bdb9a40ea9c12c54af5e2754599c3186"}, + {file = "casadi-3.6.5-cp35-none-manylinux2010_x86_64.whl", hash = "sha256:601b76b7afcb27b11563999f6ad1d9d2a2510ab3d00a6f4ce86a0bee97c9d17a"}, + {file = "casadi-3.6.5-cp35-none-win_amd64.whl", hash = "sha256:febc645bcc0aed6d7a2bdb6e58b9a89cb8f74b19bc028c41cc807d75a5d54058"}, + {file = "casadi-3.6.5-cp36-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:c98e68023c9e5905d9d6b99ae1fbbfe4b85ba9846b3685408bb498b20509f99a"}, + {file = "casadi-3.6.5-cp36-none-manylinux2014_aarch64.whl", hash = "sha256:eb311088dca5359acc05aa4d8895bf99afaa16c7c04b27bf640ce4c2361b8cde"}, + {file = "casadi-3.6.5-cp36-none-manylinux2014_i686.whl", hash = "sha256:bceb69bf9f04fded8a564eb64e298d19e945eaf4734f7145a5ee61cf9ac693e7"}, + {file = "casadi-3.6.5-cp36-none-manylinux2014_x86_64.whl", hash = "sha256:c951031e26d987986dbc334492b2e6ef108077f11c00e178ff4007e4a9bf91d8"}, + {file = "casadi-3.6.5-cp36-none-win_amd64.whl", hash = "sha256:e44af450ce944649932f9ef63ff00d2d21f642b506444418b4b20e69dba3adaf"}, + {file = "casadi-3.6.5-cp37-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:c661fe88a93b7cc7ea42802aac76a674135cd65e3e564a6f08570dd3bea05201"}, + {file = "casadi-3.6.5-cp37-none-manylinux2014_aarch64.whl", hash = "sha256:5266fc82e39352e26cb1a4e0a5c3deb32d09e6333be637bd78c273fa50f9012b"}, + {file = "casadi-3.6.5-cp37-none-manylinux2014_i686.whl", hash = "sha256:02d6fb63c460abd99a450e861034d97568a8aec621fc0a4fed22f7494989c682"}, + {file = "casadi-3.6.5-cp37-none-manylinux2014_x86_64.whl", hash = "sha256:5e8adffe2015cde370fc545b2d0fe731e96e583e4ea4c5f3044e818fea975cfc"}, + {file = "casadi-3.6.5-cp37-none-win_amd64.whl", hash = "sha256:7ea8545579872b6f5412985dafec26b906b67bd4639a6c718b7e07f802af4e42"}, + {file = "casadi-3.6.5-cp38-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:0a38bf808bf51368607c64307dd77a7363fbe8e5c910cd5c605546be60edfaff"}, + {file = "casadi-3.6.5-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:f62f779481b30e5ea88392bdb8225e9545a21c4460dc3e96c2b782405b938d04"}, + {file = "casadi-3.6.5-cp38-none-manylinux2014_aarch64.whl", hash = "sha256:deb2cb2bee8aba0c2cad03c832965b51ca305d0f8eb15de8b857ba86a76f0db0"}, + {file = "casadi-3.6.5-cp38-none-manylinux2014_i686.whl", hash = "sha256:f6e10b66d6ae8216dab01532f7ad75cc9d66a95125d421b33d078a51ea0fc2a0"}, + {file = "casadi-3.6.5-cp38-none-manylinux2014_x86_64.whl", hash = "sha256:f9e82658c910e3317535d769334260e0a24d97bbce68cadb72f592e9fcbafd61"}, + {file = "casadi-3.6.5-cp38-none-win_amd64.whl", hash = "sha256:092e448e05feaed8958d684e896d909e756d199b84d3b9d0182da38cd3deebf6"}, + {file = "casadi-3.6.5-cp39-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:f9c1de9a798767c00f89c27677b74059df4c9601d69270967b06d7fcff204b4d"}, + {file = "casadi-3.6.5-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:83e3404de4449cb7382e49d811eec79cd370e64b97b5c94b155c604d7c523a40"}, + {file = "casadi-3.6.5-cp39-none-manylinux2014_aarch64.whl", hash = "sha256:af95de5aa5942d627d43312834791623384c2ad6ba87928bf0e3cacc8a6698e8"}, + {file = "casadi-3.6.5-cp39-none-manylinux2014_i686.whl", hash = "sha256:dbeb50726603454a1f85323cba7caf72524cd43ca0aeb1f286d07005a967ece9"}, + {file = "casadi-3.6.5-cp39-none-manylinux2014_x86_64.whl", hash = "sha256:8bbfb2eb8cb6b9e2384814d6427e48bcf6df049bf7ed05b0a58bb311a1fbf18c"}, + {file = "casadi-3.6.5-cp39-none-win_amd64.whl", hash = "sha256:0e4a4ec2e26ebeb22b0c129f2db3cf90f730cf9fbe98adb9a12720ff6ca1834a"}, + {file = "casadi-3.6.5.tar.gz", hash = "sha256:409a5f6725eadea40fddfb8ba2321139b5252edac8bc115a72f68e648631d56a"}, ] [package.dependencies] @@ -6916,7 +6921,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -7996,4 +8000,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "~3.11" -content-hash = "cb63112bfe7ee2b3fc194a422479f788c9a8027d445ea51a31f4ee20299beb53" +content-hash = "5f0a1b6f26faa3effeaa5393b73d9188be385a72c1d3b9befb3f03df3b38c86d" diff --git a/pyproject.toml b/pyproject.toml index 10b99a9ddc..a25fcc1645 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,11 +83,9 @@ documentation = "https://docs.comma.ai" python = "~3.11" aiohttp = "*" aiortc = "*" -casadi = "==3.6.3" cffi = "*" crcmod = "*" Cython = "*" -future-fstrings = "*" # for acados json-rpc = "*" libusb1 = "*" numpy = "*" @@ -110,6 +108,10 @@ spidev = { version = "*", platform = "linux" } sympy = "*" websocket_client = "*" +# acados deps +casadi = "*" +future-fstrings = "*" + # these should be removed markdown-it-py = "*" timezonefinder = "*" From b9994c7c95658024199ec8f6049c17ca2522bbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Mon, 29 Apr 2024 17:42:49 -0700 Subject: [PATCH 362/384] North Dakota Model (#32309) * ND model * 86d23b15-5c26-464d-9fb5-e857f025462c/700 * Model ref replay commit * update ref again --- selfdrive/modeld/models/supercombo.onnx | 4 ++-- selfdrive/test/process_replay/model_replay_ref_commit | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/modeld/models/supercombo.onnx b/selfdrive/modeld/models/supercombo.onnx index ed539ca37d..c0f8b16fb1 100644 --- a/selfdrive/modeld/models/supercombo.onnx +++ b/selfdrive/modeld/models/supercombo.onnx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7a267b5026a0fab61095092d9af20c1dcd70311817c80749adcf6c0a0879061 -size 50660999 +oid sha256:b31b504bc0b440d3bc72967507a00eb4f112285626fbfb3135011500325ee6d6 +size 51452435 diff --git a/selfdrive/test/process_replay/model_replay_ref_commit b/selfdrive/test/process_replay/model_replay_ref_commit index 3f1e91c369..47571656e5 100644 --- a/selfdrive/test/process_replay/model_replay_ref_commit +++ b/selfdrive/test/process_replay/model_replay_ref_commit @@ -1 +1 @@ -512c45131ff7eb48bf101f9eae50a389efba6930 +69a3b169ebc478285dad5eea87658ed2cb8fee13 From d6a2a7ba60bb6aaec9da4688f491f995c9d959c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20R=C4=85czy?= Date: Tue, 30 Apr 2024 14:05:37 -0700 Subject: [PATCH 363/384] bodyteleop: include .gitignore in release files (#32328) Add gitignore to release files --- release/files_common | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/release/files_common b/release/files_common index eaf54b0cd5..34d8f00973 100644 --- a/release/files_common +++ b/release/files_common @@ -45,7 +45,9 @@ release/* tools/__init__.py tools/lib/* -tools/bodyteleop/* +tools/bodyteleop/.gitignore +tools/bodyteleop/web.py +tools/bodyteleop/static/* tools/joystick/* tools/replay/*.cc tools/replay/*.h From 6ef95f7a91b33f7f554c0d41353c7f77fb2eb6b4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 1 May 2024 11:35:20 -0700 Subject: [PATCH 364/384] adjust gps alert --- cereal | 2 +- selfdrive/controls/controlsd.py | 2 +- selfdrive/controls/lib/events.py | 16 +++++----------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/cereal b/cereal index 861144c136..284206878d 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 861144c136c91f70dcbc652c2ffe99f57440ad47 +Subproject commit 284206878d6184747b1e1af03f91ac9e718ff326 diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 13d7b25b29..35dad3f81a 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -386,7 +386,7 @@ class Controls: # TODO: fix simulator if not SIMULATION or REPLAY: # Not show in first 1 km to allow for driving out of garage. This event shows after 5 minutes - if not self.sm['liveLocationKalman'].gpsOK and self.sm['liveLocationKalman'].inputsOK and (self.distance_traveled > 1000): + if not self.sm['liveLocationKalman'].gpsOK and self.sm['liveLocationKalman'].inputsOK and (self.distance_traveled > 1500): self.events.add(EventName.noGps) if self.sm['liveLocationKalman'].gpsOK: self.distance_traveled = 0 diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 2de4d61d88..40796dd8ff 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -251,13 +251,6 @@ def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messag Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2) -def no_gps_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: - return Alert( - "Poor GPS reception", - "Hardware malfunctioning if sky is visible", - AlertStatus.normal, AlertSize.mid, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2, creation_delay=300.) - # *** debug alerts *** def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: @@ -559,9 +552,6 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, # Unused - EventName.gpsMalfunction: { - ET.PERMANENT: NormalPermanentAlert("GPS Malfunction", "Likely Hardware Issue"), - }, EventName.locationdTemporaryError: { ET.NO_ENTRY: NoEntryAlert("locationd Temporary Error"), @@ -696,7 +686,11 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.noGps: { - ET.PERMANENT: no_gps_alert, + ET.PERMANENT: Alert( + "Poor GPS reception", + "Ensure device has a clear view of the sky", + AlertStatus.normal, AlertSize.mid, + Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2, creation_delay=600.) }, EventName.soundsUnavailable: { From 6a52507e3a7479cdb3e4626de164290d839b926c Mon Sep 17 00:00:00 2001 From: Andrei Radulescu Date: Thu, 2 May 2024 01:00:25 +0300 Subject: [PATCH 365/384] camerad: cast ci->image_sensor to unsigned short (#32317) fixes 24.04 build --- system/camerad/cameras/camera_common.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/camerad/cameras/camera_common.cc b/system/camerad/cameras/camera_common.cc index 6dcb8b4d22..9d82284d9f 100644 --- a/system/camerad/cameras/camera_common.cc +++ b/system/camerad/cameras/camera_common.cc @@ -29,7 +29,7 @@ public: "-DSENSOR_ID=%hu -DHDR_OFFSET=%d -DVIGNETTING=%d ", ci->frame_width, ci->frame_height, ci->hdr_offset > 0 ? ci->frame_stride * 2 : ci->frame_stride, ci->frame_offset, b->rgb_width, b->rgb_height, buf_width, uv_offset, - ci->image_sensor, ci->hdr_offset, s->camera_num == 1); + static_cast(ci->image_sensor), ci->hdr_offset, s->camera_num == 1); const char *cl_file = "cameras/process_raw.cl"; cl_program prg_imgproc = cl_program_from_file(context, device_id, cl_file, args); krnl_ = CL_CHECK_ERR(clCreateKernel(prg_imgproc, "process_raw", &err)); From b98ea81bdb744c73a42bb491a70909490994907b Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 1 May 2024 20:54:32 -0700 Subject: [PATCH 366/384] agnos 10 (#32320) --- launch_env.sh | 2 +- system/hardware/tici/agnos.json | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/launch_env.sh b/launch_env.sh index 6859afb0d4..bfc2e6ac6a 100755 --- a/launch_env.sh +++ b/launch_env.sh @@ -7,7 +7,7 @@ export OPENBLAS_NUM_THREADS=1 export VECLIB_MAXIMUM_THREADS=1 if [ -z "$AGNOS_VERSION" ]; then - export AGNOS_VERSION="9.7" + export AGNOS_VERSION="10" fi export STAGING_ROOT="/data/safe_staging" diff --git a/system/hardware/tici/agnos.json b/system/hardware/tici/agnos.json index e69842cfec..cc3f6bb830 100644 --- a/system/hardware/tici/agnos.json +++ b/system/hardware/tici/agnos.json @@ -1,9 +1,9 @@ [ { "name": "boot", - "url": "https://commadist.azureedge.net/agnosupdate/boot-f0de74e139b8b99224738d4e72a5b1831758f20b09ff6bb28f3aaaae1c4c1ebe.img.xz", - "hash": "f0de74e139b8b99224738d4e72a5b1831758f20b09ff6bb28f3aaaae1c4c1ebe", - "hash_raw": "f0de74e139b8b99224738d4e72a5b1831758f20b09ff6bb28f3aaaae1c4c1ebe", + "url": "https://commadist.azureedge.net/agnosupdate/boot-543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1.img.xz", + "hash": "543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1", + "hash_raw": "543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1", "size": 15636480, "sparse": false, "full_check": true, @@ -61,17 +61,17 @@ }, { "name": "system", - "url": "https://commadist.azureedge.net/agnosupdate/system-0f69173d5f3058f7197c139442a6556be59e52f15402a263215a329ba5ec41e2.img.xz", - "hash": "4858385ba6284bcaa179ab77ac4263486e4d8670df921e4ac400464dc1dde59c", - "hash_raw": "0f69173d5f3058f7197c139442a6556be59e52f15402a263215a329ba5ec41e2", + "url": "https://commadist.azureedge.net/agnosupdate/system-bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a.img.xz", + "hash": "dc2f960631f02446d912885786922c27be4eb1ec6c202cacce6699d5a74021ba", + "hash_raw": "bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a", "size": 10737418240, "sparse": true, "full_check": false, "has_ab": true, "alt": { - "hash": "42658a6fff660d9b6abb9cb9fbb3481071259c9a9598718af6b1edff2b556009", - "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-0f69173d5f3058f7197c139442a6556be59e52f15402a263215a329ba5ec41e2.img.xz", - "size": 4548292756 + "hash": "283e5e754593c6e1bb5e9d63b54624cda5475b88bc1b130fe6ab13acdbd966e2", + "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a.img.xz", + "size": 4548070712 } } ] \ No newline at end of file From 0362cfa7eea8bd526a45bb231d2fcd9114a9a11d Mon Sep 17 00:00:00 2001 From: Shotaro Watanabe Date: Thu, 2 May 2024 14:22:35 +0900 Subject: [PATCH 367/384] devcontainer: added batman to the video group (#32333) --- .devcontainer/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 36bb6aa840..2bd1ccfd62 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -8,6 +8,8 @@ RUN cd /tmp && \ curl -L -o virtualgl.deb "https://downloads.sourceforge.net/project/virtualgl/3.1/virtualgl_3.1_$ARCH.deb" && \ dpkg -i virtualgl.deb +RUN usermod -aG video batman + USER batman RUN cd $HOME && \ From bf2e00a23382fede8608d75884ead3ff30ddaa9f Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 2 May 2024 12:09:34 -0700 Subject: [PATCH 368/384] CPU budget (#32335) * cpu budget * comment * new line --- selfdrive/test/test_onroad.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 5de9d20297..cd0846c894 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -27,8 +27,15 @@ from openpilot.selfdrive.test.helpers import set_params_enabled, release_only from openpilot.system.hardware.hw import Paths from openpilot.tools.lib.logreader import LogReader -# Baseline CPU usage by process +""" +CPU usage budget +* each process is entitled to at least 8% +* total CPU usage of openpilot (sum(PROCS.values()) + should not exceed MAX_TOTAL_CPU +""" +MAX_TOTAL_CPU = 250. # total for all 8 cores PROCS = { + # Baseline CPU usage by process "selfdrive.controls.controlsd": 46.0, "./loggerd": 14.0, "./encoderd": 17.0, @@ -274,6 +281,7 @@ class TestOnroad(unittest.TestCase): result += f"{proc_name.ljust(35)} {cpu_usage:5.2f}% ({exp}%) {err}\n" if len(err) > 0: cpu_ok = False + result += "------------------------------------------------\n" # Ensure there's no missing procs all_procs = {p.name for p in self.service_msgs['managerState'][0].managerState.processes if p.shouldBeRunning} @@ -281,7 +289,14 @@ class TestOnroad(unittest.TestCase): with self.subTest(proc=p): assert any(p in pp for pp in PROCS.keys()), f"Expected CPU usage missing for {p}" - result += "------------------------------------------------\n" + # total CPU check + procs_tot = sum([(max(x) if isinstance(x, tuple) else x) for x in PROCS.values()]) + with self.subTest(name="total CPU"): + assert procs_tot < MAX_TOTAL_CPU, "Total CPU budget exceeded" + result += "------------------------------------------------\n" + result += f"Total allocated CPU usage is {procs_tot}%, budget is {MAX_TOTAL_CPU}%, {MAX_TOTAL_CPU-procs_tot:.1f}% left\n" + result += "------------------------------------------------\n" + print(result) self.assertTrue(cpu_ok) From 09aeab3f77727a1e2ba25e1cf14a56882b4e5e29 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 2 May 2024 20:30:19 -0700 Subject: [PATCH 369/384] athenad: set a timeout on proxy WebSocket receive (#32336) * useless * Revert "useless" This reverts commit 28f0bb9e9794d60eefba8063b47d8ca113308008. * this forever hangs you disconnect (or 2 hours) * same timeout as the global websocket * Revert "same timeout as the global websocket" This reverts commit 0bd0cb8a38a3e17960c1fae205311d86a9cf8feb. * setting the timeout affects the entire websocket and disconnects, not just recv timeout * fix that * fix test --- selfdrive/athena/athenad.py | 11 +++++++---- selfdrive/athena/tests/helpers.py | 5 +++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index 989e284e74..505a9ae28b 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -657,10 +657,12 @@ def stat_handler(end_event: threading.Event) -> None: def ws_proxy_recv(ws: WebSocket, local_sock: socket.socket, ssock: socket.socket, end_event: threading.Event, global_end_event: threading.Event) -> None: while not (end_event.is_set() or global_end_event.is_set()): try: - data = ws.recv() - if isinstance(data, str): - data = data.encode("utf-8") - local_sock.sendall(data) + r = select.select((ws.sock,), (), (), 30) + if r[0]: + data = ws.recv() + if isinstance(data, str): + data = data.encode("utf-8") + local_sock.sendall(data) except WebSocketTimeoutException: pass except Exception: @@ -670,6 +672,7 @@ def ws_proxy_recv(ws: WebSocket, local_sock: socket.socket, ssock: socket.socket cloudlog.debug("athena.ws_proxy_recv closing sockets") ssock.close() local_sock.close() + ws.close() cloudlog.debug("athena.ws_proxy_recv done closing sockets") end_event.set() diff --git a/selfdrive/athena/tests/helpers.py b/selfdrive/athena/tests/helpers.py index 3dd98f02c9..322e9d81dd 100644 --- a/selfdrive/athena/tests/helpers.py +++ b/selfdrive/athena/tests/helpers.py @@ -43,6 +43,8 @@ class MockApi(): class MockWebsocket(): + sock = socket.socket() + def __init__(self, recv_queue, send_queue): self.recv_queue = recv_queue self.send_queue = send_queue @@ -56,6 +58,9 @@ class MockWebsocket(): def send(self, data, opcode): self.send_queue.put_nowait((data, opcode)) + def close(self): + pass + class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler): def do_PUT(self): From d7d31112121412cfdb9be5da2b61a9bbb2ee2a5a Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 3 May 2024 01:30:32 -0700 Subject: [PATCH 370/384] athenad: set TOS field for proxy WebSocket (#32337) set TOS --- selfdrive/athena/athenad.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index 505a9ae28b..9eec7a931b 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -467,6 +467,10 @@ def startLocalProxy(global_end_event: threading.Event, remote_ws_uri: str, local cookie="jwt=" + identity_token, enable_multithread=True) + # Set TOS to keep connection responsive while under load. + # DSCP of 36/HDD_LINUX_AC_VI with the minimum delay flag + ws.sock.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, 0x90) + ssock, csock = socket.socketpair() local_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) local_sock.connect(('127.0.0.1', local_port)) From d72f000d98fc63f1ff7da44acedf95251c89faef Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 3 May 2024 17:42:29 +0800 Subject: [PATCH 371/384] cabana: Improve seeking and zooming (#32334) * Improve seeking and zooming * No repeated calculation of freq * set min zoom seconds to 10ms --- tools/cabana/chart/chart.cc | 3 +- tools/cabana/chart/chartswidget.cc | 3 +- tools/cabana/streams/abstractstream.cc | 5 ++- tools/cabana/streams/abstractstream.h | 3 +- tools/cabana/streams/replaystream.cc | 10 ++++++ tools/cabana/streams/replaystream.h | 2 +- tools/replay/camera.cc | 46 +++++++++++++++----------- tools/replay/camera.h | 6 ++-- 8 files changed, 51 insertions(+), 27 deletions(-) diff --git a/tools/cabana/chart/chart.cc b/tools/cabana/chart/chart.cc index ce52825ac5..fcf171a858 100644 --- a/tools/cabana/chart/chart.cc +++ b/tools/cabana/chart/chart.cc @@ -22,6 +22,7 @@ // ChartAxisElement's padding is 4 (https://codebrowser.dev/qt5/qtcharts/src/charts/axis/chartaxiselement_p.h.html) const int AXIS_X_TOP_MARGIN = 4; +const double MIN_ZOOM_SECONDS = 0.01; // 10ms // Define a small value of epsilon to compare double values const float EPSILON = 0.000001; static inline bool xLessThan(const QPointF &p, float x) { return p.x() < (x - EPSILON); } @@ -511,7 +512,7 @@ void ChartView::mouseReleaseEvent(QMouseEvent *event) { if (rubber->width() <= 0) { // no rubber dragged, seek to mouse position can->seekTo(min); - } else if (rubber->width() > 10 && (max - min) > 0.01) { // Minimum range is 10 milliseconds. + } else if (rubber->width() > 10 && (max - min) > MIN_ZOOM_SECONDS) { charts_widget->zoom_undo_stack->push(new ZoomCommand(charts_widget, {min, max})); } else { viewport()->update(); diff --git a/tools/cabana/chart/chartswidget.cc b/tools/cabana/chart/chartswidget.cc index 63d6091cac..a7bdd74646 100644 --- a/tools/cabana/chart/chartswidget.cc +++ b/tools/cabana/chart/chartswidget.cc @@ -197,7 +197,8 @@ void ChartsWidget::updateState() { display_range.second = display_range.first + max_chart_range; } else if (cur_sec < (zoomed_range.first - 0.1) || cur_sec >= zoomed_range.second) { // loop in zoomed range - can->seekTo(zoomed_range.first); + QTimer::singleShot(0, [ts = zoomed_range.first]() { can->seekTo(ts);}); + return; } const auto &range = is_zoomed ? zoomed_range : display_range; diff --git a/tools/cabana/streams/abstractstream.cc b/tools/cabana/streams/abstractstream.cc index 593d1bf5d8..540634b9b7 100644 --- a/tools/cabana/streams/abstractstream.cc +++ b/tools/cabana/streams/abstractstream.cc @@ -138,13 +138,16 @@ void AbstractStream::updateLastMsgsTo(double sec) { auto prev = std::prev(it); double ts = (*prev)->mono_time / 1e9 - routeStartTime(); auto &m = msgs[id]; + double freq = 0; // Keep suppressed bits. if (auto old_m = messages_.find(id); old_m != messages_.end()) { + freq = old_m->second.freq; + m.last_changes.reserve(old_m->second.last_changes.size()); std::transform(old_m->second.last_changes.cbegin(), old_m->second.last_changes.cend(), std::back_inserter(m.last_changes), [](const auto &change) { return CanData::ByteLastChange{.suppressed = change.suppressed}; }); } - m.compute(id, (*prev)->dat, (*prev)->size, ts, getSpeed(), {}); + m.compute(id, (*prev)->dat, (*prev)->size, ts, getSpeed(), {}, freq); m.count = std::distance(ev.begin(), prev) + 1; } } diff --git a/tools/cabana/streams/abstractstream.h b/tools/cabana/streams/abstractstream.h index 18c00cb8b6..3d63ee49bd 100644 --- a/tools/cabana/streams/abstractstream.h +++ b/tools/cabana/streams/abstractstream.h @@ -90,6 +90,7 @@ public: signals: void paused(); void resume(); + void seekingTo(double sec); void seekedTo(double sec); void streamStarted(); void eventsMerged(const MessageEventsMap &events_map); @@ -107,6 +108,7 @@ protected: uint64_t lastEventMonoTime() const { return lastest_event_ts; } std::vector all_events_; + double current_sec_ = 0; uint64_t lastest_event_ts = 0; private: @@ -114,7 +116,6 @@ private: void updateLastMsgsTo(double sec); void updateMasks(); - double current_sec_ = 0; MessageEventsMap events_; std::unordered_map last_msgs; std::unique_ptr event_buffer_; diff --git a/tools/cabana/streams/replaystream.cc b/tools/cabana/streams/replaystream.cc index ddd1c1dfed..c75a128a15 100644 --- a/tools/cabana/streams/replaystream.cc +++ b/tools/cabana/streams/replaystream.cc @@ -84,6 +84,16 @@ bool ReplayStream::eventFilter(const Event *event) { return true; } +void ReplayStream::seekTo(double ts) { + // Update timestamp and notify receivers of the time change. + current_sec_ = ts; + std::set new_msgs; + msgsReceived(&new_msgs, false); + + // Seek to the specified timestamp + replay->seekTo(std::max(double(0), ts), false); +} + void ReplayStream::pause(bool pause) { replay->pause(pause); emit(pause ? paused() : resume()); diff --git a/tools/cabana/streams/replaystream.h b/tools/cabana/streams/replaystream.h index d92a2e426b..e3278d9a32 100644 --- a/tools/cabana/streams/replaystream.h +++ b/tools/cabana/streams/replaystream.h @@ -18,7 +18,7 @@ public: void start() override; bool loadRoute(const QString &route, const QString &data_dir, uint32_t replay_flags = REPLAY_FLAG_NONE); bool eventFilter(const Event *event); - void seekTo(double ts) override { replay->seekTo(std::max(double(0), ts), false); } + void seekTo(double ts) override; bool liveStreaming() const override { return false; } inline QString routeName() const override { return replay->route()->name(); } inline QString carFingerprint() const override { return replay->carFingerprint().c_str(); } diff --git a/tools/replay/camera.cc b/tools/replay/camera.cc index 9a023db6fa..9e711149c5 100644 --- a/tools/replay/camera.cc +++ b/tools/replay/camera.cc @@ -1,12 +1,13 @@ #include "tools/replay/camera.h" #include - #include #include "third_party/linux/include/msm_media_info.h" #include "tools/replay/util.h" +const int BUFFER_COUNT = 40; + std::tuple get_nv12_info(int width, int height) { int nv12_width = VENUS_Y_STRIDE(COLOR_FMT_NV12, width); int nv12_height = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height); @@ -36,10 +37,12 @@ CameraServer::~CameraServer() { void CameraServer::startVipcServer() { vipc_server_.reset(new VisionIpcServer("camerad")); for (auto &cam : cameras_) { + cam.cached_buf.clear(); + if (cam.width > 0 && cam.height > 0) { rInfo("camera[%d] frame size %dx%d", cam.type, cam.width, cam.height); auto [nv12_width, nv12_height, nv12_buffer_size] = get_nv12_info(cam.width, cam.height); - vipc_server_->create_buffers_with_sizes(cam.stream_type, YUV_BUFFER_COUNT, false, cam.width, cam.height, + vipc_server_->create_buffers_with_sizes(cam.stream_type, BUFFER_COUNT, false, cam.width, cam.height, nv12_buffer_size, nv12_width, nv12_width * nv12_height); if (!cam.thread.joinable()) { cam.thread = std::thread(&CameraServer::cameraThread, this, std::ref(cam)); @@ -50,13 +53,6 @@ void CameraServer::startVipcServer() { } void CameraServer::cameraThread(Camera &cam) { - auto read_frame = [&](FrameReader *fr, int frame_id) { - VisionBuf *yuv_buf = vipc_server_->get_buffer(cam.stream_type); - assert(yuv_buf); - bool ret = fr->get(frame_id, yuv_buf); - return ret ? yuv_buf : nullptr; - }; - while (true) { const auto [fr, event] = cam.queue.pop(); if (!fr) break; @@ -66,29 +62,41 @@ void CameraServer::cameraThread(Camera &cam) { auto eidx = capnp::AnyStruct::Reader(evt).getPointerSection()[0].getAs(); if (eidx.getType() != cereal::EncodeIndex::Type::FULL_H_E_V_C) continue; - const int id = eidx.getSegmentId(); - bool prefetched = (id == cam.cached_id && eidx.getSegmentNum() == cam.cached_seg); - auto yuv = prefetched ? cam.cached_buf : read_frame(fr, id); - if (yuv) { + int segment_id = eidx.getSegmentId(); + uint32_t frame_id = eidx.getFrameId(); + if (auto yuv = getFrame(cam, fr, segment_id, frame_id)) { VisionIpcBufExtra extra = { - .frame_id = eidx.getFrameId(), + .frame_id = frame_id, .timestamp_sof = eidx.getTimestampSof(), .timestamp_eof = eidx.getTimestampEof(), }; - yuv->set_frame_id(eidx.getFrameId()); vipc_server_->send(yuv, &extra); } else { - rError("camera[%d] failed to get frame: %lu", cam.type, eidx.getSegmentId()); + rError("camera[%d] failed to get frame: %lu", cam.type, segment_id); } - cam.cached_id = id + 1; - cam.cached_seg = eidx.getSegmentNum(); - cam.cached_buf = read_frame(fr, cam.cached_id); + // Prefetch the next frame + getFrame(cam, fr, segment_id + 1, frame_id + 1); --publishing_; } } +VisionBuf *CameraServer::getFrame(Camera &cam, FrameReader *fr, int32_t segment_id, uint32_t frame_id) { + // Check if the frame is cached + auto buf_it = std::find_if(cam.cached_buf.begin(), cam.cached_buf.end(), + [frame_id](VisionBuf *buf) { return buf->get_frame_id() == frame_id; }); + if (buf_it != cam.cached_buf.end()) return *buf_it; + + VisionBuf *yuv_buf = vipc_server_->get_buffer(cam.stream_type); + if (fr->get(segment_id, yuv_buf)) { + yuv_buf->set_frame_id(frame_id); + cam.cached_buf.insert(yuv_buf); + return yuv_buf; + } + return nullptr; +} + void CameraServer::pushFrame(CameraType type, FrameReader *fr, const Event *event) { auto &cam = cameras_[type]; if (cam.width != fr->width || cam.height != fr->height) { diff --git a/tools/replay/camera.h b/tools/replay/camera.h index 436423ac72..77a6293ec6 100644 --- a/tools/replay/camera.h +++ b/tools/replay/camera.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -26,12 +27,11 @@ protected: int height; std::thread thread; SafeQueue> queue; - int cached_id = -1; - int cached_seg = -1; - VisionBuf * cached_buf; + std::set cached_buf; }; void startVipcServer(); void cameraThread(Camera &cam); + VisionBuf *getFrame(Camera &cam, FrameReader *fr, int32_t segment_id, uint32_t frame_id); Camera cameras_[MAX_CAMERAS] = { {.type = RoadCam, .stream_type = VISION_STREAM_ROAD}, From c0a2ce31ee5c16545fbb3c9489f80abb9a2ae4a0 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sat, 4 May 2024 01:46:39 +0800 Subject: [PATCH 372/384] replay: fix hang issue on system wake-up (#32341) fix hang issue on system wake-up --- tools/replay/replay.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index 43aef7b881..6a159aa8e2 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -468,12 +468,15 @@ std::vector::const_iterator Replay::publishEvents(std::vector::con // Skip events if socket is not present if (!sockets_[evt.which]) continue; - int64_t time_diff = (evt.mono_time - evt_start_ts) / speed_ - (nanos_since_boot() - loop_start_ts); - // if time_diff is greater than 1 second, it means that an invalid segment is skipped - if (time_diff >= 1e9 || speed_ != prev_replay_speed) { - // reset event start times + const uint64_t current_nanos = nanos_since_boot(); + const int64_t time_diff = (evt.mono_time - evt_start_ts) / speed_ - (current_nanos - loop_start_ts); + + // Reset timestamps for potential synchronization issues: + // - A negative time_diff may indicate slow execution or system wake-up, + // - A time_diff exceeding 1 second suggests a skipped segment. + if ((time_diff < -1e9 || time_diff >= 1e9) || speed_ != prev_replay_speed) { evt_start_ts = evt.mono_time; - loop_start_ts = nanos_since_boot(); + loop_start_ts = current_nanos; prev_replay_speed = speed_; } else if (time_diff > 0) { precise_nano_sleep(time_diff); From 22be176b87503091444a5443363ce6f1e9ef673d Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 3 May 2024 10:46:57 -0700 Subject: [PATCH 373/384] [bot] Fingerprints: add missing FW versions from new users (#32340) Export fingerprints --- selfdrive/car/hyundai/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index ffd2e2e3fd..89a45accf2 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -284,6 +284,7 @@ FW_VERSIONS = { b'\xf1\x00TM__ SCC F-CUP 1.00 1.00 99110-S1500 ', b'\xf1\x00TM__ SCC F-CUP 1.00 1.01 99110-S1500 ', b'\xf1\x00TM__ SCC FHCUP 1.00 1.00 99110-S1500 ', + b'\xf1\x00TM__ SCC FHCUP 1.00 1.01 99110-S1500 ', ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00TM ESC \x01 102!\x04\x03 58910-S2DA0', @@ -294,6 +295,7 @@ FW_VERSIONS = { b'\xf1\x00TM ESC \x03 102!\x04\x03 58910-S2DA0', b'\xf1\x00TM ESC \x04 101 \x08\x04 58910-S2GA0', b'\xf1\x00TM ESC \x04 102!\x04\x05 58910-S2GA0', + b'\xf1\x00TM ESC \x04 103"\x07\x08 58910-S2GA0', b'\xf1\x00TM ESC \x1e 102 \x08\x08 58910-S1DA0', b'\xf1\x00TM ESC 103!\x030 58910-S1MA0', ], From 7b5923a5eb9d45d6fbdd458b20d4a0e9c57c160b Mon Sep 17 00:00:00 2001 From: commaci-public <60409688+commaci-public@users.noreply.github.com> Date: Fri, 3 May 2024 14:34:37 -0700 Subject: [PATCH 374/384] [bot] Bump submodules (#32344) bump submodules Co-authored-by: Vehicle Researcher --- body | 2 +- cereal | 2 +- opendbc | 2 +- panda | 2 +- rednose_repo | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/body b/body index 864c5449ef..0e74db67ae 160000 --- a/body +++ b/body @@ -1 +1 @@ -Subproject commit 864c5449ef4f339589366f5abbfc2d2211e010dd +Subproject commit 0e74db67ae6aaa7c30054bd4335dcafe69a5aa72 diff --git a/cereal b/cereal index 284206878d..84af7ef665 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 284206878d6184747b1e1af03f91ac9e718ff326 +Subproject commit 84af7ef6654b2e810a2871b8ddd27ad170696599 diff --git a/opendbc b/opendbc index e0d4be4a62..d058bc9a9f 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit e0d4be4a6215d44809718dc84efe1b9f0299ad63 +Subproject commit d058bc9a9f156d55ee6e4b90ceb292d087267414 diff --git a/panda b/panda index 53e0f13739..2b70e283c1 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 53e0f13739e920f6d2f1cd1bdf6a5676c01be3e8 +Subproject commit 2b70e283c17e8e661f471cfe7994dfca8a4457d3 diff --git a/rednose_repo b/rednose_repo index 24c50f57bb..72b3479bab 160000 --- a/rednose_repo +++ b/rednose_repo @@ -1 +1 @@ -Subproject commit 24c50f57bb4247322560da6cfa585cfc035d9824 +Subproject commit 72b3479bababc658f24cc7aa0dc8bb550f0474fc From 3bf70098772e99210ac189321feb8087a66f7225 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 4 May 2024 09:39:16 -0700 Subject: [PATCH 375/384] [bot] Fingerprints: add missing FW versions from new users (#32349) Export fingerprints --- selfdrive/car/hyundai/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 89a45accf2..b7262252a5 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -870,6 +870,7 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.00 99210-AB000 200819', b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.01 99210-AB000 210205', + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.02 99210-AB000 220111', b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.03 99210-AA000 200819', b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.03 99210-AB000 220426', b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.06 99210-AA000 220111', From 5f8b53be332bb1d5027605ea3fc69036855a41e9 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sun, 5 May 2024 00:40:54 +0800 Subject: [PATCH 376/384] cabana: fix the panda serial selector disappeared after `buildConfigForm()` (#32342) --- tools/cabana/cabana.cc | 32 ++++-------- tools/cabana/mainwin.cc | 3 ++ tools/cabana/streams/pandastream.cc | 78 ++++++++--------------------- tools/cabana/streams/pandastream.h | 4 +- 4 files changed, 35 insertions(+), 82 deletions(-) diff --git a/tools/cabana/cabana.cc b/tools/cabana/cabana.cc index 205d795776..bb29a7e3a4 100644 --- a/tools/cabana/cabana.cc +++ b/tools/cabana/cabana.cc @@ -3,7 +3,6 @@ #include "selfdrive/ui/qt/util.h" #include "tools/cabana/mainwin.h" -#include "tools/cabana/streamselector.h" #include "tools/cabana/streams/devicestream.h" #include "tools/cabana/streams/pandastream.h" #include "tools/cabana/streams/replaystream.h" @@ -82,28 +81,17 @@ int main(int argc, char *argv[]) { } } - int ret = 0; - { - MainWindow w; - QTimer::singleShot(0, [&]() { - if (!stream) { - StreamSelector dlg(&stream); - dlg.exec(); - dbc_file = dlg.dbcFile(); - } - if (!stream) { - stream = new DummyStream(&app); - } - stream->start(); - if (!dbc_file.isEmpty()) { - w.loadFile(dbc_file); - } - w.show(); - }); - - ret = app.exec(); + MainWindow w; + if (stream) { + stream->start(); + if (!dbc_file.isEmpty()) { + w.loadFile(dbc_file); + } + } else { + w.openStream(); } - + w.show(); + int ret = app.exec(); delete can; return ret; } diff --git a/tools/cabana/mainwin.cc b/tools/cabana/mainwin.cc index a4b7764346..e6c9b49ca1 100644 --- a/tools/cabana/mainwin.cc +++ b/tools/cabana/mainwin.cc @@ -262,6 +262,9 @@ void MainWindow::openStream() { } stream->start(); statusBar()->showMessage(tr("Route %1 loaded").arg(can->routeName()), 2000); + } else if (!can) { + stream = new DummyStream(this); + stream->start(); } } diff --git a/tools/cabana/streams/pandastream.cc b/tools/cabana/streams/pandastream.cc index bea1fd7480..308391a10c 100644 --- a/tools/cabana/streams/pandastream.cc +++ b/tools/cabana/streams/pandastream.cc @@ -6,39 +6,12 @@ #include #include #include -#include - -// TODO: remove clearLayout -static void clearLayout(QLayout* layout) { - while (layout->count() > 0) { - QLayoutItem* item = layout->takeAt(0); - if (QWidget* widget = item->widget()) { - widget->deleteLater(); - } - if (QLayout* childLayout = item->layout()) { - clearLayout(childLayout); - } - delete item; - } -} - -PandaStream::PandaStream(QObject *parent, PandaStreamConfig config_) : config(config_), LiveStream(parent) { - if (config.serial.isEmpty()) { - auto serials = Panda::list(); - if (serials.size() == 0) { - throw std::runtime_error("No panda found"); - } - config.serial = QString::fromStdString(serials[0]); - } - qDebug() << "Connecting to panda with serial" << config.serial; - if (!connect()) { - throw std::runtime_error("Failed to connect to panda"); - } -} +PandaStream::PandaStream(QObject *parent, PandaStreamConfig config_) : config(config_), LiveStream(parent) {} bool PandaStream::connect() { try { + qDebug() << "Connecting to panda with serial" << config.serial; panda.reset(new Panda(config.serial.toStdString())); config.bus_config.resize(3); qDebug() << "Connected"; @@ -47,7 +20,6 @@ bool PandaStream::connect() { } panda->set_safety_model(cereal::CarParams::SafetyModel::SILENT); - for (int bus = 0; bus < config.bus_config.size(); bus++) { panda->set_can_speed_kbps(bus, config.bus_config[bus].can_speed_kbps); @@ -60,7 +32,6 @@ bool PandaStream::connect() { panda->set_data_speed_kbps(bus, 10); } } - } return true; } @@ -108,26 +79,14 @@ AbstractOpenStreamWidget *PandaStream::widget(AbstractStream **stream) { // OpenPandaWidget OpenPandaWidget::OpenPandaWidget(AbstractStream **stream) : AbstractOpenStreamWidget(stream) { - QVBoxLayout *main_layout = new QVBoxLayout(this); - main_layout->addStretch(1); - - QFormLayout *form_layout = new QFormLayout(); - + form_layout = new QFormLayout(this); QHBoxLayout *serial_layout = new QHBoxLayout(); - serial_edit = new QComboBox(); - serial_edit->setFixedWidth(300); - serial_layout->addWidget(serial_edit); + serial_layout->addWidget(serial_edit = new QComboBox()); QPushButton *refresh = new QPushButton(tr("Refresh")); - refresh->setFixedWidth(100); + refresh->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); serial_layout->addWidget(refresh); form_layout->addRow(tr("Serial"), serial_layout); - main_layout->addLayout(form_layout); - - config_layout = new QFormLayout(); - main_layout->addLayout(config_layout); - - main_layout->addStretch(1); QObject::connect(refresh, &QPushButton::clicked, this, &OpenPandaWidget::refreshSerials); QObject::connect(serial_edit, &QComboBox::currentTextChanged, this, &OpenPandaWidget::buildConfigForm); @@ -145,15 +104,16 @@ void OpenPandaWidget::refreshSerials() { } void OpenPandaWidget::buildConfigForm() { - clearLayout(config_layout); - QString serial = serial_edit->currentText(); + for (int i = form_layout->rowCount() - 1; i > 0; --i) { + form_layout->removeRow(i); + } + QString serial = serial_edit->currentText(); bool has_fd = false; bool has_panda = !serial.isEmpty(); - if (has_panda) { try { - Panda panda = Panda(serial.toStdString()); + Panda panda(serial.toStdString()); has_fd = (panda.hw_type == cereal::PandaState::PandaType::RED_PANDA) || (panda.hw_type == cereal::PandaState::PandaType::RED_PANDA_V2); } catch (const std::exception& e) { has_panda = false; @@ -201,20 +161,22 @@ void OpenPandaWidget::buildConfigForm() { QObject::connect(enable_fd, &QCheckBox::stateChanged, [=](int state) {config.bus_config[i].can_fd = (bool)state;}); } - config_layout->addRow(tr("Bus %1:").arg(i), bus_layout); + form_layout->addRow(tr("Bus %1:").arg(i), bus_layout); } } else { config.serial = ""; - config_layout->addWidget(new QLabel(tr("No panda found"))); + form_layout->addWidget(new QLabel(tr("No panda found"))); } } bool OpenPandaWidget::open() { - try { - *stream = new PandaStream(qApp, config); - } catch (std::exception &e) { - QMessageBox::warning(nullptr, tr("Warning"), tr("Failed to connect to panda: '%1'").arg(e.what())); - return false; + if (!config.serial.isEmpty()) { + auto panda_stream = std::make_unique(qApp, config); + if (panda_stream->connect()) { + *stream = panda_stream.release(); + return true; + } } - return true; + QMessageBox::warning(nullptr, tr("Warning"), tr("Failed to connect to panda")); + return false; } diff --git a/tools/cabana/streams/pandastream.h b/tools/cabana/streams/pandastream.h index 919156f400..ce0adfc9f8 100644 --- a/tools/cabana/streams/pandastream.h +++ b/tools/cabana/streams/pandastream.h @@ -21,6 +21,7 @@ class PandaStream : public LiveStream { Q_OBJECT public: PandaStream(QObject *parent, PandaStreamConfig config_ = {}); + bool connect(); static AbstractOpenStreamWidget *widget(AbstractStream **stream); inline QString routeName() const override { return QString("Live Streaming From Panda %1").arg(config.serial); @@ -28,7 +29,6 @@ public: protected: void streamThread() override; - bool connect(); std::unique_ptr panda; PandaStreamConfig config = {}; @@ -47,6 +47,6 @@ private: void buildConfigForm(); QComboBox *serial_edit; - QFormLayout *config_layout; + QFormLayout *form_layout; PandaStreamConfig config = {}; }; From aca01365e6715c1c5c18242e81e27c6feed151c6 Mon Sep 17 00:00:00 2001 From: Hoang Bui <47828508+bongbui321@users.noreply.github.com> Date: Sun, 5 May 2024 19:32:08 -0400 Subject: [PATCH 377/384] CI/Simulator: Add Metadrive test to CI (#32352) * works consistently * ci gha * fix * navd * fix * cleanup * change button * cleanup --------- Co-authored-by: Adeeb Shihadeh --- .github/workflows/tools_tests.yaml | 26 ++++++++++++++++++++++++-- tools/sim/bridge/common.py | 4 +++- tools/sim/tests/test_sim_bridge.py | 2 -- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tools_tests.yaml b/.github/workflows/tools_tests.yaml index 89c3efbac6..ccd3368cb0 100644 --- a/.github/workflows/tools_tests.yaml +++ b/.github/workflows/tools_tests.yaml @@ -37,8 +37,8 @@ jobs: run: | ${{ env.RUN }} "pytest tools/plotjuggler/" - simulator: - name: simulator + simulator_build: + name: simulator docker build runs-on: ubuntu-latest if: github.repository == 'commaai/openpilot' timeout-minutes: 45 @@ -56,6 +56,28 @@ jobs: run: | selfdrive/test/docker_build.sh sim + simulator_driving: + name: simulator driving + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - run: git lfs pull + - uses: ./.github/workflows/setup-with-retry + - name: Build base docker image + run: eval "$BUILD" + - name: Build openpilot + run: | + ${{ env.RUN }} "scons -j$(nproc)" + - name: Run bridge test + run: | + ${{ env.RUN }} "export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' && \ + source selfdrive/test/setup_xvfb.sh && \ + source selfdrive/test/setup_vsound.sh && \ + CI=1 tools/sim/tests/test_metadrive_bridge.py" + devcontainer: name: devcontainer runs-on: ubuntu-latest diff --git a/tools/sim/bridge/common.py b/tools/sim/bridge/common.py index 3bd2f35772..46d09c7b9d 100644 --- a/tools/sim/bridge/common.py +++ b/tools/sim/bridge/common.py @@ -46,6 +46,7 @@ class SimulatorBridge(ABC): self.world: World | None = None self.past_startup_engaged = False + self.startup_button_prev = True def _on_shutdown(self, signal, frame): self.shutdown() @@ -161,7 +162,8 @@ Ignition: {self.simulator_state.ignition} Engaged: {self.simulator_state.is_enga self.past_startup_engaged = True elif not self.past_startup_engaged and controlsState.engageable: - self.simulator_state.cruise_button = CruiseButtons.DECEL_SET # force engagement on startup + self.simulator_state.cruise_button = CruiseButtons.DECEL_SET if self.startup_button_prev else CruiseButtons.MAIN # force engagement on startup + self.startup_button_prev = not self.startup_button_prev throttle_out = throttle_op if self.simulator_state.is_engaged else throttle_manual brake_out = brake_op if self.simulator_state.is_engaged else brake_manual diff --git a/tools/sim/tests/test_sim_bridge.py b/tools/sim/tests/test_sim_bridge.py index 504914c562..d9653d5cfd 100644 --- a/tools/sim/tests/test_sim_bridge.py +++ b/tools/sim/tests/test_sim_bridge.py @@ -62,8 +62,6 @@ class TestSimBridgeBase(unittest.TestCase): while time.monotonic() < start_time + max_time_per_step: sm.update() - q.put("cruise_down") # Try engaging - if sm.all_alive() and sm['controlsState'].active: control_active += 1 From 3c32585a9262847049e5cbf879d87b409a495c43 Mon Sep 17 00:00:00 2001 From: commaci-public <60409688+commaci-public@users.noreply.github.com> Date: Mon, 6 May 2024 13:46:58 -0700 Subject: [PATCH 378/384] [bot] Update Python packages and pre-commit hooks (#32355) Update Python packages and pre-commit hooks Co-authored-by: Vehicle Researcher --- .pre-commit-config.yaml | 2 +- poetry.lock | 438 ++++++++++++++++++++-------------------- 2 files changed, 221 insertions(+), 219 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d17fe6b7db..e9c7d93d88 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: - -L bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints - --builtins clear,rare,informal,usage,code,names,en-GB_to_en-US - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.2 + rev: v0.4.3 hooks: - id: ruff exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' diff --git a/poetry.lock b/poetry.lock index 2e66336f11..70e91f2cc2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "aiohttp" @@ -311,13 +311,13 @@ aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"] [[package]] name = "babel" -version = "2.14.0" +version = "2.15.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, - {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] [package.extras] @@ -756,63 +756,63 @@ test = ["pytest", "pytest-timeout"] [[package]] name = "coverage" -version = "7.5.0" +version = "7.5.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c"}, - {file = "coverage-7.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58"}, - {file = "coverage-7.5.0-cp310-cp310-win32.whl", hash = "sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4"}, - {file = "coverage-7.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a"}, - {file = "coverage-7.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375"}, - {file = "coverage-7.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff"}, - {file = "coverage-7.5.0-cp311-cp311-win32.whl", hash = "sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d"}, - {file = "coverage-7.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656"}, - {file = "coverage-7.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9"}, - {file = "coverage-7.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2"}, - {file = "coverage-7.5.0-cp312-cp312-win32.whl", hash = "sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4"}, - {file = "coverage-7.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475"}, - {file = "coverage-7.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e"}, - {file = "coverage-7.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88"}, - {file = "coverage-7.5.0-cp38-cp38-win32.whl", hash = "sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25"}, - {file = "coverage-7.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a"}, - {file = "coverage-7.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1"}, - {file = "coverage-7.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0"}, - {file = "coverage-7.5.0-cp39-cp39-win32.whl", hash = "sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7"}, - {file = "coverage-7.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493"}, - {file = "coverage-7.5.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067"}, - {file = "coverage-7.5.0.tar.gz", hash = "sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8"}, + {file = "coverage-7.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e"}, + {file = "coverage-7.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f"}, + {file = "coverage-7.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a"}, + {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35"}, + {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e"}, + {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223"}, + {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e"}, + {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146"}, + {file = "coverage-7.5.1-cp310-cp310-win32.whl", hash = "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228"}, + {file = "coverage-7.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8"}, + {file = "coverage-7.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428"}, + {file = "coverage-7.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746"}, + {file = "coverage-7.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3"}, + {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2"}, + {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca"}, + {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8"}, + {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057"}, + {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987"}, + {file = "coverage-7.5.1-cp311-cp311-win32.whl", hash = "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136"}, + {file = "coverage-7.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd"}, + {file = "coverage-7.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206"}, + {file = "coverage-7.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34"}, + {file = "coverage-7.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d"}, + {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa"}, + {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e"}, + {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572"}, + {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07"}, + {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7"}, + {file = "coverage-7.5.1-cp312-cp312-win32.whl", hash = "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19"}, + {file = "coverage-7.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596"}, + {file = "coverage-7.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7"}, + {file = "coverage-7.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90"}, + {file = "coverage-7.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e"}, + {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5"}, + {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661"}, + {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8"}, + {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4"}, + {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d"}, + {file = "coverage-7.5.1-cp38-cp38-win32.whl", hash = "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41"}, + {file = "coverage-7.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de"}, + {file = "coverage-7.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1"}, + {file = "coverage-7.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece"}, + {file = "coverage-7.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26"}, + {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5"}, + {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601"}, + {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be"}, + {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f"}, + {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668"}, + {file = "coverage-7.5.1-cp39-cp39-win32.whl", hash = "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981"}, + {file = "coverage-7.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f"}, + {file = "coverage-7.5.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312"}, + {file = "coverage-7.5.1.tar.gz", hash = "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c"}, ] [package.extras] @@ -830,43 +830,43 @@ files = [ [[package]] name = "cryptography" -version = "42.0.5" +version = "42.0.6" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-42.0.6-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:073104df012fc815eed976cd7d0a386c8725d0d0947cf9c37f6c36a6c20feb1b"}, + {file = "cryptography-42.0.6-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:5967e3632f42b0c0f9dc2c9da88c79eabdda317860b246d1fbbde4a8bbbc3b44"}, + {file = "cryptography-42.0.6-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99831397fdc6e6e0aa088b060c278c6e635d25c0d4d14bdf045bf81792fda0a"}, + {file = "cryptography-42.0.6-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:089aeb297ff89615934b22c7631448598495ffd775b7d540a55cfee35a677bf4"}, + {file = "cryptography-42.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:97eeacae9aa526ddafe68b9202a535f581e21d78f16688a84c8dcc063618e121"}, + {file = "cryptography-42.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f4cece02478d73dacd52be57a521d168af64ae03d2a567c0c4eb6f189c3b9d79"}, + {file = "cryptography-42.0.6-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb6f56b004e898df5530fa873e598ec78eb338ba35f6fa1449970800b1d97c2"}, + {file = "cryptography-42.0.6-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8b90c57b3cd6128e0863b894ce77bd36fcb5f430bf2377bc3678c2f56e232316"}, + {file = "cryptography-42.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d16a310c770cc49908c500c2ceb011f2840674101a587d39fa3ea828915b7e83"}, + {file = "cryptography-42.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e3442601d276bd9e961d618b799761b4e5d892f938e8a4fe1efbe2752be90455"}, + {file = "cryptography-42.0.6-cp37-abi3-win32.whl", hash = "sha256:00c0faa5b021457848d031ecff041262211cc1e2bce5f6e6e6c8108018f6b44a"}, + {file = "cryptography-42.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:b16b90605c62bcb3aa7755d62cf5e746828cfc3f965a65211849e00c46f8348d"}, + {file = "cryptography-42.0.6-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:eecca86813c6a923cabff284b82ff4d73d9e91241dc176250192c3a9b9902a54"}, + {file = "cryptography-42.0.6-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d93080d2b01b292e7ee4d247bf93ed802b0100f5baa3fa5fd6d374716fa480d4"}, + {file = "cryptography-42.0.6-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ff75b88a4d273c06d968ad535e6cb6a039dd32db54fe36f05ed62ac3ef64a44"}, + {file = "cryptography-42.0.6-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c05230d8aaaa6b8ab3ab41394dc06eb3d916131df1c9dcb4c94e8f041f704b74"}, + {file = "cryptography-42.0.6-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9184aff0856261ecb566a3eb26a05dfe13a292c85ce5c59b04e4aa09e5814187"}, + {file = "cryptography-42.0.6-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:4bdb39ecbf05626e4bfa1efd773bb10346af297af14fb3f4c7cb91a1d2f34a46"}, + {file = "cryptography-42.0.6-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e85f433230add2aa26b66d018e21134000067d210c9c68ef7544ba65fc52e3eb"}, + {file = "cryptography-42.0.6-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:65d529c31bd65d54ce6b926a01e1b66eacf770b7e87c0622516a840e400ec732"}, + {file = "cryptography-42.0.6-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f1e933b238978ccfa77b1fee0a297b3c04983f4cb84ae1c33b0ea4ae08266cc9"}, + {file = "cryptography-42.0.6-cp39-abi3-win32.whl", hash = "sha256:bc954251edcd8a952eeaec8ae989fec7fe48109ab343138d537b7ea5bb41071a"}, + {file = "cryptography-42.0.6-cp39-abi3-win_amd64.whl", hash = "sha256:9f1a3bc2747166b0643b00e0b56cd9b661afc9d5ff963acaac7a9c7b2b1ef638"}, + {file = "cryptography-42.0.6-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:945a43ebf036dd4b43ebfbbd6b0f2db29ad3d39df824fb77476ca5777a9dde33"}, + {file = "cryptography-42.0.6-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f567a82b7c2b99257cca2a1c902c1b129787278ff67148f188784245c7ed5495"}, + {file = "cryptography-42.0.6-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3b750279f3e7715df6f68050707a0cee7cbe81ba2eeb2f21d081bd205885ffed"}, + {file = "cryptography-42.0.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6981acac509cc9415344cb5bfea8130096ea6ebcc917e75503143a1e9e829160"}, + {file = "cryptography-42.0.6-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:076c92b08dd1ab88108bc84545187e10d3693a9299c593f98c4ea195a0b0ead7"}, + {file = "cryptography-42.0.6-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81dbe47e28b703bc4711ac74a64ef8b758a0cf056ce81d08e39116ab4bc126fa"}, + {file = "cryptography-42.0.6-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e1f5f15c5ddadf6ee4d1d624a2ae940f14bd74536230b0056ccb28bb6248e42a"}, + {file = "cryptography-42.0.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:43e521f21c2458038d72e8cdfd4d4d9f1d00906a7b6636c4272e35f650d1699b"}, + {file = "cryptography-42.0.6.tar.gz", hash = "sha256:f987a244dfb0333fbd74a691c36000a2569eaf7c7cc2ac838f85f59f0588ddc9"}, ] [package.dependencies] @@ -1707,13 +1707,13 @@ testing = ["pytest (==7.1.3)"] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -2051,7 +2051,6 @@ files = [ {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8"}, {file = "lxml-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd"}, {file = "lxml-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c"}, - {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3e183c6e3298a2ed5af9d7a356ea823bccaab4ec2349dc9ed83999fd289d14d5"}, {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b"}, {file = "lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a"}, {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585"}, @@ -3543,17 +3542,16 @@ pyrect = "*" [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -6921,6 +6919,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -6957,99 +6956,99 @@ files = [ [[package]] name = "pyzmq" -version = "26.0.2" +version = "26.0.3" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a60a03b01e8c9c58932ec0cca15b1712d911c2800eb82d4281bc1ae5b6dad50"}, - {file = "pyzmq-26.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:949067079e14ea1973bd740255e0840118c163d4bce8837f539d749f145cf5c3"}, - {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37e7edfa6cf96d036a403775c96afa25058d1bb940a79786a9a2fc94a783abe3"}, - {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:903cc7a84a7d4326b43755c368780800e035aa3d711deae84a533fdffa8755b0"}, - {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cb2e41af165e5f327d06fbdd79a42a4e930267fade4e9f92d17f3ccce03f3a7"}, - {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:55353b8189adcfc4c125fc4ce59d477744118e9c0ec379dd0999c5fa120ac4f5"}, - {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f961423ff6236a752ced80057a20e623044df95924ed1009f844cde8b3a595f9"}, - {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ba77fe84fe4f5f3dc0ef681a6d366685c8ffe1c8439c1d7530997b05ac06a04b"}, - {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:52589f0a745ef61b9c75c872cf91f8c1f7c0668eb3dd99d7abd639d8c0fb9ca7"}, - {file = "pyzmq-26.0.2-cp310-cp310-win32.whl", hash = "sha256:b7b6d2a46c7afe2ad03ec8faf9967090c8ceae85c4d8934d17d7cae6f9062b64"}, - {file = "pyzmq-26.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:86531e20de249d9204cc6d8b13d5a30537748c78820215161d8a3b9ea58ca111"}, - {file = "pyzmq-26.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:f26a05029ecd2bd306b941ff8cb80f7620b7901421052bc429d238305b1cbf2f"}, - {file = "pyzmq-26.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:70770e296a9cb03d955540c99360aab861cbb3cba29516abbd106a15dbd91268"}, - {file = "pyzmq-26.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2740fd7161b39e178554ebf21aa5667a1c9ef0cd2cb74298fd4ef017dae7aec4"}, - {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3706c32dea077faa42b1c92d825b7f86c866f72532d342e0be5e64d14d858"}, - {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fa1416876194927f7723d6b7171b95e1115602967fc6bfccbc0d2d51d8ebae1"}, - {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ef9a79a48794099c57dc2df00340b5d47c5caa1792f9ddb8c7a26b1280bd575"}, - {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1c60fcdfa3229aeee4291c5d60faed3a813b18bdadb86299c4bf49e8e51e8605"}, - {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e943c39c206b04df2eb5d71305761d7c3ca75fd49452115ea92db1b5b98dbdef"}, - {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8da0ed8a598693731c76659880a668f4748b59158f26ed283a93f7f04d47447e"}, - {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7bf51970b11d67096bede97cdbad0f4333f7664f4708b9b2acb352bf4faa3140"}, - {file = "pyzmq-26.0.2-cp311-cp311-win32.whl", hash = "sha256:6f8e6bd5d066be605faa9fe5ec10aa1a46ad9f18fc8646f2b9aaefc8fb575742"}, - {file = "pyzmq-26.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d03da3a0ae691b361edcb39530075461202f699ce05adbb15055a0e1c9bcaa4"}, - {file = "pyzmq-26.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f84e33321b68ff00b60e9dbd1a483e31ab6022c577c8de525b8e771bd274ce68"}, - {file = "pyzmq-26.0.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:44c33ebd1c62a01db7fbc24e18bdda569d6639217d13d5929e986a2b0f69070d"}, - {file = "pyzmq-26.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ac04f904b4fce4afea9cdccbb78e24d468cb610a839d5a698853e14e2a3f9ecf"}, - {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2133de5ba9adc5f481884ccb699eac9ce789708292945c05746880f95b241c0"}, - {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7753c67c570d7fc80c2dc59b90ca1196f1224e0e2e29a548980c95fe0fe27fc1"}, - {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d4e51632e6b12e65e8d9d7612446ecda2eda637a868afa7bce16270194650dd"}, - {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d6c38806f6ecd0acf3104b8d7e76a206bcf56dadd6ce03720d2fa9d9157d5718"}, - {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:48f496bbe14686b51cec15406323ae6942851e14022efd7fc0e2ecd092c5982c"}, - {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e84a3161149c75bb7a7dc8646384186c34033e286a67fec1ad1bdedea165e7f4"}, - {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:dabf796c67aa9f5a4fcc956d47f0d48b5c1ed288d628cf53aa1cf08e88654343"}, - {file = "pyzmq-26.0.2-cp312-cp312-win32.whl", hash = "sha256:3eee4c676af1b109f708d80ef0cf57ecb8aaa5900d1edaf90406aea7e0e20e37"}, - {file = "pyzmq-26.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:26721fec65846b3e4450dad050d67d31b017f97e67f7e0647b5f98aa47f828cf"}, - {file = "pyzmq-26.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:653955c6c233e90de128a1b8e882abc7216f41f44218056bd519969c8c413a15"}, - {file = "pyzmq-26.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:becd8d8fb068fbb5a52096efd83a2d8e54354383f691781f53a4c26aee944542"}, - {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a15e5465e7083c12517209c9dd24722b25e9b63c49a563922922fc03554eb35"}, - {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e8158ac8616941f874841f9fa0f6d2f1466178c2ff91ea08353fdc19de0d40c2"}, - {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea2c6a53e28c7066ea7db86fcc0b71d78d01b818bb11d4a4341ec35059885295"}, - {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bdbc7dab0b0e9c62c97b732899c4242e3282ba803bad668e03650b59b165466e"}, - {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e74b6d5ef57bb65bf1b4a37453d8d86d88550dde3fb0f23b1f1a24e60c70af5b"}, - {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ed4c6ee624ecbc77b18aeeb07bf0700d26571ab95b8f723f0d02e056b5bce438"}, - {file = "pyzmq-26.0.2-cp37-cp37m-win32.whl", hash = "sha256:8a98b3cb0484b83c19d8fb5524c8a469cd9f10e743f5904ac285d92678ee761f"}, - {file = "pyzmq-26.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:aa5f95d71b6eca9cec28aa0a2f8310ea53dea313b63db74932879ff860c1fb8d"}, - {file = "pyzmq-26.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:5ff56c76ce77b9805378a7a73032c17cbdb1a5b84faa1df03c5d3e306e5616df"}, - {file = "pyzmq-26.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bab697fc1574fee4b81da955678708567c43c813c84c91074e452bda5346c921"}, - {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c0fed8aa9ba0488ee1cbdaa304deea92d52fab43d373297002cfcc69c0a20c5"}, - {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:606b922699fcec472ed814dda4dc3ff7c748254e0b26762a0ba21a726eb1c107"}, - {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45f0fd82bad4d199fa993fbf0ac586a7ac5879addbe436a35a389df7e0eb4c91"}, - {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:166c5e41045939a52c01e6f374e493d9a6a45dfe677360d3e7026e38c42e8906"}, - {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d566e859e8b8d5bca08467c093061774924b3d78a5ba290e82735b2569edc84b"}, - {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:264ee0e72b72ca59279dc320deab5ae0fac0d97881aed1875ce4bde2e56ffde0"}, - {file = "pyzmq-26.0.2-cp38-cp38-win32.whl", hash = "sha256:3152bbd3a4744cbdd83dfb210ed701838b8b0c9065cef14671d6d91df12197d0"}, - {file = "pyzmq-26.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:bf77601d75ca692c179154b7e5943c286a4aaffec02c491afe05e60493ce95f2"}, - {file = "pyzmq-26.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:c770a7545b3deca2db185b59175e710a820dd4ed43619f4c02e90b0e227c6252"}, - {file = "pyzmq-26.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d47175f0a380bfd051726bc5c0054036ae4a5d8caf922c62c8a172ccd95c1a2a"}, - {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bce298c1ce077837e110367c321285dc4246b531cde1abfc27e4a5bbe2bed4d"}, - {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c40b09b7e184d6e3e1be1c8af2cc320c0f9f610d8a5df3dd866e6e6e4e32b235"}, - {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d420d856bf728713874cefb911398efe69e1577835851dd297a308a78c14c249"}, - {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d792d3cab987058451e55c70c5926e93e2ceb68ca5a2334863bb903eb860c9cb"}, - {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:83ec17729cf6d3464dab98a11e98294fcd50e6b17eaabd3d841515c23f6dbd3a"}, - {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47c17d5ebfa88ae90f08960c97b49917098665b8cd8be31f2c24e177bcf37a0f"}, - {file = "pyzmq-26.0.2-cp39-cp39-win32.whl", hash = "sha256:d509685d1cd1d018705a811c5f9d5bc237790936ead6d06f6558b77e16cc7235"}, - {file = "pyzmq-26.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:c7cc8cc009e8f6989a6d86c96f87dae5f5fb07d6c96916cdc7719d546152c7db"}, - {file = "pyzmq-26.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:3ada31cb879cd7532f4a85b501f4255c747d4813ab76b35c49ed510ce4865b45"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0a6ceaddc830dd3ca86cb8451cf373d1f05215368e11834538c2902ed5205139"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a967681463aa7a99eb9a62bb18229b653b45c10ff0947b31cc0837a83dfb86f"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6472a73bc115bc40a2076609a90894775abe6faf19a78375675a2f889a613071"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d6aea92bcccfe5e5524d3c70a6f16ffdae548390ddad26f4207d55c55a40593"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e025f6351e49d48a5aa2f5a09293aa769b0ee7369c25bed551647234b7fa0c75"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:40bd7ebe4dbb37d27f0c56e2a844f360239343a99be422085e13e97da13f73f9"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dd40d586ad6f53764104df6e01810fe1b4e88fd353774629a5e6fe253813f79"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2aca15e9ad8c8657b5b3d7ae3d1724dc8c1c1059c06b4b674c3aa36305f4930"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450ec234736732eb0ebeffdb95a352450d4592f12c3e087e2a9183386d22c8bf"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f43be2bebbd09360a2f23af83b243dc25ffe7b583ea8c722e6df03e03a55f02f"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:867f55e54aff254940bcec5eec068e7c0ac1e6bf360ab91479394a8bf356b0e6"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b4dbc033c5ad46f8c429bf238c25a889b8c1d86bfe23a74e1031a991cb3f0000"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6e8dd2961462e337e21092ec2da0c69d814dcb1b6e892955a37444a425e9cfb8"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35391e72df6c14a09b697c7b94384947c1dd326aca883ff98ff137acdf586c33"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1c3d3c92fa54eda94ab369ca5b8d35059987c326ba5e55326eb068862f64b1fc"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7aa61a9cc4f0523373e31fc9255bf4567185a099f85ca3598e64de484da3ab2"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee53a8191271f144cc20b12c19daa9f1546adc84a2f33839e3338039b55c373c"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac60a980f07fa988983f7bfe6404ef3f1e4303f5288a01713bc1266df6d18783"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88896b1b4817d7b2fe1ec7205c4bbe07bf5d92fb249bf2d226ddea8761996068"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:18dfffe23751edee917764ffa133d5d3fef28dfd1cf3adebef8c90bc854c74c4"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6926dd14cfe6967d3322640b6d5c3c3039db71716a5e43cca6e3b474e73e0b36"}, - {file = "pyzmq-26.0.2.tar.gz", hash = "sha256:f0f9bb370449158359bb72a3e12c658327670c0ffe6fbcd1af083152b64f9df0"}, + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, + {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, + {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, + {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, + {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, + {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, + {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, + {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, ] [package.dependencies] @@ -7078,43 +7077,43 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rubicon-objc" -version = "0.4.8" +version = "0.4.9" description = "A bridge between an Objective C runtime environment and Python." optional = false python-versions = ">=3.8" files = [ - {file = "rubicon-objc-0.4.8.tar.gz", hash = "sha256:f7bede0f0e73dde07083785984c75b3acf76116298743758ea5c51b3ebb81978"}, - {file = "rubicon_objc-0.4.8-py3-none-any.whl", hash = "sha256:59633f622e3c6e740bd9b3c4b60d0258fc2d30632b05d46cba12fae69539cfd3"}, + {file = "rubicon_objc-0.4.9-py3-none-any.whl", hash = "sha256:c351b3800cf74c8c23f7d534f008fd5de46c63818de7a44de96daffdb3ed8b8c"}, + {file = "rubicon_objc-0.4.9.tar.gz", hash = "sha256:3d77a5b2d10cb1e49679aa90b7824b46f67b3fd636229aa4a1b902d24aec6a58"}, ] [package.extras] -dev = ["pre-commit (==3.5.0)", "pre-commit (==3.7.0)", "pytest (==8.1.1)", "pytest-tldr (==0.2.5)", "setuptools-scm (==8.0.4)", "tox (==4.14.2)"] -docs = ["furo (==2024.1.29)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx (==7.2.6)", "sphinx-autobuild (==2021.3.14)", "sphinx-autobuild (==2024.2.4)", "sphinx-copybutton (==0.5.2)", "sphinx-tabs (==3.4.5)", "sphinxcontrib-spelling (==8.0.0)"] +dev = ["pre-commit (==3.5.0)", "pre-commit (==3.7.0)", "pytest (==8.2.0)", "pytest-tldr (==0.2.5)", "setuptools-scm (==8.0.4)", "tox (==4.15.0)"] +docs = ["furo (==2024.4.27)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx (==7.3.7)", "sphinx-autobuild (==2021.3.14)", "sphinx-autobuild (==2024.4.16)", "sphinx-copybutton (==0.5.2)", "sphinx-tabs (==3.4.5)", "sphinxcontrib-spelling (==8.0.0)"] [[package]] name = "ruff" -version = "0.4.2" +version = "0.4.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5"}, - {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd"}, - {file = "ruff-0.4.2-py3-none-win32.whl", hash = "sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe"}, - {file = "ruff-0.4.2-py3-none-win_amd64.whl", hash = "sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798"}, - {file = "ruff-0.4.2-py3-none-win_arm64.whl", hash = "sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf"}, - {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"}, + {file = "ruff-0.4.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b70800c290f14ae6fcbb41bbe201cf62dfca024d124a1f373e76371a007454ce"}, + {file = "ruff-0.4.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08a0d6a22918ab2552ace96adeaca308833873a4d7d1d587bb1d37bae8728eb3"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba1f14df3c758dd7de5b55fbae7e1c8af238597961e5fb628f3de446c3c40c5"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:819fb06d535cc76dfddbfe8d3068ff602ddeb40e3eacbc90e0d1272bb8d97113"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bfc9e955e6dc6359eb6f82ea150c4f4e82b660e5b58d9a20a0e42ec3bb6342b"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:510a67d232d2ebe983fddea324dbf9d69b71c4d2dfeb8a862f4a127536dd4cfb"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9ff11cd9a092ee7680a56d21f302bdda14327772cd870d806610a3503d001f"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29efff25bf9ee685c2c8390563a5b5c006a3fee5230d28ea39f4f75f9d0b6f2f"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b00e0bcccf0fc8d7186ed21e311dffd19761cb632241a6e4fe4477cc80ef6e"}, + {file = "ruff-0.4.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262f5635e2c74d80b7507fbc2fac28fe0d4fef26373bbc62039526f7722bca1b"}, + {file = "ruff-0.4.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7363691198719c26459e08cc17c6a3dac6f592e9ea3d2fa772f4e561b5fe82a3"}, + {file = "ruff-0.4.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eeb039f8428fcb6725bb63cbae92ad67b0559e68b5d80f840f11914afd8ddf7f"}, + {file = "ruff-0.4.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:927b11c1e4d0727ce1a729eace61cee88a334623ec424c0b1c8fe3e5f9d3c865"}, + {file = "ruff-0.4.3-py3-none-win32.whl", hash = "sha256:25cacda2155778beb0d064e0ec5a3944dcca9c12715f7c4634fd9d93ac33fd30"}, + {file = "ruff-0.4.3-py3-none-win_amd64.whl", hash = "sha256:7a1c3a450bc6539ef00da6c819fb1b76b6b065dec585f91456e7c0d6a0bbc725"}, + {file = "ruff-0.4.3-py3-none-win_arm64.whl", hash = "sha256:71ca5f8ccf1121b95a59649482470c5601c60a416bf189d553955b0338e34614"}, + {file = "ruff-0.4.3.tar.gz", hash = "sha256:ff0a3ef2e3c4b6d133fbedcf9586abfbe38d076041f2dc18ffb2c7e0485d5a07"}, ] [[package]] @@ -7193,13 +7192,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "2.0.1" +version = "2.1.1" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.0.1-py2.py3-none-any.whl", hash = "sha256:b54c54a2160f509cf2757260d0cf3885b608c6192c2555a3857e3a4d0f84bdb3"}, - {file = "sentry_sdk-2.0.1.tar.gz", hash = "sha256:c278e0f523f6f0ee69dc43ad26dcdb1202dffe5ac326ae31472e012d941bee21"}, + {file = "sentry_sdk-2.1.1-py2.py3-none-any.whl", hash = "sha256:99aeb78fb76771513bd3b2829d12613130152620768d00cd3e45ac00cb17950f"}, + {file = "sentry_sdk-2.1.1.tar.gz", hash = "sha256:95d8c0bb41c8b0bc37ab202c2c4a295bb84398ee05f4cdce55051cd75b926ec1"}, ] [package.dependencies] @@ -7208,6 +7207,7 @@ urllib3 = ">=1.26.11" [package.extras] aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] arq = ["arq (>=0.23)"] asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] @@ -7223,6 +7223,8 @@ flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] grpcio = ["grpcio (>=1.21.1)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] loguru = ["loguru (>=0.5)"] openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] @@ -7745,13 +7747,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.2" +version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, - {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, ] [package.dependencies] From c05fc4872e83d77d749f2e196a953faf36438e8b Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 6 May 2024 13:47:20 -0700 Subject: [PATCH 379/384] [bot] Fingerprints: add missing FW versions from new users (#32357) Export fingerprints --- selfdrive/car/hyundai/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index b7262252a5..c2c850877f 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -417,6 +417,7 @@ FW_VERSIONS = { b'\xf1\x00LX2_ SCC FHCUP 1.00 1.03 99110-S8100 ', b'\xf1\x00LX2_ SCC FHCUP 1.00 1.04 99110-S8100 ', b'\xf1\x00LX2_ SCC FHCUP 1.00 1.05 99110-S8100 ', + b'\xf1\x00ON__ FCA FHCUP 1.00 1.00 99110-S9110 ', b'\xf1\x00ON__ FCA FHCUP 1.00 1.01 99110-S9110 ', b'\xf1\x00ON__ FCA FHCUP 1.00 1.02 99110-S9100 ', b'\xf1\x00ON__ FCA FHCUP 1.00 1.03 99110-S9100 ', From e5107b1eabc3a04cb097f0f17d5cf587eb387453 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 6 May 2024 15:01:06 -0700 Subject: [PATCH 380/384] debug test_models script fixes (#32362) * some things were renamed without checking * fix that --- selfdrive/car/tests/test_models.py | 2 +- tools/car_porting/test_car_model.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 69220ae2b9..2a0626c590 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -94,7 +94,7 @@ class TestCarModelBase(unittest.TestCase): car_fw = msg.carParams.carFw if msg.carParams.openpilotLongitudinalControl: experimental_long = True - if cls.platform is None and not cls.ci: + if cls.platform is None and not cls.test_route_on_bucket: live_fingerprint = msg.carParams.carFingerprint cls.platform = MIGRATION.get(live_fingerprint, live_fingerprint) diff --git a/tools/car_porting/test_car_model.py b/tools/car_porting/test_car_model.py index b4d263667c..5f8294fd3c 100755 --- a/tools/car_porting/test_car_model.py +++ b/tools/car_porting/test_car_model.py @@ -12,7 +12,7 @@ def create_test_models_suite(routes: list[CarTestRoute], ci=False) -> unittest.T test_suite = unittest.TestSuite() for test_route in routes: # create new test case and discover tests - test_case_args = {"car_model": test_route.car_model, "test_route": test_route, "ci": ci} + test_case_args = {"platform": test_route.car_model, "test_route": test_route, "test_route_on_bucket": ci} CarModelTestCase = type("CarModelTestCase", (TestCarModel,), test_case_args) test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(CarModelTestCase)) return test_suite From 1de64288965d457cd5827a4128103589831f72b4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 6 May 2024 16:29:23 -0700 Subject: [PATCH 381/384] remove foxglove, rerun is the future --- tools/foxglove/fox.py | 304 ----------------------------- tools/foxglove/install_foxglove.sh | 3 - 2 files changed, 307 deletions(-) delete mode 100755 tools/foxglove/fox.py delete mode 100755 tools/foxglove/install_foxglove.sh diff --git a/tools/foxglove/fox.py b/tools/foxglove/fox.py deleted file mode 100755 index a1e930d893..0000000000 --- a/tools/foxglove/fox.py +++ /dev/null @@ -1,304 +0,0 @@ -#!/usr/bin/env python3 -import sys -import json -import base64 -import os -import subprocess -from multiprocessing import Pool -from openpilot.tools.lib.route import Route -from openpilot.tools.lib.logreader import LogReader - -try: - from mcap.writer import Writer, CompressionType -except ImportError: - print("mcap module not found. Attempting to install...") - subprocess.run([sys.executable, "-m", "pip", "install", "mcap"]) - # Attempt to import again after installation - try: - from mcap.writer import Writer, CompressionType - except ImportError: - print("Failed to install mcap module. Exiting.") - sys.exit(1) - - -FOXGLOVE_IMAGE_SCHEME_TITLE = "foxglove.CompressedImage" -FOXGLOVE_GEOJSON_TITLE = "foxglove.GeoJSON" -FOXGLOVE_IMAGE_ENCODING = "base64" -OUT_MCAP_FILE_NAME = "json_log.mcap" -RLOG_FOLDER = "rlogs" -SCHEMAS_FOLDER = "schemas" -SCHEMA_EXTENSION = ".json" - -schemas: dict[str, int] = {} -channels: dict[str, int] = {} -writer: Writer - - -def convertBytesToString(data): - if isinstance(data, bytes): - return data.decode('latin-1') # Assuming UTF-8 encoding, adjust if needed - elif isinstance(data, list): - return [convertBytesToString(item) for item in data] - elif isinstance(data, dict): - return {key: convertBytesToString(value) for key, value in data.items()} - else: - return data - - -# Load jsonscheme for every Event -def loadSchema(schemaName): - with open(os.path.join(SCHEMAS_FOLDER, schemaName + SCHEMA_EXTENSION), "r") as file: - return json.loads(file.read()) - - -# Foxglove creates one graph of an array, and not one for each item of an array -# This can be avoided by transforming array to separate objects -def transformListsToJsonDict(json_data): - def convert_array_to_dict(array): - new_dict = {} - for index, item in enumerate(array): - if isinstance(item, dict): - new_dict[index] = transformListsToJsonDict(item) - else: - new_dict[index] = item - return new_dict - - new_data = {} - for key, value in json_data.items(): - if isinstance(value, list): - new_data[key] = convert_array_to_dict(value) - elif isinstance(value, dict): - new_data[key] = transformListsToJsonDict(value) - else: - new_data[key] = value - return new_data - - -# Transform openpilot thumbnail to foxglove compressedImage -def transformToFoxgloveSchema(jsonMsg): - bytesImgData = jsonMsg.get("thumbnail").get("thumbnail").encode('latin1') - base64ImgData = base64.b64encode(bytesImgData) - base64_string = base64ImgData.decode('utf-8') - foxMsg = { - "timestamp": {"sec": "0", "nsec": jsonMsg.get("logMonoTime")}, - "frame_id": str(jsonMsg.get("thumbnail").get("frameId")), - "data": base64_string, - "format": "jpeg", - } - return foxMsg - - -# TODO: Check if there is a tool to build GEOJson -def transformMapCoordinates(jsonMsg): - coordinates = [] - for jsonCoords in jsonMsg.get("navRoute").get("coordinates"): - coordinates.append([jsonCoords.get("longitude"), jsonCoords.get("latitude")]) - - # Define the GeoJSON - geojson_data = { - "type": "FeatureCollection", - "features": [{"type": "Feature", "geometry": {"type": "LineString", "coordinates": coordinates}, "logMonoTime": jsonMsg.get("logMonoTime")}], - } - - # Create the final JSON with the GeoJSON data encoded as a string - geoJson = {"geojson": json.dumps(geojson_data)} - - return geoJson - - -def jsonToScheme(jsonData): - zeroArray = False - schema = {"type": "object", "properties": {}, "required": []} - for key, value in jsonData.items(): - if isinstance(value, dict): - tempScheme, zeroArray = jsonToScheme(value) - if tempScheme == 0: - return 0 - schema["properties"][key] = tempScheme - schema["required"].append(key) - elif isinstance(value, list): - if all(isinstance(item, dict) for item in value) and len(value) > 0: # Handle zero value arrays - # Handle array of objects - tempScheme, zeroArray = jsonToScheme(value[0]) - schema["properties"][key] = {"type": "array", "items": tempScheme if value else {}} - schema["required"].append(key) - else: - if len(value) == 0: - zeroArray = True - # Handle array of primitive types - schema["properties"][key] = {"type": "array", "items": {"type": "string"}} - schema["required"].append(key) - else: - typeName = type(value).__name__ - if typeName == "str": - typeName = "string" - elif typeName == "bool": - typeName = "boolean" - elif typeName == "float": - typeName = "number" - elif typeName == "int": - typeName = "integer" - schema["properties"][key] = {"type": typeName} - schema["required"].append(key) - - return schema, zeroArray - - -def saveScheme(scheme, schemaFileName): - schemaFileName = schemaFileName + SCHEMA_EXTENSION - # Create the new schemas folder - os.makedirs(SCHEMAS_FOLDER, exist_ok=True) - with open(os.path.join(SCHEMAS_FOLDER, schemaFileName), 'w') as json_file: - json.dump(convertBytesToString(scheme), json_file) - - -def convertToFoxGloveFormat(jsonData, rlogTopic): - jsonData["title"] = rlogTopic - if rlogTopic == "thumbnail": - jsonData = transformToFoxgloveSchema(jsonData) - jsonData["title"] = FOXGLOVE_IMAGE_SCHEME_TITLE - elif rlogTopic == "navRoute": - jsonData = transformMapCoordinates(jsonData) - jsonData["title"] = FOXGLOVE_GEOJSON_TITLE - else: - jsonData = transformListsToJsonDict(jsonData) - return jsonData - - -def generateSchemas(): - listOfDirs = os.listdir(RLOG_FOLDER) - # Open every dir in rlogs - for directory in listOfDirs: - # List every file in every rlog dir - dirPath = os.path.join(RLOG_FOLDER, directory) - listOfFiles = os.listdir(dirPath) - lastIteration = len(listOfFiles) - for iteration, file in enumerate(listOfFiles): - # Load json data from every file until found one without empty arrays - filePath = os.path.join(dirPath, file) - with open(filePath, 'r') as jsonFile: - jsonData = json.load(jsonFile) - scheme, zerroArray = jsonToScheme(jsonData) - # If array of len 0 has been found, type of its data can not be parsed, skip to the next log - # in search for a non empty array. If there is not an non empty array in logs, put a dummy string type - if zerroArray and not iteration == lastIteration - 1: - continue - title = jsonData.get("title") - scheme["title"] = title - # Add contentEncoding type, hardcoded in foxglove format - if title == FOXGLOVE_IMAGE_SCHEME_TITLE: - scheme["properties"]["data"]["contentEncoding"] = FOXGLOVE_IMAGE_ENCODING - saveScheme(scheme, directory) - break - - -def downloadLogs(logPaths): - segment_counter = 0 - for logPath in logPaths: - segment_counter += 1 - msg_counter = 1 - print(segment_counter) - rlog = LogReader(logPath) - for msg in rlog: - jsonMsg = json.loads(json.dumps(convertBytesToString(msg.to_dict()))) - jsonMsg = convertToFoxGloveFormat(jsonMsg, msg.which()) - rlog_dir_path = os.path.join(RLOG_FOLDER, msg.which()) - if not os.path.exists(rlog_dir_path): - os.makedirs(rlog_dir_path) - file_path = os.path.join(rlog_dir_path, str(segment_counter) + "," + str(msg_counter)) - with open(file_path, 'w') as json_file: - json.dump(jsonMsg, json_file) - msg_counter += 1 - - -def getLogMonoTime(jsonMsg): - if jsonMsg.get("title") == FOXGLOVE_IMAGE_SCHEME_TITLE: - logMonoTime = jsonMsg.get("timestamp").get("nsec") - elif jsonMsg.get("title") == FOXGLOVE_GEOJSON_TITLE: - logMonoTime = json.loads(jsonMsg.get("geojson")).get("features")[0].get("logMonoTime") - else: - logMonoTime = jsonMsg.get("logMonoTime") - return logMonoTime - - -def processMsgs(args): - msgFile, rlogTopicPath, rlogTopic = args - msgFilePath = os.path.join(rlogTopicPath, msgFile) - with open(msgFilePath, "r") as file: - jsonMsg = json.load(file) - logMonoTime = getLogMonoTime(jsonMsg) - return {'channel_id': channels[rlogTopic], 'log_time': logMonoTime, 'data': json.dumps(jsonMsg).encode("utf-8"), 'publish_time': logMonoTime} - - -# Get logs from a path, and convert them into mcap -def createMcap(logPaths): - print(f"Downloading logs [{len(logPaths)}]") - downloadLogs(logPaths) - print("Creating schemas") - generateSchemas() - print("Creating mcap file") - - listOfRlogTopics = os.listdir(RLOG_FOLDER) - print(f"Registering schemas and channels [{len(listOfRlogTopics)}]") - for counter, rlogTopic in enumerate(listOfRlogTopics): - print(counter) - schema = loadSchema(rlogTopic) - schema_id = writer.register_schema(name=schema.get("title"), encoding="jsonschema", data=json.dumps(schema).encode()) - schemas[rlogTopic] = schema_id - channel_id = writer.register_channel(schema_id=schemas[rlogTopic], topic=rlogTopic, message_encoding="json") - channels[rlogTopic] = channel_id - rlogTopicPath = os.path.join(RLOG_FOLDER, rlogTopic) - msgFiles = os.listdir(rlogTopicPath) - pool = Pool() - results = pool.map(processMsgs, [(msgFile, rlogTopicPath, rlogTopic) for msgFile in msgFiles]) - pool.close() - pool.join() - for result in results: - writer.add_message(channel_id=result['channel_id'], log_time=result['log_time'], data=result['data'], publish_time=result['publish_time']) - - -def is_program_installed(program_name): - try: - # Check if the program is installed using dpkg (for traditional Debian packages) - subprocess.run(["dpkg", "-l", program_name], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - return True - except subprocess.CalledProcessError: - # Check if the program is installed using snap - try: - subprocess.run(["snap", "list", program_name], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - return True - except subprocess.CalledProcessError: - return False - - -if __name__ == '__main__': - # Example usage: - program_name = "foxglove-studio" # Change this to the program you want to check - if is_program_installed(program_name): - print(f"{program_name} detected.") - else: - print(f"{program_name} could not be detected.") - installFoxglove = input("Would you like to install it? YES/NO? - ") - if installFoxglove.lower() == "yes": - try: - subprocess.run(['./install_foxglove.sh'], check=True) - print("Installation completed successfully.") - except subprocess.CalledProcessError as e: - print(f"Installation failed with return code {e.returncode}.") - # Get a route - if len(sys.argv) == 1: - route_name = "a2a0ccea32023010|2023-07-27--13-01-19" - print("No route was provided, using demo route") - else: - route_name = sys.argv[1] - # Get logs for a route - print("Getting route log paths") - route = Route(route_name) - logPaths = route.log_paths() - # Start mcap writer - with open(OUT_MCAP_FILE_NAME, "wb") as stream: - writer = Writer(stream, compression=CompressionType.NONE) - writer.start() - createMcap(logPaths) - writer.finish() - print(f"File {OUT_MCAP_FILE_NAME} has been successfully created. Please import it into foxglove studio to continue.") diff --git a/tools/foxglove/install_foxglove.sh b/tools/foxglove/install_foxglove.sh deleted file mode 100755 index 0f401549a2..0000000000 --- a/tools/foxglove/install_foxglove.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -echo "Installing foxglvoe studio..." -sudo snap install foxglove-studio From 1c42b8a05fc8b525902904a855ff04af8f56d869 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 6 May 2024 16:42:35 -0700 Subject: [PATCH 382/384] revert changes to release/ (#32364) * revert changes to release/ * put those back * revert Jenkinsfile --- Jenkinsfile | 219 ++++++++++++-------------------- release/README.md | 34 ----- release/build_git_release.sh | 105 --------------- release/build_release.sh | 80 ++++++++++-- release/package_casync_agnos.py | 59 --------- release/package_casync_build.py | 108 ---------------- 6 files changed, 147 insertions(+), 458 deletions(-) delete mode 100644 release/README.md delete mode 100755 release/build_git_release.sh delete mode 100755 release/package_casync_agnos.py delete mode 100755 release/package_casync_build.py diff --git a/Jenkinsfile b/Jenkinsfile index efba905c6b..f21d7f20fe 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -9,11 +9,6 @@ def retryWithDelay(int maxRetries, int delay, Closure body) { throw Exception("Failed after ${maxRetries} retries") } -// check if started by timer: https://gist.github.com/aaclarker/75b8a0eb2b4d600779f84f8e849f2c37 -def isJobStartedByTimer() { - return currentBuild.getBuildCauses()[0]["shortDescription"].matches("Started by timer"); -} - def device(String ip, String step_label, String cmd) { withCredentials([file(credentialsId: 'id_rsa', variable: 'key_file')]) { def ssh_cmd = """ @@ -31,7 +26,6 @@ export SOURCE_DIR=${env.SOURCE_DIR} export GIT_BRANCH=${env.GIT_BRANCH} export GIT_COMMIT=${env.GIT_COMMIT} export AZURE_TOKEN='${env.AZURE_TOKEN}' -export AZURE_TOKEN_OPENPILOT_RELEASES='${env.AZURE_TOKEN_OPENPILOT_RELEASES}' export MAPBOX_TOKEN='${env.MAPBOX_TOKEN}' # only use 1 thread for tici tests since most require HIL export PYTEST_ADDOPTS="-n 0" @@ -111,7 +105,7 @@ def pcStage(String stageName, Closure body) { checkout scm - def dockerArgs = "--user=batman -v /tmp/comma_download_cache:/tmp/comma_download_cache -v /tmp/scons_cache:/tmp/scons_cache -e PYTHONPATH=${env.WORKSPACE} -e AZURE_TOKEN_OPENPILOT_RELEASES='${env.AZURE_TOKEN_OPENPILOT_RELEASES}' --cpus=8 --memory 16g -e PYTEST_ADDOPTS='-n8'"; + def dockerArgs = "--user=batman -v /tmp/comma_download_cache:/tmp/comma_download_cache -v /tmp/scons_cache:/tmp/scons_cache -e PYTHONPATH=${env.WORKSPACE} --cpus=8 --memory 16g -e PYTEST_ADDOPTS='-n8'"; def openpilot_base = retryWithDelay (3, 15) { return docker.build("openpilot-base:build-${env.GIT_COMMIT}", "-f Dockerfile.openpilot_base .") @@ -119,7 +113,7 @@ def pcStage(String stageName, Closure body) { lock(resource: "", label: 'pc', inversePrecedence: true, quantity: 1) { openpilot_base.inside(dockerArgs) { - timeout(time: 25, unit: 'MINUTES') { + timeout(time: 20, unit: 'MINUTES') { try { retryWithDelay (3, 15) { sh "git config --global --add safe.directory '*'" @@ -141,56 +135,14 @@ def pcStage(String stageName, Closure body) { def setupCredentials() { withCredentials([ string(credentialsId: 'azure_token', variable: 'AZURE_TOKEN'), - string(credentialsId: 'azure_token_openpilot_releases', variable: 'AZURE_TOKEN_OPENPILOT_RELEASES'), string(credentialsId: 'mapbox_token', variable: 'MAPBOX_TOKEN') ]) { env.AZURE_TOKEN = "${AZURE_TOKEN}" - env.AZURE_TOKEN_OPENPILOT_RELEASES = "${AZURE_TOKEN_OPENPILOT_RELEASES}" env.MAPBOX_TOKEN = "${MAPBOX_TOKEN}" } } -def build_git_release(String channel_name) { - return parallel ( - "${channel_name} (git)": { - deviceStage("build git", "tici-needs-can", [], [ - ["build ${channel_name}", "RELEASE_BRANCH=${channel_name} $SOURCE_DIR/release/build_git_release.sh"], - ]) - } - ) -} - - -def build_casync_release(String channel_name, def is_release) { - def extra_env = is_release ? "RELEASE=1 " : "" - def build_dir = "/data/openpilot" - - extra_env += "TMPDIR=/data/tmp PYTHONPATH=$SOURCE_DIR" - - return deviceStage("build casync", "tici-needs-can", [], [ - ["build", "${extra_env} $SOURCE_DIR/release/build_release.sh ${build_dir}"], - ["package + upload", "${extra_env} $SOURCE_DIR/release/package_casync_build.py ${build_dir}"], - ]) -} - - -def build_stage() { - return parallel ( - 'nightly': { - build_casync_release("nightly", true); - }, - 'master': { - build_casync_release("master", false); - }, - 'publish agnos': { - pcStage("publish agnos") { - sh "PYTHONWARNINGS=ignore release/package_casync_agnos.py" - } - } - ) -} - node { env.CI = "1" env.PYTHONWARNINGS = "error" @@ -205,105 +157,94 @@ node { 'testing-closet*', 'hotfix-*'] def excludeRegex = excludeBranches.join('|').replaceAll('\\*', '.*') - def nightlyBranch = "master" - - def props = []; - - if (env.BRANCH_NAME == nightlyBranch) { - props.add(pipelineTriggers([ - cron('0 9 * * *') // at 2am PST (9am UTC) every night - ])) - } - - if (env.BRANCH_NAME != "master") { - props.add(disableConcurrentBuilds(abortPrevious: true)) + if (env.BRANCH_NAME != 'master') { + properties([ + disableConcurrentBuilds(abortPrevious: true) + ]) } - properties(props); - try { if (env.BRANCH_NAME == 'devel-staging') { - build_git_release("release3-staging") + deviceStage("build release3-staging", "tici-needs-can", [], [ + ["build release3-staging", "RELEASE_BRANCH=release3-staging $SOURCE_DIR/release/build_release.sh"], + ]) } if (env.BRANCH_NAME == 'master-ci') { - build_git_release("nightly") + deviceStage("build nightly", "tici-needs-can", [], [ + ["build nightly", "RELEASE_BRANCH=nightly $SOURCE_DIR/release/build_release.sh"], + ]) } if (!env.BRANCH_NAME.matches(excludeRegex)) { - parallel ( - // tici tests - 'onroad tests': { - deviceStage("onroad", "tici-needs-can", [], [ - // TODO: ideally, this test runs in master-ci, but it takes 5+m to build it - //["build master-ci", "cd $SOURCE_DIR/release && TARGET_DIR=$TEST_DIR $SOURCE_DIR/scripts/retry.sh ./build_devel.sh"], - ["build openpilot", "cd selfdrive/manager && ./build.py"], - ["check dirty", "release/check-dirty.sh"], - ["onroad tests", "pytest selfdrive/test/test_onroad.py -s"], - ["time to onroad", "pytest selfdrive/test/test_time_to_onroad.py"], - ]) - }, - 'HW + Unit Tests': { - deviceStage("tici-hardware", "tici-common", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], - ["test power draw", "pytest -s system/hardware/tici/tests/test_power_draw.py"], - ["test encoder", "LD_LIBRARY_PATH=/usr/local/lib pytest system/loggerd/tests/test_encoder.py"], - ["test pigeond", "pytest system/ubloxd/tests/test_pigeond.py"], - ["test manager", "pytest selfdrive/manager/test/test_manager.py"], - ]) - }, - 'loopback': { - deviceStage("loopback", "tici-loopback", ["UNSAFE=1"], [ - ["build openpilot", "cd selfdrive/manager && ./build.py"], - ["test boardd loopback", "pytest selfdrive/boardd/tests/test_boardd_loopback.py"], - ]) - }, - 'camerad': { - deviceStage("AR0231", "tici-ar0231", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test camerad", "pytest system/camerad/test/test_camerad.py"], - ["test exposure", "pytest system/camerad/test/test_exposure.py"], - ]) - deviceStage("OX03C10", "tici-ox03c10", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test camerad", "pytest system/camerad/test/test_camerad.py"], - ["test exposure", "pytest system/camerad/test/test_exposure.py"], - ]) - }, - 'sensord': { - deviceStage("LSM + MMC", "tici-lsmc", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test sensord", "pytest system/sensord/tests/test_sensord.py"], - ]) - deviceStage("BMX + LSM", "tici-bmx-lsm", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["test sensord", "pytest system/sensord/tests/test_sensord.py"], - ]) - }, - 'replay': { - deviceStage("model-replay", "tici-replay", ["UNSAFE=1"], [ - ["build", "cd selfdrive/manager && ./build.py"], - ["model replay", "selfdrive/test/process_replay/model_replay.py"], - ]) - }, - 'tizi': { - deviceStage("tizi", "tizi", ["UNSAFE=1"], [ - ["build openpilot", "cd selfdrive/manager && ./build.py"], - ["test boardd loopback", "SINGLE_PANDA=1 pytest selfdrive/boardd/tests/test_boardd_loopback.py"], - ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], - ["test amp", "pytest system/hardware/tici/tests/test_amplifier.py"], - ["test hw", "pytest system/hardware/tici/tests/test_hardware.py"], - ["test qcomgpsd", "pytest system/qcomgpsd/tests/test_qcomgpsd.py"], - ]) - }, - ) - } - - if (env.BRANCH_NAME == nightlyBranch && isJobStartedByTimer()) { - stage('build release') { - build_stage() - } + parallel ( + // tici tests + 'onroad tests': { + deviceStage("onroad", "tici-needs-can", [], [ + // TODO: ideally, this test runs in master-ci, but it takes 5+m to build it + //["build master-ci", "cd $SOURCE_DIR/release && TARGET_DIR=$TEST_DIR $SOURCE_DIR/scripts/retry.sh ./build_devel.sh"], + ["build openpilot", "cd selfdrive/manager && ./build.py"], + ["check dirty", "release/check-dirty.sh"], + ["onroad tests", "pytest selfdrive/test/test_onroad.py -s"], + ["time to onroad", "pytest selfdrive/test/test_time_to_onroad.py"], + ]) + }, + 'HW + Unit Tests': { + deviceStage("tici-hardware", "tici-common", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], + ["test power draw", "pytest -s system/hardware/tici/tests/test_power_draw.py"], + ["test encoder", "LD_LIBRARY_PATH=/usr/local/lib pytest system/loggerd/tests/test_encoder.py"], + ["test pigeond", "pytest system/sensord/tests/test_pigeond.py"], + ["test manager", "pytest selfdrive/manager/test/test_manager.py"], + ]) + }, + 'loopback': { + deviceStage("loopback", "tici-loopback", ["UNSAFE=1"], [ + ["build openpilot", "cd selfdrive/manager && ./build.py"], + ["test boardd loopback", "pytest selfdrive/boardd/tests/test_boardd_loopback.py"], + ]) + }, + 'camerad': { + deviceStage("AR0231", "tici-ar0231", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test camerad", "pytest system/camerad/test/test_camerad.py"], + ["test exposure", "pytest system/camerad/test/test_exposure.py"], + ]) + deviceStage("OX03C10", "tici-ox03c10", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test camerad", "pytest system/camerad/test/test_camerad.py"], + ["test exposure", "pytest system/camerad/test/test_exposure.py"], + ]) + }, + 'sensord': { + deviceStage("LSM + MMC", "tici-lsmc", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test sensord", "pytest system/sensord/tests/test_sensord.py"], + ]) + deviceStage("BMX + LSM", "tici-bmx-lsm", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["test sensord", "pytest system/sensord/tests/test_sensord.py"], + ]) + }, + 'replay': { + deviceStage("model-replay", "tici-replay", ["UNSAFE=1"], [ + ["build", "cd selfdrive/manager && ./build.py"], + ["model replay", "selfdrive/test/process_replay/model_replay.py"], + ]) + }, + 'tizi': { + deviceStage("tizi", "tizi", ["UNSAFE=1"], [ + ["build openpilot", "cd selfdrive/manager && ./build.py"], + ["test boardd loopback", "SINGLE_PANDA=1 pytest selfdrive/boardd/tests/test_boardd_loopback.py"], + ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], + ["test amp", "pytest system/hardware/tici/tests/test_amplifier.py"], + ["test hw", "pytest system/hardware/tici/tests/test_hardware.py"], + ["test qcomgpsd", "pytest system/qcomgpsd/tests/test_qcomgpsd.py"], + ]) + }, + + ) } } catch (Exception e) { currentBuild.result = 'FAILED' diff --git a/release/README.md b/release/README.md deleted file mode 100644 index 89e6cce6f3..0000000000 --- a/release/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# openpilot releases - - -## terms - -- `channel` - a named version of openpilot (git branch, casync caibx) which receives updates -- `build` - a copy of openpilot ready for distribution, already built for a specific device -- `build_style` - type of build, either `debug` or `release` - - `debug` - build with `ALLOW_DEBUG=true`, can test experimental features like longitudinal on alpha cars - - `release` - build with `ALLOW_DEBUG=false`, experimental features disabled - - -## openpilot channels - -| channel | build_style | description | -| ----------- | ----------- | ---------- | -| release | `release` | stable release of openpilot | -| staging | `release` | release candidate of openpilot for final verification | -| nightly | `release` | generated nightly from last commit passing CI tests | -| master | `debug` | current master commit with experimental features enabled | -| git branches | `debug` | installed manually, experimental features enabled, build required | - - -## build - -`release/build_release.sh ` - creates an openpilot build into `build_dir`, ready for distribution - -## packaging a casync release - -`release/package_casync_build.py ` - packages an openpilot build into a casync tar and uploads to `openpilot-releases` - -## release builds - -to create a release build, set `RELEASE=1` environment variable when running the build script diff --git a/release/build_git_release.sh b/release/build_git_release.sh deleted file mode 100755 index 08f8a5a185..0000000000 --- a/release/build_git_release.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/bash -e - -# git diff --name-status origin/release3-staging | grep "^A" | less - -DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" - -cd $DIR - -BUILD_DIR=/data/openpilot -SOURCE_DIR="$(git rev-parse --show-toplevel)" - -if [ -f /TICI ]; then - FILES_SRC="release/files_tici" -else - echo "no release files set" - exit 1 -fi - -if [ -z "$RELEASE_BRANCH" ]; then - echo "RELEASE_BRANCH is not set" - exit 1 -fi - - -# set git identity -source $DIR/identity.sh - -echo "[-] Setting up repo T=$SECONDS" -rm -rf $BUILD_DIR -mkdir -p $BUILD_DIR -cd $BUILD_DIR -git init -git remote add origin git@github.com:commaai/openpilot.git -git checkout --orphan $RELEASE_BRANCH - -# do the files copy -echo "[-] copying files T=$SECONDS" -cd $SOURCE_DIR -cp -pR --parents $(cat release/files_common) $BUILD_DIR/ -cp -pR --parents $(cat $FILES_SRC) $BUILD_DIR/ - -# in the directory -cd $BUILD_DIR - -rm -f panda/board/obj/panda.bin.signed -rm -f panda/board/obj/panda_h7.bin.signed - -VERSION=$(cat common/version.h | awk -F[\"-] '{print $2}') -echo "#define COMMA_VERSION \"$VERSION-release\"" > common/version.h - -echo "[-] committing version $VERSION T=$SECONDS" -git add -f . -git commit -a -m "openpilot v$VERSION release" - -# Build -export PYTHONPATH="$BUILD_DIR" -scons -j$(nproc) - -# release panda fw -CERT=/data/pandaextra/certs/release RELEASE=1 scons -j$(nproc) panda/ - -# Ensure no submodules in release -if test "$(git submodule--helper list | wc -l)" -gt "0"; then - echo "submodules found:" - git submodule--helper list - exit 1 -fi -git submodule status - -# Cleanup -find . -name '*.a' -delete -find . -name '*.o' -delete -find . -name '*.os' -delete -find . -name '*.pyc' -delete -find . -name 'moc_*' -delete -find . -name '__pycache__' -delete -rm -rf .sconsign.dblite Jenkinsfile release/ -rm selfdrive/modeld/models/supercombo.onnx - -# Restore third_party -git checkout third_party/ - -# Mark as prebuilt release -touch prebuilt - -# Add built files to git -git add -f . -git commit --amend -m "openpilot v$VERSION" - -# Run tests -TEST_FILES="tools/" -cd $SOURCE_DIR -cp -pR -n --parents $TEST_FILES $BUILD_DIR/ -cd $BUILD_DIR -RELEASE=1 selfdrive/test/test_onroad.py -#selfdrive/manager/test/test_manager.py -#selfdrive/car/tests/test_car_interfaces.py -rm -rf $TEST_FILES - -if [ ! -z "$RELEASE_BRANCH" ]; then - echo "[-] pushing release T=$SECONDS" - git push -f origin $RELEASE_BRANCH:$RELEASE_BRANCH -fi - -echo "[-] done T=$SECONDS" diff --git a/release/build_release.sh b/release/build_release.sh index 19c06700fa..fc15cf6cdf 100755 --- a/release/build_release.sh +++ b/release/build_release.sh @@ -1,40 +1,72 @@ -#!/usr/bin/bash +#!/usr/bin/bash -e -set -e +# git diff --name-status origin/release3-staging | grep "^A" | less DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -SOURCE_DIR="$(git -C $DIR rev-parse --show-toplevel)" -BUILD_DIR=${1:-$(mktemp -d)} + +cd $DIR + +BUILD_DIR=/data/openpilot +SOURCE_DIR="$(git rev-parse --show-toplevel)" if [ -f /TICI ]; then FILES_SRC="release/files_tici" else - FILES_SRC="release/files_pc" + echo "no release files set" + exit 1 fi -echo "Building openpilot into $BUILD_DIR" +if [ -z "$RELEASE_BRANCH" ]; then + echo "RELEASE_BRANCH is not set" + exit 1 +fi + + +# set git identity +source $DIR/identity.sh +echo "[-] Setting up repo T=$SECONDS" rm -rf $BUILD_DIR mkdir -p $BUILD_DIR +cd $BUILD_DIR +git init +git remote add origin git@github.com:commaai/openpilot.git +git checkout --orphan $RELEASE_BRANCH -# Copy required files to BUILD_DIR +# do the files copy +echo "[-] copying files T=$SECONDS" cd $SOURCE_DIR cp -pR --parents $(cat release/files_common) $BUILD_DIR/ cp -pR --parents $(cat $FILES_SRC) $BUILD_DIR/ -# Build + cleanup +# in the directory cd $BUILD_DIR -export PYTHONPATH="$BUILD_DIR" rm -f panda/board/obj/panda.bin.signed rm -f panda/board/obj/panda_h7.bin.signed -if [ -n "$RELEASE" ]; then - export CERT=/data/pandaextra/certs/release -fi +VERSION=$(cat common/version.h | awk -F[\"-] '{print $2}') +echo "#define COMMA_VERSION \"$VERSION-release\"" > common/version.h +echo "[-] committing version $VERSION T=$SECONDS" +git add -f . +git commit -a -m "openpilot v$VERSION release" + +# Build +export PYTHONPATH="$BUILD_DIR" scons -j$(nproc) +# release panda fw +CERT=/data/pandaextra/certs/release RELEASE=1 scons -j$(nproc) panda/ + +# Ensure no submodules in release +if test "$(git submodule--helper list | wc -l)" -gt "0"; then + echo "submodules found:" + git submodule--helper list + exit 1 +fi +git submodule status + # Cleanup find . -name '*.a' -delete find . -name '*.o' -delete @@ -45,7 +77,29 @@ find . -name '__pycache__' -delete rm -rf .sconsign.dblite Jenkinsfile release/ rm selfdrive/modeld/models/supercombo.onnx +# Restore third_party +git checkout third_party/ + # Mark as prebuilt release touch prebuilt -echo "----- openpilot has been built to $BUILD_DIR -----" +# Add built files to git +git add -f . +git commit --amend -m "openpilot v$VERSION" + +# Run tests +TEST_FILES="tools/" +cd $SOURCE_DIR +cp -pR -n --parents $TEST_FILES $BUILD_DIR/ +cd $BUILD_DIR +RELEASE=1 selfdrive/test/test_onroad.py +#selfdrive/manager/test/test_manager.py +selfdrive/car/tests/test_car_interfaces.py +rm -rf $TEST_FILES + +if [ ! -z "$RELEASE_BRANCH" ]; then + echo "[-] pushing release T=$SECONDS" + git push -f origin $RELEASE_BRANCH:$RELEASE_BRANCH +fi + +echo "[-] done T=$SECONDS" diff --git a/release/package_casync_agnos.py b/release/package_casync_agnos.py deleted file mode 100755 index b80cdfa98d..0000000000 --- a/release/package_casync_agnos.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import json -import os -import pathlib -import tempfile -import time -from openpilot.common.basedir import BASEDIR -from openpilot.system.hardware.tici.agnos import StreamingDecompressor, unsparsify, noop, AGNOS_MANIFEST_FILE -from openpilot.system.updated.casync.common import create_casync_from_file -from release.package_casync_build import upload_casync_release - - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="creates a casync release") - parser.add_argument("--manifest", type=str, help="json manifest to create agnos release from", \ - default=str(pathlib.Path(BASEDIR) / AGNOS_MANIFEST_FILE)) - args = parser.parse_args() - - manifest_file = pathlib.Path(args.manifest) - - with tempfile.TemporaryDirectory() as temp_dir: - working_dir = pathlib.Path(temp_dir) - casync_dir = working_dir / "casync" - casync_dir.mkdir() - - agnos_casync_dir = casync_dir / "agnos" - agnos_casync_dir.mkdir() - - entry_path = working_dir / "entry" - - with open(manifest_file) as f: - manifest = json.load(f) - - for entry in manifest: - print(f"creating casync agnos build from {entry}") - start = time.monotonic() - downloader = StreamingDecompressor(entry['url']) - - parse_func = unsparsify if entry['sparse'] else noop - - parsed_chunks = parse_func(downloader) - - size = entry["size"] - - cur = 0 - with open(entry_path, "wb") as f: - for chunk in parsed_chunks: - f.write(chunk) - - print(f"downloaded in {time.monotonic() - start}") - - start = time.monotonic() - agnos_filename = os.path.basename(entry["url"]).split(".")[0] - create_casync_from_file(entry_path, agnos_casync_dir, agnos_filename) - print(f"created casnc in {time.monotonic() - start}") - - upload_casync_release(casync_dir) diff --git a/release/package_casync_build.py b/release/package_casync_build.py deleted file mode 100755 index 5f92e893be..0000000000 --- a/release/package_casync_build.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python3 - -# packages a casync release, uploads to azure, and creates a manifest - -import argparse -import dataclasses -import json -import os -import pathlib -import tempfile - -from openpilot.system.hardware.tici.agnos import AGNOS_MANIFEST_FILE, get_partition_path -from openpilot.system.updated.casync.common import create_build_metadata_file, create_casync_release -from openpilot.system.version import get_build_metadata -from openpilot.tools.lib.azure_container import AzureContainer - - -BASE_URL = "https://commadist.blob.core.windows.net" - -OPENPILOT_RELEASES = f"{BASE_URL}/openpilot-releases/openpilot" -AGNOS_RELEASES = f"{BASE_URL}/openpilot-releases/agnos" - - -def create_casync_caibx(target_dir: pathlib.Path, output_dir: pathlib.Path): - output_dir.mkdir() - build_metadata = get_build_metadata() - build_metadata.openpilot.build_style = "release" if os.environ.get("RELEASE", None) is not None else "debug" - - create_build_metadata_file(target_dir, build_metadata) - - digest, caibx = create_casync_release(target_dir, output_dir, build_metadata.canonical) - - print(f"Created casync release from {target_dir} to {caibx} with digest {digest}") - - -def upload_casync_release(casync_dir: pathlib.Path): - if "AZURE_TOKEN_OPENPILOT_RELEASES" in os.environ: - os.environ["AZURE_TOKEN"] = os.environ["AZURE_TOKEN_OPENPILOT_RELEASES"] - - OPENPILOT_RELEASES_CONTAINER = AzureContainer("commadist", "openpilot-releases") - - for f in casync_dir.rglob("*"): - if f.is_file(): - blob_name = f.relative_to(casync_dir) - print(f"uploading {f} to {blob_name}") - OPENPILOT_RELEASES_CONTAINER.upload_file(str(f), str(blob_name), overwrite=True) - - -def create_partition_manifest(partition): - agnos_filename = os.path.basename(partition["url"]).split(".")[0] - - return { - "type": "partition", - "casync": { - "caibx": f"{AGNOS_RELEASES}/{agnos_filename}.caibx" - }, - "path": get_partition_path(0, partition), - "ab": True, - "size": partition["size"], - "full_check": partition["full_check"], - "hash_raw": partition["hash_raw"], - } - - -def create_openpilot_manifest(build_metadata): - return { - "type": "path_tarred", - "path": "/data/openpilot", - "casync": { - "caibx": f"{OPENPILOT_RELEASES}/{build_metadata.canonical}.caibx" - } - } - - -def create_manifest(target_dir): - with open(pathlib.Path(target_dir) / AGNOS_MANIFEST_FILE) as f: - agnos_manifest = json.load(f) - - build_metadata = get_build_metadata(args.target_dir) - - return { - "build_metadata": dataclasses.asdict(build_metadata), - "manifest": [ - *[create_partition_manifest(entry) for entry in agnos_manifest], - create_openpilot_manifest(build_metadata) - ] - } - - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="creates a casync release") - parser.add_argument("target_dir", type=str, help="path to a release build of openpilot to create release from") - args = parser.parse_args() - - target_dir = pathlib.Path(args.target_dir) - - with tempfile.TemporaryDirectory() as temp_dir: - casync_dir = pathlib.Path(temp_dir) / "casync" - casync_dir.mkdir(parents=True) - - manifest_file = pathlib.Path(temp_dir) / "manifest.json" - - create_casync_caibx(target_dir, casync_dir / "openpilot") - upload_casync_release(casync_dir) - manifest = create_manifest(target_dir) - - print(json.dumps(manifest, indent=2)) From 3e7d9fa2febb061f226fc72cb9f7965398d41dbf Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 6 May 2024 17:10:12 -0700 Subject: [PATCH 383/384] Kia: add missing Carnival 2024 FW (#32365) carnival 2024 FW --- selfdrive/car/hyundai/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index c2c850877f..77a04a7aaf 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1118,6 +1118,7 @@ FW_VERSIONS = { b'\xf1\x00KA4 MFC AT EUR LHD 1.00 1.06 99210-R0000 220221', b'\xf1\x00KA4 MFC AT KOR LHD 1.00 1.06 99210-R0000 220221', b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.00 99210-R0100 230105', + b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.01 99210-R0100 230710', b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.05 99210-R0000 201221', b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.06 99210-R0000 220221', b'\xf1\x00KA4CMFC AT CHN LHD 1.00 1.01 99211-I4000 210525', From 6dd55b64d8b7cf3a0ffea14add074f519425e663 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 6 May 2024 17:30:33 -0700 Subject: [PATCH 384/384] fix pigeond test path --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index f21d7f20fe..9d12b77746 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -195,7 +195,7 @@ node { ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"], ["test power draw", "pytest -s system/hardware/tici/tests/test_power_draw.py"], ["test encoder", "LD_LIBRARY_PATH=/usr/local/lib pytest system/loggerd/tests/test_encoder.py"], - ["test pigeond", "pytest system/sensord/tests/test_pigeond.py"], + ["test pigeond", "pytest system/ubloxd/tests/test_pigeond.py"], ["test manager", "pytest selfdrive/manager/test/test_manager.py"], ]) }, @@ -250,4 +250,4 @@ node { currentBuild.result = 'FAILED' throw e } -} \ No newline at end of file +}